diff --git a/.github/workflows/test.yml b/.github/workflows/build.yml
similarity index 75%
rename from .github/workflows/test.yml
rename to .github/workflows/build.yml
index faa244eecdf8b46270eeefb5616324d9b8831557..4a1983601ee1e177a8339098ff2507a84f9ee4fb 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/build.yml
@@ -1,4 +1,4 @@
-name: Test CI
+name: build
 
 on:
   push:
@@ -10,10 +10,28 @@ on:
 
 env:
   CI: true
+  DOCKER_REPO: renovate/renovate
+  YARN_CACHE_KEY: v1
+  BUILDX_VERSION: v0.3.1
+  # https://github.com/chalk/supports-color/issues/106
+  FORCE_COLOR: true
 
 jobs:
+  cleanup:
+    runs-on: ubuntu-latest
+    timeout-minutes: 5
+
+    steps:
+      - name: github-cleanup
+        uses: renovatebot/gh-action@v0
+        continue-on-error: true
+        with:
+          command: github-cleanup
+          token: ${{ secrets.GH_TOKEN }}
+          dry-run: ${{github.ref == 'refs/heads/master'}}
+
   test:
-    name: test
+    needs: [cleanup]
     runs-on: ${{ matrix.os }}
 
     # tests shouldn't need more than 15 min
@@ -75,9 +93,9 @@ jobs:
         uses: actions/cache@v1
         with:
           path: ${{ steps.init.outputs.yarn_cache }}
-          key: v1-${{ runner.os }}-yarn_cache-${{ hashFiles('**/yarn.lock') }}
+          key: ${{ env.YARN_CACHE_KEY }}-${{ runner.os }}-yarn_cache-${{ hashFiles('**/yarn.lock') }}
           restore-keys: |
-            v1-${{ runner.os }}-yarn_cache-
+            ${{ env.YARN_CACHE_KEY }}-${{ runner.os }}-yarn_cache-
 
       - name: Cache node_modules
         uses: actions/cache@v1
@@ -172,9 +190,9 @@ jobs:
         uses: actions/cache@v1
         with:
           path: ${{ steps.init.outputs.yarn_cache }}
-          key: v1-${{ runner.os }}-yarn_cache-${{ hashFiles('**/yarn.lock') }}
+          key: ${{ env.YARN_CACHE_KEY }}-${{ runner.os }}-yarn_cache-${{ hashFiles('**/yarn.lock') }}
           restore-keys: |
-            v1-${{ runner.os }}-yarn_cache-
+            ${{ env.YARN_CACHE_KEY }}-${{ runner.os }}-yarn_cache-
 
       - name: Cache node_modules
         uses: actions/cache@v1
@@ -200,3 +218,44 @@ jobs:
 
       - name: Type check
         run: yarn type-check
+
+  test-docker:
+    needs: cleanup
+    runs-on: ubuntu-latest
+
+    timeout-minutes: 15
+
+    steps:
+      - name: Set up Docker Buildx ${{ env.BUILDX_VERSION }}
+        uses: crazy-max/ghaction-docker-buildx@v1
+        with:
+          version: ${{ env.BUILDX_VERSION }}
+
+      - uses: actions/checkout@v2
+
+      - name: Build the Docker images
+        run: |
+          docker buildx bake \
+            --file docker/bake.hcl \
+            --set settings.output=type=docker \
+            default
+
+      - name: Test the Docker images
+        run: |
+          docker run --rm -t ${DOCKER_REPO} --version
+          docker run --rm -t ${DOCKER_REPO}:slim --version
+
+      - name: Image history latest
+        run: docker history ${DOCKER_REPO}
+      - name: Image history slim
+        run: docker history ${DOCKER_REPO}:slim
+
+      - name: Images size
+        run: docker image ls | grep ${DOCKER_REPO}
+
+  release:
+    needs: [lint, test, test-docker]
+    runs-on: ubuntu-latest
+    timeout-minutes: 5
+    steps:
+      - run: echo "Release"
diff --git a/.github/workflows/dockerimages.yml b/.github/workflows/dockerimages.yml
deleted file mode 100644
index 769b26a0ac0f004ba495eced084b6be24ff0ae0d..0000000000000000000000000000000000000000
--- a/.github/workflows/dockerimages.yml
+++ /dev/null
@@ -1,50 +0,0 @@
-name: Docker Images CI
-
-on:
-  push:
-    branches:
-      - master
-      - 'renovate/**'
-
-  pull_request:
-
-env:
-  PLATFORM: linux/amd64
-  DOCKER_CACHE_TAG: _cache
-  DOCKER_REPO: renovate/renovate
-
-jobs:
-  build:
-    name: Build image
-    runs-on: ubuntu-latest
-
-    timeout-minutes: 20
-
-    steps:
-      - name: Set up Docker Buildx
-        id: buildx
-        uses: crazy-max/ghaction-docker-buildx@v1
-        with:
-          version: v0.3.1
-
-      - uses: actions/checkout@v2
-
-      - name: Build the Docker images
-        run: |
-          docker buildx bake \
-            --file docker/bake.hcl \
-            --set settings.output=type=docker \
-            default
-
-      - name: Test the Docker images
-        run: |
-          docker run --rm -t ${DOCKER_REPO} --version
-          docker run --rm -t ${DOCKER_REPO}:slim --version
-
-      - name: Image history latest
-        run: docker history ${DOCKER_REPO}
-      - name: Image history slim
-        run: docker history ${DOCKER_REPO}:slim
-
-      - name: Images size
-        run: docker image ls | grep ${DOCKER_REPO}
diff --git a/.github/workflows/release-docker.sh b/.github/workflows/release-docker.sh
index 37a6a0add454abbcc3b2c41e1e6e10540ac84802..6b8896e1521d61b6aba60877176869dd1ee0d28c 100755
--- a/.github/workflows/release-docker.sh
+++ b/.github/workflows/release-docker.sh
@@ -16,11 +16,8 @@ fi
 # build final images
 docker buildx bake \
   --file docker/bake.hcl \
