From d66d52bc65ba735593c22619bedb1ab1ef4de489 Mon Sep 17 00:00:00 2001 From: "MS.Kondratev" Date: Wed, 15 Jul 2026 14:52:16 +0500 Subject: [PATCH] ci: publish Docker image and create release --- .gitea/workflows/docker-image.yml | 72 +++++++++++++++++++++++++++++++ README.md | 27 ++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 .gitea/workflows/docker-image.yml diff --git a/.gitea/workflows/docker-image.yml b/.gitea/workflows/docker-image.yml new file mode 100644 index 0000000..0639712 --- /dev/null +++ b/.gitea/workflows/docker-image.yml @@ -0,0 +1,72 @@ +name: Build and publish Docker image + +on: + push: + branches: + - main + +permissions: + contents: read + packages: write + releases: write + +env: + REGISTRY: git.spyk3r.com + IMAGE_NAME: spyk3r/timerr + +jobs: + publish: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Log in to Gitea Container Registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ gitea.actor }} + password: ${{ secrets.GITEA_TOKEN }} + + - name: Build and publish image + uses: docker/build-push-action@v6 + with: + context: . + push: true + tags: | + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ gitea.sha }} + + - name: Create Gitea release + shell: bash + env: + API_URL: ${{ gitea.api_url }} + REPOSITORY: ${{ gitea.repository }} + COMMIT_SHA: ${{ gitea.sha }} + GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} + run: | + set -euo pipefail + + tag="build-${COMMIT_SHA}" + release_url="${API_URL}/repos/${REPOSITORY}/releases" + + status=$(curl --silent --output /dev/null --write-out '%{http_code}' \ + --header "Authorization: token ${GITEA_TOKEN}" \ + "${release_url}/tags/${tag}") + + if [ "${status}" = "200" ]; then + echo "Release ${tag} already exists" + exit 0 + fi + + if [ "${status}" != "404" ]; then + echo "Unable to check release ${tag}: HTTP ${status}" >&2 + exit 1 + fi + + curl --fail-with-body --request POST \ + --header "Authorization: token ${GITEA_TOKEN}" \ + --header "Content-Type: application/json" \ + --data "{\"tag_name\":\"${tag}\",\"target_commitish\":\"${COMMIT_SHA}\",\"name\":\"Build ${COMMIT_SHA}\",\"body\":\"Docker image: ${REGISTRY}/${IMAGE_NAME}:${COMMIT_SHA}\",\"draft\":false,\"prerelease\":false}" \ + "${release_url}" diff --git a/README.md b/README.md index ab2231f..f275e8c 100644 --- a/README.md +++ b/README.md @@ -22,3 +22,30 @@ py -3.12 -m venv .venv .\.venv\Scripts\python.exe manage.py check .\.venv\Scripts\python.exe -m pytest ``` + +## Docker image + +При каждом push в ветку `main` Gitea Actions собирает образ и публикует его в +Container Registry, а затем создаёт Gitea Release с тегом +`build-`: + +```text +git.spyk3r.com/spyk3r/timerr:latest +git.spyk3r.com/spyk3r/timerr: +``` + +Для запуска приватного образа на VPS сначала войдите в registry с помощью +логина Gitea и personal access token с правом чтения packages: + +```bash +docker login git.spyk3r.com +docker pull git.spyk3r.com/spyk3r/timerr:latest +docker run -d --name timerr --restart unless-stopped \ + -p 8000:8000 \ + -e DEBUG=0 \ + -e SECRET_KEY='replace-with-a-long-random-secret' \ + -e ALLOWED_HOSTS='your-domain.example' \ + -e DATABASE_NAME=/app/data/timerr.sqlite3 \ + -v timerr-data:/app/data \ + git.spyk3r.com/spyk3r/timerr:latest +```