diff options
| -rw-r--r-- | .github/workflows/lint-test-build-push.yaml | 67 | ||||
| -rw-r--r-- | Dockerfile (renamed from docker/Dockerfile) | 2 | ||||
| -rw-r--r-- | docker-compose.yml | 2 | 
3 files changed, 32 insertions, 39 deletions
| diff --git a/.github/workflows/lint-test-build-push.yaml b/.github/workflows/lint-test-build-push.yaml index 8dd9b34..62691ab 100644 --- a/.github/workflows/lint-test-build-push.yaml +++ b/.github/workflows/lint-test-build-push.yaml @@ -23,9 +23,16 @@ jobs:          run: |            tag=$(cut -c 1-7 <<< $GITHUB_SHA)            echo "::set-output name=tag::$tag" +        - name: Checkout code          uses: actions/checkout@v2 +      # The current version (v2) of Docker's build-push action uses +      # buildx, which comes with BuildKit features that help us speed +      # up our builds using additional cache features. Buildx also +      # has a lot of other features that are not as relevant to us. +      # +      # See https://github.com/docker/build-push-action        - name: Set up Docker Buildx          uses: docker/setup-buildx-action@v1 @@ -36,38 +43,33 @@ jobs:            username: ${{ github.repository_owner }}            password: ${{ secrets.GHCR_TOKEN  }} -      # Set up a caching directory for image layers. According to the docker -      # documentation, it's recommended to use a SHA-based key to get the -      # greatest change of finding the most relevant cached layer. We fall -      # down to more generic containers by then matching by GitHub branch, -      # to use cache generated earlier in the same branch, and finally to -      # the latest cache in general. The `v0` is purely a cache version -      # indicator that can be incremented manually if we want to invalidate -      # old caches completely. +      # Create a local cache directory for PR builds, as the image +      # we build for PRs may start to deviate from the "latest" image +      # currently registered in the GHCR. For master, the best we can +      # do is use the previous master build, which can be cached from +      # the GHCR.        - name: Cache Image Layers +        if: github.event_name == 'pull_request'          uses: actions/cache@v2          with:            path: /tmp/.buildx-cache            key: ${{ runner.os }}-v0-buildx-${{ github.ref }}-${{ github.sha }}            restore-keys: |              ${{ runner.os }}-v0-buildx-${{ github.ref }}- -            ${{ runner.os }}-v0-buildx- -      # Build the image we need for testing/linting the current codebase, -      # without pushing the image to the GHCR. Instead, we load it into -      # the runner's docker environment so we can run it later. The -      # target of this build is the `venv` stage of the Dockerfile, as we -      # don't want to include the final production entry point stage. +      # Build the image we need for linting and testing using the +      # `venv` target stage within our Dockerfile. We load the image +      # into the runner's Docker image collection so we can run it +      # later.        # -      # This build caches to our GitHub Actions cache and uses that cache -      # during the build process as well. If no GitHub Actions cache was -      # available, it will use the latest intermediate images pushed to -      # the GHCR as a cache source. +      # The image includes an inline cache manifest to support caching +      # from the GHCR, which means that a build can pull the layers it +      # can reuse instead of building them from scratch.        - name: Build image for linting and testing          uses: docker/build-push-action@v2          with:            context: . -          file: ./docker/Dockerfile +          file: ./Dockerfile            push: false            load: true            target: venv @@ -147,61 +149,52 @@ jobs:            coveralls        # Final build stage. This is run in the same job with conditions -      # to prevent us from having to reload the caching directory. We -      # already built a huge chunk of the image before this point in -      # the run, so it does not make sense to drop down to a completely -      # fresh build environment in a new worker/runner. +      # in order to use the local build cache generated by buildx while +      # building the `venv` image in the lint/test phase.        # Build the final production image and push it to GHCR, tagging it        # both with the short commit SHA and 'latest'. This step should use -      # the cache that was just generated when we built the test container. +      # the local build cache of the current run.        - name: Build final image          if: env.production_build == 'true'          uses: docker/build-push-action@v2          with:            context: . -          file: ./docker/Dockerfile +          file: ./Dockerfile            push: true            cache-from: | -            type=local,src=/tmp/.buildx-cache              ghcr.io/python-discord/snekbox-base:latest              ghcr.io/python-discord/snekbox-venv:latest              ghcr.io/python-discord/snekbox:latest -          cache-to: type=local,dest=/tmp/.buildx-cache +          cache-to: type=inline            tags: |              ghcr.io/python-discord/snekbox:latest              ghcr.io/python-discord/snekbox:${{ steps.sha_tag.outputs.tag }} -      # Push the base image to GHCR, *with* an inline cache manifest to -      # ensure we can use this image as a cache source if our GitHub Actions -      # "local" cache failed to be restored. GHCR does not support pushing a -      # separate cache manifest, meaning we have to use an "inline" manifest. +      # Push the base image to GHCR, with an inline cache manifest        - name: Push base image          if: env.production_build == 'true'          uses: docker/build-push-action@v2          with:            context: . -          file: ./docker/Dockerfile +          file: ./Dockerfile            target: base            push: true            cache-from: | -            type=local,src=/tmp/.buildx-cache              ghcr.io/python-discord/snekbox-base:latest            cache-to: type=inline            tags: ghcr.io/python-discord/snekbox-base:latest -      # Push the venv image to GHCR *with* an inline cache manifest. See -      # the comment attached to the previous step for more information. +      # Push the venv image to GHCR, with an inline cache manifest        - name: Push venv image          if: env.production_build == 'true'          uses: docker/build-push-action@v2          with:            context: . -          file: ./docker/Dockerfile +          file: ./Dockerfile            target: venv            push: true            cache-from: | -            type=local,src=/tmp/.buildx-cache              ghcr.io/python-discord/snekbox-base:latest              ghcr.io/python-discord/snekbox-venv:latest            cache-to: type=inline diff --git a/docker/Dockerfile b/Dockerfile index ea05c5c..ed199a0 100644 --- a/docker/Dockerfile +++ b/Dockerfile @@ -59,5 +59,5 @@ FROM venv  ENTRYPOINT ["gunicorn"]  CMD ["-c", "config/gunicorn.conf.py", "snekbox.api.app"] -COPY . /snekbox +COPY docker /snekbox  WORKDIR /snekbox diff --git a/docker-compose.yml b/docker-compose.yml index 066f38b..3062af3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,4 +10,4 @@ services:      ipc: none      build:        context: . -      dockerfile: docker/Dockerfile +      dockerfile: Dockerfile | 
