GitLabCI(2/3) パイプライン作成

パイプライン作成


はじめに

前回からの続きです。前回はOSにGitLab Runnerを構築するところまで実施しました。
今回はパイプラインを作成して実際にアプリのデプロイができるまでを確認していきます。


システム構成

#項目内容
1GitLab のバージョン16.8.1

 

#項目内容
1GitLab Runner を構築した OSAmazon Linux 2023
2GitLab Runner のバージョン16.8.1
3GitLab Runner のタイプshell

システム概略図

※GitLab はすでに構築済みのものを使用

  1. Runner がパイプラインを確認(これは定期的に行われている)
  2. GitLabへpushするタイミングでRunnerがExecutorにパイプライン実行を指示
  3. 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内容
1jar-build-jobbuildmavenを実行しjarファイルを作成
2image-build-jobbuilddocker imageをビルド
3deploy-jobdeployビルドしたdocker imageをコンテナレジストリにプッシュ
4cleanup-jobcleanup不要な 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 インストール
    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 に環境変数を設定します。

#変数名内容
1AWS_ACCOUNTAWSのアカウントID
2AWS_IAM_USER_IDIAMユーザー
3AWS_DEFAULT_REGIONAWSのデフォルトリージョン
4AWS_ACCESS_KEY_IDAWSアクセスキー
5AWS_SECRET_ACCESS_KEYAWSシークレットキー

[設定] → [CI/CD]

 

[変数を展開]

 

[変数を追加]

 

[キーと値を入力] → [変数を追加]

 

実行結果

それではEC2のターミナルでRunnerを実行してみます。

gitlab-runner run
  • jar-build-job
  • image-build-job
  • deploy-job
  • cleanup-job

終わりに

今回は GitLab CI で初めてパイプラインを作成し、実際に動かすところまで確認しました。実際に動くパイプラインを作れたことで、CI/CD の仕組みやメリットを少しずつ理解できたように思います。

次回はパイプラインを改善していきます。

--------------------------
開発支援・技術研修のご要望・ご相談はこちらから
--------------------------
【この技術ブログを読んだエンジニアの皆様へ】
カサレアルブログをお読みいただき、ありがとうございます!

私たちは、常に新しい技術に挑戦し、ユーザーのニーズに応えるサービスを提供しています。
もし、当社の技術への情熱や、会社・チーム・社員の雰囲気に共感いただけたなら、
ぜひ私たちと一緒に働きませんか?
現在、株式会社カサレアルでは事業拡大に伴い、新たな仲間となるエンジニアを積極的に募集しています。

少しでも興味をお持ちいただけましたら、まずは弊社のことを知っていただけると嬉しいです。
▼採用サイト
https://www.casareal.co.jp/recruit/career
▼社員インタビュー
https://hrmos.co/pages/casareal/jobs/0000016
▼エンジニアの仲間になる! エントリーはこちらから
https://hrmos.co/pages/casareal/jobs

皆様のエントリーを心よりお待ちしています!

EVM スケジュール管理ノススメ

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

コメント ※

名前 ※

メール ※

サイト