GitHub Actionsで始めるPHPアプリケーションのCI実践入門 / ga-phperkaigi2020

F4d37a67ce86b2f962c79d73a9127d3c?s=47 fortkle
February 11, 2020

GitHub Actionsで始めるPHPアプリケーションのCI実践入門 / ga-phperkaigi2020

PHPerKaigi 2020の登壇資料です。
サンプルアプリはこちら https://github.com/fortkle/ga-phperkaigi-todo-api

F4d37a67ce86b2f962c79d73a9127d3c?s=128

fortkle

February 11, 2020
Tweet

Transcript

  1. GitHub Actionsで始める PHPアプリケーションのCI実践⼊⾨ 2020.02.11 PHPerKaigi 2020 コネヒト株式会社 @fortkle

  2. ⾃⼰紹介 • ⾼野 福晃 @fortkle • コネヒト株式会社 / Backend Engineer

    • 本を共著で書きました! • 『TECHNICAL MASTER はじめての
  PHPプロフェッショナル開発』 • 好きなPHPはPHP7.4
  3. ⾃⼰紹介 • ⾼野 福晃 @fortkle • コネヒト株式会社 / Backend Engineer

    • 本を共著で書きました! • 『TECHNICAL MASTER はじめての
  PHPプロフェッショナル開発』 • 好きなPHPはPHP7.4 苦⼿なPHPは5.3.3
  4. コネヒトについて • ママ向けNo.1(※) アプリ「ママリ」 • toC向けのコミュニティサービス • ママの3⼈に1⼈(※) が利⽤中 ˞೛৷தʙࡀϲ݄ͷࢠڙΛ࣋ͭঁੑ

    ਓΛର৅ͱͨ͠ௐࠪΑΓ ʮݱࡏ࢖͍ͬͯΔΞϓϦ ೛৷ɾࢠҭͯܥ Λ͢΂ͯڭ͍͑ͯͩ͘͞ʯͰୈҐʢ೥݄࣮ࢪɺௐࠪڠྗɿΠϯςʔδʣɻ
  5. 本⽇のゴール 1. GitHub Actionsの仕組みをざっくり理解する 2. PHPアプリケーションのCIでよく⾏う処理をGitHub Actionsで実⾏する⽅法を知る • テスト、静的解析、コーディングスタイルの検査

  6. GitHub Actionsについて

  7. GitHub Actionsとは - 1 • GitHubと完全に連携したCI/CD機能 • 様々なワークフローを簡単に⾃動化 • ビルド、テスト、デプロイ…etc

    • GitHub上のあらゆるイベントをフックにできる • commitやpush • issue作成やコメント追加など
  8. GitHub Actionsとは - 2 • 設定ファイル • yamlで記述 • 設定ファイル内の処理をコード化し、共有できる

    • 処理のかたまり = 「アクション」 • 「GitHub Marketplace」と呼ばれる場所があり、世界 中の⼈々で共有しブラッシュアップしていける
  9. GitHub Actionsとは - 3 • 料⾦体系 • public リポジトリは無料! •

    private リポジトリは従量制 • ⼀定の無料枠あり(2000分〜/⽉)
  10. GitHub Actionsを 使ってみよう

  11. 今回使うPHPアプリケーション - 1 • Todo アプリのAPI(fortkle/ga-phperkaigi-todo-api で公開中) • 5つのendpoint •

    GET: /todos ... 全てのToDoを返す • POST: /todos ... 新規のToDoを作る • GET: /todos/{id} ... id番のToDoを返す • PUT: /todos/{id} ... id番のToDoを更新 • DELETE: /todos/{id} ... id番のToDoを削除
  12. 今回使うPHPアプリケーション - 2 • CakePHP4, MySQL5.7 で作成 • Docker Composeで構築

    • phpサービス • DBサービス • ルートから1段下げて
 ./app 内にCakePHPのアプリを配置
  13. どうやって使っていくか • GitHub Actionsは素晴らしく多機能 • (とても15分では話しきれない!) • 今⽇のゴールである
 「PHPアプリケーションのCIでよく⾏う処理をGitHub Actionsで実⾏する⽅法を知る」


    を⽬的に、Step By Stepで必要なところだけ使っていく
  14. どうやって使っていくか 1. ワークフローを起動させる 2. 各種ツール(ex. phpunit)を使う環境を作る 3. 各種ツールを使っていく

  15. どうやって使っていくか 1. ワークフローを起動させる 2. 各種ツール(ex. phpunit)を使う環境を作る 3. 各種ツールを使っていく

  16. 1. ワークフローを起動させる • とりあえず簡単なコマンドを実⾏したい • .github/workflows/ に設定ファイルを置くだけ • ファイル名は⾃由

  17. 1. ワークフローを起動させる • .github/workflows/ci.yml

  18. 1. ワークフローを起動させる • .github/workflows/ci.yml name: ワークフローの名前(⾃由)

  19. 1. ワークフローを起動させる • .github/workflows/ci.yml on: どのイベントをトリガーに起動するか。 今回は「pull_request」と指定することで
 PRのopen, reopen, synchronizeに反応。

  20. 1. ワークフローを起動させる • .github/workflows/ci.yml jobs: 実⾏する1つ以上のジョブを定義。

  21. 1. ワークフローを起動させる • .github/workflows/ci.yml 「job_1」という名前のジョブを定義

  22. 1. ワークフローを起動させる • .github/workflows/ci.yml runs-on: Ubuntuの最新版環境の使⽤を指定。

  23. 1. ワークフローを起動させる • .github/workflows/ci.yml

  24. 1. ワークフローを起動させる • .github/workflows/ci.yml steps: 「何をやるか」を指定

  25. 1. ワークフローを起動させる • .github/workflows/ci.yml run: 任意のコマンドを実⾏させる。 ここではファイル⼀覧の出⼒と 現在の作業ディレクトリを表⽰。

  26. 1. ワークフローを起動させる • .github/workflows/ci.yml

  27. 1. ワークフローを起動させる • ymlファイルをpushしてPRを作成するとワークフローが 起動する

  28. 1. ワークフローを起動させる

  29. 1. ワークフローを起動させる workflow steps jobs

  30. 1. ワークフローを起動させる

  31. 1. ワークフローを起動させる ls -la の実⾏結果。 空っぽ = アプリケーションの
 ソースコードがまだないことが分かる。

  32. 1. ワークフローを起動させる pwd の実⾏結果。 ここが作業ディレクトリとなる。
 `echo $GITHUB_WORKSPACE`でも取れる。

  33. 1. ワークフローを起動させる ˞IUUQTIFMQHJUIVCDPNKBBDUJPOTBVUPNBUJOHZPVSXPSLGMPXXJUIHJUIVCBDUJPOTBCPVUHJUIVCBDUJPOT

  34. 1. のまとめ • workflow/jobs/stepsは以下のように理解する • workflow:「いつ起動するか」 • jobs:「どの環境で動かすか」 • steps:「何をするか」

    • 既存のCIと違って最初が「空っぽ」なのは汎⽤的なワークフローを
 ⾒据えているため(あくまで推測) • ex. 半年放置されたissueをcloseするワークフローに
   ソースコードは不要
  35. どうやって使っていくか 1. ワークフローを起動させる 2. 各種ツール(ex. phpunit)を使う環境を作る 3. 各種ツールを使っていく

  36. 2. 各種ツールを使う環境を作る • 実際に動くアプリケーションを⽤意し、テストを実⾏で きる状態にする必要がある • そのために必要なもの • ソースコード •

    PHP ( + Cakeを使うので ext-intl ) • MySQL
  37. 2. 各種ツールを使う環境を作る • GitHub Actionsで何かしたくなったらまずは共有されてい る「アクション」を探すと良い • 「アクション」とはstepsで指定できる処理のかたまり • GitHub

    Marketplaceで共有されている
  38. 2. 各種ツールを使う環境を作る • ソースコードのチェックアウト • actions/checkout • PHPの環境構築 • shivammathur/setup-php

    • MySQLの環境構築 • 仮想環境にもとから⼊っているMySQLを使う
  39. 2. 各種ツールを使う環境を作る • ソースコードのチェックアウト • actions/checkout • PHPの環境構築 • shivammathur/setup-php

    • MySQLの環境構築 • 仮想環境にもとから⼊っているMySQLを使う GitHub公式のアクションは actions/◯◯で公開されている
  40. 2. 各種ツールを使う環境を作る • ソースコードのチェックアウト • actions/checkout • PHPの環境構築 • shivammathur/setup-php

    • MySQLの環境構築 • 仮想環境にもとから⼊っているMySQLを使う ⾔語別に setup-◯◯ というアクションがあり、 バージョンの切り替えはこれを使うのが⼀般的
  41. 2. 各種ツールを使う環境を作る • ソースコードのチェックアウト • actions/checkout • PHPの環境構築 • shivammathur/setup-php

    • MySQLの環境構築 • 仮想環境にもとから⼊っているMySQLを使う MySQL以外にも様々なソフトウェアが
 最初からインストールされている。 docker-compose, heroku, aws-cli etc
  42. 2. 各種ツールを使う環境を作る • ソースコードのチェックアウト • actions/checkout • PHPの環境構築 • shivammathur/setup-php

    • MySQLの環境構築 • 仮想環境にもとから⼊っているMySQLを使う もとから⼊ってなかったり、バージョンが違う場合は 「サービスコンテナ」という仕組みが使える
  43. 2. 各種ツールを使う環境を作る

  44. 2. 各種ツールを使う環境を作る uses: で使いたいアクションを指定。

  45. 2. 各種ツールを使う環境を作る with: でアクションの設定を指定。 ここでは、バージョンは7.4、拡張にext-intl、
 ⾼速化のためcoverage: noneでxdebugなどの無効化を指定

  46. 2. 各種ツールを使う環境を作る テスト実⾏のためにtestという名の データベースが必要なので作成

  47. 2. 各種ツールを使う環境を作る ソースコードがチェックアウトされているか 確認のls -la。これでpushすると…

  48. 2. 各種ツールを使う環境を作る

  49. 2. 各種ツールを使う環境を作る ls -la の実⾏結果。 ソースコードがチェックアウト されていることがわかる。

  50. 2. 各種ツールを使う環境を作る ちなみに、name: を指定した場合
 ここに表⽰される。無指定の場合は コマンドがそのまま使われる。

  51. 2. のまとめ • GitHub Actionsの本質は「アクション」を軸にした
 ワークフロー処理の共有&ブラッシュアップ • 何かやりたいことがあったらまずはGitHub Marketplace で探す

    • なければ⾃作する(DockerかTypeScriptで作成可)
  52. どうやって使っていくか 1. ワークフローを起動させる 2. 各種ツール(ex. phpunit)を使う環境を作る 3. 各種ツールを使っていく

  53. 3. 各種ツールを使っていく • 今回使うツールはphpunit, phpstan, phpcs • やること • composer

    install • `vendor/bin/{hoge}` の実⾏ • 簡単!
  54. 3. 各種ツールを使っていく

  55. 3. 各種ツールを使っていく composerのインストールをして

  56. 3. 各種ツールを使っていく ツールを実⾏!

  57. 3. 各種ツールを使っていく ちなみに今回のアプリケーションは
 環境変数でDBの接続情報を受け取る

  58. 3. 各種ツールを使っていく

  59. 3. 各種ツールを使っていく それぞれエラーなく実⾏されている

  60. 3. 各種ツールを使っていく それぞれエラーなく実⾏されている

  61. 3. 各種ツールを使っていく それぞれエラーなく実⾏されている

  62. やりたかったことができた

  63. まとめ

  64. まとめ • GitHub ActionsでPHPアプリケーションをCIするのは
 ⼗分現実的な選択肢の1つになっている • GitHub Actionsを使うなら、積極的にアクションを活⽤& 共有していきましょう!

  65. end! ”Twemoji" by Twitter, Inc and other contributors is licensed

    under CC-BY 4.0
  66. appendix

  67. (補⾜) ビルドキャッシュ • actions/cache を使えば簡単に使える • デメリットは記述が⻑くなること • 特にjobを分けたときに同じ事を何度も書かないといけ ない

    • Github Actionsのymlはアンカー/マージ⾮対応
  68. (補⾜) ビルドキャッシュ

  69. (補⾜) reviewdog • reviewdogというコードレビューツール • PRのdiffの部分だけにlinterの警告が出るようにフィルター • 更にインラインでPRにアノテーションがつく • 2/11現在、サブディレクトリで実⾏するときにうまく動かない

    不具合あり (ルートで実⾏すれば問題ない) • 修正PRが作られたので近いうちに解決しそう • 次スライドの処理はアクションに切り出してもよいかも
  70. (補⾜) reviewdog

  71. (補⾜) docker-composeでテスト • やろうと思えばできる(実際できた) • が、以下の理由から個⼈的にはまだ使っていない • 挙動がやや不安定(マウント, 権限等の関係?) •

    随所でsleepする処理が必要(waitすることもできるけど…) • 遅い • 単純にビルド時間が+α • Docker Layer Cacheが困難
  72. (補⾜) docker-composeでテスト

  73. (余談) コネヒトの場合 • 業務では現在TravisCIをメインで使⽤ • DockerフレンドリーなCircleCIも⼀部使⽤ • GitHub Actionsは以下の箇所での導⼊実績のみ •

    ネイティブアプリのリリース関連作業(※) • ライブラリの定期アップデート • PHPアプリケーションへのCI適⽤はない • 発表者の個⼈開発のみ ˞(JUIVC"DUJPOTΛ࢖ͬͯϦϦʔε࡞ۀΛͪΐͬͱָʹͨ͠࿩ ɹIUUQTUFDIDPOOFIJUPDPNFOUSZSFMFBTFGMPXBVUPNBUJPOCZHJUIVCBDUJPOT