概要
GitHub Actionsを使って、ビルドやテスト、デプロイを自動化する方法を簡単にまとめてみました。
GitHub Actionsとは
GitHub Actionsは、コードのビルドやテスト、デプロイを自動化するためのCI/CDプラットフォームです。.github/workflowsディレクトリに配置したYAMLファイルに従って、特定のイベント(pushやpull_requestなど)が発生すると自動的にワークフローが実行されます。
YAMLファイルの基本
GitHub Actionsでワークフローを設定する際に必要なYAMLファイルについて、基本的な要素を解説します。
主な要素
- name:ワークフローの名前を指定します。
 - on:どのイベントが発生した時にワークフローを実行するかを指定します。
 - jobs:実行するタスクの単位を設定します。
 - runs-on:ワークフローを実行する環境(OS)を指定します。
 - steps:ジョブ内で実行する各処理を定義します。
 - uses:GitHubやサードパーティが提供するアクションを利用します。
 - run:シェルコマンドを直接実行します。
 
イベントの指定(on)
どのイベントが発生したらワークフローを実行するかを指定します。以下は、mainブランチにpushされた際にワークフローを実行する設定例です。
on:
  push:
    branches:
      - main設定できるイベントの例:
| イベント名 | 説明 | 
|---|---|
| push | push時に実行 | 
| pull_request | pull request作成時 | 
| fork | fork時に実行 | 
| schedule | 定期的に実行 | 
| workflow_dispatch | 手動で実行 | 
| workflow_run | 他のワークフロー完了時 | 
ジョブの定義(jobs)
ジョブとは、ワークフロー内で実行するタスクの単位です。以下は、ジョブを定義する基本の書き方です。
jobs: 
  jobid:
    name: jobname
    runs-on: ubuntu-latest 
    steps: ...
実行環境の設定(runs-on)
ジョブを実行する環境(OS)を指定します。たとえば、Ubuntuを使う場合は以下のように記述します。
runs-on: ubuntu-latest ステップの定義(steps)
ジョブ内で実行する個々の処理を定義します。複数のステップを順番に実行することでワークフローを構成します。
steps:
  - name: Checkout code
    uses: actions/checkout@v2
  - name: Set up Ruby
    uses: ruby/setup-ruby@v1
    with:
      bundler-cache: true
  - name: Setup Node.js
    uses: actions/setup-node@v4
    with:
      node-version: "20"
      cache: npm
  - run: node --version
ステップの定義(steps)
ジョブ内で実行する個々の処理を定義します。複数のステップを順番に実行することでワークフローを構成します。
steps:
  - name: Checkout code
    uses: actions/checkout@v2
  - name: Set up Ruby
    uses: ruby/setup-ruby@v1
    with:
      bundler-cache: true
  - name: Setup Node.js
    uses: actions/setup-node@v4
    with:
      node-version: "20"
      cache: npm
  - run: node --version他のアクションの利用(uses)
usesを使うことで、GitHubやサードパーティが提供しているアクションを簡単に利用できます。以下は、Node.jsをセットアップするアクションの例です。
- name: Setup Node.js
  uses: actions/setup-node@v4
  with:
    node-version: "20"
    cache: npmコマンドの実行(run)
runを使うと、指定したコマンドを実行できます。以下の例では、Node.jsのバージョンを確認するコマンドを実行します。
- run: node --versionサンプルワークフロー(RubyのCI)
実際にRubyプロジェクトのテストとリンターを実行するためのCI設定の例です。実行環境に近い環境を用意し、データベースのセットアップからテスト実行まで行っています。
name: Run rspec & rubocop
on:
  push:
jobs:
  ci:
    runs-on: ubuntu-latest
    timeout-minutes: 10
    services:
      postgres:
        image: postgres
        ports:
          - 5432:5432
        env:
          RAILS_ENV: test
          POSTGRES_PASSWORD: password
          POSTGRES_USER: postgres
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Set up Ruby
        uses: ruby/setup-ruby@v1
        with:
          bundler-cache: true
      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: "20"
          cache: npm
      - run: node --version
      - name: yarn install
        run: |
          npm install yarn
          yarn install
      - name: Bundler and gem install
        run: |
          gem install bundler
          bundle install --jobs 4 --retry 3 --path vendor/bundle
      - name: Database create and migrate
        run: |
          cp config/database.yml.ci config/database.yml
          bundle exec rails db:create RAILS_ENV=test
          bundle exec rails db:migrate RAILS_ENV=test
      - name: Run rspec
        run: bundle exec rspec
        
      - name: Run rubocop
        run: bundle exec rubocop
このサンプルでは、コードのチェックアウト、RubyとNode.jsのセットアップ、データベースのセットアップ、テストの実行まで一連の流れを定義しています。
まとめ
GitHub ActionsのYAMLファイルでは、どのイベントで実行するか、どの環境で実行するか、どのタスクを実行するかを詳細に設定できます。まずは基本の設定から始めて、プロジェクトに合わせて拡張していきましょう。
  
  
  
  

コメント