GitLabCI(2/3) パイプライン作成
パイプライン作成
はじめに
前回からの続きです。前回はOSにGitLab Runnerを構築するところまで実施しました。
今回はパイプラインを作成して実際にアプリのデプロイができるまでを確認していきます。
システム構成
# | 項目 | 内容 |
---|---|---|
1 | GitLab のバージョン | 16.8.1 |
# | 項目 | 内容 |
---|---|---|
1 | GitLab Runner を構築した OS | Amazon Linux 2023 |
2 | GitLab Runner のバージョン | 16.8.1 |
3 | GitLab Runner のタイプ | shell |
システム概略図
※GitLab はすでに構築済みのものを使用
- Runner がパイプラインを確認(これは定期的に行われている)
- GitLabへpushするタイミングでRunnerがExecutorにパイプライン実行を指示
- Executorがジョブを実行
ディレクトリ構成
root
├── app
│ ├── backend
│ │ └── main
│ │ ├── Dockerfile
│ │ ├── app
│ │ │ └── bnbwebapi-0.0.1-SNAPSHOT.jar
│ │ └── db
│ │ ├── Dockerfile
│ │ ├── compose.yaml
│ │ └── data
│ │ └── data.sql
│ └── frontend
│ ├── compose.yaml
│ └── main
│ ├── Dockerfile
│ └── app
│ └── ...
└── bnbwebapi
└── ...
パイプラインとは
パイプライン(Pipeline)とは、ソフトウェアのビルド、テスト、デプロイなどの一連の処理を自動化する仕組みです。
従来の手動によるビルドやデプロイでは、作業ミスや環境の違いによる問題が発生しやすく、開発のスピードが遅くなることがありました。パイプラインを導入することで、コードの変更があるたびに自動でテストやデプロイを行い、安定した開発・運用が可能になります。
GitLab では .gitlab-ci.yml
という設定ファイルを使ってパイプラインを定義できます。
CI/CD を利用すると、以下のような利点があります。
- コードの変更を自動でビルド・テストできる
- デプロイを自動化できる
- 処理の流れを管理しやすい
- 開発スピードの向上
パイプライン作成
今回は [jarファイルのビルド] → [docker compose で docker image をビルド] → [作成した docker image をECRにプッシュ]の流れをCIのパイプラインで実装していきます。
作成するジョブは以下の通りです。
# | 項目 | stage | 内容 |
---|---|---|---|
1 | jar-build-job | build | mavenを実行しjarファイルを作成 |
2 | image-build-job | build | docker imageをビルド |
3 | deploy-job | deploy | ビルドしたdocker imageをコンテナレジストリにプッシュ |
4 | cleanup-job | cleanup | 不要な Docker オブジェクトを削除 |
※使用するイメージ:maven:3.9.9-jdk-21
事前準備
パイプラインを作成する前に、dockerとdocker composeをEC2にインストールします。
- dockerインストール
sudo yum install -y docker # dockerのインストール sudo service docker start # dockerの起動 sudo usermod -a -G docker ec2-user # ec2-userをdockerグループに入れる。これでec2-userがdockerコマンドを実行できる sudo docker info # dockerの起動確認 sudo systemctl docker enable # OSが起動時にdockerが自動起動するようにする sudo systemctl status docker # dockerの状態確認
- docker compose インストール
- コマンドの2.32.4のところは適宜書き換えて実行してください。
- docker-composeの最新バージョンはDocker Compose のインストールページ(https://matsuand.github.io/docs.docker.jp.onthefly/compose/install/)から確認できます
sudo mkdir -p /usr/local/lib/docker/cli-plugins sudo curl -L https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/lib/docker/cli-plugins/docker-compose sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose docker compose version
パイプラインのフォーマット
[ジョブ名]: stage: # ジョブを実行するステージ script: # シェルコマンド
jar-build-job
mavenを実行しjarファイルを作成します。artifactsオプションで、作成したjarファイルをGitLabのアーティファクトに保存します。保存期間はexpire_inで設定でき、今回は1日で消えるようになっています。
jar-build-job: stage: build script: #アプリのソースコードがあるディレクトリに移動 - cd ./bnbwebapi #mavenを実行 - mvn clean package -DskipTests=true #作成したjarファイルをDockerFileがあるディレクトリに移動 - cp ./target/bnbwebapi-0.0.1-SNAPSHOT.jar ../app/backend/main/app/ artifacts: paths: - ./bnbwebapi/target/bnbwebapi-0.0.1-SNAPSHOT.jar expire_in: "1 day"
image-build-job
docker imageをビルドします。
image-build-job: stage: build script: # compose.yamlがあるディレクトリに移動 - cd ./app/frontend # docker compose でimageをビルド - docker compose build # ECRにプッシュするためにimageのタグを変更 - docker image tag backend $AWS_ACCOUNT.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/app/backend-$AWS_IAM_USER_ID:$TAG - docker image tag backend-db $AWS_ACCOUNT.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/app/backend-db-$AWS_IAM_USER_ID:$TAG - docker image tag frontend $AWS_ACCOUNT.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/app/frontend-$AWS_IAM_USER_ID:$TAG
deploy-job
ビルドしたdocker imageをコンテナレジストリにプッシュ
stage: deploy script: # imageをECRにプッシュ - docker image push $AWS_ACCOUNT.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/app/backend-$AWS_IAM_USER_ID:$TAG - docker image push $AWS_ACCOUNT.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/app/backend-db-$AWS_IAM_USER_ID:$TAG - docker image push $AWS_ACCOUNT.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/app/frontend-$AWS_IAM_USER_ID:$TAG
cleanup-job
不要なdockerオブジェクトを削除します。そのままではパイプラインを実行するためにdockerオブジェクトが増えてしまい容量不足になるため、このジョブで削除します。
cleanup-job: stage: cleanup script: # 不要な docker オブジェクト を削除 - docker system prune -f - docker volume prune -f
完成したymlファイル
最終的にできた.gitlab-ci.ymlがこちらです。
image: maven:3.9.9-jdk-21 variables: TAG: 1.0 stages: - build - deploy - cleanup - test jar-build-job: stage: build script: - cd ./bnbwebapi - mvn clean package -DskipTests=true - cp ./target/bnbwebapi-0.0.1-SNAPSHOT.jar ../app/backend/main/app/ artifacts: paths: - ./bnbwebapi/target/bnbwebapi-0.0.1-SNAPSHOT.jar expire_in: "1 day" image-build-job: stage: build script: - cd ./app/frontend - docker compose build - docker image tag backend $AWS_ACCOUNT.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/app/backend-$AWS_IAM_USER_ID:$TAG - docker image tag backend-db $AWS_ACCOUNT.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/app/backend-db-$AWS_IAM_USER_ID:$TAG - docker image tag frontend $AWS_ACCOUNT.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/app/frontend-$AWS_IAM_USER_ID:$TAG deploy-job: stage: deploy script: #ECRにログイン - aws ecr get-login-password | docker login --username AWS --password-stdin https://$AWS_ACCOUNT.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com #imageをECRにプッシュ - docker image push $AWS_ACCOUNT.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/app/backend-$AWS_IAM_USER_ID:$TAG - docker image push $AWS_ACCOUNT.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/app/backend-db-$AWS_IAM_USER_ID:$TAG - docker image push $AWS_ACCOUNT.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/app/frontend-$AWS_IAM_USER_ID:$TAG cleanup-job: stage: cleanup script: - docker system prune -f - docker volume prune -f
環境変数設定
Runner実行前に GitLab Ci に環境変数を設定します。
# | 変数名 | 内容 |
---|---|---|
1 | AWS_ACCOUNT | AWSのアカウントID |
2 | AWS_IAM_USER_ID | IAMユーザー |
3 | AWS_DEFAULT_REGION | AWSのデフォルトリージョン |
4 | AWS_ACCESS_KEY_ID | AWSアクセスキー |
5 | AWS_SECRET_ACCESS_KEY | AWSシークレットキー |
[設定] → [CI/CD]
[変数を展開]
[変数を追加]
[キーと値を入力] → [変数を追加]
実行結果
それではEC2のターミナルでRunnerを実行してみます。
gitlab-runner run
- jar-build-job
- image-build-job
- deploy-job
- cleanup-job
終わりに
今回は GitLab CI で初めてパイプラインを作成し、実際に動かすところまで確認しました。実際に動くパイプラインを作れたことで、CI/CD の仕組みやメリットを少しずつ理解できたように思います。
次回はパイプラインを改善していきます。