Author SHA1 Message Date
Admin Bot 8ab60b6d6d fix: use env vars for docker registry credentials
CI / Test (pull_request) Successful in 1m46s
CI / Build & Push Image (pull_request) Skipped
2026-09-06 23:37:54 -07:00
Admin Bot 152e4259ae 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:34:58 -07:00
Admin Bot 5c30fd4fb7 fix: standardize CI workflow to unified pattern
CI / Test (pull_request) Successful in 3m23s
CI / Build & Push Image (pull_request) Skipped
Reference: riotpiao.com action run 496/707

Unified structure:
- test job: all branches + PRs
- build-push job: main push only, depends on test
- Install Node.js before checkout
- Install docker only in build-push
- Proper secrets and env handling
- Docker login + build + push + prune
2026-09-06 23:18:44 -07:00
2 changed files with 103 additions and 33 deletions
+25 -33
View File
@@ -1,5 +1,3 @@
# Single pipeline: verify → build → push.
# One workflow per push, one concurrency group per branch.
name: CI name: CI
on: on:
@@ -8,46 +6,40 @@ on:
pull_request: pull_request:
branches: [main] branches: [main]
concurrency:
group: ci-${{ github.ref }}
cancel-in-progress: true
env: env:
REGISTRY: forgejo.riotpiao.com REGISTRY: forgejo.riotpiao.com
IMAGE: forgejo.riotpiao.com/rock/api-gateway IMAGE: forgejo.riotpiao.com/rock/homelab-frontend
jobs: jobs:
verify: test:
name: Vet, test, build name: Test
runs-on: golang runs-on: golang
steps: steps:
- name: Install Node.js for actions runtime - name: Install Node.js for actions runtime
run: apt-get update && apt-get install -y nodejs run: apt-get update && apt-get install -y nodejs
- uses: actions/checkout@v4 - name: Checkout code
uses: actions/checkout@v4
- name: go vet - name: Go vet
run: go vet ./... run: go vet ./...
- name: go test -race - name: Go test
run: go test ./... -race run: go test ./...
- name: Static build (smoke) build-push:
run: CGO_ENABLED=0 go build -trimpath -o gateway ./cmd/gateway name: Build & Push Image
needs: test
push: if: github.event_name == 'push' && github.ref == 'refs/heads/main'
name: Build and push image
needs: verify
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
runs-on: golang runs-on: golang
steps: steps:
- name: Install Docker CLI and Node.js - name: Install Node.js and Docker
run: | run: |
apt-get update apt-get update
apt-get install -y --no-install-recommends docker.io nodejs git apt-get install -y nodejs docker.io
rm -rf /var/lib/apt/lists/*
- uses: actions/checkout@v4 - name: Checkout code
uses: actions/checkout@v4
- name: Get short SHA - name: Get short SHA
id: sha id: sha
@@ -57,25 +49,25 @@ jobs:
- name: Registry login - name: Registry login
run: | run: |
echo "${REGISTRY_PAT}" | docker login "${REGISTRY}" \ echo "${REGISTRY_TOKEN}" | docker login "${REGISTRY}" \
--username rock --password-stdin --username "${REGISTRY_USER}" --password-stdin
env: env:
REGISTRY_PAT: ${{ secrets.REGISTRY_PAT }} REGISTRY_USER: ${{ secrets.FORGEJO_REGISTRY_USER }}
REGISTRY_TOKEN: ${{ secrets.FORGEJO_REGISTRY_TOKEN }}
- name: Build image - name: Build Docker image
run: | run: |
docker build \ docker build --no-cache \
--build-arg "VERSION=${{ steps.sha.outputs.short_sha }}" \
-t "${IMAGE}:${{ steps.sha.outputs.short_sha }}" \ -t "${IMAGE}:${{ steps.sha.outputs.short_sha }}" \
-t "${IMAGE}:latest" \ -t "${IMAGE}:latest" \
-f Dockerfile \
. .
- name: Push image - name: Push Docker image
run: | run: |
docker push "${IMAGE}:${{ steps.sha.outputs.short_sha }}" docker push "${IMAGE}:${{ steps.sha.outputs.short_sha }}"
docker push "${IMAGE}:latest" docker push "${IMAGE}:latest"
echo "✓ Image pushed: ${IMAGE}:${{ steps.sha.outputs.short_sha }}" echo "✓ Image pushed: ${IMAGE}:${{ steps.sha.outputs.short_sha }}"
- name: Prune unused images - name: Prune unused images
run: | run: docker image prune -a --force 2>&1 | tail -3 || true
docker image prune -a --force 2>&1 | tail -3 || true
+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