Домашнее задание №7

Домашнее задание №7

Сделайте форк проекта counter-backend и доработайте следующий пайплайн:
stages:
  - build
  - test
  - publish
variables:
  POETRY_IMAGE: registry.devops-teta.ru/materials/ci/images/poetry:1.4.1-3.11.6-bookworm
  KANIKO_IMAGE: registry.devops-teta.ru/materials/ci/images/kaniko:1.9.1
  POETRY_CACHE_DIR: .cache/poetry
  PIP_CACHE_DIR: .cache/pip
  GIT_CLONE_PATH: $CI_BUILDS_DIR/$CI_PROJECT_PATH_SLUG
default:
  before_script:
    - set -eu

Update Cache:
  stage: .pre
  needs: []
  image: &poetry_image
    name: $POETRY_IMAGE
    entrypoint: [""]
  cache:
    - &poetry_packages
      key: poetry-packages
      paths:
        - .cache
      unprotect: true
    - &poetry_venv
      key:
        prefix: poetry-venv
        files:
          - poetry.lock
      paths:
        - .venv
      unprotect: true
  script:
    - &poetry_install poetry install --no-root --no-interaction

Build Package:
  stage: build
  needs:
    - job: Update Cache
      artifacts: false
  image:
    name: $POETRY_IMAGE
    entrypoint: [""]
  cache:
    - \<\<: *poetry_packages
      policy: pull
    - \<\<: *poetry_venv
      policy: pull
  script:
    - *poetry_install
    - mkdir -p dist
    - poetry export --without-hashes --format constraints.txt --output dist/constraints.txt
    - poetry run python -m pip wheel --isolated --requirement dist/constraints.txt --wheel-dir dist/vendor
    - poetry build --format wheel
  artifacts:
    paths:
      - dist

Publish Package:
  stage: publish
  needs:
    - job: Build Package
      artifacts: true
  interruptible: false
  image:
    name: $KANIKO_IMAGE
    entrypoint: [""]
  script:
    - b64_auth=$(printf '%s:%s' "$HARBOR_USER" "$HARBOR_PASSWORD" | base64 | tr -d '\n')
    - >-
      printf '{"auths": {"%s": {"auth": "%s"}}}' "$HARBOR_HOST" "$b64_auth"
      >/kaniko/.docker/config.json
    - >-
      /kaniko/executor
      --cache
      --use-new-run
      --skip-unused-stages
      --context "$CI_PROJECT_DIR"
      --dockerfile "$CI_PROJECT_DIR/Dockerfile"
      --destination "$HARBOR_IMAGE:$IMAGE_TAG"
      --cache-repo "$HARBOR_IMAGE/cache"

Во-первых, напишите на основе этого пайплайна шаблон, который необходимо подключить к counter-backend.

Во-вторых, добавьте задачу Run Tests, запускающую unit-тесты при помощи следующего скрипта:
$ poetry install --no-root --no-interaction
$ poetry run pytest --junitxml python.junit.xml

Задача должна экспортировать отчет в формате junit при любом завершении задачи (успешном или с ошибкой). Также исправьте зависимости задач так, чтобы публикация Docker-образа не происходила при ошибке в тестах.

В-третьих, модифицируйте правила задач так, чтобы:

  • в запросах на слияние запускались только задачи, проверяющие корректность кода;
  • в тегах запускались только задачи, собирающие Docker-образ;
  • в ветке по умолчанию запускались все задачи.

Для проверки предоставьте:

  • ссылки на отработанные пайплайны в counter-backend;
  • ссылку на точку входа в шаблон для backend;
  • diff — изменений в шаблонах при подключении шаблона для counter-backend.