ci: route trusted Docker gates through isolated DinD
GeoIntel release gates / Trusted workflow source (pull_request) Canceled after 0s
GeoIntel release gates / Compile, test, contracts and builds (pull_request) Canceled after 0s
GeoIntel release gates / Python and npm vulnerability policy (pull_request) Canceled after 0s
GeoIntel release gates / GIS image, SBOM and container scan (pull_request) Canceled after 0s
GeoIntel release gates / AI image, SBOM and container scan (pull_request) Canceled after 0s

This commit is contained in:
ChatGPT MCP
2026-08-28 18:06:23 +00:00
parent 19726239ac
commit 4235da63ea
2 changed files with 60 additions and 48 deletions
+60 -1
View File
@@ -15,8 +15,31 @@ concurrency:
cancel-in-progress: true
jobs:
source-trust:
name: Trusted workflow source
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- name: Accept trusted push and manual runs
if: ${{ gitea.event_name != 'pull_request' }}
run: echo "Trusted non-PR workflow source."
- name: Require a same-repository pull request
if: ${{ gitea.event_name == 'pull_request' }}
env:
HEAD_REPOSITORY: ${{ gitea.event.pull_request.head.repo.full_name }}
TARGET_REPOSITORY: ${{ gitea.repository }}
run: |
set -euo pipefail
test -n "$HEAD_REPOSITORY"
if [ "$HEAD_REPOSITORY" != "$TARGET_REPOSITORY" ]; then
echo "Docker-capable release validation refuses forked pull requests." >&2
exit 1
fi
echo "Trusted same-repository pull request."
quality:
name: Compile, test, contracts and builds
needs: source-trust
runs-on: ubuntu-latest
timeout-minutes: 45
steps:
@@ -24,7 +47,12 @@ jobs:
with:
persist-credentials: false
- name: Verified secret scan
run: bash scripts/scan_secrets.sh
env:
DOCKER_HOST: tcp://gitea-runner-dind:2375
DOCKER_TLS_CERTDIR: ""
run: |
docker info >/dev/null
bash scripts/scan_secrets.sh
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065
with:
python-version: "3.11"
@@ -68,6 +96,7 @@ jobs:
dependency-audit:
name: Python and npm vulnerability policy
needs: source-trust
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
@@ -114,6 +143,7 @@ jobs:
container-gis:
name: GIS image, SBOM and container scan
needs: source-trust
runs-on: ubuntu-latest
timeout-minutes: 60
steps:
@@ -123,7 +153,10 @@ jobs:
- name: Build GIS release image
env:
RELEASE_SHA: ${{ gitea.sha }}
DOCKER_HOST: tcp://gitea-runner-dind:2375
DOCKER_TLS_CERTDIR: ""
run: |
docker info >/dev/null
mkdir -p artifacts
BUILD_TIME="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
docker build \
@@ -137,11 +170,22 @@ jobs:
- name: Generate GIS SPDX SBOM
env:
RELEASE_SHA: ${{ gitea.sha }}
DOCKER_HOST: tcp://gitea-runner-dind:2375
DOCKER_TLS_CERTDIR: ""
run: bash scripts/generate_container_sbom.sh "geointel-ci:$RELEASE_SHA-gis"
- name: Enforce GIS container vulnerability policy
env:
RELEASE_SHA: ${{ gitea.sha }}
DOCKER_HOST: tcp://gitea-runner-dind:2375
DOCKER_TLS_CERTDIR: ""
run: bash scripts/scan_container_image.sh "geointel-ci:$RELEASE_SHA-gis"
- name: Cleanup GIS CI image
if: always()
env:
RELEASE_SHA: ${{ gitea.sha }}
DOCKER_HOST: tcp://gitea-runner-dind:2375
DOCKER_TLS_CERTDIR: ""
run: docker image rm -f "geointel-ci:$RELEASE_SHA-gis" >/dev/null 2>&1 || true
- name: Publish GIS container evidence
if: always()
uses: actions/upload-artifact@c6a3b2bd78b3985e4b2f15397fec357f0fd808de
@@ -156,6 +200,7 @@ jobs:
container-ai:
name: AI image, SBOM and container scan
needs: source-trust
if: ${{ gitea.event_name == 'pull_request' || gitea.ref == 'refs/heads/main' || gitea.event_name == 'workflow_dispatch' }}
runs-on: ubuntu-latest
timeout-minutes: 90
@@ -166,7 +211,10 @@ jobs:
- name: Build AI release image
env:
RELEASE_SHA: ${{ gitea.sha }}
DOCKER_HOST: tcp://gitea-runner-dind:2375
DOCKER_TLS_CERTDIR: ""
run: |
docker info >/dev/null
mkdir -p artifacts
BUILD_TIME="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
docker build \
@@ -180,11 +228,22 @@ jobs:
- name: Generate AI SPDX SBOM
env:
RELEASE_SHA: ${{ gitea.sha }}
DOCKER_HOST: tcp://gitea-runner-dind:2375
DOCKER_TLS_CERTDIR: ""
run: bash scripts/generate_container_sbom.sh "geointel-ci:$RELEASE_SHA-ai"
- name: Enforce AI container vulnerability policy
env:
RELEASE_SHA: ${{ gitea.sha }}
DOCKER_HOST: tcp://gitea-runner-dind:2375
DOCKER_TLS_CERTDIR: ""
run: bash scripts/scan_container_image.sh "geointel-ci:$RELEASE_SHA-ai"
- name: Cleanup AI CI image
if: always()
env:
RELEASE_SHA: ${{ gitea.sha }}
DOCKER_HOST: tcp://gitea-runner-dind:2375
DOCKER_TLS_CERTDIR: ""
run: docker image rm -f "geointel-ci:$RELEASE_SHA-ai" >/dev/null 2>&1 || true
- name: Publish AI container evidence
if: always()
uses: actions/upload-artifact@c6a3b2bd78b3985e4b2f15397fec357f0fd808de
@@ -1,47 +0,0 @@
name: Runner Docker diagnostic
on:
push:
branches:
- chatgpt/geointel-hardening-20260826
permissions:
contents: read
jobs:
diagnostic:
runs-on: ubuntu-latest
timeout-minutes: 10
env:
DOCKER_HOST: tcp://gitea-runner-dind:2375
DOCKER_TLS_CERTDIR: ""
steps:
- name: Verify isolated shared runner daemon
shell: bash
run: |
set -euo pipefail
docker info >/tmp/docker-info.txt
docker version
mapfile -t visible_names < <(docker ps -a --format '{{.Names}}')
echo "visible-container-count=${#visible_names[@]}"
for name in "${visible_names[@]}"; do
case "$name" in
GITEA-ACTIONS-TASK-*) ;;
*)
echo "Unexpected non-Actions container visible: $name" >&2
exit 1
;;
esac
done
workdir="$(mktemp -d)"
printf 'geo-intel-ci\n' > "${workdir}/proof.txt"
cat > "${workdir}/Dockerfile" <<'EOF'
FROM scratch
COPY proof.txt /proof.txt
EOF
tag="geointel-runner-diagnostic:${GITHUB_RUN_ID:-local}-${GITHUB_RUN_ATTEMPT:-1}"
docker build --pull=false -t "$tag" "${workdir}"
docker image inspect "$tag" --format '{{.Id}}'
docker image rm "$tag" >/dev/null