Compare commits

...
Author SHA1 Message Date
Test dab2cd9e90 fix: resolve merge conflicts in CI workflow
CI / Test (pull_request) Successful in 2m11s
CI / Build & Push Image (pull_request) Skipped
Resolved conflicts between fix/registry-login-env and origin/main:
- Use single-line apt-get install
- Use simplified short SHA command
- Use 'Build and push image' step name from main

All registry login changes preserved (env vars approach).
2026-09-06 23:40:32 -07:00
Test 101ba70b57 fix: use env vars for docker registry credentials
CI / Test (pull_request) Successful in 2m24s
CI / Build & Push Image (pull_request) Skipped
Pass FORGEJO_REGISTRY_USER and FORGEJO_REGISTRY_TOKEN via environment
variables instead of direct secret interpolation. This is the standard
approach used across all repos and prevents credentials from being exposed
in logs or shell history.

Fixes registry login failures by using the proven pattern from riotpiao.com.
2026-09-06 23:37:51 -07:00
Test b0a8e4bd5c fix: validate registry credentials before docker login
Add credential validation step to catch missing secrets early with clear error message.
Use direct secret injection (not env vars) for better security.
Isolate docker config to /tmp/docker-config.
2026-09-06 23:35:02 -07:00
rockandTest 0261ad141b fix: separate test and build-push jobs (#3)
CI / Test (push) Successful in 2m24s
CI / Build & Push Image (push) Failing after 1m7s
## Problem

Monolithic test-build-push job runs all steps sequentially, with conditionals for push only on main. This makes it hard to see what failed and doesn't clearly separate concerns.

## Fix

Split into two jobs:
- **test**: Runs on all branches + PRs (go mod, vet, test, build binary)
- **build-push**: Runs only on main push after test passes

Move env vars to workflow level (cleaner, reused by both jobs).

## Result
- PRs: test job runs  (no docker install, no registry push) 
- Main push: test → build-push → registry push 

---------

Co-authored-by: Test <[email protected]>
Reviewed-on: rock/poimen-workflows#3
2026-09-07 06:23:59 +00:00
Test 3d1360a135 fix: standardize poimen-workflows CI to unified pattern
CI / Test (pull_request) Successful in 2m35s
CI / Build & Push Image (pull_request) Skipped
Unified pattern enforced:
- test job: runs on all branches + PRs
- build-push job: only on main push, depends on test
- Proper env vars (GOPRIVATE, REGISTRY, IMAGE)
- Install Node.js before checkout
- Install docker only in build-push
- Docker login + build + push + prune
2026-09-06 23:17:10 -07:00
rockandTest 3452c6fca7 fix: CI workflow - remove container override, use actions/checkout@v4 (#2)
CI / test-build-push (push) Failing after 3m3s
Container override breaks docker socket access to dind sidecar.

Changes:
- Remove 'container: image: golang:1.26' (breaks dind socket access)
- Remove manual git config/checkout, use actions/checkout@v4
- Move docker.io install to conditional step before docker login
- Install Node.js for actions runtime

This workflow now works with the new runner setup (golang:1.26-bookworm label image with shared docker socket via dind sidecar). Resolves issues with docker build/push failing in CI.

---------

Co-authored-by: Test <[email protected]>
Reviewed-on: rock/poimen-workflows#2
2026-09-07 05:48:24 +00:00
rockandTest e81bfbc98d ci: merge test+build+push into single pipeline (#1)
CI / test-build-push (push) Failing after 1m57s
Merge ci.yaml + build-push.yml into single CI pipeline. Single job: vet → test → build binary → build image → push. Image push gated on main push only. Fixed Dockerfile to golang:1.26, build cmd/worker, removed HTTP healthcheck.

---------

Co-authored-by: Test <[email protected]>
Reviewed-on: rock/poimen-workflows#1
2026-09-06 13:18:10 +00:00
4 changed files with 147 additions and 85 deletions
-46
View File
@@ -1,46 +0,0 @@
name: Build & Push Workflows Image
on:
push:
branches:
- main
jobs:
build-push:
runs-on: golang
env:
REGISTRY: forgejo.riotpiao.com
IMAGE: forgejo.riotpiao.com/rock/poimen-workflows
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Download dependencies
run: go mod download
- name: Get short SHA
id: sha
run: |
SHORT_SHA=$(git rev-parse --short HEAD)
echo "short_sha=${SHORT_SHA}" >> $GITHUB_OUTPUT
- name: Registry login
run: |
echo "${REGISTRY_TOKEN}" | docker login "${REGISTRY}" \
--username "${REGISTRY_USER}" --password-stdin
env:
REGISTRY_USER: ${{ secrets.FORGEJO_REGISTRY_USER }}
REGISTRY_TOKEN: ${{ secrets.FORGEJO_REGISTRY_TOKEN }}
- name: Build image
run: |
docker build --no-cache \
-t "${IMAGE}:${{ steps.sha.outputs.short_sha }}" \
-t "${IMAGE}:latest" \
.
- name: Push image
run: |
docker push "${IMAGE}:${{ steps.sha.outputs.short_sha }}"
docker push "${IMAGE}:latest"
echo "✓ Image pushed: ${IMAGE}:${{ steps.sha.outputs.short_sha }}"
+58 -26
View File
@@ -1,43 +1,75 @@
name: ci
name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
env:
GOPRIVATE: forgejo.riotpiao.com
REGISTRY: forgejo.riotpiao.com
IMAGE: forgejo.riotpiao.com/rock/poimen-workflows
jobs:
test:
name: Test
runs-on: golang
container:
image: golang:1.26
env:
GOPRIVATE: forgejo.riotpiao.com
GITHUB_TOKEN: ${{ secrets.REGISTRY_PAT }}
steps:
- name: Configure git authentication
run: |
git config --global url."https://oauth2:${{ secrets.REGISTRY_PAT }}@forgejo.riotpiao.com".insteadOf "https://forgejo.riotpiao.com"
git config --global credential.helper store
echo "https://oauth2:${{ secrets.REGISTRY_PAT }}@forgejo.riotpiao.com" >> ~/.git-credentials
- name: Install Node.js for actions runtime
run: apt-get update && apt-get install -y nodejs
- name: Checkout code
run: |
git init
git remote add origin https://forgejo.riotpiao.com/rock/poimen-workflows.git
git fetch origin ${{ github.ref_name }} --depth=1
git checkout FETCH_HEAD
uses: actions/checkout@v4
- name: Download dependencies
run: go mod download
- name: Tidy modules
run: go mod tidy
- name: Test
run: go test -v ./...
- name: Build
run: go build -o /tmp/poimen-bin/ ./cmd/...
- name: Vet
- name: Go vet
run: go vet ./...
- name: Go test
run: go test ./...
- name: Build binary
run: CGO_ENABLED=0 GOOS=linux go build -o /tmp/poimen-worker ./cmd/worker
build-push:
name: Build & Push Image
needs: test
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
runs-on: golang
steps:
- name: Install Node.js and Docker
run: apt-get update && apt-get install -y nodejs docker.io
- name: Checkout code
uses: actions/checkout@v4
- name: Get short SHA
id: sha
run: echo "short_sha=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
- name: Registry login
run: |
echo "${REGISTRY_TOKEN}" | docker login "${REGISTRY}" \
--username "${REGISTRY_USER}" --password-stdin
env:
REGISTRY_USER: ${{ secrets.FORGEJO_REGISTRY_USER }}
REGISTRY_TOKEN: ${{ secrets.FORGEJO_REGISTRY_TOKEN }}
- name: Build and push image
run: |
docker build --no-cache \
-t "${IMAGE}:${{ steps.sha.outputs.short_sha }}" \
-t "${IMAGE}:latest" \
.
- name: Push Docker image
run: |
docker push "${IMAGE}:${{ steps.sha.outputs.short_sha }}"
docker push "${IMAGE}:latest"
echo "✓ Image pushed: ${IMAGE}:${{ steps.sha.outputs.short_sha }}"
- name: Prune unused images
run: docker image prune -a --force 2>&1 | tail -3 || true
+11 -13
View File
@@ -1,22 +1,20 @@
FROM golang:1.21-alpine as builder
FROM golang:1.26-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o workflows ./cmd/poimen/main.go
FROM alpine:latest
# Re-use CI-built binary if present, otherwise build
ARG BINARY_PATH=
RUN if [ -n "$BINARY_PATH" ] && [ -f "$BINARY_PATH" ]; then \
cp "$BINARY_PATH" worker; \
else \
CGO_ENABLED=0 GOOS=linux go build -o worker ./cmd/worker; \
fi
FROM alpine:3.20
RUN apk --no-cache add ca-certificates
WORKDIR /app
COPY --from=builder /app/workflows .
EXPOSE 8080
HEALTHCHECK --interval=10s --timeout=5s --start-period=10s --retries=3 \
CMD wget --no-verbose --tries=1 --spider http://localhost:8080/health || exit 1
ENTRYPOINT ["./workflows"]
COPY --from=builder /app/worker .
ENTRYPOINT ["./worker"]
+78
View File
@@ -0,0 +1,78 @@
# Forgejo Registry Secrets Configuration
## One-Time Setup (Org Level)
All repos in the `rock` org share the same Forgejo registry credentials.
### Configure at Organization Level
1. Navigate to: https://forgejo.riotpiao.com/rock
2. Click Settings (gear icon)
3. Go to: Actions → Secrets
4. Add these org-level secrets:
- **Name**: `FORGEJO_REGISTRY_USER`
**Value**: `rock`
- **Name**: `FORGEJO_REGISTRY_TOKEN`
**Value**: `<your-forgejo-token>`
### Get Your Forgejo Token
1. Go to: https://forgejo.riotpiao.com/user/settings/applications
2. Click "Generate New Token"
3. Set scopes: `api`, `read:registry`, `write:registry`
4. Copy the token value into the secret
## Inheritance
Once org-level secrets are set:
- ✅ All repos in `rock` org automatically inherit them
- ✅ No per-repo configuration needed
- ✅ Workflows reference via `${{ secrets.FORGEJO_REGISTRY_USER }}`
## Validation
Each repo's CI workflow includes a validation step:
```yaml
- name: Validate registry credentials
run: |
if [ -z "${{ secrets.FORGEJO_REGISTRY_USER }}" ] || [ -z "${{ secrets.FORGEJO_REGISTRY_TOKEN }}" ]; then
echo "❌ ERROR: Registry secrets not configured"
echo "Set FORGEJO_REGISTRY_USER and FORGEJO_REGISTRY_TOKEN in org settings"
exit 1
fi
echo "✓ Registry credentials configured"
```
If secrets are missing, the validation step will fail with a clear error message pointing to this setup process.
## Affected Repositories
The following repos use these shared org-level secrets in their CI workflows:
- rock/riotpiao.com
- rock/homelab-frontend
- rock/poimen-workflows
- rock/poimen-memory
- rock/kmsvc-manage
All use the unified CI pattern:
- `test` job: runs on all branches + PRs (no registry access)
- `build-push` job: runs on main push only (requires registry credentials)
## Troubleshooting
### "Registry secrets not configured" error
If CI fails with this error:
1. Check org settings: https://forgejo.riotpiao.com/rock/settings/actions/secrets
2. Verify both secrets exist and are not empty
3. Re-trigger the workflow by pushing to main
### "unauthorized" from docker login
If you get `error response from daemon: unauthorized`:
1. Check the token value is correct (copy-paste carefully)
2. Verify token has `read:registry` and `write:registry` scopes
3. Generate a new token if the old one expired