Skip to content

Build Docker image #154

Build Docker image

Build Docker image #154

Workflow file for this run

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