こんにちは!
事業開発推進部インフラ運用SLチームの倉田です。
連載第4回目ではGitLabのコンテナレジストリの機能を利用し、作成したイメージの管理を行う手順を紹介します。GitLabを用いて管理することで分散型のバージョン管理が可能となります。チームで作業を行っても誤って他の作業者のファイルを上書き保存してしまうリスクも解消できますし、履歴も残るので誰がどのような変更を行ったのかすぐに確認ができます。結果として各ファイルのバージョン管理が簡単になり、ミスの低減が実現できます。
また、パイプラインの機能を用いることで修正したファイルをリポジトリ上にプッシュをするだけで自動的に新規イメージの作成を実行することが可能になり作業の効率化につながります。
①GitLabRunnerの設定
GitLabのパイプラインの機能を用いるために必要なGitLabRunnerの設定方法
②リポジトリの作成
構成図の説明とリポジトリの作成方法
③.gitlab-ci.ymlの作成
パイプラインの実行内容を定義する.gitlab-ci.ymlファイルの作成
④イメージの作成と管理
今までに作成したファイルをリポジトリにプッシュすることでイメージを作成
用語説明
GitLab:先進的なソフトウェア開発に必要な多くの機能を統合した製品です。課題管理、バージョン管理、コードレビュー、CI、CD、モニタリングを1つのアプリケーションで行うことができ、インストールも簡単にできます。
GitLabRunner:GitLabのリポジトリに変更があった際に、自動的にパイプラインを実行する機能です。
リポジトリ:アプリケーション開発の環境において、ソースコードや設計、データの仕様といった情報が保管されているデータベースのことである。システムの設計情報やプログラムデータ、データの更新情報などが記録保管されており、特に複数の開発者が参加するプロジェクトにおいて開発状況の共有が容易にできるようになっている。
パイプライン:継続的なインテグレーション、デリバリ、デプロイメントのトップレベルのコンポーネントです。
コンテナレジストリ:コンテナイメージの保存とアクセスに使用されるリポジトリ (またはリポジトリのコレクション) です。
※参考記事①
開発者端末
・AWS EC2(Amazon Linux)
コンテナ実行環境
・AWS EC2(Amazon Linux)
前提条件
・GitLabのアカウントを所持している
・GitLab上にプロジェクトが作成済みである(本連載ではprojectsampleとする)
・GitLabへのSSH接続の設定が完了している
イメージ図
①GitLabRunnerの設定
GitLabには様々な機能があります。
今回は「GitLabRunner」、「パイプライン」、「コンテナレジストリ」を使いイメージの作成と管理を行います。
GitLabRunnerをダウンロードする
※環境によってダウンロードするファイルは変えてください
<開発者端末上で操作>
curl -LJO "https://gitlab-runner-downloads.s3.amazonaws.com/latest/rpm/gitlab-runner_amd64.rpm"
GitLab Runnerをインストールする
<開発者端末上で操作>
rpm -i gitlab-runner_amd64.rpm
GitLab Runnerにレジスターする
gitlab-runner register
※GitLabRunnerの詳しい説明は参考記事②の「GitLabにRunnerを登録する」へ
②リポジトリの作成
GitLab上で以下のような構成にしました。
Playbook実行に必要なファイルをplaybooksampleリポジトリ配下、Dockerfileをdockerfilesample配下にプッシュします。
構成図
プロジェクトであるprojectsampleの配下に「playbooksample」と「dockerfilesample」の二つのリポジトリを用意します。
以下はGitLab上でのリポジトリの作成手順です。
GitLab上で「ホームページ」→「プロジェクト」→「新規プロジェクト」を選択。
「空のプロジェクトの作成」を選択。
「プロジェクト名」にリポジトリ名を入力し、「プロジェクトを作成」を選択。
リポジトリ一覧の画面に新規リポジトリが登録されていれば完了となります。
③.gitlab-ci.ymlの作成
.gitlab-ci.ymlはパイプラインを用いてイメージをビルドし、コンテナレジストリへイメージをプッシュしイメージを管理するために必要です。
パイプラインを実行するためには.gitlab-ci.ymlにジョブとステージを記載します。ジョブはパイプラインで実行する内容を、ステージはジョブの実行タイミングを指定します。
※パイプラインを用いたイメージ作成に関して参考記事③のStep3Case2へ
/playbooksample/.gitlab-ci.yml
stages:
- deploy
build_image:
stage: deploy
trigger:
project:projectsample/dockerfilesample
こちらではplaybooksampleリポジトリ内で変更があった際、dockerfilesampleリポジトリ内の.gitlab-ci.ymlが実行されるようなジョブになっています。
/dockerfilesample/.gitlab-ci.yml
stages:
- build
Ansible Container Build Master:
stage: build
image: docker:20.10.17
services:
- docker:20.10.17-dind
variables:
# ビルドイメージの変数作成
IMAGE: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG:$CI_COMMIT_SHA
script:
# ビルド
- docker build --no-cache --tag $IMAGE .
# Dockerレジストリにログイン
- docker login --username $CI_REGISTRY_USER --password $CI_REGISTRY_PASSWORD $CI_REGISTRY
# ビルドしたイメージをプッシュ
- docker push $IMAGE
こちらではdockerfilesampleのリポジトリ内で変更があった際、パイプラインが実行されイメージがビルド、プッシュされるジョブになっています。イメージ名とタグ名はわかりやすいように指定します。
④イメージの作成と管理
次に作成したリポジトリ内に必要なファイルを開発者端末のEC2上からGitLabへプッシュします。
※GitLabの各リポジトリへのプッシュ方法について詳しくは参考記事③へ
プッシュ後.gitlab-ci.yml上のパイプラインが自動で実行され、イメージが作成されます。
GitLabの画面上でdockerfilesampleのリポジトリ上の「CI/CD」→「パイプライン」で実行結果が確認できます。
GitLabの画面上でdockerfilesampleリポジトリ上の「パッケージとレジストリ」→「コンテナレジストリ」で作成されたイメージが確認できます。
まとめ
以上の手順でGitLabのコンテナレジストリでイメージを管理することができます!
.gitlab-ci.ymlを用いてジョブやステージをカスタムすることで様々な応用が可能です。
ぜひ、試してみてください!
次回は「AnsibleファイルをKubernetes上にデプロイ」について投稿します。
参考記事
参考記事①
GitLab日本語情報サイト | GitLab.JP
リポジトリとは 「レポジトリ」 (repository): – IT用語辞典バイナリ (sophia-it.com)
GitLabでCI/CD GitLab Runner 前編 – アルファテックブログ (alpha.co.jp)
CI/CDパイプライン | GitLab (creationline.com)
コンテナレジストリとは (redhat.com)
参考記事②
GitとCI/CDに関する知識ゼロのSEが、GitLabでRunner (Docker) を登録するだけの話 (2022/09/26 改訂) – ネットワールド らぼ (networld.co.jp)
参考記事③
サル先生のGit入門〜バージョン管理を使いこなそう〜【プロジェクト管理ツールBacklog】
参考記事④
GitとCI/CDに関する知識ゼロのSEが、GitLabでCI/CDパイプラインを使ってコンテナレジストリにイメージを登録する話 – ネットワールド らぼ (networld.co.jp)