How To Gitlab 「週刊 gitlab-runner 創刊号 type shell for phpunitを作る」の話

今回はGitlab-runnerを簡単に書いちゃうぞ!
ターゲットはphpunitを実行してくれるやつです。

Gitlab-runnerとは!

創刊号なのでGitlab-runnerってのを紹介しなくてはいけない!
簡単に言うと、GItlabから呼び出される環境です!

うむぅ〜端的に説明するとそれでもいいですが、図的に書くとこんな風です

git pushして、リポジトリが更新するトリガーでパイプラインが走ります。
そのパイプライン上で実行される処理が実行される環境がGItlab-runnerです

パイプラインの実行結果はCI/CDにて確認できます

リポジトリが更新されればパイプラインが走る、パイプラインはジョブでgitlab-runnerが走るってのを知っていればOKです

GItlab-runnerの実行を書く!

環境の作成を書く前に実際に書くスクリプトを紹介しおきます

ファイルはプロジェクトルートに .gitlab-ci.ymlを作り定義します。
今回の成果物 phpunitの内容です。(抜粋してます)

gitlab-runnerの種別はshellを使っています

stages:
  - test
phpunit:
  tags:
    - phpunit
  stage: test
  script:
    - composer install
    - phpdbg -qrr vendor/bin/phpunit -c phpunit.xml --log-junit report.xml --verbose --coverage-html coverage/ --coverage-text
  cache:
    paths:
      - vendor/
  artifacts:
    reports:
      junit: report.xml
    when: always
    paths:
      - coverage/
    expire_in: 1 days
  coverage: /\s+Lines:\s+(\d+\.\d+%)/

内容はともかくポイントはscriptの部分です。
これが走ります

composer走って、phpdbg走るってだけです。

Gitlab-runner環境を作る!

いちばん重要なことですが、gitlab-runner環境はgitlabと同じサーバである必要はありません

それこそ本番環境に入れてgit更新のタイミングでコピーするってのでも使えます。
※ セキュリティホールになりそうですがw

インストール方法は… 本家見ればOK!

https://docs.gitlab.com/runner/install/index.html

私の場合はQNAPのdocker(container)に作ります

インストールを終えたら、レジスターに登録すればOK(url & tokenは 設定 > CI/CDにあります。)

ここでのポイントは、shellとタグを指定することですね。shellは実行環境 dockerなどを指定するとgitlab-ciの記述が変わります。
タグの指定は、このgitlab-runnerを実行するのを識別するのに使います。

スクリプト例では以下のように書いています

tags:
– phpunit

登録完了したものは

うん

次に、スクリプトが!実行されるわけですから、そのスクリプトを実行できる環境を作る必要があります。

phpunitの場合はphpとcomposerを手動でインストールしてください
※ 略 php8.0を使っています

実行する

ここまでくれば、gitをコミットするかパイプラインを走らせれば動きます

各所の部分を解説しますと、カバレージ率を出すためにはスクリプトに以下を指定します

  coverage: /\s+Lines:\s+(\d+\.\d+%)/

この通り、パーセンテージを正規表示で取り出します。
なので、phpunitにて表示させるため、–coverage-textを指定しています

これで、ジョブ一覧にカバレージ率を表示させられます

次に、パイプラインのテスト項目にて簡易的な試験結果を表示させる方法ですが
–log-junit report.xmlと

  artifacts:
    reports:
      junit: report.xml

にて定義します

これで確認できます。

鋭い人には–coverage-htmlを指定しているのではOKと思われていると思いますが、結果をHTMLで表示可能になります。

このページも成果物(artifacts)に入れます!

はい、これで実行はOKだぜ!

んで、試験だからコケたら?

皆コケますw

ポイントは、皆コケます。次に引き継げません

試験内容はパスしないとジョブはOK出してくれませんので、早々に修正してください!
メール一斉送信でもOKでしょう

サブブランチまで厳密にしない場合は only -mainとかにしてmainに引き継ぐ場合に割り当てるのがいいでしょうね

とりあえず、ばばばーと書きましたが、そんな感じです
結構簡単にCI環境は作れます。
コンパイル書いて、パッケージ化すればCDもOK!
書いたとおりに実行環境に入れるスクリプトを書いたらCDepも簡単です

次回予告!

せっかく作ったcoverage html report… htmlってブラウザで表示しないと使い物にならないよね。
Webに上げる?だったら、Gitlab pagesを使えばいいじゃん!
次回!Gitlab pagesを使う話