GitHub Use Action List
date
May 31, 2024
slug
useAction
status
Published
tags
GitHub Action
summary
github action アクション中心にメモします
type
Post
Git Action 2
アクションを中心にメモします。
アクション利用はとても便利ですが、セキュリティやコンプライアンスなどで利用を制限する場合があります。
リポジトリ単位や組織単位で利用を制限することができます(settings -> Actions)
- Acton 直ぐ利用するため、github action toolkitを利用します
- javascript-actionの依存関係を管理するため、zeit/nccを利用します
- gitaction 公式テンプレートをベースに作成します
1. アクションの種類
javascript-action はGitHubから提供したVMから直接実行できます コンテナの起動コストがかかりません、実行速度が速いです
種類 | 説明 |
javascript-action | JavaScriptで記述されたアクション |
docker | Dockerコンテナで実行されるアクション |
2. アクションの保存場所
公開するアクションの場合、ソフトウェアと別にリポジトリを作成し、そのリポジトリにアクションを保存します 管理やすくなり、利用者も分かりやすくなります
プライベートなアクションの場合、リポジトリの中に保存します, どのリポジトリからも利用できますが、.github/workflows/actions 或いは、.github/actions に保存することが推奨されます 例えば、.github/actions/lint, .github/actions/test, .github/actions/build"w
3. アクションのバージョン指定
sha, branch, tag でバージョンを指定できます SHA 指定が最も安全です、公式や自作など信頼できるアクションの場合、branch指定でも問題ありません。
4. アクションの利用
1. javascript-action
フォルダー構成
. ├── .github │ └── actions │ └── my-action │ ├── action.yml │ └── dist │ └── index.js │ └── workflows │ └── test.yml └── package.json
action定義 利用可能なメタデータは以下の通りです
- name: アクションの名前
- description: アクションの説明
- inputs: アクションの入力
- id: 入力のID
- description: 入力の説明
- required: 入力が必須かどうか
- default: 入力のデフォルト値
inputs: name: description: 'Name of the person to greet' required: true default: 'World' loud: description: 'Whether to greet loudly' required: false default: 'false'
- outputs: アクションの出力
- id: 出力のID
- description: 出力の説明
outputs: greeting: ${{ steps.hello.outputs.greeting }}
- runs: アクションの実行方法
- using: 実行環境
- main: 実行するファイル
runs: using: 'node12' main: 'dist/index.js'
- docker image利用の場合
runs: using: 'docker image: 'docker://alpine:latest' #Dockerfileの場合は、Dockerfileを指定 args: - ${{ inputs.name }} - ${{ inputs.loud }}
- branding: アクションのロゴ
- icon: アクションのアイコン
- color: アクションの色(bule, green, yellow, orange, red, purple, pink)
branding: icon: 'package' color: 'blue'
- author: アクションの作者
- license: アクションのライセンス
- repository: アクションのリポジトリ
- version: アクションのバージョン
# action.yml name: "JavaScript Action" runs: using: "node12" main: "dist/index.js"
index.js
# index.js console.log('Hello, World!');
テストワークフロー
# test.yml name: "Test" on: [push] jobs: test: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 - name: Run action uses: ./.github/actions/my-action
他のリポジトリから利用する場合,タグを作成して利用します
git tag -a -m "v1.0.0" v1.0.0 git push origin v1.0.0 git show v1.0.0
利用するリポジトリのワークフロー
# test.yml name: "Test" on: [push] jobs: test: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 - name: Run action uses: owner/repo@v1.0.0 ## タグ指定
2. docker-action
フォルダー構成
# action.yml name: "Say Hello" inputs: name: description: 'Name of the person to greet' required: true default: 'ywsrock' outputs: description: 'this is a description' runs: using: 'docker' image: 'Dockerfile' args: - ${{ inputs.name }}
Dockerfile
# Dockerfile FROM alpine:latest COPY entrypoint.sh /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"]
entrypoint.sh
#!/bin/sh -l echo "::set-output name=description::Hello $1"
テストワークフロー
# test.yml name: "Test" on: [push] jobs: test: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 - name: Run action id: hello uses: ./.github/actions/action with: name: 'ywsrock' - name: output run: echo ${{ steps.hello.outputs.description }}
5. よく利用されるアクション
1. 失敗時、Slackに通知する
rtCamp/action-slack-notifyを利用します webhookを設定して、通知します
# test.yml name: "Test" on: [push] jobs: test: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 - name: fail job run: exit 1 - name: Slack Notification if: failure() uses: rtCamp/action-slack-notify@v2 env: SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} SLACK_USERNAME: GitHub Actions SLACK_ICON: <https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png> SLACK_COLOR: '#000000' SLACK_TITLE: 'GitHub Actions' SLACK_MESSAGE: 'Failed'
確認環境変数の説明
環境変数 | 説明 | 備考 |
SLACK_WEBHOOK | SlackのWebhook URL | slack チャンネルにアプリを追加すると、Webhook URLが表示される |
SLACK_USERNAME | Slackのユーザー名 | ㅤ |
SLACK_ICON | Slackのアイコン | ㅤ |
SLACK_COLOR | Slackのカラー | ㅤ |
SLACK_TITLE | Slackのタイトル | ㅤ |
SLACK_MESSAGE | Slackのメッセージ | ㅤ |
2. sshに接続してワークフローをデバッグ
mxschmitt/action-tmateを利用します ssh接続して、ワークフローをデバッグします
# test.yml name: "Test" on: [push] jobs: test: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 - name: Setup tmate uses: mxschmitt/action-tmate@v2 - name: Run action run: | echo "Hello, World!"
ワークフローを実行すると、mxschmitt/action-tmateのステップでとまります、ログに表示されるURLにアクセスして、ssh接続します
3. reviewdogを利用して、コードレビューを行う,pull requestにコメントを追加する
jsの場合、reviewdog/action-eshintを利用します (他の言語も利用可能) pull requestにコメントを追加します
# test.yml name: "Test" on: [pull_request] jobs: test: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 - name: Run action run: | echo "Hello, World!" - name: reviewdog uses: reviewdog/action-eslint@v2 with: github_token: ${{ secrets.GITHUB_TOKEN }} eslint_flags: '--ext .js'
環境変数の説明 GITHUB_TOKEN: pull requestにコメントを追加するために必要です eslint_flags: '--ext .js' は、jsファイルのみを対象にします
4. pull requestにラベルを追加する
actions/labelerを利用します ラベルを自動追加します
# test.yml name: "Test" on: [pull_request] jobs: test: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 - name: Run action run: | echo "Hello, World!" - name: labeler uses: actions/labeler@v2 with: repo-token: ${{ secrets.GITHUB_TOKEN }} config-path: .github/labeler.yml
labeler.yml 指定キーワードがある場合、ラベルを追加します
# labeler.yml labels: - name: bug color: ff0000 description: "Something isn't working" pattern: "fix|bug" - name: enhancement color: 84b6eb description: "New feature or request" pattern: "feature|enhancement"
特定ファイルにラベルを追加する場合
# labeler.yml labels: - name: bug color: ff0000 description: "Something isn't working" pattern: "fix|bug" files: - "src/**/*" - name: enhancement color: 84b6eb description: "New feature or request" pattern: "feature|enhancement" files: - "src/**/*"
5. pull requestにコメントを追加する
actions/github-scriptを利用します pull requestにコメントを追加します
# test.yml name: "Test" on: [pull_request] jobs: test: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 - name: Run action run: | echo "Hello, World!" - name: comment uses: actions/github-script@v3 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | github.issues.createComment({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, body: 'Hello, World!' })
6. pull requestにレビューを追加する
actions/github-scriptを利用します pull requestにレビューを追加します
# test.yml name: "Test" on: [pull_request] jobs: test: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 - name: Run action run: | echo "Hello, World!" - name: review uses: actions/github-script@v3 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | github.pulls.createReview({ owner: context.repo.owner, repo: context.repo.repo, pull_number: context.issue.number, body: 'Hello, World!', event: 'COMMENT' })
7. Terraform GitHub Actions でAWSリソースをデプロイする
hashicorp/setup-terraformを利用します TerraformでAWSリソースをデプロイします
# test.yml name: "Test" on: [push] jobs: test: runs-on: ubuntu-latest env: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} terraform_version: 1.0.0 steps: - name: Checkout uses: actions/checkout@v2 - name: Setup Terraform uses: hashicorp/setup-terraform@v1 with: terraform_version: ${{ env.terraform_version }} - name: format uses: hashicorp/terraform-github-actions@master with: tf_actions_version: {{ env.terraform_version }} tf_actions_subcommand: "fmt" env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: init uses: hashicorp/terraform-github-actions@master with: tf_actions_version: {{ env.terraform_version }} tf_actions_subcommand: "init" env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: plan uses: hashicorp/terraform-github-actions@master with: tf_actions_version: {{ env.terraform_version }} tf_actions_subcommand: "plan" env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: apply uses: hashicorp/terraform-github-actions@master with: tf_actions_version: {{ env.terraform_version }} tf_actions_subcommand: "apply" env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
terraform 定義ファイル stateファイルを保存するため、backendをS3に設定します
# main.tf provider "aws" { region = "us-west-2" } resource "aws_instance" "example" { ami = "ami-0c55b159cbfafe1f0" instance_type = "t2.micro" } terraform { backend "s3" { bucket = "mybucket" key = "path/to/my/key" region = "us-west-2" } }