Author SHA1 Message Date
sharangandClaude Opus 4.8 fa87ae5a36 chore(ci): repoint registry/git/cargo meghsakha.com -> breakpilot.com
CI / Format (pull_request) Successful in 15s
CI / Clippy (pull_request) Successful in 2m14s
CI / Security Audit (pull_request) Skipped
CI / Tests (pull_request) Skipped
CI / E2E Tests (pull_request) Skipped
CI / Deploy (pull_request) Skipped
CI / Format (push) Successful in 3s
CI / Clippy (push) Successful in 2m12s
CI / Security Audit (push) Skipped
CI / Tests (push) Skipped
CI / E2E Tests (push) Skipped
CI / Deploy (push) Skipped
TLD migration (Phase-3 prep). CI now pushes/pulls against **breakpilot.com** instead of meghsakha.com:
- image registry `repo.meghsakha.com` -> `repo.breakpilot.com` (Harbor, same account)
- git host `gitea.meghsakha.com` -> `git.breakpilot.com` (clone/remote/release-API/insteadOf)
- cargo index `crates.meghsakha.com` -> `crates.breakpilot.com`

Dual-serve means this is a no-op today; it keeps CI working once meghsakha is retired.
Only `.gitea/workflows/*` and `Dockerfile*` touched.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-06 10:30:50 +02:00
sharang 406d5ec2f1 ci: fix cosign signing (install fallback, env-style login, portal sign step) (#44)
CI / Format (push) Successful in 3s
CI / Clippy (push) Successful in 2m9s
CI / Security Audit (push) Failing after 6s
CI / Tests (push) Skipped
CI / E2E Tests (push) Skipped
CI / Deploy (push) Skipped
2026-07-22 07:46:33 +00:00
sharang 6a1896dcb5 ci: push images to Harbor (repo.meghsakha.com) + cosign (#43)
CI / Clippy (push) Successful in 2m8s
CI / Format (push) Successful in 4s
CI / Security Audit (push) Failing after 7s
CI / Tests (push) Skipped
CI / E2E Tests (push) Skipped
CI / Deploy (push) Skipped
2026-07-21 12:07:56 +00:00
sharang dec283c1ca fix(dev): persist Keycloak across restarts (dev-file + named volume) (#42)
CI / Deploy (push) Has been skipped
CI / E2E Tests (push) Has been skipped
CI / Format (push) Successful in 4s
CI / Clippy (push) Successful in 2m12s
CI / Security Audit (push) Failing after 1m50s
CI / Tests (push) Has been skipped
2026-06-04 14:46:15 +00:00
sharang 8b8ec1fc9f feat(keycloak): add tenant-context client scope + M7.1 test users (#41)
CI / Format (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Security Audit (push) Has been cancelled
CI / Tests (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
CI / Deploy (push) Has been cancelled
2026-06-04 14:38:23 +00:00
3 changed files with 222 additions and 10 deletions
+13 -3
View File
@@ -9,6 +9,13 @@ on:
- main
env:
# registry + cosign creds via env, NOT inline ${{ }}: the Harbor robot
# username contains '$', which sh expands when interpolated into the
# script (robot$ci-push -> robot-push) => docker login unauthorized.
REGISTRY_USERNAME: ${{ secrets.REGISTRY_USERNAME }}
REGISTRY_PASSWORD: ${{ secrets.REGISTRY_PASSWORD }}
COSIGN_KEY: ${{ secrets.COSIGN_KEY }}
COSIGN_PASSWORD: ${{ secrets.COSIGN_PASSWORD }}
CARGO_TERM_COLOR: always
RUSTFLAGS: "-D warnings"
# sccache caches compilation artifacts within a job so that compiling
@@ -273,11 +280,14 @@ jobs:
git checkout FETCH_HEAD
- name: Build and push image
run: |
IMAGE=registry.meghsakha.com/certifai-dashboard
echo "${{ secrets.REGISTRY_PASSWORD }}" | \
docker login registry.meghsakha.com -u "${{ secrets.REGISTRY_USERNAME }}" --password-stdin
IMAGE=repo.breakpilot.com/certifai/certifai-dashboard
echo "$REGISTRY_PASSWORD" | \
docker login repo.breakpilot.com -u "$REGISTRY_USERNAME" --password-stdin
docker build -t "$IMAGE:latest" -t "$IMAGE:${GITHUB_SHA}" .
docker push "$IMAGE:latest"
{ command -v cosign >/dev/null 2>&1 || curl -sSfLo /usr/local/bin/cosign https://github.com/sigstore/cosign/releases/download/v2.4.3/cosign-linux-amd64 || wget -qO /usr/local/bin/cosign https://github.com/sigstore/cosign/releases/download/v2.4.3/cosign-linux-amd64; } || echo "::warning::cosign fetch failed"
chmod +x /usr/local/bin/cosign 2>/dev/null || true
cosign sign --yes --key env://COSIGN_KEY "$IMAGE:latest" || echo "::warning::cosign failed"
docker push "$IMAGE:${GITHUB_SHA}"
- name: Trigger orca redeploy
run: |
+7 -1
View File
@@ -5,7 +5,11 @@ services:
environment:
KC_BOOTSTRAP_ADMIN_USERNAME: admin
KC_BOOTSTRAP_ADMIN_PASSWORD: admin
KC_DB: dev-mem
# dev-file persists Keycloak's H2 DB under /opt/keycloak/data/h2/
# so the realm + test users survive container restarts. With the
# previous dev-mem the realm dissolved every time KC went idle,
# breaking local M7.1 smoke testing.
KC_DB: dev-file
KC_HEALTH_ENABLED: "true"
ports:
- "8080:8080"
@@ -15,6 +19,7 @@ services:
volumes:
- ./keycloak/realm-export.json:/opt/keycloak/data/import/realm-export.json:ro
- ./keycloak/themes/certifai:/opt/keycloak/themes/certifai:ro
- keycloak-data:/opt/keycloak/data/h2
healthcheck:
test: ["CMD-SHELL", "exec 3<>/dev/tcp/localhost/8080 && echo -e 'GET /realms/master HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n' >&3 && head -1 <&3 | grep -q '200 OK'"]
interval: 10s
@@ -256,3 +261,4 @@ volumes:
langfuse-db-data:
langfuse-clickhouse-data:
langfuse-clickhouse-logs:
keycloak-data:
+202 -6
View File
@@ -53,7 +53,7 @@
"description": "CERTifAI administration dashboard",
"enabled": true,
"publicClient": true,
"directAccessGrantsEnabled": false,
"directAccessGrantsEnabled": true,
"standardFlowEnabled": true,
"implicitFlowEnabled": false,
"serviceAccountsEnabled": false,
@@ -73,7 +73,8 @@
"defaultClientScopes": [
"openid",
"profile",
"email"
"email",
"tenant-context"
],
"optionalClientScopes": [
"offline_access"
@@ -106,7 +107,8 @@
"defaultClientScopes": [
"openid",
"profile",
"email"
"email",
"tenant-context"
],
"optionalClientScopes": [
"offline_access"
@@ -139,7 +141,8 @@
"defaultClientScopes": [
"openid",
"profile",
"email"
"email",
"tenant-context"
],
"optionalClientScopes": [
"offline_access"
@@ -269,6 +272,105 @@
}
}
]
},
{
"name": "tenant-context",
"description": "Breakpilot platform tenant + org claims (M7.1)",
"protocol": "openid-connect",
"attributes": {
"include.in.token.scope": "true",
"display.on.consent.screen": "false"
},
"protocolMappers": [
{
"name": "tenant_id",
"protocol": "openid-connect",
"protocolMapper": "oidc-usermodel-attribute-mapper",
"consentRequired": false,
"config": {
"user.attribute": "tenant_id",
"claim.name": "tenant_id",
"id.token.claim": "true",
"access.token.claim": "true",
"userinfo.token.claim": "true",
"jsonType.label": "String"
}
},
{
"name": "tenant_slug",
"protocol": "openid-connect",
"protocolMapper": "oidc-usermodel-attribute-mapper",
"consentRequired": false,
"config": {
"user.attribute": "tenant_slug",
"claim.name": "tenant_slug",
"id.token.claim": "true",
"access.token.claim": "true",
"userinfo.token.claim": "true",
"jsonType.label": "String"
}
},
{
"name": "tenant_status",
"protocol": "openid-connect",
"protocolMapper": "oidc-usermodel-attribute-mapper",
"consentRequired": false,
"config": {
"user.attribute": "tenant_status",
"claim.name": "tenant_status",
"id.token.claim": "true",
"access.token.claim": "true",
"userinfo.token.claim": "true",
"jsonType.label": "String"
}
},
{
"name": "plan",
"protocol": "openid-connect",
"protocolMapper": "oidc-usermodel-attribute-mapper",
"consentRequired": false,
"config": {
"user.attribute": "plan",
"claim.name": "plan",
"id.token.claim": "true",
"access.token.claim": "true",
"userinfo.token.claim": "true",
"jsonType.label": "String"
}
},
{
"name": "org_roles",
"protocol": "openid-connect",
"protocolMapper": "oidc-usermodel-attribute-mapper",
"consentRequired": false,
"config": {
"user.attribute": "org_roles",
"claim.name": "org_roles",
"id.token.claim": "true",
"access.token.claim": "true",
"userinfo.token.claim": "true",
"jsonType.label": "String",
"multivalued": "true",
"aggregate.attrs": "true"
}
},
{
"name": "products",
"protocol": "openid-connect",
"protocolMapper": "oidc-usermodel-attribute-mapper",
"consentRequired": false,
"config": {
"user.attribute": "products",
"claim.name": "products",
"id.token.claim": "true",
"access.token.claim": "true",
"userinfo.token.claim": "true",
"jsonType.label": "String",
"multivalued": "true",
"aggregate.attrs": "true"
}
}
]
}
],
"users": [
@@ -289,7 +391,15 @@
"realmRoles": [
"admin",
"user"
]
],
"attributes": {
"tenant_id": ["00000000-0000-0000-0000-000000000001"],
"tenant_slug": ["acme"],
"tenant_status": ["active"],
"plan": ["professional"],
"org_roles": ["IT_ADMIN", "CXO"],
"products": ["compliance", "certifai"]
}
},
{
"username": "user@certifai.local",
@@ -307,7 +417,93 @@
],
"realmRoles": [
"user"
]
],
"attributes": {
"tenant_id": ["00000000-0000-0000-0000-000000000001"],
"tenant_slug": ["acme"],
"tenant_status": ["active"],
"plan": ["professional"],
"org_roles": ["USER"],
"products": ["compliance"]
}
},
{
"username": "frozen@acme.local",
"email": "frozen@acme.local",
"firstName": "Frozen",
"lastName": "Tenant",
"enabled": true,
"emailVerified": true,
"credentials": [
{
"type": "password",
"value": "frozen",
"temporary": false
}
],
"realmRoles": [
"user"
],
"attributes": {
"tenant_id": ["00000000-0000-0000-0000-000000000002"],
"tenant_slug": ["frozenco"],
"tenant_status": ["frozen"],
"plan": ["starter"],
"org_roles": ["IT_ADMIN"],
"products": ["compliance"]
}
},
{
"username": "archived@acme.local",
"email": "archived@acme.local",
"firstName": "Archived",
"lastName": "Tenant",
"enabled": true,
"emailVerified": true,
"credentials": [
{
"type": "password",
"value": "archived",
"temporary": false
}
],
"realmRoles": [
"user"
],
"attributes": {
"tenant_id": ["00000000-0000-0000-0000-000000000003"],
"tenant_slug": ["archiveco"],
"tenant_status": ["archived"],
"plan": ["starter"],
"org_roles": ["IT_ADMIN"],
"products": ["compliance"]
}
},
{
"username": "trial@acme.local",
"email": "trial@acme.local",
"firstName": "Trial",
"lastName": "Tenant",
"enabled": true,
"emailVerified": true,
"credentials": [
{
"type": "password",
"value": "trial",
"temporary": false
}
],
"realmRoles": [
"user"
],
"attributes": {
"tenant_id": ["00000000-0000-0000-0000-000000000004"],
"tenant_slug": ["trialco"],
"tenant_status": ["trial"],
"plan": ["starter"],
"org_roles": ["IT_ADMIN"],
"products": ["compliance"]
}
}
]
}