forked from Stephane-D/SGDK
-
Notifications
You must be signed in to change notification settings - Fork 0
136 lines (120 loc) · 4.75 KB
/
sgdk-docker.yml
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
133
134
135
136
name: sgdk-docker
concurrency:
group: ${{ github.ref }}-sgdk-docker
cancel-in-progress: true
on:
workflow_dispatch: # Allows for manual triggering.
pull_request: # Trigger for pull requests.
types: [opened, synchronize, reopened, ready_for_review]
branches:
- master
push: # Trigger when pushed to master.
branches:
- 'master'
paths-ignore:
- 'vstudio/**'
- 'bin/**'
- 'sample/**'
- '**.md'
env:
# TODO: arm64 images are currently disabled because they keep hanging in the
# GitHub Actions environment.
#PLATFORMS: linux/amd64,linux/arm64
PLATFORMS: linux/amd64
jobs:
build:
runs-on: ubuntu-latest
permissions:
packages: write
contents: read
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: 'true'
fetch-depth: 2
# TODO: arm64 images are currently disabled because they keep hanging in
# the GitHub Actions environment.
#- name: Set up QEMU
# uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to GHCR (only on push event)
if: github.event_name == 'push'
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Compute ghcr org name
# github.repository_owner may be mixed case. While GitHub Actions is
# case-insensitive when comparing strings, GHCR requires a lowercase
# name.
run: |
ORG="${{github.repository_owner}}"
# The bash expansion below lowercases the variable, which we then
# write to the GitHub Actions environment for subsequent steps to
# use.
echo "GHCR_ORG=${ORG,,}" >> "$GITHUB_ENV"
- name: Check if GCC Dockerfile has changed
id: changed-files
uses: tj-actions/changed-files@v42
with:
files_yaml: |
gcc:
# If the Dockerfile, sample configs, or this workflow changed,
# rebuild GCC.
- deps/**
- .github/workflows/sgdk-docker.yml
- name: Build m68k GCC (only if changed)
if: steps.changed-files.outputs.gcc_any_changed == 'true'
uses: docker/build-push-action@v5
with:
file: deps/gcc.Dockerfile
context: deps/
platforms: ${{ env.PLATFORMS }}
tags: ghcr.io/${{ env.GHCR_ORG }}/sgdk-m68k-gcc:latest
push: false
load: true
# Cache the built image where the SGDK image can reference it later.
cache-to: type=local,src=${{ github.workspace }}/build-cache
# Push is a separate step so the build logs are clearly separate from the
# push logs.
- name: Push m68k GCC (only if changed, only on push event)
if: steps.changed-files.outputs.gcc_any_changed == 'true' && github.event_name == 'push'
run: |
docker image push ghcr.io/${{ env.GHCR_ORG }}/sgdk-m68k-gcc:latest
# Right after forking SGDK, the fork will not have a GCC image.
# We may need to fetch the latest from upstream before building SGDK.
- name: Bootstrap m68k GCC (only if not changed)
if: steps.changed-files.outputs.gcc_any_changed == 'false'
run: |
# Pull from the user's fork, fall back to the upstream repo.
if ! docker pull ghcr.io/${{ env.GHCR_ORG }}/sgdk-m68k-gcc:latest; then
docker pull ghcr.io/stephane-d/sgdk-m68k-gcc:latest
docker tag ghcr.io/stephane-d/sgdk-m68k-gcc:latest \
ghcr.io/${{ env.GHCR_ORG }}/sgdk-m68k-gcc:latest
# Note that we are not pushing the upstream version to the fork.
# The workflow will update the fork if/when the GCC Dockerfile
# changes in "master", even if those changes come from upstream.
fi
- name: Build SGDK
uses: docker/build-push-action@v5
with:
file: Dockerfile
context: .
platforms: ${{ env.PLATFORMS }}
build-args: |
BASE_IMAGE=ghcr.io/${{ env.GHCR_ORG }}/sgdk-m68k-gcc
tags: ghcr.io/${{ env.GHCR_ORG }}/sgdk:latest
push: false
load: true
# When we build m68k GCC without pushing it, the build cache is how
# this step is able to grab the same image from that earlier step.
cache-from: type=local,src=${{ github.workspace }}/build-cache
# Push is a separate step so the build logs are clearly separate from the
# push logs.
- name: Push SGDK (only on push event)
if: github.event_name == 'push'
run: |
docker image push ghcr.io/${{ env.GHCR_ORG }}/sgdk:latest