Skip to content

Commit 35cd03d

Browse files
committed
Address review: uniform CI matrix, fix README alignment, clarify tag tests
1 parent 3bf7a7a commit 35cd03d

6 files changed

Lines changed: 74 additions & 109 deletions

File tree

.github/workflows/ci.yaml

Lines changed: 6 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,6 @@ name: ci
33
# Build and run all tests.
44
# - Triggers: All pushes and pull requests on any branch.
55
# - Runs on: All repositories (including forks)
6-
#
7-
# Forks build only the latest version + default distro on amd64 (fast feedback).
8-
# Full matrix (including ARM64) runs on workflow_dispatch or the official repo.
96

107
on:
118
push:
@@ -31,41 +28,8 @@ concurrency:
3128
cancel-in-progress: true
3229

3330
jobs:
34-
determine-scope:
35-
runs-on: ubuntu-latest
36-
outputs:
37-
version-filter: ${{ steps.scope.outputs.version-filter }}
38-
distro-filter: ${{ steps.scope.outputs.distro-filter }}
39-
is-official: ${{ steps.scope.outputs.is-official }}
40-
steps:
41-
- name: Checkout
42-
uses: actions/checkout@v6
43-
44-
- name: Determine build scope
45-
id: scope
46-
shell: pwsh
47-
run: |
48-
$vf = '${{ inputs.version-filter }}'
49-
$df = '${{ inputs.distro-filter }}'
50-
51-
$isOfficial = '${{ github.repository }}' -eq 'FirebirdSQL/firebird-docker'
52-
53-
# For forks (non-dispatch), build only latest version + default distro
54-
if (-not $vf -and '${{ github.event_name }}' -ne 'workflow_dispatch') {
55-
if (-not $isOfficial) {
56-
$assets = Get-Content -Raw ./assets.json | ConvertFrom-Json
57-
$vf = $assets.versions[0].version
58-
$df = $assets.config.defaultDistro
59-
}
60-
}
61-
62-
"version-filter=$vf" >> $env:GITHUB_OUTPUT
63-
"distro-filter=$df" >> $env:GITHUB_OUTPUT
64-
"is-official=$($isOfficial.ToString().ToLower())" >> $env:GITHUB_OUTPUT
65-
6631
build-and-test:
6732
if: ${{ !(github.repository == 'FirebirdSQL/firebird-docker' && github.ref == 'refs/heads/master') }}
68-
needs: determine-scope
6933
strategy:
7034
fail-fast: false
7135
matrix:
@@ -75,9 +39,6 @@ jobs:
7539
runner: ubuntu-latest
7640
- arch: arm64
7741
runner: ubuntu-24.04-arm
78-
exclude:
79-
# Forks: skip arm64 to save CI minutes
80-
- arch: ${{ needs.determine-scope.outputs.is-official != 'true' && 'arm64' || 'none' }}
8142
runs-on: ${{ matrix.runner }}
8243
steps:
8344
- name: Checkout
@@ -93,19 +54,21 @@ jobs:
9354
shell: pwsh
9455
run: |
9556
$params = @{}
96-
if ('${{ needs.determine-scope.outputs.version-filter }}') { $params['VersionFilter'] = '${{ needs.determine-scope.outputs.version-filter }}' }
97-
if ('${{ needs.determine-scope.outputs.distro-filter }}') { $params['DistributionFilter'] = '${{ needs.determine-scope.outputs.distro-filter }}' }
57+
if ('${{ inputs.version-filter }}') { $params['VersionFilter'] = '${{ inputs.version-filter }}' }
58+
if ('${{ inputs.distro-filter }}') { $params['DistributionFilter'] = '${{ inputs.distro-filter }}' }
9859
Invoke-Build Build @params
9960
10061
- name: Test
10162
shell: pwsh
10263
run: |
10364
$params = @{}
104-
if ('${{ needs.determine-scope.outputs.version-filter }}') { $params['VersionFilter'] = '${{ needs.determine-scope.outputs.version-filter }}' }
105-
if ('${{ needs.determine-scope.outputs.distro-filter }}') { $params['DistributionFilter'] = '${{ needs.determine-scope.outputs.distro-filter }}' }
65+
if ('${{ inputs.version-filter }}') { $params['VersionFilter'] = '${{ inputs.version-filter }}' }
66+
if ('${{ inputs.distro-filter }}') { $params['DistributionFilter'] = '${{ inputs.distro-filter }}' }
10667
Invoke-Build Test @params
10768
10869
- name: Run tag unit tests
70+
# Verifies Get-ImageTags produces correct Docker tags (pure logic, no Docker required).
71+
# Tag logic is arch-independent — run once on amd64 to avoid duplication.
10972
if: matrix.arch == 'amd64'
11073
shell: pwsh
11174
run: |