-  --set settings.args.SHA=${SHA}} \
   --set settings.labels.org.opencontainers.image.version=${VERSION} \
-  --set settings.labels.org.opencontainers.image.revision=${SHA} \
-  --set latest.cache-to=renovate/renovate:_cache-latest \
-  --set slim.cache-to=renovate/renovate:_cache-slim \
+  --set settings.labels.org.opencontainers.image.revision=${GIT_HASH} \
   --set settings.output=type=docker \
   default
 
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index be5ba1a61452deb20b9a8b155a2bafba96a32faf..9d5c56481730b77e3c9bfb03edf2353ad4bad9e9 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -7,9 +7,11 @@ on:
 
 env:
   PLATFORM: linux/amd64
-  DOCKER_CACHE_TAG: _cache
   DOCKER_REPO: renovate/renovate
   SKIP_JAVA_TESTS: true
+  BUILDX_VERSION: v0.3.1
+  # https://github.com/chalk/supports-color/issues/106
+  FORCE_COLOR: true
 
 jobs:
   semantic-release:
@@ -76,11 +78,11 @@ jobs:
       - name: Unit tests
         run: yarn jest --maxWorkers=2 --ci --coverageReporters=text-summary
 
-      - name: Set up Docker Buildx
+      - name: Set up Docker Buildx ${{ env.BUILDX_VERSION }}
         id: buildx
         uses: crazy-max/ghaction-docker-buildx@v1
         with:
-          version: v0.3.1
+          version: ${{ env.BUILDX_VERSION }}
 
       - name: Docker registry login
         run: echo "${{ secrets.DOCKER_RENOVATERELEASE_TOKEN }}" | docker login -u renovaterelease --password-stdin
@@ -90,8 +92,8 @@ jobs:
         run: |
           docker buildx bake \
             --file docker/bake.hcl \
-            --set latest.cache-to=renovate/renovate:_cache-latest \
-            --set slim.cache-to=renovate/renovate:_cache-slim \
+            --set latest.cache-to=type=registry,ref=renovate/docker-build-cache:renovate-latest,mode=max \
+            --set slim.cache-to=type=registry,ref=renovate/docker-build-cache:renovate-slim,mode=max \
             default
 
       - name: semantic-release
@@ -99,6 +101,6 @@ jobs:
           echo '//registry.yarnpkg.com/:_authToken=${NPM_TOKEN}' > ~/.npmrc
           yarn semantic-release
         env:
-          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+          GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}
           NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
           SHA: ${{github.sha}}
diff --git a/docker/bake.hcl b/docker/bake.hcl
index 91e047e95c3f68734d0556d946cc64a76898bda7..4c8b6ee5c77a9bb4dc6a87ff6f8cc686cb26ad73 100644
--- a/docker/bake.hcl
+++ b/docker/bake.hcl
@@ -10,11 +10,11 @@ target "slim" {
   inherits = ["settings"]
   tags = ["renovate/renovate:slim"]
   args = { "IMAGE" = "slim" }
-  cache-from = ["renovate/renovate:_cache-slim"]
+  cache-from = ["renovate/docker-build-cache:renovate-slim", "renovate/renovate:_cache-slim"]
 }
 
 target "latest" {
   inherits = ["settings"]
   tags = ["renovate/renovate"]
-  cache-from = ["renovate/renovate:_cache-latest"]
+  cache-from = ["renovate/docker-build-cache:renovate-latest", "renovate/renovate:_cache-latest"]
 }
diff --git a/readme.md b/readme.md
index 4c26ef8084c63aa444b952159e2fdcc849836bdc..36523f6afff37b18b147605afec8641b384d7ab6 100644
--- a/readme.md
+++ b/readme.md
@@ -7,6 +7,7 @@ Automated dependency updates. Multi-platform and multi-language.
 [![License: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg)](https://raw.githubusercontent.com/renovatebot/renovate/master/license)
 [![codecov](https://codecov.io/gh/renovatebot/renovate/branch/master/graph/badge.svg)](https://codecov.io/gh/renovatebot/renovate)
 [![Renovate enabled](https://img.shields.io/badge/renovate-enabled-brightgreen.svg)](https://renovatebot.com/)
+[![Build status](https://github.com/renovatebot/renovate/workflows/build/badge.svg)](https://github.com/renovatebot/renovate/actions)
 
 ## Why Use Renovate?