LoginSignup
7
7

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-12-15

アドベントカレンダー駆動開発として、つくりたいと思っていたツール 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 に公開する…といったワークフローなども可能です。

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