.github/workflows/publish.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ jobs:
5555
Invoke-Build Test
5656
5757
- name: Run tag unit tests
58+
# Verifies Get-ImageTags produces correct Docker tags (pure logic, no Docker required).
59+
# Tag logic is arch-independent — run once on amd64 to avoid duplication.
5860
if: matrix.arch == 'amd64'
5961
shell: pwsh
6062
run: |

AGENTS.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ Invoke-Build Build -VersionFilter 5 -DistributionFilter bookworm # Filtered
4545
- `AGENTS.md` — This file
4646

4747
## CI/CD
48-
- `ci.yaml` — Build+test on push/PR. Forks: latest version only. Full matrix via workflow_dispatch.
48+
- `ci.yaml` — Build+test on push/PR. Full matrix (amd64 + arm64) on all repos. Filtered via workflow_dispatch inputs.
4949
- `publish.yaml` — Official repo only. Build+test+push to Docker Hub.
5050
- `snapshot.yaml` — Snapshot pre-release images from FirebirdSQL/snapshots.
5151

DECISIONS.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,11 @@ Decisions made during the v2 rewrite, with rationale.
5050

5151
**Rationale:** Firebird 3 depends on `libncurses5`, which was removed from Ubuntu Noble. Rather than special-casing in code, we declare blocked combinations in config.
5252

53-
## D-008: Fork CI scope
53+
## D-008: Uniform CI scope
5454

55-
**Decision:** Forks build only the latest version + default distro. Full matrix runs on the official repo.
55+
**Decision:** All repositories (forks and official) run the same full build matrix on every push/PR, including both amd64 and arm64.
5656

57-
**Rationale:** Building all 60+ images on every fork push wastes CI minutes. A single latest image provides sufficient confidence for PR work.
57+
**Rationale:** Consistent CI ensures contributors catch the same failures as the official repo. Public repos have unlimited GitHub Actions minutes, so fork-scoping provides no meaningful savings while adding code complexity.
5858

5959
## D-009: No QEMU in CI
6060

README.md

