Docker Github Actions

CI/CD に関するシリーズの最初の投稿 では、Docker を使用するための高レベルのベスト プラクティスをいくつか説明しました。今日はもう少し深く掘り下げて、Githubアクションを見ていきます。 

キャッシュの使用も簡単にするために、GitHubアクションのV2をリリースしました! また、 @crazy-max (ケビン:D)がアクションのV2に費やした仕事に対して、彼なしではこれを行うことができなかったことにも感謝します。 

今、私たちが何ができるか見てみましょう! 

まず、プロジェクトのセットアップを取得する必要がありますが、既存の単純なDockerプロジェクトの1つを使用してこれをテストします。
Github アクション 1

最初に行う必要があるのは、作成したワークフローからDocker Hubにアクセスできるようにすることであり、これを行うには、DockerIDとパーソナルアクセストークン(PAT)をシークレットとしてGitHubに追加する必要があります。 https://hub.docker.com/settings/security に行くことでPATを取得できます 「新しいアクセストークン」をクリックすると、この例ではトークンを「whaleCI」と呼びます。

Github アクション 2

次に、これとユーザー名をシークレットとしてGitHubシークレットUIに追加できます。
Github アクション 3

これで、Hubに画像を構築して保存するためのアクションワークフローの設定を開始できます。 この CI フローでは 2 つの Docker アクションを使用していますが、1 つ目は GitHub リポジトリのシークレット ストアを使用して Docker Hub にログインできます。 2つ目はビルドとプッシュアクションで、ここではプッシュフラグをtrueに設定し(プッシュしたいので)、常に最新に移動するようにタグを追加しています。 最後に、画像ダイジェストをエコーして、何がプッシュされたかを確認します。 

name: CI to Docker hub 

on:

  push:

    branches: [ master ]

  steps:

      -

        name: Login to DockerHub

        uses: docker/login-action@v1 

        with:

          username: ${{ secrets.DOCKER_HUB_USERNAME }}

          password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}

      -

        name: Build and push

        id: docker_build

        uses: docker/build-push-action@v2

        with:

          context: ./

          file: ./Dockerfile

          push: true

          tags: bengotch/simplewhale:latest

      -

        name: Image digest

        run: echo ${{ steps.docker_build.outputs.digest }}

素晴らしい、今私はそれを初めて実行させてから、Dockerfileを微調整して、CIが実行され、新しいイメージの変更をプッシュしていることを確認します。
Github アクション 4

次に、これを最適化する方法を見てみましょう。私がしたい最初のことは、ビルドキャッシュの使用を見ることです。 これには2つの利点があり、1つ目はすべてのイメージを再ダウンロードする必要がないためビルド時間が短縮され、2つ目はDocker Hubに対して完了するプルの数が減ります。 これを行うには、GitHubキャッシュを利用しますが、これを行うには、ビルドキャッシュを使用してビルダーを設定する必要があります。

私が最初にやりたいことは実際にビルダーを設定することです、これは内部でBuildkitを使用しています、これはBuildxアクションを使用して非常に簡単に行われます。

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

次に、ビルダーのキャッシュを設定する必要がありますが、ここではgithubキャッシュを使用してこれを保存するためのパスとキーを追加します。 

     -
        name: Cache Docker layers
        uses: actions/cache@v2
        with:
          path: /tmp/.buildx-cache
          key: ${{ runner.os }}-buildx-${{ github.sha }}
          restore-keys: |
          ${{ runner.os }}-buildx-

最後に、これらの2つのビットをアクションファイルの先頭に追加したら、ビルドとプッシュステップに追加の属性を追加する必要があります。 ここでは、buildxステップの出力を使用するようにビルダーを設定し、このために設定したキャッシュを使用して保存および取得しています。

 -
        name: Login to Docker Hub
        uses: docker/login-action@v1 
        with:
          username: ${{ secrets.DOCKER_HUB_USERNAME }}
          password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
      -
        name: Build and push
        id: docker_build
        uses: docker/build-push-action@v2
        with:
          context: ./
          file: ./Dockerfile
          builder: ${{ steps.buildx.outputs.name }}
          push: true
          tags:  bengotch/simplewhale:latest
          cache-from: type=local,src=/tmp/.buildx-cache
          cache-to: type=local,dest=/tmp/.buildx-cache
      -
        name: Image digest
        run: echo ${{ steps.docker_build.outputs.digest }}

素晴らしい、今私たちはそれを再び実行することができ、私はキャッシュを使用していることがわかります!

これで、Docker Hubにリリースするタグ付きバージョンをマスターへのコミットとは異なる動作にする機能を追加することで、これをより機能的に改善する方法を確認できます(Docker Hubで最新のものを更新するのではなく! このようなことをして、コミットをローカルレジストリに移動して夜間のテストで使用できるようにし、タグ付けされたバージョンをHubにリリースするために予約しながら、常に最新のものをテストできるようにすることができます。 

開始するには、特定のタグを取得した場合にのみHubにプッシュするように、以前のGitHubワークフローを変更する必要があります。

on:
 push:
   tags:
     - "v*.*.*"

これは、コミットにV.n.n.nのタグを付けた場合にのみメインCIが起動することを意味します。

Github アクション 5

そして、私がGitHubアクションをチェックすると: 

Github アクション 6

すごい!

次に、最新のコミットをイメージとして GitHub レジストリに保存するために 2 つ目の GitHub アクション ファイルを設定する必要があるため、夜間のテストや定期的なテストを実行したり、進行中の作業イメージを同僚と共有したりするためにこれを行うことができます。 まず、以前のGitHubアクションを複製し、すべてのプッシュに対して以前のロジックを追加し直します。 

次に、Docker Hub ログインを GitHub コンテナー レジストリ ログインに変更します

    	if: github.event_name != 'pull_request'
    	uses: docker/login-action@v1
    	with:
      	registry: ghcr.io
      	username: ${{ github.repository_owner }}
      	password: ${{ secrets.ghcr_TOKEN }}

また、画像のタグ付け方法を変更することも忘れずに行う必要がありますが、唯一のタグとして最新のものを保持することを選択しましたが、いつでもこのためのロジックを追加できます。

  タグ: ghcr.io/nebuk89/simplewhale:latest

これで、マスターへの変更用とプル要求用の 2 つの異なるフローが作成されます。 次に、PRをハブではなくGitHubレジストリにプッシュするように、以前のものを変更する必要があります。 

これで、最新のタグに対して夜間テストを設定する方法、各PRをテストする方法、または使用しているタグでより洗練されたことを行い、画像内の同じタグにGitタグを使用する方法を確認できます。 これらのいずれかを実行する方法を確認したい場合、または今日経験したことを設定する方法の完全な例を取得したい場合は、これを実行するチャドのリポジトリと、最新のGitHubアクションの詳細を確認してください https://github.com/metcalfc/docker-action-examples 

そして、今後数週間以内に来る新しい投稿については、他のCIでこの設定を取得する方法を検討しています@docker。
Docker Hub を使用して GitHub CI のセットアップを開始するには、今すぐ Docker アカウントにサインアップして、Docker の公式 GitHub アクションをお試しください。