LoginSignup
6
3

More than 3 years have passed since last update.

GitHub Actions を使って Docker イメージをテスト、ビルド、そして GitHub Container Registry にpushする

Last updated at Posted at 2020-09-05

用意するもの

  • Githubリポジトリ
  • リポジトリ内のDockerfile

基本設定

Github Actions 用 Token の作成

Githubの設定からPATの作成、位置は:

Github -> Settings -> Developer settings -> Personal access tokens

権限:write:packages read:packagesをチェックします

Tokenの保存

リポジトリの Settings -> Secrets の中に New Secrets をクリックして:

  • Name: CT_PAT
  • Value: さっき作成したToken`

Github Actions の作成

Workflowの作成

docker-publish.yml
name: Docker

on:
  push:
    # `master` ブランチを `latest` としてビルド
    branches:
      - master

    # バージョン `v1.2.3` タグをリリースとしビルド
    tags:
      - v*

  # PRがあればテストする
  pull_request:

env:
  # TODO: Dockerイメージの名前
  IMAGE_NAME: author/xxxx

jobs:
  # テスト
  # 解説: https://docs.docker.com/docker-hub/builds/automated-testing/
  test:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2

      - name: Run tests
        run: |
          if [ -f docker-compose.test.yml ]; then
            docker-compose --file docker-compose.test.yml build
            docker-compose --file docker-compose.test.yml run sut
          else
            docker build . --file Dockerfile
          fi
  # GitHub Packages に Dockerイメージを push する
  # 解説: https://docs.docker.com/docker-hub/builds/
  push:
    # テストを確認する
    needs: test

    runs-on: ubuntu-latest
    # PRではない時に実行
    if: github.event_name == 'push'

    steps:
      - uses: actions/checkout@v2

      - name: Build image
        run: docker build . --file Dockerfile --tag $IMAGE_NAME

      - name: Log into GitHub Container Registry
      # ここで Secrets に設定した `CR_PAT` を使って ghcr.io にログインする
        run: echo "${{ secrets.CR_PAT }}" | docker login https://ghcr.io -u ${{ github.actor }} --password-stdin

      - name: Push image to GitHub Container Registry
        run: |
          IMAGE_ID=ghcr.io/${{ github.repository_owner }}/$IMAGE_NAME
          # 設定したDockerイメージの名前を小文字にする
          IMAGE_ID=$(echo $IMAGE_ID | tr '[A-Z]' '[a-z]')
          # バージョン文字の処理
          VERSION=$(echo "${{ github.ref }}" | sed -e 's,.*/\(.*\),\1,')
          # タグから "v" を除去
          [[ "${{ github.ref }}" == "refs/tags/"* ]] && VERSION=$(echo $VERSION | sed -e 's/^v//')
          # masterブランチならば `latest` タグをつける
          [ "$VERSION" == "master" ] && VERSION=latest
          echo IMAGE_ID=$IMAGE_ID
          echo VERSION=$VERSION
          docker tag $IMAGE_NAME $IMAGE_ID:$VERSION
          docker push $IMAGE_ID:$VERSION

このファイルをコミットしたら自動的に一回実行するはずです、ログはリポジトリのActionsのところに見えます。
このActionsはdocker-composeにも対応します。

実際の応用は、
今開発中のOVaaSのFront-Endリポジトリを参考して下さい:
https://github.com/OVaaS/ovaas-front

用語

  • PAT:Personal Access Token
6
3
0

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
6
3