Lines changed: 61 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -20,67 +20,67 @@ Docker images for Firebird Database.
2020
|`firebirdsql/firebird`|Dockerfile|
2121
|:-|:-:|
2222
|`5.0.3-bookworm`, `5-bookworm`, `bookworm`, `5.0.3`, `5`, `latest`|[Dockerfile](./generated/5.0.3/bookworm/Dockerfile)|
23-
|`5.0.3-bullseye`, `5-bullseye`, `bullseye`|[Dockerfile](./generated/5.0.3/bullseye/Dockerfile)|
24-
|`5.0.3-jammy`, `5-jammy`, `jammy`|[Dockerfile](./generated/5.0.3/jammy/Dockerfile)|
25-
|`5.0.3-noble`, `5-noble`, `noble`|[Dockerfile](./generated/5.0.3/noble/Dockerfile)|
26-
|`5.0.2-bookworm`, `5.0.2`|[Dockerfile](./generated/5.0.2/bookworm/Dockerfile)|
27-
|`5.0.2-bullseye`|[Dockerfile](./generated/5.0.2/bullseye/Dockerfile)|
28-
|`5.0.2-jammy`|[Dockerfile](./generated/5.0.2/jammy/Dockerfile)|
29-
|`5.0.2-noble`|[Dockerfile](./generated/5.0.2/noble/Dockerfile)|
30-
|`5.0.1-bookworm`, `5.0.1`|[Dockerfile](./generated/5.0.1/bookworm/Dockerfile)|
31-
|`5.0.1-bullseye`|[Dockerfile](./generated/5.0.1/bullseye/Dockerfile)|
32-
|`5.0.1-jammy`|[Dockerfile](./generated/5.0.1/jammy/Dockerfile)|
33-
|`5.0.1-noble`|[Dockerfile](./generated/5.0.1/noble/Dockerfile)|
34-
|`5.0.0-bookworm`, `5.0.0`|[Dockerfile](./generated/5.0.0/bookworm/Dockerfile)|
35-
|`5.0.0-bullseye`|[Dockerfile](./generated/5.0.0/bullseye/Dockerfile)|
36-
|`5.0.0-jammy`|[Dockerfile](./generated/5.0.0/jammy/Dockerfile)|
37-
|`5.0.0-noble`|[Dockerfile](./generated/5.0.0/noble/Dockerfile)|
38-
|`4.0.6-bookworm`, `4-bookworm`, `4.0.6`, `4`|[Dockerfile](./generated/4.0.6/bookworm/Dockerfile)|
39-
|`4.0.6-bullseye`, `4-bullseye`|[Dockerfile](./generated/4.0.6/bullseye/Dockerfile)|
40-
|`4.0.6-jammy`, `4-jammy`|[Dockerfile](./generated/4.0.6/jammy/Dockerfile)|
41-
|`4.0.6-noble`, `4-noble`|[Dockerfile](./generated/4.0.6/noble/Dockerfile)|
42-
|`4.0.5-bookworm`, `4.0.5`|[Dockerfile](./generated/4.0.5/bookworm/Dockerfile)|
43-
|`4.0.5-bullseye`|[Dockerfile](./generated/4.0.5/bullseye/Dockerfile)|
44-
|`4.0.5-jammy`|[Dockerfile](./generated/4.0.5/jammy/Dockerfile)|
45-
|`4.0.5-noble`|[Dockerfile](./generated/4.0.5/noble/Dockerfile)|
46-
|`4.0.4-bookworm`, `4.0.4`|[Dockerfile](./generated/4.0.4/bookworm/Dockerfile)|
47-
|`4.0.4-bullseye`|[Dockerfile](./generated/4.0.4/bullseye/Dockerfile)|
48-
|`4.0.4-jammy`|[Dockerfile](./generated/4.0.4/jammy/Dockerfile)|
49-
|`4.0.4-noble`|[Dockerfile](./generated/4.0.4/noble/Dockerfile)|
50-
|`4.0.3-bookworm`, `4.0.3`|[Dockerfile](./generated/4.0.3/bookworm/Dockerfile)|
51-
|`4.0.3-bullseye`|[Dockerfile](./generated/4.0.3/bullseye/Dockerfile)|
52-
|`4.0.3-jammy`|[Dockerfile](./generated/4.0.3/jammy/Dockerfile)|
53-
|`4.0.3-noble`|[Dockerfile](./generated/4.0.3/noble/Dockerfile)|
54-
|`4.0.2-bookworm`, `4.0.2`|[Dockerfile](./generated/4.0.2/bookworm/Dockerfile)|
55-
|`4.0.2-bullseye`|[Dockerfile](./generated/4.0.2/bullseye/Dockerfile)|
56-
|`4.0.2-jammy`|[Dockerfile](./generated/4.0.2/jammy/Dockerfile)|
57-
|`4.0.2-noble`|[Dockerfile](./generated/4.0.2/noble/Dockerfile)|
58-
|`4.0.1-bookworm`, `4.0.1`|[Dockerfile](./generated/4.0.1/bookworm/Dockerfile)|
59-
|`4.0.1-bullseye`|[Dockerfile](./generated/4.0.1/bullseye/Dockerfile)|
60-
|`4.0.1-jammy`|[Dockerfile](./generated/4.0.1/jammy/Dockerfile)|
61-
|`4.0.1-noble`|[Dockerfile](./generated/4.0.1/noble/Dockerfile)|
62-
|`4.0.0-bookworm`, `4.0.0`|[Dockerfile](./generated/4.0.0/bookworm/Dockerfile)|
63-
|`4.0.0-bullseye`|[Dockerfile](./generated/4.0.0/bullseye/Dockerfile)|
64-
|`4.0.0-jammy`|[Dockerfile](./generated/4.0.0/jammy/Dockerfile)|
65-
|`4.0.0-noble`|[Dockerfile](./generated/4.0.0/noble/Dockerfile)|
66-
|`3.0.13-bookworm`, `3-bookworm`, `3.0.13`, `3`|[Dockerfile](./generated/3.0.13/bookworm/Dockerfile)|
67-
|`3.0.13-bullseye`, `3-bullseye`|[Dockerfile](./generated/3.0.13/bullseye/Dockerfile)|
68-
|`3.0.13-jammy`, `3-jammy`|[Dockerfile](./generated/3.0.13/jammy/Dockerfile)|
69-
|`3.0.12-bookworm`, `3.0.12`|[Dockerfile](./generated/3.0.12/bookworm/Dockerfile)|
70-
|`3.0.12-bullseye`|[Dockerfile](./generated/3.0.12/bullseye/Dockerfile)|
71-
|`3.0.12-jammy`|[Dockerfile](./generated/3.0.12/jammy/Dockerfile)|
72-
|`3.0.11-bookworm`, `3.0.11`|[Dockerfile](./generated/3.0.11/bookworm/Dockerfile)|
73-
|`3.0.11-bullseye`|[Dockerfile](./generated/3.0.11/bullseye/Dockerfile)|
74-
|`3.0.11-jammy`|[Dockerfile](./generated/3.0.11/jammy/Dockerfile)|
75-
|`3.0.10-bookworm`, `3.0.10`|[Dockerfile](./generated/3.0.10/bookworm/Dockerfile)|
76-
|`3.0.10-bullseye`|[Dockerfile](./generated/3.0.10/bullseye/Dockerfile)|
77-
|`3.0.10-jammy`|[Dockerfile](./generated/3.0.10/jammy/Dockerfile)|
78-
|`3.0.9-bookworm`, `3.0.9`|[Dockerfile](./generated/3.0.9/bookworm/Dockerfile)|
79-
|`3.0.9-bullseye`|[Dockerfile](./generated/3.0.9/bullseye/Dockerfile)|
80-
|`3.0.9-jammy`|[Dockerfile](./generated/3.0.9/jammy/Dockerfile)|
81-
|`3.0.8-bookworm`, `3.0.8`|[Dockerfile](./generated/3.0.8/bookworm/Dockerfile)|
82-
|`3.0.8-bullseye`|[Dockerfile](./generated/3.0.8/bullseye/Dockerfile)|
83-
|`3.0.8-jammy`|[Dockerfile](./generated/3.0.8/jammy/Dockerfile)|
23+
|`5.0.3-bullseye`, `5-bullseye`, `bullseye`|[Dockerfile](./generated/5.0.3/bullseye/Dockerfile)|
24+
|`5.0.3-jammy`, `5-jammy`, `jammy`|[Dockerfile](./generated/5.0.3/jammy/Dockerfile)|
25+
|`5.0.3-noble`, `5-noble`, `noble`|[Dockerfile](./generated/5.0.3/noble/Dockerfile)|
26+
|`5.0.2-bookworm`, `5.0.2`|[Dockerfile](./generated/5.0.2/bookworm/Dockerfile)|
27+
|`5.0.2-bullseye`|[Dockerfile](./generated/5.0.2/bullseye/Dockerfile)|
28+
|`5.0.2-jammy`|[Dockerfile](./generated/5.0.2/jammy/Dockerfile)|
29+
|`5.0.2-noble`|[Dockerfile](./generated/5.0.2/noble/Dockerfile)|
30+
|`5.0.1-bookworm`, `5.0.1`|[Dockerfile](./generated/5.0.1/bookworm/Dockerfile)|
31+
|`5.0.1-bullseye`|[Dockerfile](./generated/5.0.1/bullseye/Dockerfile)|
32+
|`5.0.1-jammy`|[Dockerfile](./generated/5.0.1/jammy/Dockerfile)|
33+
|`5.0.1-noble`|[Dockerfile](./generated/5.0.1/noble/Dockerfile)|
34+
|`5.0.0-bookworm`, `5.0.0`|[Dockerfile](./generated/5.0.0/bookworm/Dockerfile)|
35+
|`5.0.0-bullseye`|[Dockerfile](./generated/5.0.0/bullseye/Dockerfile)|
36+
|`5.0.0-jammy`|[Dockerfile](./generated/5.0.0/jammy/Dockerfile)|
37+
|`5.0.0-noble`|[Dockerfile](./generated/5.0.0/noble/Dockerfile)|
38+
|`4.0.6-bookworm`, `4-bookworm`, `4.0.6`, `4`|[Dockerfile](./generated/4.0.6/bookworm/Dockerfile)|
39+
|`4.0.6-bullseye`, `4-bullseye`|[Dockerfile](./generated/4.0.6/bullseye/Dockerfile)|
40+
|`4.0.6-jammy`, `4-jammy`|[Dockerfile](./generated/4.0.6/jammy/Dockerfile)|
41+
|`4.0.6-noble`, `4-noble`|[Dockerfile](./generated/4.0.6/noble/Dockerfile)|
42+
|`4.0.5-bookworm`, `4.0.5`|[Dockerfile](./generated/4.0.5/bookworm/Dockerfile)|
43+
|`4.0.5-bullseye`|[Dockerfile](./generated/4.0.5/bullseye/Dockerfile)|
44+
|`4.0.5-jammy`|[Dockerfile](./generated/4.0.5/jammy/Dockerfile)|
45+
|`4.0.5-noble`|[Dockerfile](./generated/4.0.5/noble/Dockerfile)|
46+
|`4.0.4-bookworm`, `4.0.4`|[Dockerfile](./generated/4.0.4/bookworm/Dockerfile)|
47+
|`4.0.4-bullseye`|[Dockerfile](./generated/4.0.4/bullseye/Dockerfile)|
48+
|`4.0.4-jammy`|[Dockerfile](./generated/4.0.4/jammy/Dockerfile)|
49+
|`4.0.4-noble`|[Dockerfile](./generated/4.0.4/noble/Dockerfile)|
50+
|`4.0.3-bookworm`, `4.0.3`|[Dockerfile](./generated/4.0.3/bookworm/Dockerfile)|
51+
|`4.0.3-bullseye`|[Dockerfile](./generated/4.0.3/bullseye/Dockerfile)|
52+
|`4.0.3-jammy`|[Dockerfile](./generated/4.0.3/jammy/Dockerfile)|
53+
|`4.0.3-noble`|[Dockerfile](./generated/4.0.3/noble/Dockerfile)|
54+
|`4.0.2-bookworm`, `4.0.2`|[Dockerfile](./generated/4.0.2/bookworm/Dockerfile)|
55+
|`4.0.2-bullseye`|[Dockerfile](./generated/4.0.2/bullseye/Dockerfile)|
56+
|`4.0.2-jammy`|[Dockerfile](./generated/4.0.2/jammy/Dockerfile)|
57+
|`4.0.2-noble`|[Dockerfile](./generated/4.0.2/noble/Dockerfile)|
58+
|`4.0.1-bookworm`, `4.0.1`|[Dockerfile](./generated/4.0.1/bookworm/Dockerfile)|
59+
|`4.0.1-bullseye`|[Dockerfile](./generated/4.0.1/bullseye/Dockerfile)|
60+
|`4.0.1-jammy`|[Dockerfile](./generated/4.0.1/jammy/Dockerfile)|
61+
|`4.0.1-noble`|[Dockerfile](./generated/4.0.1/noble/Dockerfile)|
62+
|`4.0.0-bookworm`, `4.0.0`|[Dockerfile](./generated/4.0.0/bookworm/Dockerfile)|
63+
|`4.0.0-bullseye`|[Dockerfile](./generated/4.0.0/bullseye/Dockerfile)|
64+
|`4.0.0-jammy`|[Dockerfile](./generated/4.0.0/jammy/Dockerfile)|
65+
|`4.0.0-noble`|[Dockerfile](./generated/4.0.0/noble/Dockerfile)|
66+
|`3.0.13-bookworm`, `3-bookworm`, `3.0.13`, `3`|[Dockerfile](./generated/3.0.13/bookworm/Dockerfile)|
67+
|`3.0.13-bullseye`, `3-bullseye`|[Dockerfile](./generated/3.0.13/bullseye/Dockerfile)|
68+
|`3.0.13-jammy`, `3-jammy`|[Dockerfile](./generated/3.0.13/jammy/Dockerfile)|
69+
|`3.0.12-bookworm`, `3.0.12`|[Dockerfile](./generated/3.0.12/bookworm/Dockerfile)|
70+
|`3.0.12-bullseye`|[Dockerfile](./generated/3.0.12/bullseye/Dockerfile)|
71+
|`3.0.12-jammy`|[Dockerfile](./generated/3.0.12/jammy/Dockerfile)|
72+
|`3.0.11-bookworm`, `3.0.11`|[Dockerfile](./generated/3.0.11/bookworm/Dockerfile)|
73+
|`3.0.11-bullseye`|[Dockerfile](./generated/3.0.11/bullseye/Dockerfile)|
74+
|`3.0.11-jammy`|[Dockerfile](./generated/3.0.11/jammy/Dockerfile)|
75+
|`3.0.10-bookworm`, `3.0.10`|[Dockerfile](./generated/3.0.10/bookworm/Dockerfile)|
76+
|`3.0.10-bullseye`|[Dockerfile](./generated/3.0.10/bullseye/Dockerfile)|
77+
|`3.0.10-jammy`|[Dockerfile](./generated/3.0.10/jammy/Dockerfile)|
78+
|`3.0.9-bookworm`, `3.0.9`|[Dockerfile](./generated/3.0.9/bookworm/Dockerfile)|
79+
|`3.0.9-bullseye`|[Dockerfile](./generated/3.0.9/bullseye/Dockerfile)|
80+
|`3.0.9-jammy`|[Dockerfile](./generated/3.0.9/jammy/Dockerfile)|
81+
|`3.0.8-bookworm`, `3.0.8`|[Dockerfile](./generated/3.0.8/bookworm/Dockerfile)|
82+
|`3.0.8-bullseye`|[Dockerfile](./generated/3.0.8/bullseye/Dockerfile)|
83+
|`3.0.8-jammy`|[Dockerfile](./generated/3.0.8/jammy/Dockerfile)|
8484

8585

8686
> _Firebird 3 does not have an image for Ubuntu 24.04 LTS (Noble Numbat) due to a dependency (`libncurses5`) missing from Ubuntu sources._

firebird-docker.build.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ task Update-Readme LoadAssets, {
208208
}
209209

210210
$template = Get-Content './src/README.md.template' -Raw -Encoding UTF8
211-
$content = $template.Replace('{{SupportedTags}}', ($TSupportedTags -join ' '))
211+
$content = $template.Replace('{{SupportedTags}}', ($TSupportedTags -join ''))
212212
Write-GeneratedFile -Content $content -Destination './README.md'
213213
}
214214

0 commit comments

Comments
 (0)