From 03c0e44e4200aa3c550228c7555195f07ccf8768 Mon Sep 17 00:00:00 2001 From: Georgi Manchev Date: Tue, 29 Sep 2026 00:40:39 +0300 Subject: [PATCH] Add Hiyv nginx image and release pipeline --- .dockerignore | 3 ++ .gitea/workflows/publish.yml | 66 +++++++++++++++++++++++++++++++++++ Dockerfile | 21 +++++++++++ README.md | 44 +++++++++++++++++++++++ nginx/default.conf | 18 ++++++++++ web/hiyv-cover.jpg | Bin 0 -> 9383 bytes web/index.html.template | 43 +++++++++++++++++++++++ 7 files changed, 195 insertions(+) create mode 100644 .dockerignore create mode 100644 .gitea/workflows/publish.yml create mode 100644 Dockerfile create mode 100644 nginx/default.conf create mode 100644 web/hiyv-cover.jpg create mode 100644 web/index.html.template diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..8e1fd93 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,3 @@ +.git +.gitea +README.md diff --git a/.gitea/workflows/publish.yml b/.gitea/workflows/publish.yml new file mode 100644 index 0000000..61c5d44 --- /dev/null +++ b/.gitea/workflows/publish.yml @@ -0,0 +1,66 @@ +name: Publish container image + +on: + push: + tags: + - "v*.*.*" + +env: + REGISTRY: git.mancheff.com + IMAGE_NAME: hiyv-demo/hiyv-nginx + +jobs: + publish: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + steps: + - name: Check out source + uses: actions/checkout@v4 + + - name: Derive image tags + id: tags + shell: bash + run: | + version="${GITHUB_REF_NAME#v}" + if [[ ! "${version}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "Tag ${GITHUB_REF_NAME} is not a semantic version (vMAJOR.MINOR.PATCH)." >&2 + exit 1 + fi + major_minor="${version%.*}" + major="${version%%.*}" + image="${REGISTRY}/${IMAGE_NAME}" + { + echo "version=${version}" + echo "image=${image}" + echo "tags=${image}:${version},${image}:${major_minor},${image}:${major},${image}:${GITHUB_SHA},${image}:latest" + } >> "${GITHUB_OUTPUT}" + + - name: Log in to the Gitea registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ secrets.REGISTRY_USERNAME }} + password: ${{ secrets.REGISTRY_TOKEN }} + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build and publish + uses: docker/build-push-action@v6 + with: + context: . + push: true + build-args: | + COMMIT_ID=${{ github.sha }} + tags: ${{ steps.tags.outputs.tags }} + labels: | + org.opencontainers.image.version=${{ steps.tags.outputs.version }} + org.opencontainers.image.revision=${{ github.sha }} + org.opencontainers.image.source=${{ github.server_url }}/${{ github.repository }} + platforms: linux/amd64,linux/arm64 diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..b6fc41b --- /dev/null +++ b/Dockerfile @@ -0,0 +1,21 @@ +FROM nginx:1.28-alpine + +ARG COMMIT_ID=unknown + +LABEL org.opencontainers.image.title="Hiyv nginx" \ + org.opencontainers.image.description="Hiyv-branded base nginx image" \ + org.opencontainers.image.revision="${COMMIT_ID}" \ + org.opencontainers.image.source="https://git.mancheff.com/hiyv-demo/hiyv-nginx" + +COPY nginx/default.conf /etc/nginx/conf.d/default.conf +COPY web/ /usr/share/nginx/html/ + +RUN sed "s|@@COMMIT_ID@@|${COMMIT_ID}|g" \ + /usr/share/nginx/html/index.html.template \ + > /usr/share/nginx/html/index.html \ + && rm /usr/share/nginx/html/index.html.template + +EXPOSE 80 + +HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ + CMD wget -qO- http://127.0.0.1/healthz || exit 1 diff --git a/README.md b/README.md index e69de29..fc896db 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,44 @@ +# Hiyv nginx + +A small, Hiyv-branded nginx base image. The landing page displays the exact +Git commit used to build the published container. + +## Run it + +```sh +docker run --rm -p 8080:80 git.mancheff.com/hiyv-demo/hiyv-nginx:1.0.0 +``` + +Open . The health endpoint is available at +. + +## Publish a version + +Publishing is driven by semantic-version Git tags: + +```sh +git tag v1.0.0 +git push origin main v1.0.0 +``` + +The Gitea Actions workflow publishes the following tags for `v1.2.3`: + +- `1.2.3` +- `1.2` +- `1` +- the full Git commit SHA +- `latest` + +The workflow publishes multi-platform images for `linux/amd64` and +`linux/arm64` to `git.mancheff.com/hiyv-demo/hiyv-nginx`. + +The repository must define two Actions secrets: `REGISTRY_USERNAME` with the +Gitea username and `REGISTRY_TOKEN` with a personal access token that has +package write access. Gitea's automatic job token cannot currently publish OCI +packages. + +## Build locally + +```sh +docker build --build-arg COMMIT_ID="$(git rev-parse HEAD)" -t hiyv-nginx:local . +``` diff --git a/nginx/default.conf b/nginx/default.conf new file mode 100644 index 0000000..8f5097b --- /dev/null +++ b/nginx/default.conf @@ -0,0 +1,18 @@ +server { + listen 80; + listen [::]:80; + server_name _; + + root /usr/share/nginx/html; + index index.html; + + location = /healthz { + access_log off; + default_type text/plain; + return 200 "ok\n"; + } + + location / { + try_files $uri $uri/ =404; + } +} diff --git a/web/hiyv-cover.jpg b/web/hiyv-cover.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a44dbc1b3e7891a9634306ae21e2848bba85c7a4 GIT binary patch literal 9383 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 literal 0 HcmV?d00001 diff --git a/web/index.html.template b/web/index.html.template new file mode 100644 index 0000000..09ba9ac --- /dev/null +++ b/web/index.html.template @@ -0,0 +1,43 @@ + + + + + + Hiyv nginx + + + +
+ Hiyv — Elevating Enterprise Scale +

COMMIT  @@COMMIT_ID@@

+
+ +