Help us understand the problem. What is going on with this article?

Bitbucket + Symfony2(PHP5.6) + Wercker でCIをする

More than 3 years have passed since last update.

プロジェクトが落ち着いてそろそろCI/CDを導入したいねっていう状況でした。

CircleCIを別案件で使ってた人が近くに居るけどBitbucketではCircleCIをサポートしていないようですので、別のCIを検討する必要がありました。

そこで色々検討した結果Werckerを使ってみることにしました。(無料だし)
しかし、WerckerはPHPをサポートしているけど、Quickstarts に書いてある事項はSymfony向きではないため混乱しました。
また wercker.yml に変更を加えていないのにBuildがfailedになることもありました。(僕は「werckerの機嫌が悪い」って呼んでる)
更にWerckerとWercker2の記述が有りググったときに更に混乱を招きました。

導入方法

前提/状況/目的

前提/状況

  • Bitbucketでバージョン管理してる(状態はプライベート)
  • Composer使ってる
  • PHPUnit(5.4.4)でテストコードが若干あるが網羅率は高くない
    • UnitTestのm
  • Symfony2.6使ってる。(2.7に移行したい) * そのためのテストコードを書いていきたい
  • PHP5.6使ってる
  • MySQL5.6使ってる
  • Docker使っていない
    • 使いたい
    • WerckerはDockerHubのプライベートなやつにも対応できる

目的

  • テストが自動でおこなわれて、PullRequestからその結果が確認(SUCCESS等)したい
    • Push → PR作成 → 自動でテスト がしたい。Push → 自動テストでもいい
  • CDも欲しいけどCIの後で次ステップとして考えているのでCDは一旦後にする

Werckerに登録

  • 画面の案内に従えば特に迷わなかったため省略

wercker.ymlの作成

迷いまくった結果の結果物(wercker.yml)と、その説明をする。

結果物

wercker.yml
box:
  id: voak/symfony2
  tag: latest

services:
  - id: mysql
    tag: 5.6
    env:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_ALLOW_EMPTY_PASSWORD: yes
      MYSQL_RANDOM_ROOT_PASSWORD: no
      MYSQL_DATABASE: symfony
      MYSQL_USER: test
      MYSQL_PASSWORD: test

build:
  steps:

    - script:
      name: install dependencies
      code: |-
        sudo apt-get update
        sudo apt-get install -y git libfreetype6-dev libjpeg62-turbo-dev libmcrypt-dev libpng12-dev unzip
        docker-php-ext-install gd
        docker-php-ext-install iconv mcrypt mbstring pdo_mysql
        curl -L https://phar.phpunit.de/phpunit.phar -o /usr/local/bin/phpunit
        chmod +x /usr/local/bin/phpunit
        curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer

    - script:
      name: composer update ʕ•̬͡•ʔ
      code: composer update

    - create-file:
      name: parameters.yml
      filename: app/config/parameters.yml
      overwrite: true
      content: |-
        parameters:
          database_driver: pdo_mysql
          database_host: $MYSQL_PORT_3306_TCP_ADDR
          database_port: 3306
          database_name: symfony
          database_user: test
          database_password: test
          mailer_transport: smtp
          mailer_host: 127.0.0.1
          mailer_user: null
          mailer_password: null
          locale: ja

    - script:
      name: doctrine shema update
      code: php app/console d:s:u --dump-sql --force

    - script:
      name: doctrine fixtures load
      code: php app/console doctrine:fixtures:load

    - script:
      name: php unit test
      code: phpunit -c app/ src/App/AdminBundle/Tests/

結果物の説明

box

wercker.yml
box:
  id: voak/symfony2
  tag: latest
  • box には使用するDockerイメージを追加する。
  • DockerHubに登録されているイメージを使用する。
    • Privateも使用できるとの情報あり
  • 上記では自前のDockerイメージを用意せずに公開されているSymfony2のDockerイメージを使う例
  • id にはDockerイメージのIDを記載
  • tag にはidで指定したDockerHubで設定されているタグを設定する
    • PHP5.6-fpm がlatestのようなので latestを設定している。 公式ドキュメント Classic wercker.ymlは古いwercker.ymlの記述がある。これは移行作業ができるようにするための案内のためある。注意。
    • wercker/rubyとあり、wercker/phpがあるかもなって思ったら無い。そもそもその記述方法は古かった。

service

