手順
1. Pipelinesの有効化
Bitbucketの画面左のナビゲーションバーのPipelinesをクリックして、画面下のボタンを押してbitbucket-pipelines.ymlファイルをコミットする。
デフォルトの内容でさっそくパイプラインが動くがどうせ失敗するのでストップをクリックして止める。
この操作はリポジトリに対してadmin権限がないとできないので、持っていない場合は管理者等に言って権限をつけてもらう。
2. bitbucket-pipelines.ymlの内容を修正
コミットされたbitbucket-pipelines.ymlを以下のように修正する。
image: php:7.4-fpm
pipelines:
default:
- step:
script:
- apt-get update && apt-get install -qy git curl libmcrypt-dev mariadb-client unzip
- yes | pecl install mcrypt-1.0.3
- docker-php-ext-install pdo_mysql
- curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
- composer install
- ln -f -s .env.pipelines .env
- php artisan migrate
- php artisan serve &
- sleep 5
- ./vendor/bin/phpunit
- curl -vk http://localhost:8000
services:
- mysql
definitions:
services:
mysql:
image: mysql:8.0
environment:
MYSQL_DATABASE: 'test_db'
MYSQL_RANDOM_ROOT_PASSWORD: 'yes'
MYSQL_USER: 'homestead'
MYSQL_PASSWORD: 'secret'
注意点
PHPUnitは、テストを実行するときの環境変数をphpunit.xmlで上書きできる。
次の手順の.env.pipelinesで環境変数を定義してもphpunit.xmlで上書きされてしまうので、mysqlの環境変数はphpunit.xmlの値に優先して合わせる必要がある。
例えばphpunit.xmlに以下のような記載がある場合はテスト実行時にDB名はtest_dbでアクセスする。.env.pipelinesでDB_DATABASEにいくら他の値を定義してもtest_dbでアクセスする。
<server name="DB_DATABASE" value="test_db"/>
3. .env.pipelinesファイルを作成
ローカルで使ってる .env
をコピーして .env.pipelines
を作成し、以下の環境変数を更新する。
scriptを見て分かる通りこのファイルで定義されている環境変数でテストを実行することになる。
DB_HOST=127.0.0.1
DB_USERNAME=homestead
DB_PASSWORD=secret
bitbucket-pipelines.yml
と .env.pipelines
をCommitしてPushすればテストが実行され、Pipelinesの画面でログが見れる。
上記手順に至るまでにやったこと
公式Bitbucket SupportのLaravel with Bitbucket Pipelinesに書いてある通りにやってみるもエラーが出て出来ず。
1個ずつエラーを解消していった結果、以下の変更が必要だった。
- phpのバージョンを7.4に変更
-
mysql-client
をmariadb-client
に変更 -
mcrypt-1.0.2
をmcrypt-1.0.3
に変更 -
unzip
のinstallを追加
エラー解消のデバッグ方法
ローカルで bitbucket-pipelines.yml
を修正してPushしてPipelinesで実行ログを見て、、、を繰り返してデバッグしても良いが時間がかかってしまうので、ローカルで docker run --rm -it -v $PWD:/var/www/html php:7.4-fpm bash
のようにしてコンテナに入り、scriptの内容を順番に実行していってエラーになったら調べて新たなコマンドを入力して、、、という方法が早い。
CI/CDの辛いところ
このように時が経つとエラーが発生してしまうようになり、実行できなくなることがある。
実際、デプロイをCI/CDで実行しているシステムがあってしばらく改修の必要もなく1年くらいデプロイしてなかったが、プログラム改修することになり、簡単な修正だったので1日もかからずに修正が終わっていざデプロイしようとしたら、CIがコケてデプロイできないという事象に遭遇。結局それを解消するのにすごく時間がかかってしまった。。。
定期的にデプロイできるかどうかを確認してメンテしていくことが必要。
記事投稿日:2020/9/29