diff --git a/.gitea/workflows/docker.yml b/.gitea/workflows/docker.yml index fb8bba0..3e03eb8 100644 --- a/.gitea/workflows/docker.yml +++ b/.gitea/workflows/docker.yml @@ -19,30 +19,37 @@ jobs: - name: Build image run: docker build -t cloudflare-balancer:ci . - # Опционально: публикация в Container Registry Gitea. - # Секреты репозитория: - # REGISTRY_URL — хост Gitea (https://gitea.example.com допустимо) - # REGISTRY_USER — имя пользователя Gitea (логин) - # PACKAGE_TOKEN — токен для push в пакеты / registry (основной; пароль в docker login) - # REGISTRY_PASSWORD — запасной вариант, если PACKAGE_TOKEN не задан - - name: Log in to registry - if: ${{ secrets.REGISTRY_USER != '' && secrets.REGISTRY_URL != '' && (secrets.PACKAGE_TOKEN != '' || secrets.REGISTRY_PASSWORD != '') }} + # Публикация в registry: не используйте `if: secrets.X != ''` — в Gitea/GitHub + # проверка «пустой ли секрет» в выражениях часто всегда ложна, шаги пропускаются. + # Секреты пробрасываем в env и проверяем в bash. + # + # Секреты: REGISTRY_URL, REGISTRY_USER, PACKAGE_TOKEN (или REGISTRY_PASSWORD) + - name: Login and push to Container Registry (optional) + env: + REGISTRY_URL: ${{ secrets.REGISTRY_URL }} + REGISTRY_USER: ${{ secrets.REGISTRY_USER }} + PACKAGE_TOKEN: ${{ secrets.PACKAGE_TOKEN }} + REGISTRY_PASSWORD: ${{ secrets.REGISTRY_PASSWORD }} run: | - REG="${{ secrets.REGISTRY_URL }}" - REG="${REG#https://}" - REG="${REG#http://}" - REG="${REG%/}" - PASS="${{ secrets.PACKAGE_TOKEN }}" - if [ -z "$PASS" ]; then PASS="${{ secrets.REGISTRY_PASSWORD }}"; fi - echo "$PASS" | docker login "$REG" -u "${{ secrets.REGISTRY_USER }}" --password-stdin - - - name: Tag and push - if: ${{ secrets.REGISTRY_USER != '' && secrets.REGISTRY_URL != '' && (secrets.PACKAGE_TOKEN != '' || secrets.REGISTRY_PASSWORD != '') }} - run: | - REG="${{ secrets.REGISTRY_URL }}" - REG="${REG#https://}" + set -e + if [ "${GITHUB_EVENT_NAME:-}" = "pull_request" ]; then + echo "Pull request: push в registry не выполняется (только сборка)." + exit 0 + fi + if [ -z "${REGISTRY_URL:-}" ] || [ -z "${REGISTRY_USER:-}" ]; then + echo "Пропуск registry: задайте секреты REGISTRY_URL и REGISTRY_USER." + exit 0 + fi + PASS="${PACKAGE_TOKEN:-}" + if [ -z "$PASS" ]; then PASS="${REGISTRY_PASSWORD:-}"; fi + if [ -z "$PASS" ]; then + echo "Пропуск registry: задайте PACKAGE_TOKEN или REGISTRY_PASSWORD." + exit 0 + fi + REG="${REGISTRY_URL#https://}" REG="${REG#http://}" REG="${REG%/}" + echo "$PASS" | docker login "$REG" -u "$REGISTRY_USER" --password-stdin IMG="cloudflare-balancer" OWNER_LOWER=$(echo "${{ github.repository_owner }}" | tr '[:upper:]' '[:lower:]') TAG="${GITHUB_SHA:0:12}" @@ -51,3 +58,4 @@ jobs: docker tag cloudflare-balancer:ci "${REG}/${OWNER_LOWER}/${IMG}:latest" docker push "${REG}/${OWNER_LOWER}/${IMG}:${TAG}" docker push "${REG}/${OWNER_LOWER}/${IMG}:latest" + echo "Опубликовано: ${REG}/${OWNER_LOWER}/${IMG}:${TAG}" diff --git a/README.md b/README.md index a1aff0f..04dc27f 100644 --- a/README.md +++ b/README.md @@ -251,6 +251,8 @@ docker logs -f > В Gitea создайте **Personal Access Token** (или токен с нужным scope) с доступом к **пакетам** / записи в Container Registry и сохраните его в секрете **`PACKAGE_TOKEN`**. +> **Почему шаги не «Skipped»:** в workflow нет условия `if: secrets.… != ''` — в Gitea Actions (как и в GitHub) такие проверки часто **всегда ложны**, и публикация молча пропускается. Вместо этого один шаг всегда выполняется: при отсутствии секретов он выводит причину и завершается с кодом 0. На **pull request** push в registry намеренно не делается (только `docker build`). + --- ## Безопасность