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

【初心者向け】bitbucket-pipelinesのキーワードとTips

More than 1 year has passed since last update.

Ola!!
SET(Software Engineer in Test)Gの@mochioです。
みなさんはCI/CDやってますか!?

CIツールといえば「CircleCI」や「Jenkins」が有名だと思いますが、
ここではAtlassian謹製の「bitbucket-pipelines」を紹介したいと思います。

fukabori.fmのCI/CDの回でも話されていたとおり、
開発フローの序盤で導入するのが一番効果的だと思ってます。

導入に関してはこちらの記事を参考にしていただければと思います。

キーワードとは

CIの設定はbitbucket-pipelines.ymlにyaml形式で書いていくのですが、
キーワードはそのパイプライン(操作の流れ)において何を行うかを記述するものになります。
yaml上ではkeyにあたる部分です。
よく使うものをリストアップして使用例とともに紹介します。

image

CI・CDを回すコンテナイメージを指定します。
Docker Hubで公開されているイメージを使用したり、
プライベートイメージも使ったりできます。
すべてのstepで同一のイメージを使う場合は一番上に記述すれば良いです。
step以下に記述することもでき、使用するimageを分けることもできます。

使用例

Docker Hub
image: python:3.6

pipelines:
  default:
    - step:
Docker Hub(Private)
image: python:3.6
  name: account-name/watashino-openjdk:8
  username: $DOCKER_HUB_USERNAME
  password: $DOCKER_HUB_PASSWORD
  email: $DOCKER_HUB_EMAIL

pipelines:
  default:
    - step:
Amazon Container Registory
image: python:3.6
  name: <aws_account_id>.dkr.ecr.<region>.amazonaws.com/openjdk:8
  aws:
    access-key: $AWS_ACCESS_KEY
    secret-key: $AWS_SECRET_KEY

pipelines:
  default:
    - step:
step毎にimageを分けたい
pipelines:
  default:
    - step:
        image: python:3.6
    - step:
        image: ruby:2.5

$変数名はbitbucket側で環境変数として設定することができる変数になります。
センシティブな情報は全部そちらで管理しましょう。
管理方法はこちらを参照してください。

pipelines

パイプラインを定義します。
pipelines以下にstepを宣言して、実行の詳細を記述していきます。

step

stepを宣言してから操作を記述していきます。

使用例

image: ruby:2.5

pipelines:
  default:
    - step:
        script: echo "unittestします"
    - step:
        script: echo "rubocopかけます"

default

defaultを宣言すると、すべてのブランチがCIの実行対象となります。
実行されるタイミングはブランチのpush時です。

使用例

image: python:3.6

pipelines:
  default:
    - step:
        script: echo "全部のブランチ対象だよー"

branches

特定のブランチをCIの実行対象とすることができます。
アスタリスクを使うこともできます。

使用例

developブランチを指定するとき
image: python:3.6

pipelines:
  branches:
    develop:
      - step:
          script: echo "developだけですよ"
featureブランチを指定するとき
image: python:3.6

