From 3b35191ec273bdff54ada7eec5e3a49a3b84e897 Mon Sep 17 00:00:00 2001 From: Vlad Date: Sat, 7 Jun 2025 09:09:18 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D1=84=D0=B0=D0=B9=D0=BB=20HARBOR=5FTAG=5FFORMAT.md=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=83=D1=82=D0=BE=D1=87=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=82=D0=B0=20?= =?UTF-8?q?=D1=82=D0=B5=D0=B3=D0=BE=D0=B2=20Docker=20=D0=BE=D0=B1=D1=80?= =?UTF-8?q?=D0=B0=D0=B7=D0=BE=D0=B2=20=D0=B8=20=D0=B4=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B8=D0=BD=D1=84=D0=BE?= =?UTF-8?q?=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8=20=D0=BE=20=D0=BD=D0=B5?= =?UTF-8?q?=D0=BE=D0=B1=D1=85=D0=BE=D0=B4=D0=B8=D0=BC=D1=8B=D1=85=20=D1=81?= =?UTF-8?q?=D0=B5=D0=BA=D1=80=D0=B5=D1=82=D0=B0=D1=85=20=D0=B4=D0=BB=D1=8F?= =?UTF-8?q?=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20=D1=81=20Harbor.=20?= =?UTF-8?q?=D0=92=D0=BD=D0=B5=D1=81=D0=B5=D0=BD=D1=8B=20=D0=B8=D0=B7=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B2=20=D1=84=D0=B0?= =?UTF-8?q?=D0=B9=D0=BB=20docker-build-local.yml=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6=D0=BA=D0=B8=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D0=BE=D0=B9=20PROJEC?= =?UTF-8?q?T=5FNAME=20=D0=B8=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=82?= =?UTF-8?q?=D0=B0=20=D1=82=D0=B5=D0=B3=D0=BE=D0=B2.=20=D0=AD=D1=82=D0=B8?= =?UTF-8?q?=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D1=83=D0=BB=D1=83=D1=87=D1=88=D0=B0=D1=8E=D1=82=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=86=D0=B8=D1=8E=20?= =?UTF-8?q?=D0=B8=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=BE=D0=BD=D0=B0?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D0=BE=D1=81=D1=82=D1=8C=20CI/CD=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D1=86=D0=B5=D1=81=D1=81=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/docker-build-local.yml | 19 ++++--- HARBOR_SETUP_INSTRUCTIONS.md | 52 +++++++++++++++++++ HARBOR_TAG_FORMAT.md | 66 ++++++++++++++++++------- 3 files changed, 112 insertions(+), 25 deletions(-) create mode 100644 HARBOR_SETUP_INSTRUCTIONS.md diff --git a/.gitea/workflows/docker-build-local.yml b/.gitea/workflows/docker-build-local.yml index fba47d5..a58c230 100644 --- a/.gitea/workflows/docker-build-local.yml +++ b/.gitea/workflows/docker-build-local.yml @@ -45,24 +45,25 @@ jobs: run: | # Harbor формат: registry_url/project/repository:tag REGISTRY_URL="${{ secrets.DOCKER_REGISTRY_URL }}" + PROJECT_NAME="${{ secrets.DOCKER_REGISTRY_PROJECT || 'salvage_bot' }}" IMAGE_NAME="${{ env.IMAGE_NAME }}" # Убираем протокол из registry URL если есть REGISTRY_URL=$(echo "$REGISTRY_URL" | sed 's|^https\?://||') if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then - echo "tags=${REGISTRY_URL}/${IMAGE_NAME}:${{ github.event.inputs.tag }}" >> $GITHUB_OUTPUT + echo "tags=${REGISTRY_URL}/${PROJECT_NAME}/${IMAGE_NAME}:${{ github.event.inputs.tag }}" >> $GITHUB_OUTPUT elif [[ "${{ github.event_name }}" == "pull_request" ]]; then pr_number=${{ github.event.number }} - echo "tags=${REGISTRY_URL}/${IMAGE_NAME}:pr-${pr_number}" >> $GITHUB_OUTPUT + echo "tags=${REGISTRY_URL}/${PROJECT_NAME}/${IMAGE_NAME}:pr-${pr_number}" >> $GITHUB_OUTPUT elif [[ "${{ github.ref_type }}" == "tag" ]]; then tag=${GITHUB_REF#refs/tags/} - echo "tags=${REGISTRY_URL}/${IMAGE_NAME}:${tag},${REGISTRY_URL}/${IMAGE_NAME}:latest" >> $GITHUB_OUTPUT + echo "tags=${REGISTRY_URL}/${PROJECT_NAME}/${IMAGE_NAME}:${tag},${REGISTRY_URL}/${PROJECT_NAME}/${IMAGE_NAME}:latest" >> $GITHUB_OUTPUT elif [[ "${{ github.ref_name }}" == "main" ]]; then - echo "tags=${REGISTRY_URL}/${IMAGE_NAME}:latest,${REGISTRY_URL}/${IMAGE_NAME}:main" >> $GITHUB_OUTPUT + echo "tags=${REGISTRY_URL}/${PROJECT_NAME}/${IMAGE_NAME}:latest,${REGISTRY_URL}/${PROJECT_NAME}/${IMAGE_NAME}:main" >> $GITHUB_OUTPUT else branch_name=$(echo "${{ github.ref_name }}" | sed 's/[^a-zA-Z0-9]/-/g') - echo "tags=${REGISTRY_URL}/${IMAGE_NAME}:${branch_name}" >> $GITHUB_OUTPUT + echo "tags=${REGISTRY_URL}/${PROJECT_NAME}/${IMAGE_NAME}:${branch_name}" >> $GITHUB_OUTPUT fi - name: Build and push Docker image @@ -85,6 +86,7 @@ jobs: echo "## Docker Build Summary" >> $GITHUB_STEP_SUMMARY echo "- **Event:** ${{ github.event_name }}" >> $GITHUB_STEP_SUMMARY echo "- **Registry:** ${{ secrets.DOCKER_REGISTRY_URL }}" >> $GITHUB_STEP_SUMMARY + echo "- **Project:** ${{ secrets.DOCKER_REGISTRY_PROJECT || 'salvage_bot' }}" >> $GITHUB_STEP_SUMMARY echo "- **Repository:** ${{ env.IMAGE_NAME }}" >> $GITHUB_STEP_SUMMARY echo "- **Tags:** ${{ steps.tags.outputs.tags }}" >> $GITHUB_STEP_SUMMARY echo "- **Commit:** ${{ github.sha }}" >> $GITHUB_STEP_SUMMARY @@ -101,9 +103,10 @@ jobs: echo "" >> $GITHUB_STEP_SUMMARY echo "### ⚠️ Configuration Required:" >> $GITHUB_STEP_SUMMARY echo "To push images to registry, configure these secrets:" >> $GITHUB_STEP_SUMMARY - echo "- \`DOCKER_REGISTRY_URL\` - registry URL (e.g., registry.gitlab.com)" >> $GITHUB_STEP_SUMMARY - echo "- \`DOCKER_REGISTRY_USERNAME\` - registry username" >> $GITHUB_STEP_SUMMARY - echo "- \`DOCKER_REGISTRY_PASSWORD\` - registry password/token" >> $GITHUB_STEP_SUMMARY + echo "- \`DOCKER_REGISTRY_URL\` - registry URL (e.g., reg.ddl.su)" >> $GITHUB_STEP_SUMMARY + echo "- \`DOCKER_REGISTRY_PROJECT\` - Harbor project name (e.g., salvage_bot)" >> $GITHUB_STEP_SUMMARY + echo "- \`DOCKER_REGISTRY_USERNAME\` - Harbor username (preferably robot account)" >> $GITHUB_STEP_SUMMARY + echo "- \`DOCKER_REGISTRY_PASSWORD\` - Harbor password/token" >> $GITHUB_STEP_SUMMARY elif [[ "${{ github.event_name }}" == "pull_request" ]]; then echo "- **PR Number:** #${{ github.event.number }}" >> $GITHUB_STEP_SUMMARY echo "- **Action:** Build only (no push for PR)" >> $GITHUB_STEP_SUMMARY diff --git a/HARBOR_SETUP_INSTRUCTIONS.md b/HARBOR_SETUP_INSTRUCTIONS.md new file mode 100644 index 0000000..38f0f0a --- /dev/null +++ b/HARBOR_SETUP_INSTRUCTIONS.md @@ -0,0 +1,52 @@ +# Настройка Harbor Registry для Gitea Actions + +## Быстрая настройка + +### 1. Создайте Robot Account в Harbor + +1. Откройте Harbor UI: `https://reg.ddl.su` +2. Войдите в проект `salvage_bot` +3. Перейдите в **Robot Accounts** → **New Robot Account** +4. Настройте: + - **Name**: `gitea-ci` (или любое удобное имя) + - **Expiration**: выберите подходящий срок + - **Permissions**: отметьте `Push Artifact` и `Pull Artifact` +5. Скопируйте: + - **Username**: `robot$gitea-ci` (автогенерируется) + - **Token**: сгенерированный токен + +### 2. Настройте секреты в Gitea + +В настройках репозитория добавьте секреты: + +``` +DOCKER_REGISTRY_URL = reg.ddl.su +DOCKER_REGISTRY_PROJECT = salvage_bot +DOCKER_REGISTRY_USERNAME = robot$gitea-ci +DOCKER_REGISTRY_PASSWORD = <сгенерированный токен> +``` + +### 3. Запустите workflow + +После настройки секретов workflow будет автоматически: +- Собирать Docker образ +- Логиниться в Harbor +- Пушить образ с правильными тегами + +## Проверка результата + +После успешного выполнения workflow образ будет доступен: +``` +reg.ddl.su/salvage_bot/salvagedb-bot:latest +``` + +## Устранение проблем + +### Ошибка 400 Bad Request +- Проверьте правильность robot account credentials +- Убедитесь что robot account имеет права на проект +- Проверьте что все 4 секрета настроены корректно + +### Ошибка 403 Forbidden +- Robot account не имеет прав Push Artifact +- Проект `salvage_bot` недоступен для robot account \ No newline at end of file diff --git a/HARBOR_TAG_FORMAT.md b/HARBOR_TAG_FORMAT.md index a7753c2..8b62805 100644 --- a/HARBOR_TAG_FORMAT.md +++ b/HARBOR_TAG_FORMAT.md @@ -1,22 +1,14 @@ # Harbor Registry Tag Format Fix ## Проблема -Ошибка в формате тегов Docker образов для Harbor registry. Harbor ожидает формат: +Ошибка в формате тегов Docker образов для Harbor registry и проблемы с аутентификацией. Harbor ожидает формат: ``` -reg.ddl.su/salvage_bot/REPOSITORY[:TAG] +reg.ddl.su/project/repository[:TAG] ``` ## Исправление -### До (неправильно): -```yaml -env: - IMAGE_NAME: salvagedb/salvagedb-bot # содержит лишний slash - -# Генерировал теги вида: reg.ddl.su/salvagedb/salvagedb-bot:latest -``` - -### После (правильно): +### Структура Harbor тегов: ```yaml env: IMAGE_NAME: salvagedb-bot # только имя репозитория @@ -28,16 +20,49 @@ env: Harbor использует трёхуровневую структуру: 1. **Registry URL**: `reg.ddl.su` -2. **Project/Namespace**: `salvage_bot` (уже включен в настройках Harbor) +2. **Project/Namespace**: `salvage_bot` (указывается в DOCKER_REGISTRY_PROJECT) 3. **Repository**: `salvagedb-bot` (указывается в IMAGE_NAME) Конечный формат: `registry_url/project/repository:tag` +## Требуемые секреты Gitea + +Для корректной работы с Harbor необходимо настроить следующие секреты: + +- `DOCKER_REGISTRY_URL`: `reg.ddl.su` +- `DOCKER_REGISTRY_PROJECT`: `salvage_bot` (название проекта в Harbor) +- `DOCKER_REGISTRY_USERNAME`: username или robot account +- `DOCKER_REGISTRY_PASSWORD`: пароль или токен robot account + +## Рекомендации по аутентификации + +### Robot Account (настоятельно рекомендуется) + +1. В Harbor UI перейдите в Project → Robot Accounts +2. Создайте robot account с правами `push` и `pull` +3. Используйте имя robot account в формате `robot$username` +4. Используйте сгенерированный токен как пароль + +### Преимущества robot account: +- Безопаснее для CI/CD (ограниченные права) +- Можно отозвать без влияния на основной аккаунт +- Чёткое разграничение доступа + +## Устранение ошибок + +### 400 Bad Request при OAuth токене + +Наиболее частые причины: +- Неправильный формат username (для robot account должен начинаться с `robot$`) +- Некорректный токен или пароль +- Отсутствие прав на проект в Harbor +- Отсутствие PROJECT_NAME в пути тега + ## Изменения в файлах -- ✅ `.gitea/workflows/docker-build-local.yml` - исправлен формат тегов -- ✅ Убрано лишнее `/salvagedb/` из пути -- ✅ Добавлена нормализация URL (убирает https:// если есть) +- ✅ `.gitea/workflows/docker-build-local.yml` - добавлен PROJECT_NAME +- ✅ Исправлен формат тегов: `registry/project/repository:tag` +- ✅ Добавлена поддержка DOCKER_REGISTRY_PROJECT секрета - ✅ Обновлена документация в Summary ## Тестирование @@ -47,5 +72,12 @@ Harbor использует трёхуровневую структуру: - `reg.ddl.su/salvage_bot/salvagedb-bot:main` - `reg.ddl.su/salvage_bot/salvagedb-bot:v1.0.0` -Вместо неправильных: -- ~~`reg.ddl.su/salvagedb/salvagedb-bot:latest`~~ ❌ \ No newline at end of file +## Проверка доступности + +```bash +# Тест локальной авторизации +docker login reg.ddl.su -u YOUR_USERNAME + +# Или для robot account +docker login reg.ddl.su -u robot$YOUR_ROBOT_NAME +``` \ No newline at end of file