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メニューからタスクが実行されているのが確認できるかと思います。
一旦流れを作っておけば、後からテストを追加とかもできるはずなので、一歩前進というところです。
内容に関して何かございましたらお知らせいただきたいです。こっちの方がいい、ここ間違っている、これめっちゃ危ない、根本的に勘違いしている、ちゃんとリファレンス読みなさい、など指摘いただけると大変助かります。
ハマった
- リポジトリの権限
- Permission denied
ssh-agent
が止まっているとか~/.ssh
周りの権限とか所有者が適切ではなかったり- どの時点での権限不足なのか、サーバー3つ(Pipelines, Deploy, Bitbucket)なのでわかりにくかった
- Pipelinesを使い始める順番