Skip to content

Build Docker image

Build Docker image #63

Workflow file for this run

name: Build Docker image
on:
workflow_call:
inputs:
uploadImageAsTarball:
description: 'uploads the Docker image additionally as a tarball'
required: false
default: false
type: boolean
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
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'
required: false
default: false
type: boolean
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
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: warp-ubuntu-latest-x64-16x
timeout-minutes: ${{ inputs.debug && 140 || 70 }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
# Setup caching
- 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
uses: WarpBuilds/cache@v1
with:
path: sccache-cache
key: ${{ runner.os }}-sccache-${{ hashFiles('**/Cargo.lock') }}
- name: Inject sccache-cache into Docker
uses: reproducible-containers/buildkit-cache-dance@v3
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 != true || github.ref == 'refs/heads/main') && ' and push ' || ' '}}Docker image
id: build
uses: docker/build-push-action@v6
with:
context: .
file: "docker/Dockerfile"
tags: ${{ steps.meta.outputs.tags }}
# push if we aren't uploading as a tarball, or if this is main
outputs: |
${{ (inputs.uploadImageAsTarball != true || github.ref == 'refs/heads/main') && 'type=registry' || '' }}
${{ inputs.uploadImageAsTarball == true && 'type=tar,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 }}
RESTATE_FEATURES=${{ inputs.features || '' }}
cache-from: type=gha,url=http://127.0.0.1:49160/
cache-to: type=gha,url=http://127.0.0.1:49160/,mode=max
- name: Upload docker image tar as artifact
if: ${{ inputs.uploadImageAsTarball }}
uses: actions/upload-artifact@v4
with:
name: restate.tar
path: restate.tar
retention-days: 1
if-no-files-found: error
# Even if uploadImageAsTarball, push main images
# This won't actually build again, it'll just use cache
- name: Push Docker image
if: ${{ inputs.uploadImageAsTarball && github.ref == 'refs/heads/main' }}
uses: docker/build-push-action@v6
with:
context: .
file: "docker/Dockerfile"
push: true
tags: ${{ steps.meta.outputs.tags }}
load: false
labels: ${{ steps.meta.outputs.labels }}
# ignore inputs.platforms as we always need to push both arm64 and amd64 docker images
platforms: 'linux/arm64,linux/amd64'
network: host
build-args: |
CARGO_PROFILE_RELEASE_DEBUG=${{ inputs.debug }}
RESTATE_FEATURES=${{ inputs.features || '' }}
cache-from: type=gha,url=http://127.0.0.1:49160/
cache-to: type=gha,url=http://127.0.0.1:49160/,mode=max