wercker.yml
services:
  - id: mysql
    tag: 5.6
    env:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_ALLOW_EMPTY_PASSWORD: yes
      MYSQL_RANDOM_ROOT_PASSWORD: no
      MYSQL_DATABASE: symfony
      MYSQL_USER: test
      MYSQL_PASSWORD: test
  • service では利用するMySQL等サービスを指定する
  • id でDockerイメージを指定する
    • mysql/mysql-server を指定していると、buildcreate-file$MYSQL_PORT_3306_TCP_ADDRが取れないため注意
  • tag にはバージョンを設定する
  • env には DockerHubのMySQLのページに記載されているEnvironment Variablesについて書いていく
    • 必須 MYSQL_ROOT_PASSWORD(rootユーザーのPW) ・ MYSQL_ALLOW_EMPTY_PASSWORD(PW無しユーザー許可) ・ MYSQL_RANDOM_ROOT_PASSWORD(rootユーザーのPWがランダムか)
      • 設定しないとFailed.
    • 推奨(僕が) MYSQL_DATABASEMYSQL_USERMYSQL_PASSWORD
      • 設定するとDBやUserを作ってくれる. 便利.

build

Pipelineの build に関する事

◇build内共通説明
  • - script: ではコマンド(スクリプト)が実行できる。

    • name はWercerの管理画面上に表示される名前。かわいいAA(ʕ•̬͡•ʔ)でも大丈夫。
    • code は実行するコマンドを書く。|- ってやれば改行も扱える
      • コマンド例 sudo apt-get update
  • - create-file: ではファイルが作れる

    • name はWercerの管理画面上に表示される名前。かわいいAA(ʕ•̬͡•ʔ)でも大丈夫。
    • filename は書き出し先のファイル名
    • overwrite は上書きするか
    • content は書き出し内容。|- ってやれば改行も扱える
◇build内個別説明
install dependencies
wercker.yml
    - script:
      name: install dependencies
      code: |-
        sudo apt-get update
        sudo apt-get install -y git libfreetype6-dev libjpeg62-turbo-dev libmcrypt-dev libpng12-dev unzip
        docker-php-ext-install gd
        docker-php-ext-install iconv mcrypt mbstring pdo_mysql
        curl -L https://phar.phpunit.de/phpunit.phar -o /usr/local/bin/phpunit
        chmod +x /usr/local/bin/phpunit
        curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer
  • sudo apt-get でcomposerやgit、PHPで画像を扱うためのGDを使うために依存しているものをインストールする。
  • docker-php-ext-install Dockerのコマンドを実行する. 今回は voak/symfony2に依存しつつ、今回のプロジェクトで必要なgdpdo_mysqlなどをインストールする。
  • curlchmod のはPHPUnitやComposerのインストール
composer update
wercker.yml
    - script:
      name: composer update
      code: composer update
  • composer update を実行するだけ
parameters.yml
wercker.yml
    - create-file:
      name: parameters.yml
      filename: app/config/parameters.yml
      overwrite: true
      content: |-
        parameters:
          database_driver: pdo_mysql
          database_host: $MYSQL_PORT_3306_TCP_ADDR
          database_port: 3306
          database_name: symfony
          database_user: test
          database_password: test
          mailer_transport: smtp
          mailer_host: 127.0.0.1
          mailer_user: null
          mailer_password: null
          locale: ja
  • Symfony2のコンフィグ、app/config/parameters.yml を作る
  • SwiftmailerやDBの設定だけ書いてある
    • $MYSQL_PORT_3306_TCP_ADDR が使えるので $MYSQL_PORT_3306_TCP_PORT とかも使える.
    • 参考になった: mysql - DockerHub
    • database_nameやuser, passwordはservice で書いた内容が使える
    • 注意) 僕の環境ではメール送信/受信箇所のテストコードを書いていないためローカルな値となっている
doctrine shema update
wercker.yml
    - script:
      name: doctrine shema update
      code: php app/console d:s:u --dump-sql --force
  • DBへの接続設定がおわったのでShema更新だけ。
doctrine fixtures load
wercker.yml
    - script:
      name: doctrine fixtures load
      code: php app/console doctrine:fixtures:load
  • テストで使用するデータはDataFixturesとして作成済み
  • データを流すだけでし
php unit test
wercker.yml
    - script:
      name: php unit test
      code: phpunit -c app/ src/App/AdminBundle/Tests/
  • テストを実行するだけ。