pipelines:
  branches:
    feature/*:
      - step:
          script: echo "featureがつくブランチが対象です"

tags

特定のgitタグに紐づくブランチを指定できます。

使用例

image: python:3.6

pipelines:
  tags:
    enhancement:
      - step:
          script: echo "enhancementタグがついているブランチのみです"

parallel

並列でJobを実行したいときに使います。

使用例

image: ruby:2.5

pipelines:
  default:
    - parallel:      # 以下のスクリプトは並列実行されます!
        - step:
            name: Integration 1
            script:
              - ./integration-tests.sh --batch 1
        - step:
            name: Integration 2
            script:
              - ./integration-tests.sh --batch 2

name

stepに名前をつけることができます。
テスト実行、静的解析実行、デプロイ実行など場合によって分けたいですね。

使用例

image: ruby:2.5

pipelines:
  branches:
    develop:
      - step:
          name: Execution unit testing

trigger

上の方でpush時に実行されると言いましたが、
triggerを使えばマニュアル実行に変更することもできます。
デプロイタスクなどはこちらにしたほうが良いかもしれません。
triggerを使用しない場合はauto(pushがトリガー)になるので注意。

使用例

image: ruby:2.5

pipelines:
  branches:
    develop:
      - step:
          trigger: manual
          name: deploy
          script: sh deploy_shimasu.sh

deployment

デプロイステップには使うようにしましょう。
deploymentsダッシュボードで扱えるようになります。
deploymentsの詳細に関してはまた別記事に書こうかなーと思ってます。

使用例

image: ruby:2.5

pipelines:
  branches:
    develop:
      - step:
          deployment: test
          script: echo "start test deploy"

size

使用するコンテナのサイズを変更できます。
1xもしくは2xが使えるようです。
2xにした場合ビルド時間も二倍でカウントされるので注意
(bitbucketはCircleCIと課金体系がちょっと違い、ビルド時間に対して料金が変動します。)

使用例

image: ruby:2.5

pipelines:
  branches:
    develop:
      - step:
          size: 2x
          script: echo "start many tests"

script

コンテナ内で実行したいコマンドを記述します。

使用例

image: rails:5.0.1

pipelines:
  branches:
    develop:
      - step:
          script: rspec spec/

artifacts

stepでの成果物を後のstepで使用するために使います。

使用例

image: python:3.6

pipelines:
  branches:
    develop:
      - step:
          script: rspec spec/ –format html:test_result.html
          artifacts: test_result.html
      - step:
          name: report test result

options

パイプラインすべてに適用できるオプションを設定します。
現状max-timeしかないようです。

max-time

max-timeは一つのstepの最大時間を設定できます。
単位は分なので注意

使用例

options:
  max-time: 60
pipelines:
  default:
    - step:
        name: Sleeping step
        script:
          - sleep 120m
    - step:
        name: quick step
        max-time: 5
        script:
          - sleep 120m #this step will timeout after 5 minutes

上の例のようにstep内に記述することでoptionに記述したものの掛け算をして使うことができます。

clone

コンテナにクローンするときの設定を記述します。

depth

depthはどこまでのコミットを含めてクローンしてくるかを設定できます。
デフォルトは50です。

使用例

clone:
  depth: 5       # include the last five commits

pipelines:
  default:
    - step:
        name: Cloning
        script:
          - echo "Clone all the things!"

definitions

複数コンテナを連動させたいときや、キャッシュをとっておきたいときはdefinitionsで定義します

services

複数コンテナを連動させて使いたいときはservicesで名前を定義してパイプラインで使うことができます。

使用例

pipelines:
  branches:
    master:
      - step:
          image: redis
          script:
            - redis-cli -h localhost ping
          services:
            - redis
            - mysql
definitions:
  services:
    redis:
      image: redis:3.2
    mysql:
      image: mysql:5.7
      environment:
        MYSQL_DATABASE: my-db
        MYSQL_ROOT_PASSWORD: $password

caches

ビルドの度に依存関係を毎回インストールするのは、時間もかかりますし料金もかかります。
cachesを使うことでキャッシュをとっておくことができます。

使用例

image: ruby:2.4.0
pipelines:
  default:
    - step:
        caches:
          - bundler #cache is defined below in the definitions section
        script:
          - bundle install --path vendor/bundle

definitions:
  caches:
    bundler: vendor/bundle

Tips

ビルドコンテナ内からサーバにssh接続をしたいとき

CI自体はbitbucketが管理するクラウド上のコンテナで動きます。
そのため、デプロイ先のサーバ内でなにかしらのスクリプトを動かしたいときは、
そのコンテナから接続できるようにする必要があります。

  1. 「設定」→「PIPELINES」→「SSH keys」 スクリーンショット 2018-12-18 13.49.56.png
  2. Generate Keys スクリーンショット 2018-12-18 13.51.38.png
  3. 公開鍵が発行されるので、デプロイ先のサーバ内で公開鍵認証設定をする。 https://qiita.com/nnahito/items/dbe6fbfe347cd66ae7e6
  4. 接続!

ちなみにsshのオプションでよくやる「-i .ssh/kagidayo.pub」みたいな指定は要りません。
bitbucketがうまくやってくれます。

デプロイ先サーバにIP制限をかけたい

CircleCIだとIPが公開されていないので、
cliを使ってごにょごにょやる必要があり少し手間ですよね。
bitbucket-pipelinesだとこちらにbitbucket cloudのIPが公開されていますので、
接続許可設定をしてあげればよいです。

まとめ

自分で作ったパイプラインが動いてグリーンになるのは面白いし気持ち良いので
CIをどんどん導入していきましょう!
次回は実践編を書きたいと思います!

明日は食を愛し食に喰われた男@suzu-4が何か伝えます。

Salud!!🌵

参考/引用

https://ja.confluence.atlassian.com/bitbucket/configure-bitbucket-pipelines-yml-792298910.html

mochio
lifull
日本最大級の不動産・住宅情報サイト「LIFULL HOME'S」を始め、人々の生活に寄り添う様々な情報サービス事業を展開しています。
https://lifull.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