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.2k
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
630
余裕を生み出すコードレビュー 〜レビュイー編〜 / code-review-phpcon-2019
fortkle
8
6.9k
「設計振り返り」を始めてみようと思っている話 / 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
私なりのAIのご紹介 [2024年版]
qt_luigi
1
120
KubeCon NA 2024 Recap: How to Move from Ingress to Gateway API with Minimal Hassle
ysakotch
0
200
ハイテク休憩
sat
PRO
2
150
TSKaigi 2024 の登壇から広がったコミュニティ活動について
tsukuha
0
160
AI時代のデータセンターネットワーク
lycorptech_jp
PRO
1
290
DevOps視点でAWS re:invent2024の新サービス・アプデを振り返ってみた
oshanqq
0
180
LINEスキマニにおけるフロントエンド開発
lycorptech_jp
PRO
0
330
LINEヤフーのフロントエンド組織・体制の紹介【24年12月】
lycorp_recruit_jp
0
530
プロダクト開発を加速させるためのQA文化の築き方 / How to build QA culture to accelerate product development
mii3king
1
270
サービスでLLMを採用したばっかりに振り回され続けたこの一年のあれやこれや
segavvy
2
450
Opcodeを読んでいたら何故かphp-srcを読んでいた話
murashotaro
0
250
社内イベント管理システムを1週間でAKSからACAに移行した話し
shingo_kawahara
0
190
Featured
See All Featured
It's Worth the Effort
3n
183
28k
[RailsConf 2023] Rails as a piece of cake
palkan
53
5k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
2
170
GraphQLとの向き合い方2022年版
quramy
44
13k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
132
33k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
17
2.3k
Designing for humans not robots
tammielis
250
25k
Fontdeck: Realign not Redesign
paulrobertlloyd
82
5.3k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
Into the Great Unknown - MozCon
thekraken
33
1.5k
Java REST API Framework Comparison - PWX 2021
mraible
28
8.3k
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