build結果の画面

Wercker

こんな形で表示されます。
スクリーンショット 2016-06-15 15.52.13.png

Bitbucket

  • Build結果がBitbucketのPullRequestのリストに表示される. スクリーンショット_2016-06-15_15_17_18.png

スクリーンショット 2016-06-15 15.17.40.png

TIPS

参考になったこと、気になったこと、転んだところなど。

Workflowsが設定できる

  • Pipelineの実行順序を変更できる。
  • Pipelineとはbuild など
    • Pipelineは追加できる

PrivateなDockerHubも使える

Werckerの機嫌が悪い現象

『setup environment failed』

  • 結果にsetup environment failedとでる。
  • wercker.yml に何らかの変更を加えたわけではないのでそこでbuildが失敗するのは変。
  • wercker.yml の読み込みに成功しているが、context canceled と表示される。
  • RetryするとSuccessする時もある。連続してこの現象が発生することもある。
  • wercker.ymlを読み込み以下Symfony2やMySQLのDockerイメージを読み込み注意に処理が中断されると発生する様だが、原因は不明。
    • タイムアウトが発生しているためか?

発生時のLog(wercker.ymlの最後から掲載)

faild.log
    - script:
      name: doctrine shema update
      code: php app/console d:s:u --dump-sql --force

    - script:
      name: doctrine fixtures load
      code: php app/console doctrine:fixtures:load

    - script:
      name: php unit test
      code: phpunit -c app/ src/App/AdminBundle/Tests/

Pulling from voak/symfony2: latest
Digest: sha256:82378ceb2aa364304d48077b18deea38fefca7fdcb5f3ab148132e0963cf0ea7
Status: Image is up to date for voak/symfony2:latest
Pulling from library/mysql: 5.6
Digest: sha256:03646869dfecf96f443640f8b9040fbde78a96269aaf47bbfbb505a4c1adcad9
Status: Image is up to date for mysql:5.6

正常時のLog(wercker.ymlの最後から掲載)

successed.log
    - script:
      name: doctrine shema update
      code: php app/console d:s:u --dump-sql --force

    - script:
      name: doctrine fixtures load
      code: php app/console doctrine:fixtures:load

    - script:
      name: php unit test
      code: phpunit -c app/ src/App/AdminBundle/Tests/

Pulling from voak/symfony2: latest
Pulling fs layer: 6d46aff4cc0b
Pulling fs layer: 5154d7fe8cb1
Pulling fs layer: 5476328463d8
[略]
Digest: sha256:82378ceb2aa364304d48077b18deea38fefca7fdcb5f3ab148132e0963cf0ea7
Status: Downloaded newer image for voak/symfony2:latest
Pulling from library/mysql: 5.6
Digest: sha256:03646869dfecf96f443640f8b9040fbde78a96269aaf47bbfbb505a4c1adcad9
Status: Image is up to date for mysql:5.6
export WERCKER="true"
export WERCKER_ROOT="/pipeline/source"
export WERCKER_SOURCE_DIR="/pipeline/source"
export WERCKER_CACHE_DIR="/pipeline/cache"
[略]
export WERCKER_MAIN_PIPELINE_STARTED="XXXXXXXXX"

buildが実行されない

  • 待てども待てども実行されぬ
  • AbordRetry で実行できるときがある。実行できないときもある。
  • 原因不明

良かった事

  • BitbucketやSlackとの連係が簡単(難しくない)

    • マニュアル込みで分かりやすい。
  • (今は)無料で同時にいくつも実行できるので全Commitに対してBuildを走らせれる

  • Buid時間が早い

    • codeやDockerイメージの取得はCacheされているためか合わせて20秒程度で完了
    • apt-getcomposerのインストールなどは1分20秒程度で完了
    • composer updateは1分程度で完了
    • 全体でbuildに掛かる時間は3分程度〜4分程度
    • CircleCIより早く終わるらしい、 参考: まだ CircleCI で消耗してるの?
  • WerckerのCLIがある

    • The Wercker Command Line Interface
    • 使っていないが良いとの噂。
    • 使わずにどうしたのか→ 「すぐ出来ると思いwercker.ymlを修正してCommit&Pushで頑張った(真顔)」
      • いれた方が絶対便利

その他参考になったこと

以上。
テストかくぞー٩(๑òωó๑)۶

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした