DevHire Cloud publishes immutable service images from the protected release workflow. GHCR is the canonical registry because it links packages back to this repository through OCI labels. Docker Hub is supported as a public mirror when repository secrets are configured.
| Service | GHCR image | Docker Hub mirror |
|---|---|---|
| api-gateway | ghcr.io/jasontm17/devhire/api-gateway:<tag> |
docker.io/nguyenson1710/devhire-cloud-api-gateway:<tag> |
| auth-service | ghcr.io/jasontm17/devhire/auth-service:<tag> |
docker.io/nguyenson1710/devhire-cloud-auth-service:<tag> |
| user-service | ghcr.io/jasontm17/devhire/user-service:<tag> |
docker.io/nguyenson1710/devhire-cloud-user-service:<tag> |
| company-service | ghcr.io/jasontm17/devhire/company-service:<tag> |
docker.io/nguyenson1710/devhire-cloud-company-service:<tag> |
| job-service | ghcr.io/jasontm17/devhire/job-service:<tag> |
docker.io/nguyenson1710/devhire-cloud-job-service:<tag> |
| application-service | ghcr.io/jasontm17/devhire/application-service:<tag> |
docker.io/nguyenson1710/devhire-cloud-application-service:<tag> |
| notification-service | ghcr.io/jasontm17/devhire/notification-service:<tag> |
docker.io/nguyenson1710/devhire-cloud-notification-service:<tag> |
| audit-service | ghcr.io/jasontm17/devhire/audit-service:<tag> |
docker.io/nguyenson1710/devhire-cloud-audit-service:<tag> |
| ai-service | ghcr.io/jasontm17/devhire/ai-service:<tag> |
docker.io/nguyenson1710/devhire-cloud-ai-service:<tag> |
| assessment-runner-service | ghcr.io/jasontm17/devhire/assessment-runner-service:<tag> |
docker.io/nguyenson1710/devhire-cloud-assessment-runner-service:<tag> |
| frontend | ghcr.io/jasontm17/devhire/frontend:<tag> |
docker.io/nguyenson1710/devhire-cloud-frontend:<tag> |
Use release tags or commit SHAs. Do not deploy latest; it is intentionally not published.
Each image carries OCI labels for:
- source repository;
- exact Git revision;
- release/manual image tag;
- creation timestamp;
- documentation URL;
- title, description, vendor, author, and license.
The release workflow also requests BuildKit provenance and SBOM output for every published image. This makes GHCR package pages readable and lets reviewers trace each image back to source and CI evidence.
Release tags publish GHCR images automatically:
git tag v0.6.0
git push origin v0.6.0Manual publish uses the same workflow without creating a GitHub Release:
gh workflow run release.yml --ref master -f image_tag=v0.6.0-previewDocker Hub mirroring is skipped unless these repository secrets exist:
gh secret set DOCKERHUB_USERNAME --repo JasonTM17/DevHire_Cloud_Spring_Microservices
gh secret set DOCKERHUB_TOKEN --repo JasonTM17/DevHire_Cloud_Spring_Microservices
gh variable set DOCKERHUB_NAMESPACE --body nguyenson1710 --repo JasonTM17/DevHire_Cloud_Spring_MicroservicesIf DOCKERHUB_NAMESPACE is omitted, the workflow uses DOCKERHUB_USERNAME as the namespace.
The current release images are mirrored through Docker Desktop and/or the release workflow under the nguyenson1710 Docker Hub account. Each service has the release tag:
v0.6.0
docker pull ghcr.io/jasontm17/devhire/api-gateway:v0.6.0
docker pull ghcr.io/jasontm17/devhire/frontend:v0.6.0Docker Hub mirror examples:
docker pull docker.io/nguyenson1710/devhire-cloud-api-gateway:v0.6.0
docker pull docker.io/nguyenson1710/devhire-cloud-frontend:v0.6.0Verify the complete Docker Hub mirror set:
.\scripts\dockerhub-image-verify.ps1 -Tags v0.6.0Use the production compose sample with Docker Hub mirror names:
$env:IMAGE_TAG = "v0.6.0"
$env:DEVHIRE_RUNNER_MODE = "judge0"
$env:JUDGE0_BASE_URL = "https://judge0.example.internal"
docker compose -f deploy/docker-compose.prod.yml -f deploy/docker-compose.dockerhub.yml config --quiet
.\scripts\code-assessment-smoke.ps1 -GatewayUrl http://localhost:8080Production compose and Kubernetes profiles must keep DEVHIRE_RUNNER_MODE=judge0 and require JUDGE0_BASE_URL; local deterministic mode is preview-only and should not be used for trusted candidate scoring.
For assessment-specific verification after deployment, run the code assessment runner runbook smoke sequence: Gateway workflow smoke first, then live Judge0 smoke when the sandbox is reachable.
After the first GHCR publish, package visibility may still need an owner review in GitHub Packages settings if the account defaults packages to private.