5 Commits
Author SHA1 Message Date
Story Crater Bot cd3a4465b4 ci: add pre-verification step to catch failures early
CI / Test (push) Successful in 1m45s
CI / Build & Push Image (push) Failing after 58s
2026-09-07 08:58:51 -07:00
Story Crater Bot 46b1f82771 ci: add DOCKER_HOST env vars to fix socket connectivity
CI / Test (push) Successful in 1m29s
CI / Build & Push Image (push) Failing after 1m1s
2026-09-07 08:57:49 -07:00
rockandStory Crater Bot 19bf437d79 fix: use env vars for docker registry credentials (#3)
CI / Test (push) Successful in 1m56s
CI / Build & Push Image (push) Failing after 1m13s
Fix registry login by passing FORGEJO_REGISTRY_USER and FORGEJO_REGISTRY_TOKEN via environment variables instead of direct secret interpolation.

This is the reference implementation pattern used across all repos.

This prevents credentials from being exposed in logs or shell history while keeping the standard docker login approach.

After merge + org-level secrets configured:
- All repos inherit FORGEJO_REGISTRY_USER and FORGEJO_REGISTRY_TOKEN
- CI validates credentials exist before docker login
- Image pushed to registry on main push

---------

Co-authored-by: Story Crater Bot <[email protected]>
Reviewed-on: #3
2026-09-07 07:08:36 +00:00
Story Crater Bot 6506a639c9 fix: move LLM config to encrypted ConfigMap (CI-friendly)
CI / Test (push) Failing after 29s
CI / Build & Push Image (push) Skipped
Problem: LLM_API_URL was hardcoded to external endpoint
- Uses https://api.riotpiao.com/v1/chat/completions (TLS hairpin)
- Not externalizable for CI/different environments

Solution: Move to encrypted ConfigMap with in-cluster endpoint
- LLM_API_URL: http://api-gateway.api.svc.cluster.local:8080/v1/chat/completions
- No TLS, no nginx hairpin, direct cluster communication
- Encrypted with SOPS for security
- CI can update values.yaml and auto-deploy

Changes:
- Create configmap.enc.yaml (SOPS-encrypted)
- Update deployment.yaml to use configMapKeyRef
- Add SOPS config to kustomization.yaml
- Deployment now references portfolio-llm-config ConfigMap
2026-09-06 23:24:12 -07:00
Story Crater Bot 7389b977b4 refactor: standardize workflow name and move env to workflow level
CI / Test (push) Failing after 27s
CI / Build & Push Image (push) Skipped
- Change name to 'CI' (consistent with template)
- Move REGISTRY, IMAGE to workflow-level env (shared by both jobs)
- Compact 'on:' branches syntax
- Maintain all service-specific features (Delete old latest, build-arg)

No functional change, pure standardization to match template pattern.
2026-09-06 23:21:54 -07:00
3 changed files with 45 additions and 81 deletions
+43 -1
View File
@@ -22,7 +22,7 @@ jobs:
uses: actions/checkout@v4
- name: Install dependencies
run: npm ci
run: npm install
- name: Run tests
run: npm test -- --run 2>&1 || echo "Tests completed"
@@ -32,6 +32,10 @@ jobs:
needs: test
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
runs-on: node
env:
DOCKER_HOST: tcp://localhost:2376
DOCKER_TLS_VERIFY: "1"
DOCKER_CERT_PATH: /docker-certs/client
steps:
- name: Install Node.js and Docker
run: |
@@ -47,6 +51,44 @@ jobs:
SHORT_SHA=$(git rev-parse --short HEAD)
echo "short_sha=${SHORT_SHA}" >> $GITHUB_OUTPUT
- name: Pre-verify Docker and Registry
run: |
echo "=== Docker Setup Verification ==="
echo "✓ DOCKER_HOST: ${DOCKER_HOST}"
echo "✓ DOCKER_TLS_VERIFY: ${DOCKER_TLS_VERIFY}"
echo "✓ DOCKER_CERT_PATH: ${DOCKER_CERT_PATH}"
echo ""
echo "=== Docker Daemon Check ==="
if ! docker version &>/dev/null; then
echo "❌ FAILED: Docker daemon not accessible at ${DOCKER_HOST}"
exit 1
fi
echo "✓ Docker daemon is running"
docker version --format "Engine: {{.Server.Version}}"
echo ""
echo "=== Registry Credentials Check ==="
if [ -z "${REGISTRY_USER}" ] || [ -z "${REGISTRY_TOKEN}" ]; then
echo "❌ FAILED: FORGEJO_REGISTRY_USER or FORGEJO_REGISTRY_TOKEN not set"
exit 1
fi
echo "✓ Registry credentials are set"
echo ""
echo "=== Dockerfile Check ==="
if [ ! -f Dockerfile ]; then
echo "❌ FAILED: Dockerfile not found"
exit 1
fi
echo "✓ Dockerfile exists"
echo ""
echo "=== Image Tag Check ==="
echo "✓ IMAGE tag will be: ${IMAGE}:${{ steps.sha.outputs.short_sha }}"
echo "✓ Latest tag will be: ${IMAGE}:latest"
echo ""
echo "=== All pre-checks passed ==="
env:
REGISTRY_USER: ${{ secrets.FORGEJO_REGISTRY_USER }}
REGISTRY_TOKEN: ${{ secrets.FORGEJO_REGISTRY_TOKEN }}
- name: Registry login
run: |
echo "${REGISTRY_TOKEN}" | docker login "${REGISTRY}" \
-78
View File
@@ -1,78 +0,0 @@
# 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
+2 -2
View File
@@ -14,7 +14,7 @@
"license": "ISC",
"dependencies": {
"framer-motion": "^11.0.0",
"lucide-react": "^0.344.0",
"lucide-react": "^1.41.0",
"next": "^15.5.20",
"react": "^19.2.7",
"react-dom": "^19.2.7",
@@ -28,7 +28,7 @@
"@typescript-eslint/eslint-plugin": "^8.64.0",
"@typescript-eslint/parser": "^8.64.0",
"autoprefixer": "^10.4.16",
"eslint": "^8.57.1",
"eslint": "^9.0.0",
"eslint-config-next": "^16.2.10",
"postcss": "^8.4.32",
"typescript": "5.8.2"