koudenpaのブログ

趣味のブログです。株式会社はてなでWebアプリケーションエンジニアをやっています。職業柄IT関連の記事が多いと思います。

Bitbucket Pipelines で PHP のプロジェクトを Deployer する

お久しぶりです。 この半年間 FA:G の沼にはまりかけたりしていましたが、コードもそれなりに書いていました。

IoTのTの字は全くないですが、何故かPHPです。

さて、日ごろから1銭も払わずにGitのプライベートリポジトリを使わせていただいており非常に感謝しているサービスに Bitbucket Cloud があります。

いい加減ローカルマシンで Deployer のデプロイコマンドを叩くのに飽きたので、いわゆるCDしてやろうかと CircleCI と接続できる Bitbucket にリポジトリを持ってきました。

そうしたら、Bitbucketにもコードパイプラインが用意されていたんですね。 んじゃぁ、デイリーアクセス数十ヒットのこのBlogで紹介してユーザー数増加に貢献してやろうと思った次第です。

bitbucket-pipelines.yml

Bitbucket Pipelines は他のCIサービスよろしく、リポジトリ直下に bitbucket-pipelines.yml というCI設定を宣言したファイルを配置することで動作するようです。

詳しくはドキュメントを読んでください。 自分はろくすっぱ読まずに Try And Error してデプロイしました。

なので、以下の設定は相当に眉唾です。

皆さんは default(リポジトリ内容変化時に常に行われるビルド)にはいい感じのテストタスクを宣言してください。

この例では staging ブランチにPRがマージされたらデプロイ、のようなことを宣言しています。

deploy.php が既定の位置に配置されていれば -f 引数は要らないですね。

image: php:7.1.1

pipelines:
  default:
    - step:
        script:
          - ls -la ~/.ssh
          - cat ~/.ssh/config
  branches:
    staging:
      - step:
          script:
            - apt-get update
            - apt-get install ssh -y
            - curl -LO https://deployer.org/deployer.phar
            - chmod +x deployer.phar
            - ./deployer.phar -f=./front/deployer/deploy.php deploy staging -v
            - ./deployer.phar -f=./admin/deployer/deploy.php deploy staging -v

Errors

私が見たエラーたちです。

Deployerのバージョンが上がっていた

[Error] Call to undefined function Deployer\server()                           
 #0                                                                             
 phar:///opt/atlassian/pipelines/agent/build/deployer.phar/src/Deployer.php(309)
 : require()                                                                    
~~                    
 require('phar:///opt/atl...')                                                  
 #5 {main}                                                                      

ハァ? という感じのエラーが吐かれて意味不明だったのですが、 何のことはなくDeployerのバージョンが上がった際に破壊的な変更がいい感じに行われていただけでした。

さすがメジャーバージョンアップデート、後方互換なんて一切気にしてないぜ。

Servers to Hosts server($name, $hostname) to host($hostname)

ssh コマンドがインストールされていない

[Deployer\Exception\InitializationException]  
Failed to initialize ssh multiplexing         

の様なエラーが出たんですね。 image の選定がイケてないのかもしれませんが、Deployerを動かすんだから、とPHPのビルド向けの php:7.1.1 を指定したら、ssh コマンドがインストールされていないようでした。

ssh コマンドのインストールを宣言して回避しました。 なお apt-get の update を行っておかないと install には失敗するようです。

別にエラーではないのですが、Pipelinesのビルド時にはリポジトリの設定で指定したSSHキーが以下のように配置されているみたいです。 これによってSSHコマンドのデフォルトに指定した鍵が使用されます。

ls -la ~/.ssh
total 16
drwxr-xr-x. 2 root root 4096 May 26 17:31 .
drwx------. 1 root root 4096 May 26 17:31 ..
-rw-------. 1 root root   56 May 26 17:31 config
-rw-r--r--. 1 root root 1606 May 26 17:31 known_hosts

cat ~/.ssh/config
IdentityFile /opt/atlassian/pipelines/agent/data/id_rsa

known_hosts

にBitbucketが入っていなくて、リモートマシンでの git clone が失敗していました。

いろいろダメだった気がしますが忘れました。

コスト

こんなところでしょうか。

Deployerの実行自体は基本的には以下の3行のスクリプトで行えるので、後はプロジェクトの事情に応じて周辺設定、宣言を適宜行っていけばいいと思います。

            - curl -LO https://deployer.org/deployer.phar
            - chmod +x deployer.phar
            - ./deployer.phar deploy

正直PipelinesでDeployerするのにかけた時間と毎回コマンドを手で叩く時間の総計では、前者の方が長い結果になる気がするのですが、叩かなくてよくなる、というのはいいですね。

Bitbucket Server(Stash)にもくっついてこないかなぁ? 標準添付だと何かと便利そうなのだけれどコンテナを実行できる環境とかないと無理だし、ないかな。欲しいんだけどなぁ。

そんな感じでした。