Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

持続可能なソフトウェア開発を支える『GitHub CI/CD実践ガイド』

tmknom
September 17, 2024

持続可能なソフトウェア開発を支える『GitHub CI/CD実践ガイド』

書籍『GitHub CI/CD実践ガイド』はGitHub Actionsの基本構文からスタートし、テスト・静的解析・リリース・コンテナデプロイなどをハンズオン形式で学べる一冊です。Dependabot・OpenID Connect・継続的なセキュリティ改善・GitHub Appsについても解説し、実運用に欠かせないプラクティスを多数習得できます。

本発表では『GitHub CI/CD実践ガイド』のポイントを紹介していきます。
https://gihyo.jp/book/2024/978-4-297-14173-8

tmknom

September 17, 2024
Tweet

More Decks by tmknom

Other Decks in Technology

Transcript

  1. GitHub Actionsの実装 ワークフロー いつ・どこで・なにをするか定義 YAMLの独自構文で実装 GitHub Actionsの管理単位 ワークフローの構成要素 イベント/ランナー/ステップ/ジョブ name:

    Test # 配置先ディレクトリ on: # .github/workflows workflow_dispatch: pull_request: paths: ['**.go'] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: go-version: '1.22' - run: go test 17
  2. 構成要素:イベントとランナー イベント ワークフロー実行の起点 プルリクエストや手動実行など ランナー GitHub Actionsの実行環境 毎回クリーンな環境で起動 name: Test

    on: # イベント workflow_dispatch: # 手動実行 pull_request: # プルリクエスト paths: ['**.go'] jobs: test: # WindowsやmacOSも指定可 runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: go-version: '1.22' - run: go test 18
  3. 構成要素:ステップとジョブ ステップ 処理の最小単位 シェルコマンドやアクションを実行 ジョブ ランナーとステップを取りまとめ 複数定義すれば並列実行できる name: Test on:

    workflow_dispatch: pull_request: paths: ['**.go'] jobs: # ジョブは複数定義可 test: # このコードでは1つだけ定義 runs-on: ubuntu-latest steps: # ステップは処理の最小単位 - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: go-version: '1.22' - run: go test 19
  4. コンテキストとは 複数のプロパティで構成されたオブジェクト GitHub Actionsの独自記法「 ${{ <expression> }} 」で参照 - run:

    echo "${{ github.event.pull_request.title }}" # コンテキストからPRタイトルを取得 利用頻度が非常に高く、さまざまなデータへのアクセスに利用 ブランチ名・イベント名・実行者・PR番号などの実行時情報 ワークフロー手動起動時に指定できる入力パラメータ VariablesやSecretsが保持している値 30
  5. コンテキストのアンチパターン シェルコマンドへコンテキストを直接埋め込むのはNG スクリプトインジェクションという攻撃に利用されてしまう - run: echo "${{ github.event.pull_request.title }}" #

    脆弱性アリなBad Code! 不正なタイトルでプルリクエストを作成すると… 文字列ではなく、シェルコマンドとして解釈される! 31
  6. 中間環境変数 コンテキストを環境変数へマッピングし、環境変数経由で参照する 環境変数をクォートするのがミソ コマンド実行を抑止し、ただの文字列として扱う - run: echo "${PR_TITLE}" # 環境変数は忘れずにダブルクォーテーションで囲む!

    env: PR_TITLE: ${{ github.event.pull_request.title }} # 環境変数へマッピング 同じように記述しても、コンテキストの場合はクォートされない - run: echo "${{ github.event.pull_request.title }}" # クォートされない! 34
  7. アクションとは GitHub Actionsにおけるモジュールの一種 他者が実装したアクションを使えば、実装の手間が省ける - uses: actions/checkout@v4 # コードを取得するアクション 大変便利な仕組みで、GitHub

    Actionsでは不可欠な要素 誰でも簡単に実装でき、多数のアクションが公開されている アクション公開時に審査などは行われない 一般的なOSSと同様、自己責任で利用する 59