Bitbucket Pipelinesを使ってrsyncによるデプロイを設定してみた

### 現状
自分が仕事で管理しているとあるサーバでのデプロイ方法は、そのサーバにログインしてデプロイ用のシェルスクリプトを実行することで実現しています。

そのデプロイ用のシェルスクリプトでは

1. 作業用ディレクトリを作成
1. 作業用ディレクトリ内でgit pullを実行して本番用のソースコードをダウンロード
1. 本番用のソースコードをrsyncでwebサーバのDocumentRoot配下にコピー
1. 作業用ディレクトリを削除 

といった手順でデプロイが行われます。

### 今回のゴール
デプロイ対象のソースコードはBitbucketで管理しているので、今回は「[Bitbucket Pipelines](https://www.atlassian.com/ja/software/bitbucket/features/pipelines)」を使うことでデプロイ対象ブランチにpushされたタイミングでデプロイ（[rsyncのパイプ](https://bitbucket.org/atlassian/rsync-deploy/src/master/)を利用）が行われるように設定してみます。

### Bitbucket Pipelines機能の有効化

Bitbucketのリポジトリで初めてPipelinesを利用する場合は、Pipelinesの機能が無効化されていますので、まずは有効化する必要があります。

「Repository settings」の画面を開きます。
![スクリーンショット_2020-12-24_11_29_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/a1b90fa6-8a33-fb7d-3fb7-fd54628f4f40.png)

PIPELINESのメニューから「Settings」を選択して、「Enable Pipelines」をクリックして有効化します。
![スクリーンショット_2020-12-24_11_33_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/5f423dfb-5e0c-b756-4378-9e393606256d.png)

有効化するとスイッチが緑色に反転し「Configure bitbucket-pipelines.yml」のボタンが表示されるのでこれで準備OKです。
![スクリーンショット 2020-12-24 11.37.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/a7d79048-b35b-3c04-d3a7-a059870a713b.png)

「Configure bitbucket-pipelines.yml」のボタンをクリックするとリポジトリの「Pipelines」の画面に遷移しますが、bitbucket-pipelines.ymlはまだ作成していないので特に何も起きません。
![スクリーンショット_2020-12-24_11_41_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/96823963-3c6b-f6d5-2e3a-f8763c31ff60.png)

メニューから「[Deployments](https://ja.confluence.atlassian.com/bitbucket/bitbucket-deployments-940695276.html)」を選択すると「[bitbucket-pipelines.yml](https://ja.confluence.atlassian.com/bitbucket/configure-bitbucket-pipelines-yml-792298910.html)」のデフォルト設定が表示されます。
![スクリーンショット_2020-12-24_11_46_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/0f6526d9-d1c1-647c-9a95-ca451e5a3b53.png)

### 設定手順
今回はrsyncの[パイプ](https://ja.confluence.atlassian.com/bitbucket/learn-about-pipes-978200267.html)を使いたいので、「Add Pipes (Integrations)」の「Explore more pipes」をクリックします。
![スクリーンショット_2020-12-24_12_34_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/3fa0efc4-a70c-4d7e-5a1e-fc9dbc256d53.png)

Discover pipesの検索欄で「rsync」と入力するとAtlassianが提供している「[RSYNC Deploy](https://bitbucket.org/atlassian/rsync-deploy/src/master/)」が該当します。
![スクリーンショット_2020-12-24_12_37_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/677a30cb-307b-014b-980c-076045e02f33.png)

「RSYNC Deploy」のパイプをクリックすると設定例が表示されます。Variablesの説明を見るとrsyncのために必要な値がわかりますので適宜これらを設定していきます。
![スクリーンショット 2020-12-24 14.25.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/d10af5ba-a02e-f990-390d-69695a47fbcd.png)

「(＊) = required variable.」の記載の通り「＊」が表示されているSERVER、USER、REMOTE_PATH、LOCAL_PATHは必須項目ですので、このあたりを環境変数として設定します。
もちろんbitbucket-pipelines.yml内に値を直接記述しても構いませんが、デプロイ先のディレクトリやサーバの変更が発生する場合を考慮すると、環境変数に設定しておく方が変更が容易かと思います。

設定は、Configureの「Add variables」から行うか、
![スクリーンショット_2020-12-24_14_21_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/3fdaf1e7-8595-b439-fab9-aca2abb84344.png)
もしくは、「Repository settings」の「Repository variables」から行います。
![スクリーンショット_2020-12-24_14_22_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/03c4dd52-0ce1-6ad3-fe6c-46c806845843.png)

デプロイ先のサーバアドレスなど同じ環境変数名でもデプロイ先の環境毎によって変数の値を変更したい場合があるかと思います。
そういった場合は、「Repository settings」の「Deployments」から環境毎に設定可能です。
![スクリーンショット_2020-12-25_10_06_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/3b01fb97-893d-4f70-0baf-c11f6d0cbbf4.png)

デプロイサーバへSSHするための鍵の設定は「Repository settings」の「SSH keys」から行います。
新規に作成する場合は「Generate keys」、既存の鍵を利用する場合は「Use my own keys」を選択します。
![スクリーンショット_2020-12-24_17_12_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/7d9e922f-1fec-b487-c62c-85dd16928319.png)

今回は既存の鍵を利用するので「Use my own keys」をクリックして設定画面を開き、秘密鍵と公開鍵の入力が終わったら「Save key pairs」をクリックします。
![スクリーンショット 2020-12-24 17.56.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/36f248f8-8cbe-1ef6-b57b-af30d9af7eb5.png)

保存されるとこのように表示が切り替わります。
![スクリーンショット_2020-12-24_17_51_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/0d9ba7ba-7098-6b51-c3ae-b1c5c22d3bb2.png)

「Host address」の欄は「サーバアドレス:ポート番号」の形式で入力して「Fetch」ボタンをクリックします。
![スクリーンショット 2020-12-24 17.57.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/8e050ee4-354a-88ab-81b0-d2e2f4a34192.png)


※デプロイ先のサーバでIP制限を行っている場合は「[What are the IP addresses to configure a corporate firewall?](https://support.atlassian.com/bitbucket-cloud/docs/what-are-the-bitbucket-cloud-ip-addresses-i-should-use-to-configure-my-corporate-firewall/)」のページに記載されている「Valid IP addresses for Bitbucket Pipelines build environments」のIPからのアクセスを許可しておく必要があります。

fingerprintが表示されたら「Fetch」ボタンのラベルが「Add host」に切り替わるのでクリックします。
![スクリーンショット_2020-12-24_17_38_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/508060dd-8e1c-a259-245c-3b2dcec5610c.png)

Host addressとFingerprintがこのように表示されたら鍵の設定は完了です。
![スクリーンショット_2020-12-24_17_40_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/446a438a-dd2e-e990-70fd-9660cef27ea3.png)

ここまで準備ができたらあとはリポジトリの直下に「bitbucket-pipelines.yml」を準備するだけです。
「[RSYNC deploy](https://bitbucket.org/atlassian/rsync-deploy/src/master/)」のREADMEに記載されているExamplesのコードを参考にしつつ、以下のような内容にしました。
今回は「masterブランチ」にpushされると「deployment: Staging」の環境変数の内容を元にステージング環境へデプロイ(rsync)するという設定になっています。
今後、本番環境へのデプロイ設定を追加する場合は[branchesの下に「productionブランチ」に関する内容を追加するとよい](https://ja.confluence.atlassian.com/bitbucket/branch-workflows-856697482.html)でしょう。

```yaml:bitbucket-pipelines.yml
image: atlassian/default-image:2

pipelines:
  branches:
    master:
      - step:
          deployment: Staging
          script:
            - pipe: atlassian/rsync-deploy:0.4.4
              variables:
                USER: $RSYNC_USRE
                SERVER: $RSYNC_SERVER
                REMOTE_PATH: $RSYNC_REMOTE_PATH
                LOCAL_PATH: $RSYNC_LOCAL_PATH
                DEBUG: 'true'
                SSH_PORT: $RSYNC_SSH_PORT
                EXTRA_ARGS: $RSYNC_EXTRA_ARGS
```

Pipelinesの処理に成功すると以下のような表示になります。

Pipelines（一覧画面）
![スクリーンショット_2020-12-25_16_11_42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/db2bfa13-c76d-f4c2-e086-b64d47da1989.png)

Pipelines（詳細画面）
![スクリーンショット_2020-12-25_16_11_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/44bd72ca-bcfa-509d-02b0-d4f136b4c9a6.png)

Deployments（一覧画面）
![スクリーンショット_2020-12-25_16_12_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/03c46dfc-d360-764d-3862-387bb3c671cf.png)

Deployments（詳細画面）
![スクリーンショット_2020-12-25_16_20_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/94fbcef5-b83a-4b56-30f5-3f27d387eb4d.png)


### 参考URL
- [Bitbucket Pipelines とデプロイメント](https://www.atlassian.com/ja/software/bitbucket/features/pipelines)
- [Pipelines を使用したビルド、テスト、およびデプロイ](https://ja.confluence.atlassian.com/bitbucket/build-test-and-deploy-with-pipelines-792496469.html)
- [Bitbucket Pipes integrations](https://bitbucket.org/product/features/pipelines/integrations)