ushumpei’s blog

生活で気になったことを随時調べて書いていきます。

BitbucketのPipelinesでmasterブランチにPull Request後、自動デプロイ

いい加減デプロイ自動化しないといけない。

プライオリティ低くなってしまっていて放置気味でしたが、毎回サーバーに入ってgit pullすることに飽きてきました。

BitbucketのPipelinesについて調べたことを書いていきます。

無料で使用できますが月50分までの使用制限があるそうなので、そんなにがっつりは使えない気もします。(2017/10/31 時点)

また、この記事ではPipelinesを使いますが、他の選択肢としてはWebhookとかあります。 その場合サーバー側にエントリポイント作って、POST受け取ってあれこれするという風になるかと思います。 状況に応じてWebhookも検討してみると良いかもしれないです。

概要

BitbucketのPipelinesを使えばリポジトリごとに 特定のブランチへのコミットを検知したタイミング で行いたい処理、テスト実行とか通知とかデプロイスクリプト起動とか、を設定できます。

Pipelinesはコミット検知したら裏側でDocker立ち上げているので、私たちはコンテナ内で起動するコマンドを書いていく感じです。立ち上げるDockerイメージも指定できます。

Pipelinesの使い方は簡単で、 bitbucket-pipelines.ymlというYAMLファイルに記述してレポジトリルートにおいておくと勝手に読んでくれます。

プルリクエストのマージじゃなくて 特定のブランチへのコミットを検知したタイミング でいいの?

とか思ったのですがよく考えたら、デフォルトだとプルリクエストをマージするとマージコミットが生成されるため(fast-fowardでもコミット追加されますし)、 masterブランチの設定を記述しておけば、masterへのプルリクエストが閉じられたら本番環境にデプロイ、とか出来る様になります。なるはずです!

やること

  • Pipelinesの有効化とbitbucket-pipelines.ymlの記述
  • デプロイ用ユーザーを作成
  • deploy.shの記述

今回は最小限、デプロイだけです。テストとかロールバックとかについては考えてないので、お気をつけください。

Pipelinesの有効化とbitbucket-pipelines.ymlの記述

Bitbucketへ行き、対象のリポジトリ管理画面の「Settings > Pipelines > Settings」からPipelinesを有効化します。

(リファレンスは次です。参考ページ)

YAMLを書きます。私は次のように記述しました。Dockerイメージは現在使っているサーバーに合わせてcentosにしています。sshできるようにしてデプロイスクリプトを叩くだけです。スクリプトは後で書きます。

image: centos:latest

pipelines:
  branches:
    master:
      - step:
          name: Deploy
          script:
            - yum -y install openssh-clients
            - ssh -p $SERVER_PORT $DEPLOY_USER@$SERVER_IP bash < deploy.sh

$SERVER_PORT, $DEPLOY_USER, $SERVER_IPなどの環境変数を、 「Settings > Pipelines > Environment variables」 から設定します。参考

作成したYAMLファイルをどうにかmasterに取り込んでください。好きな方法でいいです。add, commit, pushとか。

デプロイ用ユーザーを作成

デプロイサーバー -> Bitbucket

デプロイサーバーからBitbucketのリポジトリにアクセスするユーザーを作成します。サーバーに接続してbitbucketユーザーを作成します。($DEPLOY_USERと同じもの)

次に新しいユーザーのSSHキーペアを作成してください、これはBitbucketからgit pullするときに使用します。参考: Creating SSH keys

Bitbucketのサイトから作成した公開鍵を、リポジトリのデプロイキーに設定します。

このユーザーでリモートリポジトリにアクセス(fetchとか)できたら成功です。

Pipelines -> デプロイサーバー

PipelinesのDockerコンテナからデプロイサーバーにssh接続するために、BitbucketからSSHキーペアを作成します。参考: Use SSH keys in Bitbucket Pipelines

「Settings > Pipelines > SSH keys」 からキーペアを作成してください。

サーバーに戻り、先ほど作ったユーザーの~/.ssh/authorized_keysに公開鍵を貼り付けます。

またsshが困らないように、この画面の下部にある Known hosts の追加も行っておきましょう。(ポート付きの場合XXX.XXX.XXX.XXX:PORT)

deploy.shの記述

#!/bin/bash

REPOSITORY_PATH=/repository/path # 適当に変えてください

cd $REPOSITORY_PATH
git pull

リポジトリパスに移動してgit pullするだけのスクリプトです。注意としては、リポジトリのブランチが常にmasterになっていないと予期せぬ挙動が起こると思います。

完了

適当にブランチ切って修正してコミットしてプッシュしてプルリクエストしてマージして、Pipelinesメニューからタスクが実行されているのが確認できるかと思います。

一旦流れを作っておけば、後からテストを追加とかもできるはずなので、一歩前進というところです。

内容に関して何かございましたらお知らせいただきたいです。こっちの方がいい、ここ間違っている、これめっちゃ危ない、根本的に勘違いしている、ちゃんとリファレンス読みなさい、など指摘いただけると大変助かります。

ハマった

  • リポジトリの権限
    • 私のケースではサーバーに、すでに別ユーザーでクローンしたリポジトリがあったため、新しいユーザーでは更新系のgit操作ができない状態になってました。今回はオーナーを再帰的に変更して誤魔化しました。
  • Permission denied
    • ssh-agentが止まっているとか
    • ~/.ssh周りの権限とか所有者が適切ではなかったり
    • どの時点での権限不足なのか、サーバー3つ(Pipelines, Deploy, Bitbucket)なのでわかりにくかった
  • Pipelinesを使い始める順番
    • Bitbucketサイトからアクティベートしないと使えない
    • メニュー直下のPipelinesはチュートリアル形式で混乱したので、設定以下のPipelinesで普通にアクティベートした
    • 環境変数などもアクティベート後から設定可能になる