Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
GitHub Actionsで始めるPHPアプリケーションのCI実践入門 / ga-phper...
Search
fortkle
February 11, 2020
Technology
3
4.1k
GitHub Actionsで始めるPHPアプリケーションのCI実践入門 / ga-phperkaigi2020
PHPerKaigi 2020の登壇資料です。
サンプルアプリはこちら
https://github.com/fortkle/ga-phperkaigi-todo-api
fortkle
February 11, 2020
Tweet
Share
More Decks by fortkle
See All by fortkle
無駄な物をなるべく作らないリプレイス戦略 / replace-strategy-phperkaigi2021
fortkle
1
2.1k
フルリモート時代のカンバン運用 / kanban-operation-in-remote
fortkle
0
620
余裕を生み出すコードレビュー 〜レビュイー編〜 / code-review-phpcon-2019
fortkle
8
6.8k
「設計振り返り」を始めてみようと思っている話 / architecture reflection
fortkle
3
530
「ママ向けNo.1アプリ」の 更なる成長を支える仕組み / startup-engineer-night-connehito
fortkle
2
280
良いテストデータ、悪いテストデータ / testdata-antipattern
fortkle
4
6.7k
BackstopJSで始める CSSリグレッションテスト / backstopjs-css-test
fortkle
0
1.5k
PhpStorm導入アンチパターン / phpstorm-anti-pattern
fortkle
0
2k
やさしいコーディング規約の導入〜その後〜 / yasashii-sonogo
fortkle
7
3.5k
Other Decks in Technology
See All in Technology
現地でMeet Upをやる場合の注意点〜反省点を添えて〜
shotashiratori
0
520
ネット広告に未来はあるか?「3rd Party Cookie廃止とPrivacy Sandboxの効果検証の裏側」 / third-party-cookie-privacy
cyberagentdevelopers
PRO
1
130
Forget efficiency – Become more productive without the stress
ufried
0
130
Java x Spring Boot Warm up
kazu_kichi_67
2
490
話題のGraphRAG、その可能性と課題を理解する
hide212131
4
1.5k
カメラを用いた店内計測におけるオプトインの仕組みの実現 / ai-optin-camera
cyberagentdevelopers
PRO
1
120
10分でわかるfreee エンジニア向け会社説明資料
freee
18
520k
20241031_AWS_生成AIハッカソン_GenMuck
tsumita
0
110
分布で見る効果検証入門 / ai-distributional-effect
cyberagentdevelopers
PRO
4
700
Fargateを使った研修の話
takesection
0
120
小規模に始めるデータメッシュとデータガバナンスの実践
kimujun
3
590
WINTICKETアプリで実現した高可用性と高速リリースを支えるエコシステム / winticket-eco-system
cyberagentdevelopers
PRO
1
190
Featured
See All Featured
StorybookのUI Testing Handbookを読んだ
zakiyama
26
5.2k
4 Signs Your Business is Dying
shpigford
180
21k
Measuring & Analyzing Core Web Vitals
bluesmoon
1
40
Agile that works and the tools we love
rasmusluckow
327
21k
Ruby is Unlike a Banana
tanoku
96
11k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
250
21k
Fantastic passwords and where to find them - at NoRuKo
philnash
50
2.8k
VelocityConf: Rendering Performance Case Studies
addyosmani
325
24k
Making the Leap to Tech Lead
cromwellryan
132
8.9k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
191
16k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Embracing the Ebb and Flow
colly
84
4.4k
Transcript
GitHub Actionsで始める PHPアプリケーションのCI実践⼊⾨ 2020.02.11 PHPerKaigi 2020 コネヒト株式会社 @fortkle
⾃⼰紹介 • ⾼野 福晃 @fortkle • コネヒト株式会社 / Backend Engineer
• 本を共著で書きました! • 『TECHNICAL MASTER はじめての PHPプロフェッショナル開発』 • 好きなPHPはPHP7.4
⾃⼰紹介 • ⾼野 福晃 @fortkle • コネヒト株式会社 / Backend Engineer
• 本を共著で書きました! • 『TECHNICAL MASTER はじめての PHPプロフェッショナル開発』 • 好きなPHPはPHP7.4 苦⼿なPHPは5.3.3
コネヒトについて • ママ向けNo.1(※) アプリ「ママリ」 • toC向けのコミュニティサービス • ママの3⼈に1⼈(※) が利⽤中 ˞৷தʙࡀϲ݄ͷࢠڙΛ࣋ͭঁੑ
ਓΛରͱͨ͠ௐࠪΑΓ ʮݱࡏ͍ͬͯΔΞϓϦ ৷ɾࢠҭͯܥ Λͯ͢ڭ͍͑ͯͩ͘͞ʯͰୈҐʢ݄࣮ࢪɺௐࠪڠྗɿΠϯςʔδʣɻ
本⽇のゴール 1. GitHub Actionsの仕組みをざっくり理解する 2. PHPアプリケーションのCIでよく⾏う処理をGitHub Actionsで実⾏する⽅法を知る • テスト、静的解析、コーディングスタイルの検査
GitHub Actionsについて
GitHub Actionsとは - 1 • GitHubと完全に連携したCI/CD機能 • 様々なワークフローを簡単に⾃動化 • ビルド、テスト、デプロイ…etc
• GitHub上のあらゆるイベントをフックにできる • commitやpush • issue作成やコメント追加など
GitHub Actionsとは - 2 • 設定ファイル • yamlで記述 • 設定ファイル内の処理をコード化し、共有できる
• 処理のかたまり = 「アクション」 • 「GitHub Marketplace」と呼ばれる場所があり、世界 中の⼈々で共有しブラッシュアップしていける
GitHub Actionsとは - 3 • 料⾦体系 • public リポジトリは無料! •
private リポジトリは従量制 • ⼀定の無料枠あり(2000分〜/⽉)
GitHub Actionsを 使ってみよう
今回使う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を削除
今回使うPHPアプリケーション - 2 • CakePHP4, MySQL5.7 で作成 • Docker Composeで構築
• phpサービス • DBサービス • ルートから1段下げて ./app 内にCakePHPのアプリを配置
どうやって使っていくか • GitHub Actionsは素晴らしく多機能 • (とても15分では話しきれない!) • 今⽇のゴールである 「PHPアプリケーションのCIでよく⾏う処理をGitHub Actionsで実⾏する⽅法を知る」
を⽬的に、Step By Stepで必要なところだけ使っていく
どうやって使っていくか 1. ワークフローを起動させる 2. 各種ツール(ex. phpunit)を使う環境を作る 3. 各種ツールを使っていく
どうやって使っていくか 1. ワークフローを起動させる 2. 各種ツール(ex. phpunit)を使う環境を作る 3. 各種ツールを使っていく
1. ワークフローを起動させる • とりあえず簡単なコマンドを実⾏したい • .github/workflows/ に設定ファイルを置くだけ • ファイル名は⾃由
1. ワークフローを起動させる • .github/workflows/ci.yml
1. ワークフローを起動させる • .github/workflows/ci.yml name: ワークフローの名前(⾃由)
1. ワークフローを起動させる • .github/workflows/ci.yml on: どのイベントをトリガーに起動するか。 今回は「pull_request」と指定することで PRのopen, reopen, synchronizeに反応。
1. ワークフローを起動させる • .github/workflows/ci.yml jobs: 実⾏する1つ以上のジョブを定義。
1. ワークフローを起動させる • .github/workflows/ci.yml 「job_1」という名前のジョブを定義
1. ワークフローを起動させる • .github/workflows/ci.yml runs-on: Ubuntuの最新版環境の使⽤を指定。
1. ワークフローを起動させる • .github/workflows/ci.yml
1. ワークフローを起動させる • .github/workflows/ci.yml steps: 「何をやるか」を指定
1. ワークフローを起動させる • .github/workflows/ci.yml run: 任意のコマンドを実⾏させる。 ここではファイル⼀覧の出⼒と 現在の作業ディレクトリを表⽰。
1. ワークフローを起動させる • .github/workflows/ci.yml
1. ワークフローを起動させる • ymlファイルをpushしてPRを作成するとワークフローが 起動する
1. ワークフローを起動させる
1. ワークフローを起動させる workflow steps jobs
1. ワークフローを起動させる
1. ワークフローを起動させる ls -la の実⾏結果。 空っぽ = アプリケーションの ソースコードがまだないことが分かる。
1. ワークフローを起動させる pwd の実⾏結果。 ここが作業ディレクトリとなる。 `echo $GITHUB_WORKSPACE`でも取れる。
1. ワークフローを起動させる ˞IUUQTIFMQHJUIVCDPNKBBDUJPOTBVUPNBUJOHZPVSXPSLGMPXXJUIHJUIVCBDUJPOTBCPVUHJUIVCBDUJPOT
1. のまとめ • workflow/jobs/stepsは以下のように理解する • workflow:「いつ起動するか」 • jobs:「どの環境で動かすか」 • steps:「何をするか」
• 既存のCIと違って最初が「空っぽ」なのは汎⽤的なワークフローを ⾒据えているため(あくまで推測) • ex. 半年放置されたissueをcloseするワークフローに ソースコードは不要
どうやって使っていくか 1. ワークフローを起動させる 2. 各種ツール(ex. phpunit)を使う環境を作る 3. 各種ツールを使っていく
2. 各種ツールを使う環境を作る • 実際に動くアプリケーションを⽤意し、テストを実⾏で きる状態にする必要がある • そのために必要なもの • ソースコード •
PHP ( + Cakeを使うので ext-intl ) • MySQL
2. 各種ツールを使う環境を作る • GitHub Actionsで何かしたくなったらまずは共有されてい る「アクション」を探すと良い • 「アクション」とはstepsで指定できる処理のかたまり • GitHub
Marketplaceで共有されている
2. 各種ツールを使う環境を作る • ソースコードのチェックアウト • actions/checkout • PHPの環境構築 • shivammathur/setup-php
• MySQLの環境構築 • 仮想環境にもとから⼊っているMySQLを使う
2. 各種ツールを使う環境を作る • ソースコードのチェックアウト • actions/checkout • PHPの環境構築 • shivammathur/setup-php
• MySQLの環境構築 • 仮想環境にもとから⼊っているMySQLを使う GitHub公式のアクションは actions/◯◯で公開されている
2. 各種ツールを使う環境を作る • ソースコードのチェックアウト • actions/checkout • PHPの環境構築 • shivammathur/setup-php
• MySQLの環境構築 • 仮想環境にもとから⼊っているMySQLを使う ⾔語別に setup-◯◯ というアクションがあり、 バージョンの切り替えはこれを使うのが⼀般的
2. 各種ツールを使う環境を作る • ソースコードのチェックアウト • actions/checkout • PHPの環境構築 • shivammathur/setup-php
• MySQLの環境構築 • 仮想環境にもとから⼊っているMySQLを使う MySQL以外にも様々なソフトウェアが 最初からインストールされている。 docker-compose, heroku, aws-cli etc
2. 各種ツールを使う環境を作る • ソースコードのチェックアウト • actions/checkout • PHPの環境構築 • shivammathur/setup-php
• MySQLの環境構築 • 仮想環境にもとから⼊っているMySQLを使う もとから⼊ってなかったり、バージョンが違う場合は 「サービスコンテナ」という仕組みが使える
2. 各種ツールを使う環境を作る
2. 各種ツールを使う環境を作る uses: で使いたいアクションを指定。
2. 各種ツールを使う環境を作る with: でアクションの設定を指定。 ここでは、バージョンは7.4、拡張にext-intl、 ⾼速化のためcoverage: noneでxdebugなどの無効化を指定
2. 各種ツールを使う環境を作る テスト実⾏のためにtestという名の データベースが必要なので作成
2. 各種ツールを使う環境を作る ソースコードがチェックアウトされているか 確認のls -la。これでpushすると…
2. 各種ツールを使う環境を作る
2. 各種ツールを使う環境を作る ls -la の実⾏結果。 ソースコードがチェックアウト されていることがわかる。
2. 各種ツールを使う環境を作る ちなみに、name: を指定した場合 ここに表⽰される。無指定の場合は コマンドがそのまま使われる。
2. のまとめ • GitHub Actionsの本質は「アクション」を軸にした ワークフロー処理の共有&ブラッシュアップ • 何かやりたいことがあったらまずはGitHub Marketplace で探す
• なければ⾃作する(DockerかTypeScriptで作成可)
どうやって使っていくか 1. ワークフローを起動させる 2. 各種ツール(ex. phpunit)を使う環境を作る 3. 各種ツールを使っていく
3. 各種ツールを使っていく • 今回使うツールはphpunit, phpstan, phpcs • やること • composer
install • `vendor/bin/{hoge}` の実⾏ • 簡単!
3. 各種ツールを使っていく
3. 各種ツールを使っていく composerのインストールをして
3. 各種ツールを使っていく ツールを実⾏!
3. 各種ツールを使っていく ちなみに今回のアプリケーションは 環境変数でDBの接続情報を受け取る
3. 各種ツールを使っていく
3. 各種ツールを使っていく それぞれエラーなく実⾏されている
3. 各種ツールを使っていく それぞれエラーなく実⾏されている
3. 各種ツールを使っていく それぞれエラーなく実⾏されている
やりたかったことができた
まとめ
まとめ • GitHub ActionsでPHPアプリケーションをCIするのは ⼗分現実的な選択肢の1つになっている • GitHub Actionsを使うなら、積極的にアクションを活⽤& 共有していきましょう!
end! ”Twemoji" by Twitter, Inc and other contributors is licensed
under CC-BY 4.0
appendix
(補⾜) ビルドキャッシュ • actions/cache を使えば簡単に使える • デメリットは記述が⻑くなること • 特にjobを分けたときに同じ事を何度も書かないといけ ない
• Github Actionsのymlはアンカー/マージ⾮対応
(補⾜) ビルドキャッシュ
(補⾜) reviewdog • reviewdogというコードレビューツール • PRのdiffの部分だけにlinterの警告が出るようにフィルター • 更にインラインでPRにアノテーションがつく • 2/11現在、サブディレクトリで実⾏するときにうまく動かない
不具合あり (ルートで実⾏すれば問題ない) • 修正PRが作られたので近いうちに解決しそう • 次スライドの処理はアクションに切り出してもよいかも
(補⾜) reviewdog
(補⾜) docker-composeでテスト • やろうと思えばできる(実際できた) • が、以下の理由から個⼈的にはまだ使っていない • 挙動がやや不安定(マウント, 権限等の関係?) •
随所でsleepする処理が必要(waitすることもできるけど…) • 遅い • 単純にビルド時間が+α • Docker Layer Cacheが困難
(補⾜) docker-composeでテスト
(余談) コネヒトの場合 • 業務では現在TravisCIをメインで使⽤ • DockerフレンドリーなCircleCIも⼀部使⽤ • GitHub Actionsは以下の箇所での導⼊実績のみ •
ネイティブアプリのリリース関連作業(※) • ライブラリの定期アップデート • PHPアプリケーションへのCI適⽤はない • 発表者の個⼈開発のみ ˞(JUIVC"DUJPOTΛͬͯϦϦʔε࡞ۀΛͪΐͬͱָʹͨ͠ ɹIUUQTUFDIDPOOFIJUPDPNFOUSZSFMFBTFGMPXBVUPNBUJPOCZHJUIVCBDUJPOT