Upgrade to Pro — share decks privately, control downloads, hide ads and more …

自動化と効率化のためにGitHub Actionsを使いこなそう

自動化と効率化のためにGitHub Actionsを使いこなそう

GitHub ActionsはただのCI/CDツールではなく、GitHubを中心とした開発の効率化にも役立ちます。
今回は、少し踏み込んでマトリックスビルドやキャッシュの活用、イベント駆動型のワークフローなどの応用的なテクニックについて紹介します。

とことんDevOps

June 19, 2024
Tweet

More Decks by とことんDevOps

Other Decks in Technology

Transcript

  1. 発表者について • 技術部所属 • DevOpsのOps側を担当 • IaCのコードを書いたり • CI/CDを組んだり、など •

    たまに執筆もしています • Software Design https://gihyo.jp/magazine/SD/archive/2023/202303 https://gihyo.jp/magazine/SD/archive/2023/202311 • ThinkIT https://thinkit.co.jp/author/21963 2
  2. ⽇本仮想化技術株式会社 概要 • 社名:⽇本仮想化技術株式会社 • 英語名:VirtualTech Japan Inc. • 設⽴:2006年12⽉

    • 資本⾦:3,000万円 • 本社:東京都渋⾕区渋⾕1-8-1 • 取締役:宮原 徹(代表取締役社⻑兼CEO)、伊藤 宏通(取締役CTO) • スタッフ:11名(うち、8名が仮想化技術専⾨エンジニアです) • URL:http://VirtualTech.jp/ • 仮想化技術に関する研究および開発 • 仮想化技術に関する各種調査 • 仮想化技術に関連したソフトウェアの開発 • 仮想化技術を導⼊したシステムの構築 • OpenStackの導⼊⽀援・新規機能開発 3 ベンダーニュートラルな 独⽴系仮想化技術の エキスパート集団 会社概要
  3. アジェンダ • GitHub Actionsとは • コンポーネント • アクションの危険性を理解する • 料⾦

    • 少し踏み込んだ使い⽅ • Pushだけじゃないイベント駆動 • マトリックス • キャッシュを使った⾼速化 4
  4. GitHub Actionsとは • GitHub ActionsはGitHubが提供するCI/CDのプラットフォーム • リポジトリで発⽣したイベントをトリガー • ワークフローを実⾏する仮想マシンは •

    GitHubが提供するGitHubホステッドランナー • ⾃分でマシンを⽤意するセルフホステッドランナー • ランナーのOSはLinux、Windows、macOS 5
  5. コンポーネント • ワークフロー • .github/workflowsディレクトリ内にYAMLフォーマットで定義 • ファイル名を変えて複数定義できる • イベント •

    リポジトリで発⽣するイベント • コードがコミットされたとき、IssueやPRが作られたとき、スケジュール • トリガーできるイベント⼀覧 https://docs.github.com/ja/actions/using-workflows/events-that- trigger-workflows 7
  6. コンポーネント • ジョブ • 同じランナーで実⾏される⼀連のステップ • 各ステップではシェルやアクションを実⾏ • ステップ間でファイルやデータを共有できる •

    アクション • ジョブを再利⽤可能な状態で公開 • 複雑な処理を⾃分で構築することなく実現できる • ランナー • ワークフローがトリガーされると実⾏されるサーバー • 毎回新しくプロビジョニングされ、1度に1つのジョブを実⾏ 8
  7. アクションの危険性を理解する • 誰でも公開できる • 悪意のあるコードが混⼊しているかもしれない • 対策 • GitHub Marketplaceの「検証済み作者バッジ」を確認

    • アクションのチェンジログ、リリースノートを確認 ネットに公開されているコードをコピペで実⾏しない 9
  8. 料⾦ プラン ストレージ 分(⽉あたり) Free 500 MB 2,000 Pro 1

    GB 3,000 Team 2 GB 3,000 Enterprise Cloud 50 GB 50,000 11 • パブリックリポジトリからGitHub Actionsを使う場合は無料 • プライベートリポジトリから使⽤する場合は表の制限あり • 時間は毎⽉リセットされるがストレージの容量は成果物やPackagesを削除するまで変わらない • OSによっても実⾏時間の倍率が違う • Linuxは1倍 • Windowsは2倍 • macOSは10倍 • 時間を使い切ったら追加で課⾦するまでジョブの実⾏ができない
  9. PRの作成時に⾃動でラベルをつける 1 on: 2 pull_request: 3 4 jobs: 5 triage:

    6 runs-on: ubuntu-latest 7 permissions: 8 contents: read 9 pull-requests: write 10 steps: 11 - uses: actions/labeler@v5 12 with: 13 repo-token: ${{ secrets.github_token }} 14 configuration-path: .github/labeler.yaml 14
  10. Issueの作成時に⾃動でラベルをつける 9 Documentation: 10 - changed-files: 11 - any-glob-to-any-file: 'docs/*'

    12 13 terraform: 14 - changed-file: 15 - any-glob-to-any-file: 'terraform/**' 16 17 feature: 18 - head-branch: ['^feature', 'feature'] 15
  11. ⾮アクティブなIssueやPRの⾃動クローズ 1 on: 2 workflow_dispatch: 3 schedule: 4 - cron:

    "30 1 * * *" 5 6 jobs: 7 close-issues: 8 runs-on: ubuntu-latest 9 permissions: 10 issues: write 17
  12. ⾮アクティブなIssueやPRの⾃動クローズ 11 steps: 12 - uses: actions/stale@v5 13 with: 14

    days-before-issue-stale: 1 15 days-before-issue-close: 1 16 stale-issue-label: "stale" 17 stale-issue-message: “⾮アクティブとマークされた" 18 close-issue-message: “クローズされた" 19 days-before-pr-stale: -1 20 days-before-pr-close: -1 21 repo-token: ${{ secrets.GITHUB_TOKEN }} 18
  13. マトリックス 1 on: 2 push: 3 4 jobs: 5 matrix:

    6 strategy: 7 matrix: 8 version: [18, 20] 9 os: [ubuntu-22.04, ubuntu-20.04] 10 runs-on: ${{ matrix.os }} 11 steps: 12 - uses: actions/setup-node@v4 13 with: 14 node-version: ${{ matrix.version }} 22
  14. マトリックス 4 jobs: 5 set-matrix: 6 runs-on: ubuntu-latest 7 outputs:

    8 matrix: ${{ steps.git-diff.outputs.matrix }} 9 steps: 10 - uses: actions/checkout@v4 11 with: 12 ref: ${{ github.event.pull_request.base.ref }} 13 - uses: actions/checkout@v4 14 - id: git-diff 15 run: | 16 a=$(git diff --name-only origin/${GITHUB_BASE_REF} HEAD -- . ¥ 17 | sed -E 's/^(.*)¥/[^/]*$/"¥1",/' | sort -u | tr -d '¥n' ¥ 18 | sed -E 's/,$//; s/^(.*)$/[¥1]/' | jq -c '{"workdir": .}') 19 echo -E "matrix=$a" >> "$GITHUB_OUTPUT" 24
  15. マトリックス 20 21 matrix: 22 needs: set-matrix 23 runs-on: ubuntu-latest

    24 strategy: 25 matrix: ${{ fromJSON(needs.set- matrix.outputs.matrix) }} 26 steps: 27 - uses: actions/checkout@v4 28 - run: pwd 29 working-directory: ${{ matrix.workdir }} 25
  16. キャッシュを使った⾼速化 5 jobs: 6 cache: 7 runs-on: ubuntu-latest 8 steps:

    9 - uses: actions/checkout@v4 10 - id: cache-go 11 uses: actions/cache@v4 12 with: 13 path: | 14 ~/.cache/go-build 15 ~/go/pkg/mod 16 key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} 17 restore-keys: | 18 ${{ runner.os }}-go- 29
  17. キャッシュを使った⾼速化 19 - if: ${{ steps.cache-go.outputs.cache-hit != 'true' }} 20

    run: go mod tidy 21 working-directory: cache 22 - run: go build 23 working-directory: cache 30
  18. 参考リンク • GitHub Actionsを理解する https://docs.github.com/ja/actions/learn-github-actions/understanding-github-actions • ワークフローをトリガーするイベント https://docs.github.com/ja/actions/using-workflows/events-that-trigger-workflows • 依存関係をキャッシュしてワークフローのスピードを上げる

    https://docs.github.com/ja/actions/using-workflows/caching-dependencies-to-speed-up- workflows • Issueにラベルを追加する https://docs.github.com/ja/actions/managing-issues-and-pull-requests/adding-labels-to- issues • ⾮アクティブなIssueをクローズする https://docs.github.com/ja/actions/managing-issues-and-pull-requests/closing-inactive- issues • ジョブにマトリックスを使⽤する https://docs.github.com/ja/actions/using-jobs/using-a-matrix-for-your-jobs • サンプルコード https://github.com/VirtualTech-DevOps/devops-23 38
  19. 39