GitLabでは、CIでビルドしたバイナリをReleaseとして管理することができます。
久しぶりにリリースを作ってみたら色々忘れていたので、備忘録を兼ねて書いてみることにしました。
環境は、GitLab CEを使っています。言うまでもないですが、以下に出てくるYAMLの設定は、.gitlab-ci.yml
の設定になります。
buildを行う
特に変わったことをすることはないのですが、artifactsを設定する必要があります。
compile:
stage: build
script:
- make build
artifacts:
paths:
- bin/*.exe
expire_in: 5 minute
make build
すると、bin/
以下に、Windows用のバイナリが作られるようにしています。
artifacts
に以下の設定があります。
artifacts:
paths:
- bin/*.exe
expire_in: 5 minute
paths
には、artifactsに含みたいものがどこにあるのかを指定します。expire_in
は、消していい時間ですが、今回、CIが動いている間だけの話(buildしてからの後述の作業が完了するまで)なので、5分もあれば十分です。
Package Registoryに登録する
GitLabには、Registryの機能があり、コンテナレジストリなどと同列にパッケージレジストリがあります。
artifactsをパッケージレジストリに登録します。
put_package_registry:
stage: publish
image: alpine:latest
needs:
- job: compile
artifacts: true
rules:
- if: $CI_COMMIT_TAG # Run this job when a tag is created manually
script:
- echo "publish binary"
- apk update && apk add curl
- |
find bin/ -name '*.exe' -printf "%P" | xargs -i curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file bin/{} ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/${CI_PROJECT_NAME}/${CI_COMMIT_TAG}/{};
これで、bin/
以下にある*.exe
ファイルを、パッケージレジストリに登録できました。
実際に登録している処理は、以下ですね。
find bin/ -name '*.exe' -printf "%P" | \
xargs -i curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" \
--upload-file bin/{} \
${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/${CI_PROJECT_NAME}/${CI_COMMIT_TAG}/{};
これが動くのは、compile
が動いているのと、artifactsがあり、タグがついているのも条件です。
needs:
- job: compile
artifacts: true
rules:
- if: $CI_COMMIT_TAG # Run this job when a tag is
リリースを作る
リリースを作るためのCIです。
release_job:
stage: release
image: registry.gitlab.com/gitlab-org/release-cli:latest
rules:
- if: $CI_COMMIT_TAG # Run this job when a tag is created manually
script:
- echo "running release_job"
release:
name: "Release $CI_COMMIT_TAG"
description: "Created using the release-cli $EXTRA_DESCRIPTION" # $EXTRA_DESCRIPTION must be defined
tag_name: "$CI_COMMIT_TAG" # elsewhere in the pipeline.
assets:
links:
- name: "For xxxxx"
url: "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/${CI_PROJECT_NAME}/${CI_COMMIT_TAG}/xxxxx.exe"
- name: "For yyyyy"
url: "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/${CI_PROJECT_NAME}/${CI_COMMIT_TAG}/yyyyy.exe"
最後のassets
で複数のバイナリを1つのリリースに含めています。単に、先程パッケージレジストリへのlinksをartifactsごとに複数書いているだけです。
assets:
links:
- name: "For xxxxx"
url: "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/${CI_PROJECT_NAME}/${CI_COMMIT_TAG}/xxxxx.exe"
- name: "For yyyyy"
url: "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/${CI_PROJECT_NAME}/${CI_COMMIT_TAG}/yyyyyy.exe"
ここだけは、手動で追加する必要がありますが、まぁ、やむなしかなと。もしくは、複数にするのではなくて、zipにして、一つにしてしまうとかもありでしょうが、今回はバラバラのほうが良かったので、こうなりました。