qinfengge

qinfengge

醉后不知天在水,满船清梦压星河
github

gitlab のCI/CD パイプラインの初めての体験

CI/CD#

CI/CD の考え方と説明についてはここでは触れませんが、この記事を参照してください。

なぜ GitLab のパイプラインを選ぶのか#

理由は非常にシンプルです。会社のコードは GitLab にホストされており、GitLab の無料枠もかなり高いです。
Jenkinsを選ばない理由も非常にシンプルです。UI が古く、機能は多いですが、リソースを多く消費します。
初心者の場合、Drone も良い選択肢かもしれません。視覚化されたインターフェースがあり、リソース消費も少ないです。

ランナーの登録#

テストや試用の場合は、登録せずに共有のランナーを使用することもできます。
ただし、自分のサーバーにデプロイする場合は、登録されたランナーを使用する必要があります。
ランナーの登録方法は通常 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 で設定ファイルを作成するか、公式のテンプレートを使用できます。

image
設定ファイルの名前は .gitlab-ci.yml で固定されており、プロジェクトのルートディレクトリに配置する必要があります。

image
.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

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。