【解説】第3章 速習GitHub Actions 〜 明日からの充実GitHub自動化ライフのための凝縮ポイント 〜 / zozotechbook1-ch03-githubactions

【解説】第3章 速習GitHub Actions 〜 明日からの充実GitHub自動化ライフのための凝縮ポイント 〜 / zozotechbook1-ch03-githubactions

Title
【解説】第3章 速習GitHub Actions 〜 明日からの充実GitHub自動化ライフのための凝縮ポイント 〜

Speaker
川崎 庸市 Yoichi Kawasaki (株式会社ZOZOテクノロジーズ SRE部)

2020/04/28 【オンライン】#技術書典 頒布本「ZOZO TECH BOOK」解説会 Vol.1
https://zozotech-inc.connpass.com/event/173309/
#zozotech

7634917a0679d61341cb5cf40dbc7766?s=128

Yoichi Kawasaki

April 28, 2020
Tweet

Transcript

  1. 1.

    【解説】第3章 速習GitHub Actions 〜 明日からの充実GitHub自動化ライフのための 凝縮ポイント 〜
 #技術書典 頒布本「ZOZO TECH

    BOOK」解説会 Vol.1
 株式会社ZOZOテクノロジーズ
 SRE部 
 川崎庸市 @yokawasa Copyright © ZOZO Technologies, Inc.
  2. 2.

    © ZOZO Technologies, Inc. 株式会社ZOZOテクノロジーズ SRE部 川崎 庸市 Yoichi Kawasaki

    株式会社ZOZOテクノロジーズ所属のエンジニア。過去に国内モバイルベンチャー や大手インターネット企業にて大規模サービスの基盤プラットフォーム開発に従 事、外資系ソフトウェアベンダーにて自社エンタープライズ検索製品やクラウドサー ビスの技術コンサルやアーキテクチャ策定支援に従事。現在はインフラ運用の自 動化・効率化が目下の関心事。業務外ではNoOps Japanコミュニティーの運営に 従事。趣味はサウナ。
 2 https://www.amazon.co.jp/dp/4839970920/ プログラマーのための Visual Studio Codeの教科書 共同著者本 4/30発売予定 Twitter / GitHub: @yokawasa
  3. 3.

    © ZOZO Technologies, Inc. 3 アジェンダ
 技術書典 応援祭で頒布された 「ZOZO TECH

    BOOK VOL.1」の 第3章「速習GitHub Actions 〜 明日からの充実 GitHub自動化ライフのための凝縮ポイント」 の凝縮ポイントを解説します。 発表後Q&Aタイムあります。
  4. 6.

    © ZOZO Technologies, Inc. GitHub Actionsとは?
 ソフトウェア開発のライフサイクルにおけるワークフローを自動化する サービス 6 •

    2018年 β版 GitHub Universeで発表 ◦ 実行環境:Linux版のみ ◦ ワークフロー記述形式:HCL • 2019年 11月正式版 ◦ 実行環境:Linux、macOS、Windows ◦ ワークフロー記述形式:YAML {repository}/.github/workflows/{action}.yml
  5. 7.

    © ZOZO Technologies, Inc. 7 name: Sample Node.js CI on:

    [push] jobs: test: name: Test on node ${{ matrix.node_version }} and ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: matrix: node_version: [8, 10, 12] os: [ubuntu-latest, windows-latest, macos-latest] steps: - uses: actions/checkout@v1 - name: Use Node.js ${{ matrix.node_version }} uses: actions/setup-node@v1 with: version: ${{ matrix.node_version }} - run: npm ci - run: npm test env: CI: true {repository}/.github/workflows/{action}.yml ワークフローをYAMLで記述 GitHub Actionsが自動実行 イベント (push)をトリガーにGitHub Actionsがワークフローを自動実行 GitHub Actionsのライブログ UI
  6. 8.

    © ZOZO Technologies, Inc. GitHub Actionsの特徴
 • GitHubとの親和性
 ◦ 自動化ワークフローを直接GitHubリポジトリに作成可能


    • 豊富なジョブ実行環境の選択肢
 ◦ Linux, macOS, Windows
 • 豊富なワークフロー実行トリガー
 ◦ リポジトリで発生する全ての操作イベントや外部イベントのトリガー、スケジュール実行
 • 充実した基本機能
 ◦ シークレット情報管理、Artifactの保存・取得、依存データのキャッシュ、etc.
 • 豊富なアクションの選択肢と充実したエコシステム
 ◦ GitHub公式+コミュニティ提供アクションとそれらを流通させるためのマーケットプレイス
 8
  7. 9.

    © ZOZO Technologies, Inc. 豊富なテンプレート&スニペットを使って簡単に開始
 9 select template アクション利用のための YAML

    スニペット • リポジトリに何もActionがない場合はスターター用テン プレート選択ページが表示 • キーワード検索でマーケットプレイスに公開されている アクション利用のためのスニペットを簡単に取得可能
  8. 10.

    step1 step2 step3 stepN Job1 ︙ ワークフロー イベント • push

    • pull requests • pull request review • issues • issue comment • fork • release • label • public • status • watch • deployment • … Triggers name: My Workflow on: push: branches: - 'releases/*’ - '!releases/**-alpha' jobs: job_one: name: Job_1 runs-on: ubuntu-latest steps: - name: step 1 run: echo "1" - name: step 2 run: echo "2" - name: step 3 run: echo ”3" job_two: name: Job 2 runs-on: windows-latest steps: ... ワークフローYAML Job1定義 Job2定義 Trigger定義 各step定義 実行環境 イベント、トリガー、ワークフローの基本
 アクションはステップとして実行されます
  9. 11.

    © ZOZO Technologies, Inc. 代表的なGitHubアクション
 11 主要GitHub公式アクション name: Go Release

    Project on: push: tags: - 'v*' # v0.01やv1.0のようなタグv*にマッチするpushイベント jobs: build: name: Upload Release Asset runs-on: ubuntu-latest steps: - name: Check out code into the Go module directory uses: actions/checkout@v2 - name: Build Project run: | GOOS=linux GOARCH=amd64 go build -o dist/hello . zip --junk-paths -r myartifact dist - name: Create Release # リリースの作成 id: create_release uses: actions/create-release@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: tag_name: ${{ github.ref }} release_name: Release ${{ github.ref }} draft: false prerelease: false - name: Upload Release Asset # リリースファイルのアップロード id: upload-release-asset uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} asset_path: ./myartifact.zip asset_name: myartifact.zip asset_content_type: application/zip
  10. 13.

    © ZOZO Technologies, Inc. ジョブ実行パターン - 並列実行(デフォルト)
 13 Job C

    Job A Job B Events jobs: job_a: runs-on: ubuntu-latest steps: - run: echo "A step in job A" job_b: runs-on: ubuntu-latest steps: - run: echo "A step in job B" job_c: runs-on: ubuntu-latest steps: - run: echo "A step in job C" Jobs in Workflow YAML 複数ジョブが定義されている場合、ジョブはデフォルトで並行実行される
  11. 14.

    © ZOZO Technologies, Inc. ジョブ実行パターン - Matrix実行
 14 • Matrix実行

    = ジョブの設定オプションをリストで指定できる • 複数のOS、プラットフォーム、言語バージョンなどの設定オプション別のジョブを 実行する場合、Matrixでリスト指定することで簡潔な記述が可能 Job (macos-latest) Events jobs: build: strategy: matrix: os: [macos-latest, windows-latest, ubuntu-latest] runs-on: ${{ matrix.os }} steps: - name: Build Project run: echo "Build on ${{ matrix.os }} Jobs in Workflow YAML Job (windows-latest) Job (ubuntu-latest)
  12. 15.

    © ZOZO Technologies, Inc. ジョブ実行パターン - 直列実行
 15 複数ジョブをシーケンシャルに実行するには、jobs.<job_id>.needsを使って他の ジョブに対する依存関係を定義する

    Job C Job A Job B Events jobs: job_a: runs-on: ubuntu-latest steps: - run: echo "A step in job A" job_b: needs: job_a runs-on: ubuntu-latest steps: - run: echo "A step in job B" job_c: needs: job_b runs-on: ubuntu-latest steps: - run: echo "A step in job C" Jobs in Workflow YAML
  13. 16.

    © ZOZO Technologies, Inc. ジョブ実行パターン - Fan-in Fan-out実行
 16 直列実行と並列実行の組み合わせによる

    Fan-in Fan-outパターンのジョブ実行 jobs: job_a: runs-on: ubuntu-latest steps: - run: echo "A step in job A" job_b: needs: job_a runs-on: ubuntu-latest steps: - run: echo "A step in job B" job_c: needs: job_a runs-on: ubuntu-latest steps: - run: echo "A step in job C" job_d: needs: job_a runs-on: ubuntu-latest steps: - run: echo "A step in job D" job_e: needs: [job_b, job_c, job_d] runs-on: ubuntu-latest steps: - run: echo "A step in job E" Jobs in Workflow YAML
  14. 18.

    © ZOZO Technologies, Inc. ジョブ実行環境 - GitHubホスト仮想マシン
 • GitHubが提供するGitHubホスト型の仮想マシン •

    マルチプラットフォーム(Linux、macOS、Windows)で提供 • ジョブは仮想マシン上のGitHubホスト型Runnerインスタンスで実行される 18 jobs: build: runs-on: ubuntu-16.04 ジョブ実行の仮想マシン指定 利用可能なGitHubホスト仮想マシン Supported runners and hardware resources https://help.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners#supported-runners-and-hardware-resources
  15. 19.

    © ZOZO Technologies, Inc. ジョブ実行環境 - Dockerコンテナー
 • ジョブを仮想マシン上のDockerコンテナー内で実行可能
 •

    jobs.<job_id>.steps.usesシンタックスでコンテナーを指定
 • メリット:ワークフローの単純化、利用ソフトウェアや環境の自由度
 19 jobs: build: name: Build on centos:6 (Alternateive) runs-on: ubuntu-latest steps: - name: Run on centos:6 (step level) uses: docker://centos:6 with: args: /bin/sh -c "cat /etc/*release ジョブ実行のコンテナー指定(ステップレベル)
  16. 20.

    © ZOZO Technologies, Inc. ジョブ実行環境 - セルフホスト型Runner
 セルフホスト型Runnerを独自環境にホストすることで独自環境でジョブを実行できる。 独自環境でのジョブ実行の主なモチベーションに次の点がある。 •

    自由度の高さ: GitHubホスト環境では利用できないソフトウェアやライセンスを要するソフトウェアを 使いたい • セキュリティ要件: ファイアウォール内のマシンと通信したい。また、クレデンシャル情報を含んだ処理 を他社環境で実行したくない
 20 Runner GitHub Port 443 Your Machine 独自環境はOutbound 443 portの穴あけ設定が必要 セルフホスト型Runnerのセキュリティ的懸念 Runnerが動く環境で悪意あるコードが実行されてしまうリスクが あるため、パブリックに公開されたリポジトリでの利用は推奨さ れていません。なお、 GitHubホスト型Runnerの場合は、Runner インスタンスで実行されるジョブは、実行毎でクリーンな隔離さ れた仮想マシンから実行され、処理が終わると全て破棄される ためこの心配はありません。
  17. 21.

    セルフホスト型Runner実行イメージ
 ① セルフホスト型Runner認証・起動 jobs: build: runs-on: self-hosted ④ セルフホスト型Runnerでジョブ実行 ③

    リポジトリにイベント発生 ② セルフホスト型Runnerが登録される ワークフローで実行環境に”self-hosted”を指定 独自環境(macOS上) GitHub リポジトリ(Private)
  18. 23.

    © ZOZO Technologies, Inc. 実行環境、イベント情報へのアクセス
 GitHub Actionsで発生したイベント情報、リポジトリ情報やワークスペース情報などは GitHub側で規定にセットされる環境変数やコンテキストから取得可能 
 23

    echo "GITHUB_WORKSPACE ${GITHUB_WORKSPACE}" echo "GITHUB_EVENT_PATH ${GITHUB_EVENT_PATH} 規定の環境変数の出力 コンテキスト情報(${{ expression }}でアクセス可能) steps: - name: Dump GitHub Context env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT GitHubコンテキストのダンプ例 • 規定の環境変数: https://help.github.com/en/actions/configuring-and-managing-workflows/using-environment-variables • コンテキスト情報: https://help.github.com/ja/actions/reference/contexts-and-expression-syntax-for-github-actions
  19. 24.

    © ZOZO Technologies, Inc. シークレット情報とGITHUB_TOKEN
 • GitHub Actionsはシークレット情報を管理・アクセスするための仕組みを提供。設定し た変数は${{ secrets.シークレット変数名

    }}でアクセス可能 • GitHub APIの利用に必要となるトークン情報は規定でsecrets.GITHUB_TOKENで アクセス可能 24 シークレット情報設定UI name: Create issue on commit on: - push jobs: create_commit: runs-on: ubuntu-latest steps: - name: Create issue using REST API run: | curl --request POST \ --url https://api.github.com/repos/${{ github.repository }}/issues \ --header 'authorization: Bearer ${{ secrets.GITHUB_TOKEN }}' \ --header 'content-type: application/json' \ --data '{ "title": "Automated issue for commit: ${{ github.sha }}", "body": "This issue was automatically created by the GitHub Action workflow **${{ github.workflow }}**" }' トークン情報を利用したGitHub REST API利用例
  20. 26.

    © ZOZO Technologies, Inc. 複数ジョブと複数ステップの実行空有間イメージ
 • ワークフローの各ジョブは別々のGitHubホスト型Runnerインスタンスで実行 • ジョブ中の各ステップはRunner環境の別々のプロセスで実行 26

    jobs: job_a: name: Job_A runs-on: ubuntu-latest steps: - name: step A1 run: echo "A1" - name: step A2 run: echo "A2" job_b: name: Job B runs-on: ubuntu-latest steps: - name: step B1 run: echo ”B1" 複数ジョブ+ステップのワークフロー step A1 step A2 step B1 ジョブAのRunnerインスタンス ジョブBのRunnerインスタンス プロセス プロセス プロセス
  21. 27.

    © ZOZO Technologies, Inc. データ共有方法 - ステップ間
 ステップはジョブが実行されるRunner環境におけるプロセスとして実行される 27 方法①

    共通のファイルシステムを通じた データ共有 方法② set-envやset-outputを使った後続 ステップへの共有 steps: - name: Dump Env Variables run: | echo "HOME: ${HOME}" echo "GITHUB_WORKSPACE: ${GITHUB_WORKSPACE}" - name: Write Data in a Job run: echo "Hello" > ${GITHUB_WORKSPACE}/myoutput.txt - name: Read Data in a Job run: | value=$(cat ${GITHUB_WORKSPACE}/myoutput.txt) echo "Read Data: ${value}" 環境変数 GITHUB_WORKSPACEやHOMEの活用 steps: - run: echo "::set-env name=TEST_VAR::Hello" - run: echo "TEST_VAR ${TEST_VAR}" steps: - run: echo "::set-output name=action_fruit::strawberry" id: fruit - uses: actions/hello-world-javascript-action@master with: who-to-greet: ${{ steps.fruit.outputs.action_fruit }} ::set-envで環境変数を後続ステップに共有 ::set-outputであるステップのoutputとして登録 GitHub Actionsワークフローコマンド: https://help.github.com/en/actions/reference/workflow-commands-for-github-actions
  22. 28.

    © ZOZO Technologies, Inc. データ共有方法 - ジョブ間
 複数ジョブ間でのデータの共有にはArtifact(成果物)用ストレージを活用する
 28 jobs:

    first_job: name: First Job runs-on: ubuntu-latest steps: - shell: bash run: | echo "First Job Success!!" > first-job.txt - name: Upload First Job Output uses: actions/upload-artifact@v1 with: name: job-output path: first-job.txt second_job: name: Second Job needs: first_job runs-on: ubuntu-latest steps: - name: Download First Job Output uses: actions/download-artifact@v1 with: name: job-output - shell: bash run: | value=$(cat job-output/first-job.txt) echo "First Job Output: ${value} ジョブが異なると異なるランナー環境で実行される。 よって、ステップ間の共有ように共通のワークスペース、ファイ ルシステムでのデータ共有ができず、また、複数ジョブ間で共有 可能な変数も提供されていない。 次のアクションを活用してArtifact用ストレージを通じ てジョブ間でデータを共有 • Artifactアップロード用アクション: actions/upload-artifact • Artifactダウンロード用のアクション actions/download-artifact Artifactアクションを活用したfirst_jobとsecond_jobのジョブ間でのデータ共有例
  23. 30.

    © ZOZO Technologies, Inc. 依存データのキャッシュ
 • ワークフロー内で依存データをキャッシュする 仕組み ◦ GitHub

    ホスト型 Runner インスタンスで実行されるジョブは、実行毎でクリーンな隔離さ れた仮想マシンから実行され、 ジョブの実行が終わると破棄されるため、依存ファイルを毎回ダウンロードする必要がある • 依存 データのキャッシュは actions/cacheアクションを利用 • さまざまな言語の依存パッケージに活用可能 30 - uses: actions/cache@v1 with: # npm cache files are stored in `~/.npm` on Linux/macOS path: ~/.npm key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.os }}-build-${{ env.cache-name }}- ${{ runner.os }}-build- ${{ runner.os }}- npmのキャッシュ設定例(Linux/macOS) ワークフローデータのキャッシングと保存 https://help.github.com/ja/actions/configuring-and-managing-workflows/caching-dependencies-to-speed-up-workflows
  24. 32.

    © ZOZO Technologies, Inc. github-scriptsで簡単GitHub API連携
 github-script アクションはインプットに JavaScript が記述でき、

    ワークフローで簡単に GitHub API を使った処理が追加できる 32 on: issues: types: [opened] jobs: comment: runs-on: ubuntu-latest steps: - name: Comment on an issue uses: actions/github-script@0.4.0 with: github-token: ${{secrets.GITHUB_TOKEN}} script: | const commentBody = `Hi @${context.actor}! Thanks for the feedback! We'll assign the issue to the content author to evaluate and update as appropriate.`; github.issues.createComment({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, body: commentBody }) Issueへのコメント例 Script シンタックスの中で既に API 認証済み の octokit/rest.js のクライアントであるgithub オブジェクトが利用可能 • gitHub-script: https://github.com/actions/github-script • Octokit/rest.js: https://octokit.github.io/rest.js/
  25. 33.

    © ZOZO Technologies, Inc. CI/CDだけじゃない、共通タスクの自動化
 • GitHub Actions はリポジトリのコードのビルド、テスト、リリースといった単なる CI/CD

    のためのワークフロー構築だけのための自動化ツールではない。リポジトリ で発生するすべての操作イベントのトリガーを提供し、さまざまな共通処理に活用可 能 ◦ Wiki のページ作成・更新(gollum)、Issue の作成(issues)や Issue へのコメン ト (issue_comment)、リポジトリへのラベル作成(label)、プロジェクトの作成(project) ◦ ワークフローをスケジュール実行 ◦ 外部イベント(repository_dispatch)をトリガーにワークフローを実行 • 共通タスク例 ◦ GitHub Issueコメントの内容に応じたChatOps的な処理 ◦ Pushされたコードに対する静的解析、セキュリティスキャンの実行 33
  26. 34.

    © ZOZO Technologies, Inc. カスタムアクション
 • 独自のアクションを作成してワークフローで実行可能 • 他のユーザーと共有が可能(マーケットプレイスへの公開) •

    JavaScript と Docker コンテナーアクションの2種類の作り方がある 34 用意するもの • action.yml - inputs/outputsなどメタデータ定義 • JavaScript or Dockerコンテナーアクション 公開方法 • 直接パスの公開 • マーケットプレイスへの登録 https://github.com/marketplace?type=actions GitHub Actionパスの指定: {owner}/{repo}@{ref} Publicレポジトリの特定のbranch, ref, またはSHAを指定可 能 steps: - uses: {owner}/{actionname}@74bc508 # 特定コミット - uses: {owner}/{actionname}@v1 # メジャーリリースバージョン - uses: {owner}/{actionname}@v1.2 # マイナーリリースバージョン - uses: {owner}/{actionname}@master # ブランチ
  27. 35.

    © ZOZO Technologies, Inc. カスタムアクション例
 35 Dockerコンテナーカスタムアクション例 name: 'Container Action

    Template' description: 'Get started with Container actions' author: 'GitHub' inputs: myInput: description: 'Input to use' default: 'world' runs: using: 'docker' image: 'Dockerfile' args: - ${{ inputs.myInput }} #!/bin/sh -l echo "hello $1" action.yml - アクションのinput/outputを定義 entrypoint.sh - コンテナーのエントリーポイントファイル 公開アクションパス (例 ownerがyokawasaの場合) yokawasa/container-action@v1 https://github.com/yokawasa/container-action uses: yokawasa/container-action@v1 with: myInput: 'world' カスタムアクションを使うワークフローYAML
  28. 36.

    © ZOZO Technologies, Inc. さいごに
 36 • GitHub Actionsを使うことで、CI/CDはもちろん、さまざまなGitHubベースの作業を 自動化でき、より効率的なソフトウェア開発が可能になります

    • まだはじめていない方、何でもいいのでご自身のリポジトリでワークフローを作成し てみるところからはじめてみてください。手を動かしてみることでその便利さが理解 できます。 Have a happy automation life with GitHub Actions!
  29. 37.