Build Docker image #67
Workflow file for this run
This file contains 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' | |
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 | |
parca: | |
description: 'split out debug symbols and upload to polar signals' | |
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 | |
parca: | |
description: 'upload debug symbols to polar signals' | |
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 || inputs.parca) && 140 || 70 }} | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
# 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: | |
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/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" | |
# 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 != true || github.ref == 'refs/heads/main') && 'type=registry' || '' }} | |
${{ inputs.uploadImageAsTarball == true && '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 }} | |
UPLOAD_DEBUGINFO=${{ inputs.parca }} | |
RESTATE_FEATURES=${{ inputs.features || '' }} | |
secrets: | | |
parca=${{ secrets.PARCA_TOKEN }} | |
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 |