|
| 1 | +--- |
| 2 | +type: Reference |
| 3 | +title: CI/CD and Release Process |
| 4 | +description: GitHub Actions workflow for building and publishing multi-arch Docker images to Docker Hub and GHCR, including release steps, secrets, and OpenWiki automation. |
| 5 | +tags: [ci-cd, github-actions, docker, release, openwiki] |
| 6 | +--- |
| 7 | + |
| 8 | +# CI/CD and Release Process |
| 9 | + |
| 10 | +## Image deployment workflow |
| 11 | + |
| 12 | +[`.github/workflows/deploy-image.yml`](/.github/workflows/deploy-image.yml) builds and publishes multi-arch Docker images automatically when any git tag is pushed. |
| 13 | + |
| 14 | +### Trigger |
| 15 | + |
| 16 | +```yaml |
| 17 | +on: |
| 18 | + push: |
| 19 | + tags: |
| 20 | + - "*" |
| 21 | +``` |
| 22 | +
|
| 23 | +Pushing **any** tag triggers the build. There is no branch filter — the tag itself determines the image tag name. |
| 24 | +
|
| 25 | +### Build pipeline |
| 26 | +
|
| 27 | +```mermaid |
| 28 | +sequenceDiagram |
| 29 | + participant Dev as Developer |
| 30 | + participant GH as GitHub Actions |
| 31 | + participant Buildx as Docker Buildx (QEMU) |
| 32 | + participant Hub as Docker Hub |
| 33 | + participant GHCR as ghcr.io |
| 34 | + |
| 35 | + Dev->>GH: push tag (e.g. 25-graalce) |
| 36 | + GH->>GH: checkout, setup QEMU + Buildx |
| 37 | + GH->>Hub: login (DOCKER_USER / DOCKER_TOKEN) |
| 38 | + GH->>GHCR: login (GITHUB_TOKEN) |
| 39 | + GH->>Buildx: build linux/amd64 + linux/arm64 |
| 40 | + Buildx->>Hub: push :latest + :<tag> |
| 41 | + Buildx->>GHCR: push :latest + :<tag> |
| 42 | +``` |
| 43 | +
|
| 44 | +### Output |
| 45 | +
|
| 46 | +Each build pushes to **both** registries with two tags: |
| 47 | +
|
| 48 | +| Tag pattern | Example | |
| 49 | +|-------------|---------| |
| 50 | +| `latest` | `softinstigate/graalvm-maven:latest` | |
| 51 | +| `<git-tag>` | `softinstigate/graalvm-maven:25-graalce` | |
| 52 | + |
| 53 | +### Required secrets |
| 54 | + |
| 55 | +| Secret | Used by | Purpose | |
| 56 | +|--------|---------|---------| |
| 57 | +| `DOCKER_USER` | Docker Hub login | Hub username | |
| 58 | +| `DOCKER_TOKEN` | Docker Hub login | Hub access token | |
| 59 | +| `GITHUB_TOKEN` | GHCR login | Automatic — no manual setup needed | |
| 60 | + |
| 61 | +## Release process (maintainer steps) |
| 62 | + |
| 63 | +1. Update `ARG JAVA_VERSION` and `ARG MAVEN_VERSION` in [`Dockerfile`](/Dockerfile). |
| 64 | +2. Update the version table in [`README.md`](/README.md) to match. |
| 65 | +3. Commit and push to `main`. |
| 66 | +4. Create and push a git tag matching the GraalVM version (e.g. `25-graalce`): |
| 67 | + ```bash |
| 68 | + git tag 25-graalce |
| 69 | + git push origin 25-graalce |
| 70 | + ``` |
| 71 | +5. GitHub Actions builds and publishes the image automatically. |
| 72 | + |
| 73 | +## OpenWiki automation |
| 74 | + |
| 75 | +[`.github/workflows/openwiki-update.yml`](/.github/workflows/openwiki-update.yml) runs a scheduled OpenWiki documentation refresh: |
| 76 | + |
| 77 | +- **Schedule:** daily at 08:00 UTC (`cron: "0 8 * * *"`) |
| 78 | +- **Trigger:** also available via `workflow_dispatch` |
| 79 | +- **Process:** checks out the repo, installs OpenWiki globally, runs `openwiki code --update --print`, then opens a PR on the `openwiki/update` branch with any documentation changes. |
| 80 | +- **PR scope:** changes under `openwiki/`, `AGENTS.md`, `CLAUDE.md`, and the workflow file itself. |
| 81 | + |
| 82 | +The workflow uses OpenRouter as the LLM provider (configured via `OPENROUTER_API_KEY` secret). |
| 83 | + |
| 84 | +## Relationship to Dockerfile |
| 85 | + |
| 86 | +The CI workflow consumes the Dockerfile as-is — it does not override `ARG` values at build time. This means the version `ARG`s in the Dockerfile are the sole source of truth for what gets installed in the published image. |
0 commit comments