forked from goccy/bigquery-emulator
-
Notifications
You must be signed in to change notification settings - Fork 5
132 lines (122 loc) · 4.36 KB
/
build.yml
File metadata and controls
132 lines (122 loc) · 4.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
name: build and push image
on:
push:
tags:
- v*
env:
REGISTRY: ghcr.io
REGISTRY_IMAGE: ghcr.io/recidiviz/bigquery-emulator
jobs:
# For each platform in the matrix, creates and pushes a platform-compatible Docker image to the registry
# and stores all the image digests as Github Actions build output artifacts so that we can referenced them
# in the `merge-platform-images` job below
build-image:
permissions:
contents: read
packages: write
strategy:
matrix:
include:
- runner: ubuntu-latest
artifact_name: bigquery-emulator
asset_name: bigquery-emulator-linux-amd64
platform: linux/amd64
- runner: ubuntu-24.04-arm
artifact_name: bigquery-emulator
asset_name: bigquery-emulator-linux-arm64
platform: linux/arm64
runs-on: ${{ matrix.runner }}
steps:
- uses: actions/checkout@v4
- name: setup docker buildx
uses: docker/setup-buildx-action@v3
- name: cache for linux
uses: actions/cache@v4
if: runner.os == 'Linux'
with:
path: |
~/.cache/go-build
~/go/pkg/mod
key: ${{ runner.os }}-go-${{matrix.asset_name}}-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ runner.os }}-go-${{matrix.asset_name}}-
- name: cache for macOS
uses: actions/cache@v3
if: runner.os == 'macOS'
with:
path: |
~/Library/Caches/go-build
~/go/pkg/mod
key: ${{ runner.os }}-go-${{matrix.asset_name}}-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ runner.os }}-go-${{matrix.asset_name}}
- uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- uses: docker/build-push-action@v6
name: Build and push by digest
id: build
with:
context: .
push: true
tags: ${{ env.REGISTRY_IMAGE }}
outputs: type=image,push-by-digest=true,name-canonical=true,push=true
platforms: ${{ matrix.platform }}
cache-from: type=local,src=~/.cache/go-build
- name: Export digest
run: |
mkdir -p ${{ runner.temp }}/digests
digest="${{ steps.build.outputs.digest }}"
touch "${{ runner.temp }}/digests/${digest#sha256:}"
- name: Upload digest
uses: actions/upload-artifact@v4
with:
name: digests-${{ matrix.asset_name }}
path: ${{ runner.temp }}/digests/*
if-no-files-found: error
retention-days: 1
# Creates a multi-architecture image manifest from the digests of the individual images built above.
# This produces a single image tag that contains all the platform-specific images.
merge-platform-images:
runs-on: ubuntu-latest
needs:
- build-image
permissions:
contents: read
packages: write
steps:
- name: Download digests
uses: actions/download-artifact@v4
with:
path: ${{ runner.temp }}/digests
pattern: digests-*
merge-multiple: true
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- uses: docker/login-action@v2
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY_IMAGE }}
tags: |
type=ref,event=branch
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=raw,value=latest,enable=${{ !contains(github.ref_name, 'pre') }}
- name: Create manifest list and push
working-directory: ${{ runner.temp }}/digests
# Extract image tags from the metadata action output and create a manifest list
run: |
docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
$(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *)
- name: Inspect image
run: |
docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }}