@@ -3,9 +3,13 @@ name: PR Checks
33on :
44 pull_request :
55 branches : [main]
6+ push :
7+ branches : [main]
68
79env :
810 DEVCELL_DIR : ${{ github.workspace }}
11+ REGISTRY : ghcr.io
12+ IMAGE_NAME : ${{ github.repository }}
913
1014jobs :
1115 secrets :
@@ -21,19 +25,27 @@ jobs:
2125 GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
2226
2327 build :
24- name : Build and Test (${{ matrix.arch }})
28+ name : Build (${{ matrix.arch }})
2529 strategy :
2630 fail-fast : false
2731 matrix :
2832 include :
2933 - runner : ubuntu-latest
3034 arch : amd64
35+ platform : linux/amd64
3136 - runner : ubuntu-24.04-arm
3237 arch : arm64
38+ platform : linux/arm64
3339 runs-on : ${{ matrix.runner }}
40+ permissions :
41+ contents : read
42+ packages : write
3443 steps :
3544 - uses : actions/checkout@v4
3645
46+ - name : Set lowercase image name
47+ run : echo "IMAGE_NAME_LC=${IMAGE_NAME,,}" >> $GITHUB_ENV
48+
3749 - name : Free disk space
3850 run : |
3951 sudo rm -rf /usr/share/dotnet
@@ -43,37 +55,68 @@ jobs:
4355 sudo docker image prune -af
4456 df -h
4557
46- - name : Install Task
47- uses : arduino/setup-task@v2
48- with :
49- version : 3.x
50-
5158 - name : Copy example files
5259 run : |
5360 cp .tool-versions-example .tool-versions
5461 cp Dockerfile-local.example Dockerfile-local
5562 cp compose.local-example.yml compose.local.yml
63+ cp opencode.example.json opencode-local.json
5664
5765 - name : Set up Docker Buildx
5866 uses : docker/setup-buildx-action@v3
67+
68+ - name : Log in to GitHub Container Registry
69+ uses : docker/login-action@v3
5970 with :
60- driver : docker
71+ registry : ${{ env.REGISTRY }}
72+ username : ${{ github.actor }}
73+ password : ${{ secrets.GITHUB_TOKEN }}
6174
62- - name : Build images
63- run : task image:build
64- env :
65- USER_NAME : runner
66- USER_UID : 1001
67- USER_GID : 127
75+ - name : Build and push base image
76+ uses : docker/build-push-action@v6
77+ with :
78+ context : .
79+ push : true
80+ platforms : ${{ matrix.platform }}
81+ tags : ${{ env.REGISTRY }}/${{ env.IMAGE_NAME_LC }}:edge-${{ matrix.arch }}
82+ cache-from : type=gha,scope=${{ matrix.arch }}-base
83+ cache-to : type=gha,mode=max,scope=${{ matrix.arch }}-base
84+ provenance : false
85+ build-args : |
86+ USER_NAME=devuser
87+ USER_UID=1000
88+ USER_GID=1000
89+ DEVCELL_GUI_ENABLED=true
90+
91+ - name : Build and push extended image
92+ uses : docker/build-push-action@v6
93+ with :
94+ context : .
95+ file : ./Dockerfile-local
96+ push : true
97+ platforms : ${{ matrix.platform }}
98+ tags : ${{ env.REGISTRY }}/${{ env.IMAGE_NAME_LC }}:edge-extended-${{ matrix.arch }}
99+ cache-from : type=gha,scope=${{ matrix.arch }}-extended
100+ cache-to : type=gha,mode=max,scope=${{ matrix.arch }}-extended
101+ provenance : false
102+ build-args : |
103+ BASE_IMAGE=${{ env.REGISTRY }}/${{ env.IMAGE_NAME_LC }}:edge-${{ matrix.arch }}
104+ USER_NAME=devuser
105+ USER_UID=1000
106+ USER_GID=1000
107+ DEVCELL_KICAD_ENABLED=false
68108
69109 - name : Test Claude version
70110 run : |
71111 # Get expected version from package.json
72112 EXPECTED=$(jq -r '.dependencies["@anthropic-ai/claude-code"]' package.json)
73113 echo "Expected Claude version: $EXPECTED"
74114
75- # Get actual version from container (use docker directly, task claude requires TTY)
76- ACTUAL=$(docker run --rm --entrypoint "" devcell:latest-local claude --version 2>&1 | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1)
115+ # Pull the edge image we just built
116+ docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME_LC }}:edge-extended-${{ matrix.arch }}
117+
118+ # Get actual version from container
119+ ACTUAL=$(docker run --rm --entrypoint "" ${{ env.REGISTRY }}/${{ env.IMAGE_NAME_LC }}:edge-extended-${{ matrix.arch }} claude --version 2>&1 | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1)
77120 echo "Actual Claude version: $ACTUAL"
78121
79122 if [[ -z "$ACTUAL" ]]; then
@@ -87,3 +130,43 @@ jobs:
87130 fi
88131
89132 echo "Claude version verified: $ACTUAL"
133+
134+ manifest :
135+ name : Create Edge Manifests
136+ needs : build
137+ runs-on : ubuntu-latest
138+ permissions :
139+ contents : read
140+ packages : write
141+
142+ steps :
143+ - name : Set lowercase image name
144+ run : echo "IMAGE_NAME_LC=${IMAGE_NAME,,}" >> $GITHUB_ENV
145+ env :
146+ IMAGE_NAME : ${{ github.repository }}
147+
148+ - name : Log in to GitHub Container Registry
149+ uses : docker/login-action@v3
150+ with :
151+ registry : ${{ env.REGISTRY }}
152+ username : ${{ github.actor }}
153+ password : ${{ secrets.GITHUB_TOKEN }}
154+
155+ - name : Create and push edge manifest
156+ run : |
157+ docker buildx imagetools create -t ${{ env.REGISTRY }}/${{ env.IMAGE_NAME_LC }}:edge \
158+ ${{ env.REGISTRY }}/${{ env.IMAGE_NAME_LC }}:edge-amd64 \
159+ ${{ env.REGISTRY }}/${{ env.IMAGE_NAME_LC }}:edge-arm64
160+
161+ - name : Create and push edge-extended manifest
162+ run : |
163+ docker buildx imagetools create -t ${{ env.REGISTRY }}/${{ env.IMAGE_NAME_LC }}:edge-extended \
164+ ${{ env.REGISTRY }}/${{ env.IMAGE_NAME_LC }}:edge-extended-amd64 \
165+ ${{ env.REGISTRY }}/${{ env.IMAGE_NAME_LC }}:edge-extended-arm64
166+
167+ - name : Inspect manifests
168+ run : |
169+ echo "=== edge manifest ==="
170+ docker buildx imagetools inspect ${{ env.REGISTRY }}/${{ env.IMAGE_NAME_LC }}:edge
171+ echo "=== edge-extended manifest ==="
172+ docker buildx imagetools inspect ${{ env.REGISTRY }}/${{ env.IMAGE_NAME_LC }}:edge-extended
0 commit comments