Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

fortkle
February 11, 2020

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

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

fortkle

February 11, 2020
Tweet

More Decks by fortkle

Other Decks in Technology

Transcript

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

    View full-size slide

  2. ⾃⼰紹介
    • ⾼野 福晃 @fortkle
    • コネヒト株式会社 / Backend Engineer
    • 本を共著で書きました!
    • 『TECHNICAL MASTER はじめての

     PHPプロフェッショナル開発』
    • 好きなPHPはPHP7.4

    View full-size slide

  3. ⾃⼰紹介
    • ⾼野 福晃 @fortkle
    • コネヒト株式会社 / Backend Engineer
    • 本を共著で書きました!
    • 『TECHNICAL MASTER はじめての

     PHPプロフェッショナル開発』
    • 好きなPHPはPHP7.4 苦⼿なPHPは5.3.3

    View full-size slide

  4. コネヒトについて
    • ママ向けNo.1(※)
    アプリ「ママリ」
    • toC向けのコミュニティサービス
    • ママの3⼈に1⼈(※)
    が利⽤中
    ˞೛৷தʙࡀϲ݄ͷࢠڙΛ࣋ͭঁੑ ਓΛର৅ͱͨ͠ௐࠪΑΓ
    ʮݱࡏ࢖͍ͬͯΔΞϓϦ ೛৷ɾࢠҭͯܥ
    Λ͢΂ͯڭ͍͑ͯͩ͘͞ʯͰୈҐʢ೥݄࣮ࢪɺௐࠪڠྗɿΠϯςʔδʣɻ

    View full-size slide

  5. 本⽇のゴール
    1. GitHub Actionsの仕組みをざっくり理解する
    2. PHPアプリケーションのCIでよく⾏う処理をGitHub
    Actionsで実⾏する⽅法を知る
    • テスト、静的解析、コーディングスタイルの検査

    View full-size slide

  6. GitHub Actionsについて

    View full-size slide

  7. GitHub Actionsとは - 1
    • GitHubと完全に連携したCI/CD機能
    • 様々なワークフローを簡単に⾃動化
    • ビルド、テスト、デプロイ…etc
    • GitHub上のあらゆるイベントをフックにできる
    • commitやpush
    • issue作成やコメント追加など

    View full-size slide

  8. GitHub Actionsとは - 2
    • 設定ファイル
    • yamlで記述
    • 設定ファイル内の処理をコード化し、共有できる
    • 処理のかたまり = 「アクション」
    • 「GitHub Marketplace」と呼ばれる場所があり、世界
    中の⼈々で共有しブラッシュアップしていける

    View full-size slide

  9. GitHub Actionsとは - 3
    • 料⾦体系
    • public リポジトリは無料!
    • private リポジトリは従量制
    • ⼀定の無料枠あり(2000分〜/⽉)

    View full-size slide

  10. GitHub Actionsを
    使ってみよう

    View full-size slide

  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を削除

    View full-size slide

  12. 今回使うPHPアプリケーション - 2
    • CakePHP4, MySQL5.7 で作成
    • Docker Composeで構築
    • phpサービス
    • DBサービス
    • ルートから1段下げて

    ./app 内にCakePHPのアプリを配置

    View full-size slide

  13. どうやって使っていくか
    • GitHub Actionsは素晴らしく多機能
    • (とても15分では話しきれない!)
    • 今⽇のゴールである

    「PHPアプリケーションのCIでよく⾏う処理をGitHub
    Actionsで実⾏する⽅法を知る」

    を⽬的に、Step By Stepで必要なところだけ使っていく

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    PRのopen, reopen, synchronizeに反応。

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  31. 1. ワークフローを起動させる
    ls -la の実⾏結果。
    空っぽ = アプリケーションの

    ソースコードがまだないことが分かる。

    View full-size slide

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

    `echo $GITHUB_WORKSPACE`でも取れる。

    View full-size slide

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

    View full-size slide

  34. 1. のまとめ
    • workflow/jobs/stepsは以下のように理解する
    • workflow:「いつ起動するか」
    • jobs:「どの環境で動かすか」
    • steps:「何をするか」
    • 既存のCIと違って最初が「空っぽ」なのは汎⽤的なワークフローを

    ⾒据えているため(あくまで推測)
    • ex. 半年放置されたissueをcloseするワークフローに

      ソースコードは不要

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    最初からインストールされている。
    docker-compose, heroku, aws-cli etc

    View full-size slide

  42. 2. 各種ツールを使う環境を作る
    • ソースコードのチェックアウト
    • actions/checkout
    • PHPの環境構築
    • shivammathur/setup-php
    • MySQLの環境構築
    • 仮想環境にもとから⼊っているMySQLを使う
    もとから⼊ってなかったり、バージョンが違う場合は
    「サービスコンテナ」という仕組みが使える

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  45. 2. 各種ツールを使う環境を作る
    with: でアクションの設定を指定。
    ここでは、バージョンは7.4、拡張にext-intl、

    ⾼速化のためcoverage: noneでxdebugなどの無効化を指定

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  50. 2. 各種ツールを使う環境を作る
    ちなみに、name: を指定した場合

    ここに表⽰される。無指定の場合は
    コマンドがそのまま使われる。

    View full-size slide

  51. 2. のまとめ
    • GitHub Actionsの本質は「アクション」を軸にした

    ワークフロー処理の共有&ブラッシュアップ
    • 何かやりたいことがあったらまずはGitHub Marketplace
    で探す
    • なければ⾃作する(DockerかTypeScriptで作成可)

    View full-size slide

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

    View full-size slide

  53. 3. 各種ツールを使っていく
    • 今回使うツールはphpunit, phpstan, phpcs
    • やること
    • composer install
    • `vendor/bin/{hoge}` の実⾏
    • 簡単!

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  57. 3. 各種ツールを使っていく
    ちなみに今回のアプリケーションは

    環境変数でDBの接続情報を受け取る

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  63. まとめ
    • GitHub ActionsでPHPアプリケーションをCIするのは

    ⼗分現実的な選択肢の1つになっている
    • GitHub Actionsを使うなら、積極的にアクションを活⽤&
    共有していきましょう!

    View full-size slide

  64. end!
    ”Twemoji" by Twitter, Inc and other contributors is licensed under CC-BY 4.0

    View full-size slide

  65. (補⾜) ビルドキャッシュ
    • actions/cache を使えば簡単に使える
    • デメリットは記述が⻑くなること
    • 特にjobを分けたときに同じ事を何度も書かないといけ
    ない
    • Github Actionsのymlはアンカー/マージ⾮対応

    View full-size slide

  66. (補⾜) ビルドキャッシュ

    View full-size slide

  67. (補⾜) reviewdog
    • reviewdogというコードレビューツール
    • PRのdiffの部分だけにlinterの警告が出るようにフィルター
    • 更にインラインでPRにアノテーションがつく
    • 2/11現在、サブディレクトリで実⾏するときにうまく動かない
    不具合あり (ルートで実⾏すれば問題ない)
    • 修正PRが作られたので近いうちに解決しそう
    • 次スライドの処理はアクションに切り出してもよいかも

    View full-size slide

  68. (補⾜) reviewdog

    View full-size slide

  69. (補⾜) docker-composeでテスト
    • やろうと思えばできる(実際できた)
    • が、以下の理由から個⼈的にはまだ使っていない
    • 挙動がやや不安定(マウント, 権限等の関係?)
    • 随所でsleepする処理が必要(waitすることもできるけど…)
    • 遅い
    • 単純にビルド時間が+α
    • Docker Layer Cacheが困難

    View full-size slide

  70. (補⾜) docker-composeでテスト

    View full-size slide

  71. (余談) コネヒトの場合
    • 業務では現在TravisCIをメインで使⽤
    • DockerフレンドリーなCircleCIも⼀部使⽤
    • GitHub Actionsは以下の箇所での導⼊実績のみ
    • ネイティブアプリのリリース関連作業(※)
    • ライブラリの定期アップデート
    • PHPアプリケーションへのCI適⽤はない
    • 発表者の個⼈開発のみ
    ˞(JUIVC"DUJPOTΛ࢖ͬͯϦϦʔε࡞ۀΛͪΐͬͱָʹͨ͠࿩
    ɹIUUQTUFDIDPOOFIJUPDPNFOUSZSFMFBTFGMPXBVUPNBUJPOCZHJUIVCBDUJPOT

    View full-size slide