LoginSignup
1
1

More than 3 years have passed since last update.

今更だけどGitHub Actionsに入門してみた

Posted at

記事の目的

業務でCircleCIからGitHubActionsへのリプレイスを行った際に調べた事や記述などまとめておきます。(ほぼ自分用)

間違ってる箇所などあれば教えてください:robot:

GitHub Actionsとは?

GitHubに組み込まれたCI/CD機能
2018年10月に開催された開発者のためのカンファレンス、GitHub Universeにて発表され、
2019年11月にリリースされた新しめの技術

特徴

○無料で使える!

正確にはPublicリポジトリであれば無料で、Privateリポジトリは有料ですが2000分/月まで無料で使えちゃいます。(うちのような小規模プロジェクトでは十分)
料金詳細 →

◯GitHubのイベントをトリガーに出来る!

branchにpushやissueの発行、pull requestなど様々なイベントをトリガーにすることができます。
ワークフローをトリガーするイベント →

◯豊富なアクション!

GitHub Actionsでは、実行する処理を定義したものをWorkflow(ワークフロー)と呼びます。
ワークフロー内では、シェル経由で任意のコマンドを実行できるほか、Action(アクション)という、あらかじめ定義済みの処理が豊富に用意されています!
Actions →

○キックの単位をフィルタリング出来る!

特定のディレクトリ、ファイルでフィルタリングが出来る為、IaC系のコードの変更時のみなど特定のにキックされるワークフローを作る事ができます。
フィルタパターンのチートシート →

他にもスケジューリングなどたくさんの機能があります。

Secrets

シークレットは暗号化された環境変数で、Organization、リポジトリ、あるいはリポジトリ環境に作成でき、作成したシークレットは、GitHub Actionsワークフローで利用できる!
※設定はリポジトリオーナーのみ

${{ secrets.DOCKERHUB_USERNAME }}

暗号化されたシークレット →

Workflow(ワークフロー

GitHub Actionsは、YAML 構文を使用して、イベント、ジョブ、およびステップを定義する。

name: ci

on:
  push:
    branches: main

jobs:
  login:
    runs-on: ubuntu-latest
    steps:
      -
        name: Login to Docker Hub
        uses: docker/login-action@v1
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

■ name

好きなワークフロー名

name: ci

■ on(必須)

ワークフローをトリガーするGitHubイベントを決めます

□ on.push

# リポジトリ内のpushでキック
on: push
# masterブランチのpushでキック
on:
  push:
    branches: master

□ on.pull_request

# リポジトリ内のpush, PRでキック
on: [push, pull_request]
# mainブランチのpush, PRでキック
on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

□ on.paths

# cloud_formation_templates/以下の変更があった場合のみキック
# IaC系とアプリコードを同一リポジトリで管理しやすくなりそう
on:
  push:
    paths:
    - 'cloud_formation_templates/**'
# !否定
on:
  push:
    paths:
    - '!**.md'

フィルタパターンのチートシート →

■ env

ワークフローで設定出来る環境変数
設定した箇所でスコープが異なる

# 全てのjobから参照可
env:
  RAILS_ENV: production

jobs:
  job1:
    name: Greeting
    runs-on: ubuntu-latest
   # job1内から参照可
    env:
      GREET: Hello

    steps:
    - name: Print greeting
      # steps Print greeting内から参照可
      env:
        FIRST_NAME: Satoru
        LAST_NAME: Gojo
      run: |
        echo $GREET $LAST_NAME $FIRST_NAME.
     
     # => Hello Gojo Satoru

■ jobs

ワークフローには1つ以上のジョブからなり、 デフォルトでは、ジョブは並行して実行されます。後述するneedsなどを使いジョブを順番に実行するようにワークフローを設定することもできます。
各ジョブは仮想環境の新しいインスタンスで実行される為、
ジョブ間で環境変数やファイル、実行結果などは共有されないので注意!

□ jobs.< jobs_id >

ジョブ内でユニークな文字型で命名

jobs:
  first_job_id:

  second_job_id:

□ jobs.< jobs_id >.runs-on(必須)

ジョブが実行される仮想環境を指定

jobs:
  first_job_id:
    runs-on: ubuntu-latest

  second_job_id:
    runs-on: windows-latest

Windows Server 2019, macOS Big Sur 11.0などなどが使えます。
jobs.< jobs_id >.runs-on →

□ jobs.< job_id>.steps

1つのジョブ内で順番に実行されるタスク

jobs:
  first_job_id:
    runs-on: ubuntu-latest
    steps:
      - name: My first step
      run: echo First step.

      - name: My second step
      run: echo Second step.

□ jobs.< job_id>.needs

ジョブの実行前に正常完了する必要があるジョブを指定し依存関係を作る

  1. job1実行
  2. job1が正常終了されたらjob2を実行
  3. job1job2が正常終了されたらjob3を実行
jobs:
  job1:
  job2:
    needs: job1
  job3:
    needs: [job1, job2]

□ jobs.< job_id>.steps[*].run

コマンド実行!
シェルのカスタマイズも出来る

jobs:
  first_job_id:
    runs-on: ubuntu-latest
    steps:
      - name: My first step
      run: echo First step.

      # 複数コマンド実行
      - name: My second step
      run: |
        echo First line.
        echo Second line
        echo Third line

□ jobs.< job_id>.steps[*].uses

ステップの一部として実行されるアクションを選択できます!
AWSの初期セットアップもこれでオッケー

steps:
  - name: checkout
    uses: actions/checkout@v2
  - name: configure AWS credentials
    uses: aws-actions/configure-aws-credentials@v1
    # with => 入力パラメータ
    with:
      aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
      aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
      aws-region: ap-northeast-1

Tips

指定ブランチにマージされたらキックする


on:
  pull_request:
    branches:
      - main
    types: [closed]

jobs:
  test:
    runs-on: ubuntu-latest
    if: github.event.pull_request.merged == true

Slackへ実行結果の通知

  slack-notify:
    if: always()
    needs: test
    name: workflow notification to slack
    runs-on: ubuntu-latest
    steps:
      - uses: Gamesight/slack-workflow-status@master
        with:
          repo_token: ${{ secrets.GITHUB_TOKEN }}
          slack_webhook_url: ${{ secrets.SLACK_WEBHOOK_URL }}

# ${{ secrets.GITHUB_TOKEN }} => デフォルトの環境変数

Docker Hub Build Push

  build:
    runs-on: ubuntu-latest
    steps:
      - name: Check Out Repo
        uses: actions/checkout@v2

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v1

      - name: Login to DockerHub
        uses: docker/login-action@v1
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}

      - name: Set up Docker Buildx
        id: buildx
        uses: docker/setup-buildx-action@v1

      - name: Build and push
        id: docker_build
        uses: docker/build-push-action@v2
        with:
          context: ./
          file: ./Dockerfile
          push: true
          tags: ${{ secrets.DOCKER_IMAGE_REPO }}:latest

      - name: Image digest
        run: echo ${{ steps.docker_build.outputs.digest }}

参考

GitHub Actionsのワークフロー構文
Configure GitHub Actions
Github Actionsの使い方メモ
GitHubの新機能「GitHub Actions」で試すCI/CD
GitHub Actionsでworkflow全体の結果をSlackに通知する
Github Actionsに入門してみた(CI編)

1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1