Build Docker image #138
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Build Docker image | |
on: | |
workflow_call: | |
inputs: | |
uploadImageAsTarball: | |
description: "uploads the Docker image additionally as a tarball with the provided name" | |
required: false | |
default: "" | |
type: string | |
platforms: | |
description: "platforms for docker build step" | |
required: false | |
default: "" | |
type: string | |
debug: | |
description: "include debug symbols in built image" | |
required: false | |
default: false | |
type: boolean | |
parca: | |
description: "split out debug symbols and upload to polar signals" | |
required: false | |
default: false | |
type: boolean | |
buildIndividually: | |
description: "build separate binaries individually to avoid feature unification" | |
required: false | |
default: false | |
type: boolean | |
features: | |
description: "features to enable in the build" | |
required: false | |
default: "" | |
type: string | |
pushToDockerHub: | |
description: "push image to DockerHub" | |
required: false | |
default: false | |
type: boolean | |
workflow_dispatch: | |
inputs: | |
uploadImageAsTarball: | |
description: "uploads the Docker image additionally as a tarball with the provided name" | |
required: false | |
default: "" | |
type: string | |
platforms: | |
description: "platforms for docker build step" | |
required: false | |
default: "" | |
type: string | |
debug: | |
description: "include debug symbols in built image" | |
required: false | |
default: false | |
type: boolean | |
parca: | |
description: "upload debug symbols to polar signals" | |
required: false | |
default: false | |
type: boolean | |
buildIndividually: | |
description: "build separate binaries individually to avoid feature unification" | |
required: false | |
default: false | |
type: boolean | |
pushToDockerHub: | |
description: "push image to DockerHub" | |
required: false | |
default: false | |
type: boolean | |
env: | |
REPOSITORY_OWNER: ${{ github.repository_owner }} | |
GHCR_REGISTRY: "ghcr.io" | |
GHCR_REGISTRY_USERNAME: ${{ github.actor }} | |
GHCR_REGISTRY_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
jobs: | |
build-and-push-image: | |
runs-on: ${{ (inputs.debug || inputs.parca) && 'warp-ubuntu-latest-x64-32x' || 'warp-ubuntu-latest-x64-16x' }} | |
timeout-minutes: ${{ (inputs.debug || inputs.parca) && 140 || 70 }} | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
- name: Install cargo-hakari | |
if: ${{ hashFiles('.config/hakari.toml') != '' }} | |
uses: taiki-e/install-action@v2 | |
with: | |
tool: cargo-hakari | |
- name: Disable hakari | |
if: ${{ hashFiles('.config/hakari.toml') != '' }} | |
run: cargo hakari disable | |
# this is needed to be able to load and push a multiplatform image in one step | |
- name: Set up Docker containerd snapshotter | |
uses: crazy-max/ghaction-setup-docker@v3 | |
with: | |
# Docker 28.0.1 seems to fail on GHA: https://github.com/restatedev/restate/actions/runs/13562737120/job/37909085871#step:6:47 | |
# todo set to latest once new Docker version that is working on GHA is released | |
version: "27.5.1" | |
daemon-config: | | |
{ | |
"features": { | |
"containerd-snapshotter": true | |
} | |
} | |
- name: Set up QEMU dependency | |
uses: docker/setup-qemu-action@v3 | |
- name: Set up Docker Buildx | |
uses: docker/setup-buildx-action@v3 | |
with: | |
# https://docs.warpbuild.com/cache/docker-layer-caching#step-1-set-up-docker-buildx-action | |
driver-opts: | | |
network=host | |
- name: Cache sccache | |
id: cache | |
uses: WarpBuilds/cache@v1 | |
with: | |
path: sccache-cache | |
key: ${{ runner.os }}-sccache-${{ hashFiles('**/Cargo.lock') }} | |
- name: Inject sccache-cache into Docker | |
uses: reproducible-containers/[email protected] | |
with: | |
cache-map: | | |
{ | |
"sccache-cache": "/var/cache/sccache" | |
} | |
skip-extraction: ${{ steps.cache.outputs.cache-hit }} | |
- name: Log into GitHub container registry | |
uses: docker/login-action@v3 | |
with: | |
registry: ${{ env.GHCR_REGISTRY }} | |
username: ${{ env.GHCR_REGISTRY_USERNAME }} | |
password: ${{ env.GHCR_REGISTRY_TOKEN }} | |
- name: Log into DockerHub | |
if: ${{ inputs.pushToDockerHub }} | |
uses: docker/login-action@v3 | |
with: | |
username: ${{ secrets.DOCKER_USERNAME }} | |
password: ${{ secrets.DOCKER_PASSWORD }} | |
- name: Extract image name | |
# Set repository name as image name | |
run: | | |
echo "IMAGE_NAME=${GITHUB_REPOSITORY#$GITHUB_REPOSITORY_OWNER/}" >> $GITHUB_ENV | |
- name: Extract metadata (tags, labels) for Docker | |
id: meta | |
uses: docker/metadata-action@v5 | |
with: | |
images: | | |
${{ env.GHCR_REGISTRY }}/${{ env.REPOSITORY_OWNER }}/${{ env.IMAGE_NAME }} | |
${{ inputs.pushToDockerHub && format('docker.io/{0}/{1}', env.REPOSITORY_OWNER, env.IMAGE_NAME) || '' }} | |
flavor: | | |
${{ inputs.debug && 'prefix=debug-,onlatest=true' || '' }} | |
tags: | | |
type=ref,event=branch | |
type=semver,pattern={{version}} | |
type=semver,pattern={{major}}.{{minor}} | |
- name: Build${{(inputs.uploadImageAsTarball == '' || github.ref == 'refs/heads/main') && ' and push ' || ' '}}Docker image | |
id: build | |
uses: docker/build-push-action@v6 | |
with: | |
context: . | |
file: "docker/Dockerfile" | |
# push if we aren't uploading as a tarball, or if this is main' | |
tags: ${{ steps.meta.outputs.tags }} | |
# push if we aren't uploading as a tarball, or if this is main | |
outputs: | | |
${{ (inputs.uploadImageAsTarball == '' || github.ref == 'refs/heads/main') && 'type=registry' || '' }} | |
${{ inputs.uploadImageAsTarball != '' && 'type=oci,dest=restate.tar' || '' }} | |
labels: ${{ steps.meta.outputs.labels }} | |
# on main, always push both platforms, otherwise use platform input | |
platforms: ${{ github.ref == 'refs/heads/main' && 'linux/arm64,linux/amd64' || (inputs.platforms || 'linux/arm64,linux/amd64') }} | |
network: host | |
build-args: | | |
CARGO_PROFILE_RELEASE_DEBUG=${{ inputs.debug || inputs.parca }} | |
BUILD_INDIVIDUALLY=${{ inputs.buildIndividually }} | |
UPLOAD_DEBUGINFO=${{ inputs.parca }} | |
RESTATE_FEATURES=${{ inputs.features || '' }} | |
secrets: | | |
parca=${{ secrets.PARCA_TOKEN }} | |
cache-from: type=gha,url=http://127.0.0.1:49160/,version=1 | |
# don't cache debug/parca builds, its just too big | |
cache-to: ${{ (!inputs.debug && !inputs.parca) && 'type=gha,url=http://127.0.0.1:49160/,mode=max,version=1' || '' }} | |
- name: Upload docker image tar as artifact | |
if: ${{ inputs.uploadImageAsTarball != '' }} | |
uses: actions/upload-artifact@v4 | |
with: | |
name: ${{ inputs.uploadImageAsTarball }} | |
path: restate.tar | |
retention-days: 1 | |
if-no-files-found: error |