reviewdog / reviewdog

🐶 Automated code review tool integrated with any code analysis tools regardless of programming language

Home Page:https://medium.com/@haya14busa/reviewdog-a-code-review-dog-who-keeps-your-codebase-healthy-d957c471938b#.8xctbaw5u

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Pre-build and publish container images - rather than building every run

sammcj opened this issue · comments

commented

Problem

At present it seems reviewdog actions have to build the container image on ever (uncached) run.

This significantly increase the time it takes to run and the compute cost for reviewdog based Actions.

Solution

One way to improve this would be to build and publish container images and use those, image hosting for open source projects is free on Github using Github.

This greatly improves performance and cost of Docker based Actions.

Example

If the Actions still want to be a "Docker" type Action, you can simply keep their Dockerfile with that only includes a FROM for the image that's already been built:

FROM ghcr.io/reviewdog/some-cool-action:latest

and rename, build and publish existing Dockerfile which will be used for the builds.

An example of such a workflow might look like:

(assuming the "real" dockerfile is now called prebuild.Dockerfile

name: Build & Publish Docker Image

on:
  workflow_dispatch:
  push:
    branches:
      - master
permissions:
  packages: write
  contents: read

env:
  IMAGE_NAME: ${{ github.repository }}
  IMAGE_TAG: ${{ github.sha }}
  REGISTRY: ghcr.io

jobs:
  build:
    timeout-minutes: 15
    runs-on: ubuntu-22.04
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Generate Docker Metadata
        id: meta
        uses: docker/metadata-action@v4
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          images: |
            ${{ env.IMAGE_NAME }}
            ghcr.io/user${{ env.IMAGE_NAME }}
          tags: |
            type=schedule
            type=ref,event=branch
            type=ref,event=pr
            type=semver,pattern={{version}}
            type=semver,pattern={{major}}.{{minor}}
            type=semver,pattern={{major}}
            type=sha

      - name: Set up QEMU To support build amd64 and arm64 images
        uses: docker/setup-qemu-action@v2

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

      - name: Login to Github Container Repository
        uses: docker/login-action@v2
        with:
          registry: ghcr.io
          username: ${{ github.repository_owner }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Build and push
        uses: docker/build-push-action@v3
        id: docker_build
        with:
          push: ${{ github.event_name != 'pull_request' }}
          context: .
          file: ./prebuild.Dockerfile
          platforms: linux/amd64,linux/arm64
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}

      - name: Output image, digest and metadata to summary
        run: |
          {
          echo imageid: "${{ steps.docker_build.outputs.imageid }}"
          echo digest: "${{ steps.docker_build.outputs.digest }}"
          echo labels: "${{ steps.meta.outputs.labels }}"
          echo tags: "${{ steps.meta.outputs.tags }}"
          echo version: "${{ steps.meta.outputs.version }}"
          } >> "$GITHUB_STEP_SUMMARY"