Bitbucket PipelinesでプッシュをトリガーにしてWebサイトのFTPアップロードを自動化する



Webサイトを更新する際、FTPが必要な事がまあまあある。

今回は、ソースをBitbucketで管理している事が条件だが、gitのプッシュをトリガーとして様々な処理ができる、Bitbucket Pipelinesを利用しFTPで指定のサーバーへアップロードする。

Bitbucketの無料プランでも月の使用時間制限があるが、一応利用することが出来る。

手順

bitbucket-pipelines.ymlの作成

リポジトリの直下にbitbucket-pipelines.ymlというファイルを作成し、以下を記述してプッシュする。
ここではmasterブランチへのプッシュをトリガーとする。

image: samueldebruyn/debian-git
pipelines:
   branches:
     master:
       - step:
           script:
             - echo "Pipeline Init"
             - apt-get update
             - apt-get -qq install git-ftp
             - git ftp init --user $FTP_USERNAME --passwd $FTP_PASSWORD $FTP_PATH
             - echo "git-ftp done"

BitbuketのサイトでPipelinesの設定

Bitbucketのサイトの該当リポジトリの、
設定>PIPELINESのSettingsからEnable Pipelinesをオンにする。

Enable Pipelinesをオン

次に、設定> PIPELINESのRepository variablesに以下を追加。

FTP_USERNAME:FTPのユーザー名
FTP_PASSWORD:FTPのパスワード
FTP_PATH:FTPの接続先

FTPの接続先はホスト名に続けてアップロード先のパスも記述する。
Securedをチェックすると伏せ字になるので隠したいものはチェックする。

Repository variablesにFTP接続情報を追加

ここで入力した情報はbitbucket-pipelines.ymlに記述しているgit ftpのFTP接続に利用される。

.git-ftp-ignoreの作成

リポジトリ直下に.git-ftp-ignoreというファイルを作成し、アップロード対象外にしたいファイルを記述する。
とりあえず以下のようにした。

.git*
bitbucket-pipelines.yml

Webサイトのデータをプッシュ&bitbucket-pipelines.ymlの修正

あとはWebサイトのデータをプッシュすると、FTP接続先に指定したサーバーにファイルがアップロードされる。

進行状況はPiplinesの該当のコミットから確認出来る。

初回は多少時間がかかるが、以降はbitbucket-pipelines.yml (11行目) のgit ftp initをgit ftp pushに変更してプッシュすれば、コミットの差分だけがアップロードされるようになり高速化される。

image: samueldebruyn/debian-git
pipelines:
  branches:
    master:
      - step:
          script:
            - echo "Pipeline Init"
            - apt-get update
            - apt-get -qq install git-ftp
            - git ftp push --user $FTP_USERNAME --passwd $FTP_PASSWORD $FTP_PATH
            - echo "git-ftp done"

サーバーに作成される.git-ftp.logというファイルにアップロードされた最後のコミットが記録されているので、削除しないようにする。

対象のファイルのみアップロードされた。

トリガーを手動にする

プッシュしたタイミングではなく、手動で作動させたい場合は、bitbucket-pipelines.ymlを以下のようにする。

image: samueldebruyn/debian-git
pipelines:
  branches:
    master:
      - step:
          script:
            - echo "Pipeline Init"
      - step:
          name: Deploy to Production
          deployment: production
          trigger: manual
          script:
            - echo "Deploy to Production Init"
            - apt-get update
            - apt-get -qq install git-ftp
            - git ftp push --user $FTP_USERNAME --passwd $FTP_PASSWORD $FTP_PATH
            - echo "git-ftp done"

プッシュ後にBitbucketのサイトの該当リポジトリの Pipelines>該当のコミット のDeplayを押すことで処理されるようになる。

注意点

Bitbucketの無料プランではPipelinesの使用時間が月50分までとなっている。
ファイルが多くアップロードに時間がかかるものが多いとすぐ50分に達してしまうと思う。
ファイルが少なく軽いもので20~30秒かかる感じ。

制限を超えた場合Pipeline自体が動作しなくなる。その場合、1000分を10ドルで追加するか、月15ドル~のスタンダードプランに変更して制限を2500分にする必要がある。

まとめ

最近はAWSのS3とCloudFrontで構成されているサイトも多く、Bitbucket PipelineでS3へのアップロードとCloudFrontのキャッシュ削除を自動化しようとしていて、FTPも出来ることを知った。
S3以外のWebサーバーとCloudFrontの構成でもCloudFrontのキャッシュ削除処理を入れたり出来るので便利。

規模が大きくなければ無料プランでも使える気がするので便利。



関連記事