Skip to content

Commit dd19ae7

Browse files
authored
Fix Docker workflow: use static permissions value (#250)
## Summary - Replace dynamic expression in `permissions.packages` with static `write` value - GitHub Actions rejects expressions in permission declarations at parse time, which caused all 369 Docker workflow runs to fail before executing any step - Push-gating is already handled by `if` conditions on the login and build-push steps 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Wes McKinney <wesm@users.noreply.github.com>
1 parent 479e309 commit dd19ae7

5 files changed

Lines changed: 83 additions & 66 deletions

File tree

.github/workflows/docker.yml

Lines changed: 54 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,62 @@ env:
1919
IMAGE_NAME: ${{ github.repository }}
2020

2121
jobs:
22-
build:
22+
# PR validation: build and smoke-test only, no registry access
23+
validate:
24+
if: github.event_name == 'pull_request'
2325
runs-on: ubuntu-latest
2426
permissions:
2527
contents: read
26-
# Only allow package writes for pushes to main/tags, not PRs
27-
packages: ${{ github.event_name != 'pull_request' && 'write' || 'read' }}
28+
29+
steps:
30+
- name: Checkout
31+
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
32+
33+
- name: Set up QEMU
34+
uses: docker/setup-qemu-action@ce360397dd3f832beb865e1373c09c0e9f86d70a # v4.0.0
35+
36+
- name: Set up Docker Buildx
37+
uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0
38+
39+
- name: Build multi-arch (no push)
40+
uses: docker/build-push-action@d08e5c354a6adb9ed34480a06d141179aa583294 # v7.0.0
41+
with:
42+
context: .
43+
platforms: linux/amd64,linux/arm64
44+
push: false
45+
build-args: |
46+
VERSION=test
47+
COMMIT=${{ github.sha }}
48+
BUILD_DATE=${{ github.event.head_commit.timestamp }}
49+
cache-from: type=gha
50+
cache-to: type=gha,mode=max
51+
52+
- name: Smoke test (amd64)
53+
run: |
54+
docker buildx build \
55+
--platform linux/amd64 \
56+
--load \
57+
--tag msgvault:test \
58+
--build-arg VERSION=test \
59+
--build-arg COMMIT=$(echo $GITHUB_SHA | cut -c1-8) \
60+
--build-arg BUILD_DATE=$(date -u +%Y-%m-%dT%H:%M:%SZ) \
61+
.
62+
63+
docker run --rm msgvault:test version
64+
docker run --rm msgvault:test --help
65+
66+
mkdir -p /tmp/msgvault-test && chmod 777 /tmp/msgvault-test
67+
docker run --rm -v /tmp/msgvault-test:/data msgvault:test init-db
68+
test -f /tmp/msgvault-test/msgvault.db || { echo "FATAL: database not created"; exit 1; }
69+
rm -rf /tmp/msgvault-test
70+
71+
# Publish: build multi-arch and push to GHCR (main/tags only)
72+
publish:
73+
if: github.event_name != 'pull_request'
74+
runs-on: ubuntu-latest
75+
permissions:
76+
contents: read
77+
packages: write
2878

2979
steps:
3080
- name: Checkout
@@ -37,7 +87,6 @@ jobs:
3787
uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0
3888

3989
- name: Log in to Container Registry
40-
if: github.event_name != 'pull_request'
4190
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
4291
with:
4392
registry: ${{ env.REGISTRY }}
@@ -76,7 +125,7 @@ jobs:
76125
with:
77126
context: .
78127
platforms: linux/amd64,linux/arm64
79-
push: ${{ github.event_name != 'pull_request' }}
128+
push: true
80129
tags: ${{ steps.meta.outputs.tags }}
81130
labels: ${{ steps.meta.outputs.labels }}
82131
build-args: |
@@ -85,34 +134,3 @@ jobs:
85134
BUILD_DATE=${{ steps.build_args.outputs.build_date }}
86135
cache-from: type=gha
87136
cache-to: type=gha,mode=max
88-
89-
- name: Test image (amd64)
90-
if: github.event_name == 'pull_request'
91-
run: |
92-
# Build single-arch for testing
93-
docker buildx build \
94-
--platform linux/amd64 \
95-
--load \
96-
--tag msgvault:test \
97-
--build-arg VERSION=test \
98-
--build-arg COMMIT=$(echo $GITHUB_SHA | cut -c1-8) \
99-
--build-arg BUILD_DATE=$(date -u +%Y-%m-%dT%H:%M:%SZ) \
100-
.
101-
102-
# Smoke test: version command
103-
echo "--- Version test ---"
104-
docker run --rm msgvault:test version
105-
106-
# Smoke test: help command
107-
echo "--- Help test ---"
108-
docker run --rm msgvault:test --help
109-
110-
# Smoke test: init-db (creates database)
111-
echo "--- Init DB test ---"
112-
mkdir -p /tmp/msgvault-test && chmod 777 /tmp/msgvault-test
113-
docker run --rm -v /tmp/msgvault-test:/data msgvault:test init-db
114-
test -f /tmp/msgvault-test/msgvault.db || { echo "FATAL: database not created"; exit 1; }
115-
echo "Database created successfully"
116-
117-
# Cleanup
118-
rm -rf /tmp/msgvault-test

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ __pycache__/
4141

4242
# Nix
4343
.direnv/
44+
result
4445

4546
# Claude Code
4647
.claude/

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Build stage
22
# Pin by digest for reproducibility; update periodically
3-
FROM golang:1.25-bookworm@sha256:7af46e70d2017aef0b4ce2422afbcf39af0511a61993103e948b61011233ec42 AS builder
3+
FROM golang:1.25-bookworm@sha256:29e59af995c51a5bf63d072eca973b918e0e7af4db0e4667aa73f1b8da1a6d8c AS builder
44

55
# Install build dependencies for CGO (SQLite, DuckDB)
66
RUN apt-get update && apt-get install -y --no-install-recommends \

flake.nix

Lines changed: 26 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -11,41 +11,39 @@
1111
nixpkgs.lib.genAttrs [ "x86_64-linux" "aarch64-linux" "aarch64-darwin" "x86_64-darwin" ] (
1212
system: fn nixpkgs.legacyPackages.${system}
1313
);
14+
15+
# Pin Go 1.25.9 until nixpkgs-unstable catches up from staging
16+
goPinned = pkgs: pkgs.go_1_25.overrideAttrs (old: rec {
17+
version = "1.25.9";
18+
src = pkgs.fetchurl {
19+
url = "https://go.dev/dl/go${version}.src.tar.gz";
20+
hash = "sha256-DsnvjrzqCXqsN97K6fCachi0Uc2Wvn1u1RPY5Lz5Cc8=";
21+
};
22+
});
1423
in
1524
{
1625
packages = forAllSystems (pkgs: {
17-
default =
18-
let
19-
# Pin Go 1.25.8 until nixpkgs-unstable catches up from staging
20-
go_pinned = pkgs.go_1_25.overrideAttrs (old: rec {
21-
version = "1.25.8";
22-
src = pkgs.fetchurl {
23-
url = "https://go.dev/dl/go${version}.src.tar.gz";
24-
hash = "sha256-6YjUokRqx/4/baoImljpk2pSo4E1Wt7ByJgyMKjWxZ4=";
25-
};
26-
});
27-
in
28-
(pkgs.buildGoModule.override { go = go_pinned; }) {
29-
pname = "msgvault";
30-
version = "0.11.0";
31-
src = ./.;
32-
vendorHash = "sha256-JtfZwLpeyVsX/Yvb3EV7L+Gk/lFYaMJcrmID6eEvz84=";
33-
proxyVendor = true;
34-
subPackages = [ "cmd/msgvault" ];
35-
tags = [ "fts5" ];
36-
ldflags = [
37-
"-X github.com/wesm/msgvault/cmd/msgvault/cmd.Version=nix-dev"
38-
];
39-
};
26+
default = (pkgs.buildGoModule.override { go = goPinned pkgs; }) {
27+
pname = "msgvault";
28+
version = "0.11.0";
29+
src = ./.;
30+
vendorHash = "sha256-JtfZwLpeyVsX/Yvb3EV7L+Gk/lFYaMJcrmID6eEvz84=";
31+
proxyVendor = true;
32+
subPackages = [ "cmd/msgvault" ];
33+
tags = [ "fts5" ];
34+
ldflags = [
35+
"-X github.com/wesm/msgvault/cmd/msgvault/cmd.Version=nix-dev"
36+
];
37+
};
4038
});
4139

4240
devShells = forAllSystems (pkgs: {
4341
default = pkgs.mkShell {
44-
packages = with pkgs; [
45-
go
46-
golangci-lint
47-
gcc
48-
prek
42+
packages = [
43+
(goPinned pkgs)
44+
pkgs.golangci-lint
45+
pkgs.gcc
46+
pkgs.prek
4947
];
5048
};
5149
});

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module github.com/wesm/msgvault
22

3-
go 1.25.8
3+
go 1.25.9
44

55
require (
66
github.com/BurntSushi/toml v1.6.0

0 commit comments

Comments
 (0)