3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GitLab CIで複数のバイナリをリリースする

Last updated at Posted at 2025-03-14

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にして、一つにしてしまうとかもありでしょうが、今回はバラバラのほうが良かったので、こうなりました。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?