Help us understand the problem. What is going on with this article?

コマンドラインツールのビルド〜配布をBitbucket Pipelinesで完結させる

More than 1 year has passed since last update.

アドベントカレンダー駆動開発として、つくりたいと思っていたツール admin-mate-cli を作成しました。その際にBitbucketで完結してビルドから配布まで行えるように工夫したので知見をまとめてみます。

ツール自体はGoで開発しましたが bitbucket-pipelines.yml で指定するDockerのイメージを切り替えれば他言語でも応用可能です。

概要

次のようなワークフローを想定しています。

  • 各開発者: ローカルでは make lint build test で開発を進める
    • コーディング規約の担保
    • ビルド
    • テスト
  • Pipelines - default: プッシュするとローカルと同じコマンドを実行してくれる
  • Pipelines - tag - v*: プッシュされたタグが v1.0.0 などの形式だった場合にリリース作業をしてくれる
  • Pipelines - custom - manual-release: 任意のコミットに対しても手動リリースが行える

Pipelinesのベストプラクティス

すべての出発点となる bitbucket-pipelines.yml で工夫できる点を紹介します。

bitbucket-pipelines.yml
image: golang:1.11.2-alpine3.7

pipelines:
  default:
    - step:
        script:
          - apk add build-base git bash
          - ./script/ci.sh init
        caches:
          - docker
          - apk
        services:
          - docker
# ...

definitions:
  caches:
    apk: /etc/apk/cache

設定項目について詳しくはドキュメント Configure bitbucket-pipelines.yml も参照してみてください。

Pipelinesからリリースを行う

次のようなスクリプトでリポジトリ上からビルド済みのファイルをBitbucketにアップロードできます。

distribution.sh
API_ENDPOINT="https://api.bitbucket.org/2.0/repositories/${BITBUCKET_REPO_OWNER}/${BITBUCKET_REPO_SLUG}/downloads"
FILE_SUFFIX="$(echo ${BITBUCKET_TAG:-$BITBUCKET_COMMIT} | sed -e 's#\.#-#g')"

for FILE_PATH in $(find . -type f ! -name '.*'); do
  FILENAME="$(basename ${FILE_PATH})"
  ARTIFACT="./${BITBUCKET_BUILD_NUMBER}_${FILENAME}_${FILE_SUFFIX}.zip"
  zip -r "${ARTIFACT}" "${FILE_PATH}"
  curl -LX POST --user "${BB_AUTH_STRING}" "${API_ENDPOINT}" --form files=@"${ARTIFACT}"
done

配布後にはリポジトリのサイドバー "Downloads" から公開したファイルがダウンロードできるようになります。

Screenshot 2018-12-15 21.42.34.png

また、ローカルでGitのタグ付けをしてからプッシュすると自動でリリースまで行うようにもできます(具体的には./script/ci.sh release にてビルド完了後に distribution.sh を実行している)。

bitbucket-pipelines.yml
  tags:
    v*:
      - step:
          name: New version release
          script:
            - apk add build-base git bash zip curl
            - ./script/ci.sh release
          caches:
            - docker
            - apk
          artifacts:
            - pkg/**
          services:
            - docker

あとは検証用に手動リリースが行えるようにしておくと便利です。

Screenshot 2018-12-15 22.06.55.png

bitbucket-pipelines.yml
  custom:
    manual-release:
      - step:
          script:
            - apk add build-base git bash zip curl
            - ./script/ci.sh release
          caches:
            - docker
            - apk
          artifacts:
            - pkg/**
          services:
            - docker

所感

他の多くのCIサービスと異なり、PipelinesはBitbucketに組み込みなので1つのサイトで完結していて動作も素早いのが気に入っています。
また、コンテナ時代に誕生したCIサービスだけあって services で指定するだけでDockerを使えるのも嬉しいです。今回は行っていませんが Dockerfile 自体を github.com/hadolint/hadolint で検証してビルドして Docker Hub に公開する…といったワークフローなども可能です。

ymkjp
人間がコンピューターの仕事を奪うな (˘ω˘ )
https://ymkjp.wordpress.com/
atlassian
Team Up. 次の何かを生み出すために。新しい価値あるモノを創るための、シンプルで徹底的に柔軟性の高いコラボレーションソフトウェアを提供します。
https://ja.atlassian.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした