Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
GitHub Actionsで始める PHPアプリケーションのCI実践⼊⾨ 2020.02.11 PHPerKaigi 2020 コネヒト株式会社 @fortkle
Slide 2
Slide 2 text
⾃⼰紹介 • ⾼野 福晃 @fortkle • コネヒト株式会社 / Backend Engineer • 本を共著で書きました! • 『TECHNICAL MASTER はじめての PHPプロフェッショナル開発』 • 好きなPHPはPHP7.4
Slide 3
Slide 3 text
⾃⼰紹介 • ⾼野 福晃 @fortkle • コネヒト株式会社 / Backend Engineer • 本を共著で書きました! • 『TECHNICAL MASTER はじめての PHPプロフェッショナル開発』 • 好きなPHPはPHP7.4 苦⼿なPHPは5.3.3
Slide 4
Slide 4 text
コネヒトについて • ママ向けNo.1(※) アプリ「ママリ」 • toC向けのコミュニティサービス • ママの3⼈に1⼈(※) が利⽤中 ˞৷தʙࡀϲ݄ͷࢠڙΛ࣋ͭঁੑ ਓΛରͱͨ͠ௐࠪΑΓ ʮݱࡏ͍ͬͯΔΞϓϦ ৷ɾࢠҭͯܥ Λͯ͢ڭ͍͑ͯͩ͘͞ʯͰୈҐʢ݄࣮ࢪɺௐࠪڠྗɿΠϯςʔδʣɻ
Slide 5
Slide 5 text
本⽇のゴール 1. GitHub Actionsの仕組みをざっくり理解する 2. PHPアプリケーションのCIでよく⾏う処理をGitHub Actionsで実⾏する⽅法を知る • テスト、静的解析、コーディングスタイルの検査
Slide 6
Slide 6 text
GitHub Actionsについて
Slide 7
Slide 7 text
GitHub Actionsとは - 1 • GitHubと完全に連携したCI/CD機能 • 様々なワークフローを簡単に⾃動化 • ビルド、テスト、デプロイ…etc • GitHub上のあらゆるイベントをフックにできる • commitやpush • issue作成やコメント追加など
Slide 8
Slide 8 text
GitHub Actionsとは - 2 • 設定ファイル • yamlで記述 • 設定ファイル内の処理をコード化し、共有できる • 処理のかたまり = 「アクション」 • 「GitHub Marketplace」と呼ばれる場所があり、世界 中の⼈々で共有しブラッシュアップしていける
Slide 9
Slide 9 text
GitHub Actionsとは - 3 • 料⾦体系 • public リポジトリは無料! • private リポジトリは従量制 • ⼀定の無料枠あり(2000分〜/⽉)
Slide 10
Slide 10 text
GitHub Actionsを 使ってみよう
Slide 11
Slide 11 text
今回使う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を削除
Slide 12
Slide 12 text
今回使うPHPアプリケーション - 2 • CakePHP4, MySQL5.7 で作成 • Docker Composeで構築 • phpサービス • DBサービス • ルートから1段下げて ./app 内にCakePHPのアプリを配置
Slide 13
Slide 13 text
どうやって使っていくか • GitHub Actionsは素晴らしく多機能 • (とても15分では話しきれない!) • 今⽇のゴールである 「PHPアプリケーションのCIでよく⾏う処理をGitHub Actionsで実⾏する⽅法を知る」 を⽬的に、Step By Stepで必要なところだけ使っていく
Slide 14
Slide 14 text
どうやって使っていくか 1. ワークフローを起動させる 2. 各種ツール(ex. phpunit)を使う環境を作る 3. 各種ツールを使っていく
Slide 15
Slide 15 text
どうやって使っていくか 1. ワークフローを起動させる 2. 各種ツール(ex. phpunit)を使う環境を作る 3. 各種ツールを使っていく
Slide 16
Slide 16 text
1. ワークフローを起動させる • とりあえず簡単なコマンドを実⾏したい • .github/workflows/ に設定ファイルを置くだけ • ファイル名は⾃由
Slide 17
Slide 17 text
1. ワークフローを起動させる • .github/workflows/ci.yml
Slide 18
Slide 18 text
1. ワークフローを起動させる • .github/workflows/ci.yml name: ワークフローの名前(⾃由)
Slide 19
Slide 19 text
1. ワークフローを起動させる • .github/workflows/ci.yml on: どのイベントをトリガーに起動するか。 今回は「pull_request」と指定することで PRのopen, reopen, synchronizeに反応。
Slide 20
Slide 20 text
1. ワークフローを起動させる • .github/workflows/ci.yml jobs: 実⾏する1つ以上のジョブを定義。
Slide 21
Slide 21 text
1. ワークフローを起動させる • .github/workflows/ci.yml 「job_1」という名前のジョブを定義
Slide 22
Slide 22 text
1. ワークフローを起動させる • .github/workflows/ci.yml runs-on: Ubuntuの最新版環境の使⽤を指定。
Slide 23
Slide 23 text
1. ワークフローを起動させる • .github/workflows/ci.yml
Slide 24
Slide 24 text
1. ワークフローを起動させる • .github/workflows/ci.yml steps: 「何をやるか」を指定
Slide 25
Slide 25 text
1. ワークフローを起動させる • .github/workflows/ci.yml run: 任意のコマンドを実⾏させる。 ここではファイル⼀覧の出⼒と 現在の作業ディレクトリを表⽰。
Slide 26
Slide 26 text
1. ワークフローを起動させる • .github/workflows/ci.yml
Slide 27
Slide 27 text
1. ワークフローを起動させる • ymlファイルをpushしてPRを作成するとワークフローが 起動する
Slide 28
Slide 28 text
1. ワークフローを起動させる
Slide 29
Slide 29 text
1. ワークフローを起動させる workflow steps jobs
Slide 30
Slide 30 text
1. ワークフローを起動させる
Slide 31
Slide 31 text
1. ワークフローを起動させる ls -la の実⾏結果。 空っぽ = アプリケーションの ソースコードがまだないことが分かる。
Slide 32
Slide 32 text
1. ワークフローを起動させる pwd の実⾏結果。 ここが作業ディレクトリとなる。 `echo $GITHUB_WORKSPACE`でも取れる。
Slide 33
Slide 33 text
1. ワークフローを起動させる ˞IUUQTIFMQHJUIVCDPNKBBDUJPOTBVUPNBUJOHZPVSXPSLGMPXXJUIHJUIVCBDUJPOTBCPVUHJUIVCBDUJPOT
Slide 34
Slide 34 text
1. のまとめ • workflow/jobs/stepsは以下のように理解する • workflow:「いつ起動するか」 • jobs:「どの環境で動かすか」 • steps:「何をするか」 • 既存のCIと違って最初が「空っぽ」なのは汎⽤的なワークフローを ⾒据えているため(あくまで推測) • ex. 半年放置されたissueをcloseするワークフローに ソースコードは不要
Slide 35
Slide 35 text
どうやって使っていくか 1. ワークフローを起動させる 2. 各種ツール(ex. phpunit)を使う環境を作る 3. 各種ツールを使っていく
Slide 36
Slide 36 text
2. 各種ツールを使う環境を作る • 実際に動くアプリケーションを⽤意し、テストを実⾏で きる状態にする必要がある • そのために必要なもの • ソースコード • PHP ( + Cakeを使うので ext-intl ) • MySQL
Slide 37
Slide 37 text
2. 各種ツールを使う環境を作る • GitHub Actionsで何かしたくなったらまずは共有されてい る「アクション」を探すと良い • 「アクション」とはstepsで指定できる処理のかたまり • GitHub Marketplaceで共有されている
Slide 38
Slide 38 text
2. 各種ツールを使う環境を作る • ソースコードのチェックアウト • actions/checkout • PHPの環境構築 • shivammathur/setup-php • MySQLの環境構築 • 仮想環境にもとから⼊っているMySQLを使う
Slide 39
Slide 39 text
2. 各種ツールを使う環境を作る • ソースコードのチェックアウト • actions/checkout • PHPの環境構築 • shivammathur/setup-php • MySQLの環境構築 • 仮想環境にもとから⼊っているMySQLを使う GitHub公式のアクションは actions/◯◯で公開されている
Slide 40
Slide 40 text
2. 各種ツールを使う環境を作る • ソースコードのチェックアウト • actions/checkout • PHPの環境構築 • shivammathur/setup-php • MySQLの環境構築 • 仮想環境にもとから⼊っているMySQLを使う ⾔語別に setup-◯◯ というアクションがあり、 バージョンの切り替えはこれを使うのが⼀般的
Slide 41
Slide 41 text
2. 各種ツールを使う環境を作る • ソースコードのチェックアウト • actions/checkout • PHPの環境構築 • shivammathur/setup-php • MySQLの環境構築 • 仮想環境にもとから⼊っているMySQLを使う MySQL以外にも様々なソフトウェアが 最初からインストールされている。 docker-compose, heroku, aws-cli etc
Slide 42
Slide 42 text
2. 各種ツールを使う環境を作る • ソースコードのチェックアウト • actions/checkout • PHPの環境構築 • shivammathur/setup-php • MySQLの環境構築 • 仮想環境にもとから⼊っているMySQLを使う もとから⼊ってなかったり、バージョンが違う場合は 「サービスコンテナ」という仕組みが使える
Slide 43
Slide 43 text
2. 各種ツールを使う環境を作る
Slide 44
Slide 44 text
2. 各種ツールを使う環境を作る uses: で使いたいアクションを指定。
Slide 45
Slide 45 text
2. 各種ツールを使う環境を作る with: でアクションの設定を指定。 ここでは、バージョンは7.4、拡張にext-intl、 ⾼速化のためcoverage: noneでxdebugなどの無効化を指定
Slide 46
Slide 46 text
2. 各種ツールを使う環境を作る テスト実⾏のためにtestという名の データベースが必要なので作成
Slide 47
Slide 47 text
2. 各種ツールを使う環境を作る ソースコードがチェックアウトされているか 確認のls -la。これでpushすると…
Slide 48
Slide 48 text
2. 各種ツールを使う環境を作る
Slide 49
Slide 49 text
2. 各種ツールを使う環境を作る ls -la の実⾏結果。 ソースコードがチェックアウト されていることがわかる。
Slide 50
Slide 50 text
2. 各種ツールを使う環境を作る ちなみに、name: を指定した場合 ここに表⽰される。無指定の場合は コマンドがそのまま使われる。
Slide 51
Slide 51 text
2. のまとめ • GitHub Actionsの本質は「アクション」を軸にした ワークフロー処理の共有&ブラッシュアップ • 何かやりたいことがあったらまずはGitHub Marketplace で探す • なければ⾃作する(DockerかTypeScriptで作成可)
Slide 52
Slide 52 text
どうやって使っていくか 1. ワークフローを起動させる 2. 各種ツール(ex. phpunit)を使う環境を作る 3. 各種ツールを使っていく
Slide 53
Slide 53 text
3. 各種ツールを使っていく • 今回使うツールはphpunit, phpstan, phpcs • やること • composer install • `vendor/bin/{hoge}` の実⾏ • 簡単!
Slide 54
Slide 54 text
3. 各種ツールを使っていく
Slide 55
Slide 55 text
3. 各種ツールを使っていく composerのインストールをして
Slide 56
Slide 56 text
3. 各種ツールを使っていく ツールを実⾏!
Slide 57
Slide 57 text
3. 各種ツールを使っていく ちなみに今回のアプリケーションは 環境変数でDBの接続情報を受け取る
Slide 58
Slide 58 text
3. 各種ツールを使っていく
Slide 59
Slide 59 text
3. 各種ツールを使っていく それぞれエラーなく実⾏されている
Slide 60
Slide 60 text
3. 各種ツールを使っていく それぞれエラーなく実⾏されている
Slide 61
Slide 61 text
3. 各種ツールを使っていく それぞれエラーなく実⾏されている
Slide 62
Slide 62 text
やりたかったことができた
Slide 63
Slide 63 text
まとめ
Slide 64
Slide 64 text
まとめ • GitHub ActionsでPHPアプリケーションをCIするのは ⼗分現実的な選択肢の1つになっている • GitHub Actionsを使うなら、積極的にアクションを活⽤& 共有していきましょう!
Slide 65
Slide 65 text
end! ”Twemoji" by Twitter, Inc and other contributors is licensed under CC-BY 4.0
Slide 66
Slide 66 text
appendix
Slide 67
Slide 67 text
(補⾜) ビルドキャッシュ • actions/cache を使えば簡単に使える • デメリットは記述が⻑くなること • 特にjobを分けたときに同じ事を何度も書かないといけ ない • Github Actionsのymlはアンカー/マージ⾮対応
Slide 68
Slide 68 text
(補⾜) ビルドキャッシュ
Slide 69
Slide 69 text
(補⾜) reviewdog • reviewdogというコードレビューツール • PRのdiffの部分だけにlinterの警告が出るようにフィルター • 更にインラインでPRにアノテーションがつく • 2/11現在、サブディレクトリで実⾏するときにうまく動かない 不具合あり (ルートで実⾏すれば問題ない) • 修正PRが作られたので近いうちに解決しそう • 次スライドの処理はアクションに切り出してもよいかも
Slide 70
Slide 70 text
(補⾜) reviewdog
Slide 71
Slide 71 text
(補⾜) docker-composeでテスト • やろうと思えばできる(実際できた) • が、以下の理由から個⼈的にはまだ使っていない • 挙動がやや不安定(マウント, 権限等の関係?) • 随所でsleepする処理が必要(waitすることもできるけど…) • 遅い • 単純にビルド時間が+α • Docker Layer Cacheが困難
Slide 72
Slide 72 text
(補⾜) docker-composeでテスト
Slide 73
Slide 73 text
(余談) コネヒトの場合 • 業務では現在TravisCIをメインで使⽤ • DockerフレンドリーなCircleCIも⼀部使⽤ • GitHub Actionsは以下の箇所での導⼊実績のみ • ネイティブアプリのリリース関連作業(※) • ライブラリの定期アップデート • PHPアプリケーションへのCI適⽤はない • 発表者の個⼈開発のみ ˞(JUIVC"DUJPOTΛͬͯϦϦʔε࡞ۀΛͪΐͬͱָʹͨ͠ ɹIUUQTUFDIDPOOFIJUPDPNFOUSZSFMFBTFGMPXBVUPNBUJPOCZHJUIVCBDUJPOT