Slide 1

Slide 1 text

⾃動化と効率化のために GitHub Actionsを使いこなそう ⽇本仮想化技術株式会社 [email protected] 2024/06/19 1

Slide 2

Slide 2 text

発表者について • 技術部所属 • 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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

アジェンダ • GitHub Actionsとは • コンポーネント • アクションの危険性を理解する • 料⾦ • 少し踏み込んだ使い⽅ • Pushだけじゃないイベント駆動 • マトリックス • キャッシュを使った⾼速化 4

Slide 5

Slide 5 text

GitHub Actionsとは • GitHub ActionsはGitHubが提供するCI/CDのプラットフォーム • リポジトリで発⽣したイベントをトリガー • ワークフローを実⾏する仮想マシンは • GitHubが提供するGitHubホステッドランナー • ⾃分でマシンを⽤意するセルフホステッドランナー • ランナーのOSはLinux、Windows、macOS 5

Slide 6

Slide 6 text

コンポーネント 6 https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions#the-components-of-github-actions

Slide 7

Slide 7 text

コンポーネント • ワークフロー • .github/workflowsディレクトリ内にYAMLフォーマットで定義 • ファイル名を変えて複数定義できる • イベント • リポジトリで発⽣するイベント • コードがコミットされたとき、IssueやPRが作られたとき、スケジュール • トリガーできるイベント⼀覧 https://docs.github.com/ja/actions/using-workflows/events-that- trigger-workflows 7

Slide 8

Slide 8 text

コンポーネント • ジョブ • 同じランナーで実⾏される⼀連のステップ • 各ステップではシェルやアクションを実⾏ • ステップ間でファイルやデータを共有できる • アクション • ジョブを再利⽤可能な状態で公開 • 複雑な処理を⾃分で構築することなく実現できる • ランナー • ワークフローがトリガーされると実⾏されるサーバー • 毎回新しくプロビジョニングされ、1度に1つのジョブを実⾏ 8

Slide 9

Slide 9 text

アクションの危険性を理解する • 誰でも公開できる • 悪意のあるコードが混⼊しているかもしれない • 対策 • GitHub Marketplaceの「検証済み作者バッジ」を確認 • アクションのチェンジログ、リリースノートを確認 ネットに公開されているコードをコピペで実⾏しない 9

Slide 10

Slide 10 text

アクションの危険性を理解する 10

Slide 11

Slide 11 text

料⾦ プラン ストレージ 分(⽉あたり) 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倍 • 時間を使い切ったら追加で課⾦するまでジョブの実⾏ができない

Slide 12

Slide 12 text

少し踏み込んだ使い⽅ • Pushだけじゃないイベント駆動 • マトリックス • キャッシュを使った⾼速化 12

Slide 13

Slide 13 text

Pushだけじゃないイベント駆動 • IssueやPRの作成をトリガーできる • PRの作成時に⾃動でラベルをつける • スケジュールによってワークフローを実⾏ • ⾮アクティブなIssueやPRの⾃動クローズ 13

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

Issueの作成時に⾃動でラベルをつける 16

Slide 17

Slide 17 text

⾮アクティブな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

Slide 18

Slide 18 text

⾮アクティブな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

Slide 19

Slide 19 text

⾮アクティブなIssueやPRの⾃動クローズ 19

Slide 20

Slide 20 text

⾮アクティブなIssueやPRの⾃動クローズ 20

Slide 21

Slide 21 text

マトリックス • 1つのジョブを並列に処理できる • 静的な並列化 • 与えられた配列に基づいてジョブを並列に実⾏ • 動的な並列化 • 配列を動的に⽣成してジョブを並列実⾏ 21

Slide 22

Slide 22 text

マトリックス 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

Slide 23

Slide 23 text

マトリックス 23

Slide 24

Slide 24 text

マトリックス 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

Slide 25

Slide 25 text

マトリックス 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

Slide 26

Slide 26 text

マトリックス 26

Slide 27

Slide 27 text

マトリックスの注意点 27 • 実⾏時間 • 並列実⾏したジョブそれぞれの実⾏時間が⽉の実⾏時間から引かれる • 10並列でジョブを実⾏し1つのジョブの実⾏時間が1秒だった場合 • 1分(1秒でも起動したら次の分に切り上げ)* 10ジョブ = 10分

Slide 28

Slide 28 text

キャッシュを使った⾼速化 • ワークフローを⾼速化して効率を上げる • キャッシュを実現するにはcacheというアクションを使う https://github.com/actions/cache 28

Slide 29

Slide 29 text

キャッシュを使った⾼速化 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

Slide 30

Slide 30 text

キャッシュを使った⾼速化 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

Slide 31

Slide 31 text

キャッシュを使った⾼速化 31

Slide 32

Slide 32 text

キャッシュを使った⾼速化 32

Slide 33

Slide 33 text

キャッシュを使った⾼速化 33

Slide 34

Slide 34 text

キャッシュを使った⾼速化 34

Slide 35

Slide 35 text

キャッシュを使った⾼速化 35

Slide 36

Slide 36 text

キャッシュの注意点 36 • システムワイドにインストールするツールとの相性はいまいち • aptやyumやdnfなどなど • パスの設定が⾯倒 • このレベルのキャッシュが必要ならコンテナ化がおすすめ

Slide 37

Slide 37 text

まとめ • GitHub Actionsを使ってGitHub上での操作をサポートしよう • キャッシュやマトリックスを使⽤してワークフローの実⾏時間 を短縮しよう 37

Slide 38

Slide 38 text

参考リンク • 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

Slide 39

Slide 39 text

39