CI/CD#
CI/CD の理念と説明についてはここでは触れませんが、この記事を参照してください。
なぜ GitLab のパイプラインを選ぶのか#
理由は非常にシンプルです。会社のコードは GitLab にホストされており、GitLab の無料枠もかなり高いです。
Jenkinsを選ばない理由も非常にシンプルです。UI が古く、機能は多いですがリソースを多く消費します。
初心者の場合、Drone も良い選択肢かもしれません。視覚的なインターフェースがあり、リソース使用量も少ないです。
Runner の登録#
テストや試用の場合は、登録せずに共有のランナーを使用することもできます。
ただし、自分のサーバーにデプロイする場合は、登録されたランナーを使用する必要があります。
通常、ランナーの登録方法は 2 つあります。
docker
docker run -d --name gitlab-runner --restart always \\n -v /home/jk/docker/gitlabRunner/config:/etc/gitlab-runner \\n -v /var/run/docker.sock:/var/run/docker.sock \\n gitlab/gitlab-runner:latest
Docker の方法で登録されたランナーは、ホストレベルで新しいコンテナをデプロイすることはできません。dind(docker in docker)は実際には追加のレイヤーを追加するため、構築には適していますが、デプロイには適していません。
shell
sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
sudo chmod +x /usr/local/bin/gitlab-runner
sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
sudo gitlab-runner start
sudo gitlab-runner register --url https://gitlab.com/ --registration-token {gitlabのランナー登録トークン}
sudo gpasswd -a gitlab-runner docker
シェルモードでは、ホストマシンで Docker イメージをプルして実行することができます。これはサービスのデプロイに適しています。
詳細なインストール手順については、公式ドキュメントを参照してください。
設定ファイルの作成#
GitLab プロジェクトの Build ---> Pipeline Editor で設定ファイルを作成するか、公式のテンプレートを使用できます。
設定ファイルの名前は .gitlab-ci.yml
で固定されており、プロジェクトのルートディレクトリに配置する必要があります。
.gitlab-ci.yml
には指定されたキーワードとフォーマットがあります。公式の構文ドキュメントで確認できます。
よく使用されるキーワードは次のとおりです。
キーワード | 説明 | 使用例 |
---|---|---|
image | パイプラインで使用する Docker イメージを指定します。 | image: docker:latest |
services | 追加のサービスイメージを指定します。 | services:- name: docker:dind |
variables | グローバル変数を定義します。 | variables:PORT: 9005 |
stages | パイプラインのステージを定義します。 | stages:- build - docker-build |
tags | このステージで使用するランナーを指定します。 | tags: - shell-node |
artifacts | ジョブの成果物。ビルドコマンドを使用するとファイルが生成され、このキーワードでビルド後のファイルを保存できます。 | artifacts:paths:- target/jk_testing-1.0-SNAPSHOT.jar |
script | このステージで実行するコマンドスクリプトを指定します。 | script:- mvn clean install |
もちろん、GitLab は多くの変数を提供しています。
たとえば、$CI_COMMIT_SHORT_SHA
は現在のコミットの短い SHA を表し、variables
で定義したカスタム変数を使用することもできます。
すべての変数については、公式ドキュメントを参照してください。
プロジェクトを Docker イメージにパッケージ化するために Dockerfile
を使用することを強くお勧めします。これにより、プロジェクトの管理とデプロイが容易になります。
例#
以下では、spring boot
プロジェクトを使用して設定ファイルを説明します。コメントをできるだけ追加します。
# パイプラインで使用するDockerイメージを指定します
image: docker:latest
# 追加のサービスイメージを指定します
services:
- name: docker:dind
# パラメータの定義
variables:
PORT: 9005
APPLICATION_NAME: test
# パイプラインのステージを定義します
stages:
- build
- docker-build
- deploy
- notify
# ビルドステージ:Mavenビルドを実行します
build:
image: maven:3.6.3-openjdk-8
stage: build
# 実行スクリプトを定義します
script:
- mvn clean install
artifacts:
paths:
- target/jk_testing-1.0-SNAPSHOT.jar
# Dockerビルドステージ:Dockerイメージをビルドしてレジストリにプッシュします
docker-build:
stage: docker-build
script:
- docker build -t $APPLICATION_NAME .
- docker tag $APPLICATION_NAME $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
# デプロイステージ:イメージのローリングアップデート
deploy:
stage: deploy
# シェルランナーを指定します
tags:
- shell-node
script:
# 複数のスクリプトを定義します
# 名前にtestが含まれるコンテナを停止し、コンテナとイメージを削除します
# 最新のイメージをレジストリからプルして実行します
- >
if [[ $(docker ps -q -f name=$APPLICATION_NAME) ]]; then
docker stop $APPLICATION_NAME 2>/dev/null;
docker rm $APPLICATION_NAME 2>/dev/null;
docker images | grep test | awk '{print $3}' | xargs -I {} docker rmi {};
fi
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker pull $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
- docker run -d -p $PORT:9004 --name $APPLICATION_NAME $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
# ビルド失敗時の通知メッセージ
notifyFailWeChat:
stage: notify
script:
- apk add curl
- curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key= {WeChatのトークン}' -H 'Content-Type:application/json' -d "{\"msgtype\":\"markdown\",\"markdown\":{\"content\":\"小程序项目构建结果:<font color=\\"warning\\">失败</font>\n>本次构建由:$GITLAB_USER_NAME 触发\n>项目名称:$CI_PROJECT_NAME\n>提交号:$CI_COMMIT_SHA\n>提交日志:$CI_COMMIT_MESSAGE\n>构建分支:$CI_COMMIT_BRANCH\n>流水线地址:[$CI_PIPELINE_URL]($CI_PIPELINE_URL)\"}}"
# masterブランチでのみ実行するように指定
only:
- master
# 実行タイミングを指定します。ここではパイプラインのビルドが失敗した場合に実行されます
when: on_failure
# ビルド成功時の通知メッセージ
notifySuccessWeChat:
stage: notify
script:
- apk add curl
- curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key= {WeChatのトークン}' -H 'Content-Type:application/json' -d "{\"msgtype\":\"markdown\",\"markdown\":{\"content\":\"小程序项目构建结果:<font color=\\"info\\">成功</font>\n>本次构建由:$GITLAB_USER_NAME 触发\n>项目名称:$CI_PROJECT_NAME\n>提交号:$CI_COMMIT_SHA\n>提交日志:$CI_COMMIT_MESSAGE\n>构建分支:$CI_COMMIT_BRANCH\n>流水线地址:[$CI_PIPELINE_URL]($CI_PIPELINE_URL)\"}}"
only:
- master
when: on_success