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