Files
netology-devops/src/homework/09-ci/9.6/readme.md

8.3 KiB
Raw Blame History

Выполнение домашнего задания по теме "9.6. Gitlab"

Q/A

Задание 1

Подготовка к выполнению

  1. Необходимо подготовить gitlab к работе по инструкции
  2. Создайте свой новый проект
  3. Создайте новый репозиторий в gitlab, наполните его файлами
  4. Проект должен быть публичным, остальные настройки по желанию

Ссылка на проект: https://netology-sao.gitlab.yandexcloud.net/dannc/netology-devops-gitlab.

Зеркало проекта на github: dannecron/netology-devops-gitlab.

Задание 2

Основная часть

DevOps

В репозитории содержится код проекта на python. Проект - RESTful API сервис. Ваша задача автоматизировать сборку образа с выполнением python-скрипта:

  1. Образ собирается на основе centos:7
  2. Python версии не ниже 3.7
  3. Установлены зависимости: flask flask-restful
  4. Создана директория /python_api
  5. Скрипт из репозитория размещён в /python_api
  6. Точка вызова: запуск скрипта
  7. Если сборка происходит на ветке master: должен подняться pod kubernetes на основе образа python-api, иначе этот шаг нужно пропустить

Dockerfile для приложения выглядит следующим образом:

FROM centos:7

RUN yum install -y python3 curl
COPY src/requirements.txt /tmp/requirements.txt

RUN pip3 install -r /tmp/requirements.txt

COPY src/ /python_api/

EXPOSE 5290

CMD ["python3", "/python_api/python-api.py"]

В gitlab-ci выделено 3 стадии:

  • build
  • test (для необязательного задания)
  • deploy

В рамках build производится два пайплайна:

  • pre-build: формирование тэга для образа: на дефолтной ветке сборка идёт с тэгом latest, на MR с названием ветки.

    ---
    pre-build:
    image: busybox:latest
    stage: build
    script:
      - |
        if [[ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]]; then
          tag="latest"
          echo "Running on default branch '$CI_DEFAULT_BRANCH': tag = 'latest'"
        else
          tag="$CI_COMMIT_REF_SLUG"
          echo "Running on branch '$CI_COMMIT_BRANCH': tag = $tag"
        fi
      - echo "DOCKER_IMAGE=netology-devops-gitlab:${tag}" > docker.env
    artifacts:
      reports:
        dotenv:
          docker.env
    
  • docker-build: построение и отправка образа в registry.

    docker-build:
      stage: build
      variables:
        DOCKER_DRIVER: overlay2
        DOCKER_TLS_CERTDIR: ""
        DOCKER_HOST: tcp://localhost:2375/
      image: cr.yandex/yc/metadata-token-docker-helper:0.2
      services:
        - docker:19.03.1-dind
      needs:
        - pre-build
      script:
        - docker build --pull -t "cr.yandex/${YA_DOCKER_REGISTRY}/${DOCKER_IMAGE}" -f docker/Dockerfile .
        - docker push "cr.yandex/${YA_DOCKER_REGISTRY}/${DOCKER_IMAGE}"
      rules:
        - if: $CI_COMMIT_BRANCH
          exists:
            - docker/Dockerfile
    

В данных пайплайнах используется переменная YA_DOCKER_REGISTRY, которая добавлена в CI/CD-переменные проекта. Все остальные переменные CI_* являются предопределёнными.

Стадия deploy состоит из одного шага:

deploy:
  image: gcr.io/cloud-builders/kubectl:latest
  stage: deploy
  needs:
    - pre-build
    - docker-build
  script:
    - kubectl config set-cluster k8s --server="$KUBE_URL" --insecure-skip-tls-verify=true
    - kubectl config set-credentials admin --token="$KUBE_TOKEN"
    - kubectl config set-context default --cluster=k8s --user=admin
    - kubectl config use-context default
    - sed -i "s/__YA_REGISTRY__/${YA_DOCKER_REGISTRY}/" docker/k8s.yaml
    - sed -i "s/__DOCKER_IMAGE__/${DOCKER_IMAGE}/" docker/k8s.yaml
    - kubectl apply -f docker/k8s.yaml

Успешность деплоя можно проверить

Product Owner

Вашему проекту нужна бизнесовая доработка: необходимо поменять JSON ответа на вызов метода GET /rest/api/get_info, необходимо создать Issue в котором указать:

  1. Какой метод необходимо исправить
  2. Текст с { "message": "Already started" } на { "message": "Running" }
  3. Issue поставить label: feature

Ссылка на issue: https://netology-sao.gitlab.yandexcloud.net/dannc/netology-devops-gitlab/-/issues/1

gitlab_issue

Developer

Вам пришел новый Issue на доработку, вам необходимо:

  1. Создать отдельную ветку, связанную с этим issue
  2. Внести изменения по тексту из задания
  3. Подготовить Merge Request, влить необходимые изменения в master, проверить, что сборка прошла успешно

Merge-request: https://netology-sao.gitlab.yandexcloud.net/dannc/netology-devops-gitlab/-/merge_requests/1.

gitlab_merge_request

Tester

Разработчики выполнили новый Issue, необходимо проверить валидность изменений:

  1. Поднять докер-контейнер с образом python-api:latest и проверить возврат метода на корректность
  2. Закрыть Issue с комментарием об успешности прохождения, указав желаемый результат и фактически достигнутый

Для проверки необходимо авторизоваться в registry и выполнить команду

docker run --rm -d -p "5290:5290" cr.yandex/crp4ua679vouef3vqg87/netology-devops-gitlab:issue-1

А затем выполнить curl-запрос на localhost:5290.

Автоматизируйте работу тестировщика, пусть у вас будет отдельный конвейер, который автоматически поднимает контейнер и выполняет проверку, например, при помощи curl. На основе вывода - будет приниматься решение об успешности прохождения тестирования.

Для автоматизации работы тестировщика в рамках стейджа test был написан pipeline:

test-api:
  image: alpine/curl:latest
  stage: test
  variables:
    PYTHON_API_HOSTNAME: python-api
  services:
    - name: "cr.yandex/${YA_DOCKER_REGISTRY}/${DOCKER_IMAGE}"
      alias: python-api
  needs:
    - pre-build
    - docker-build
  script:
    - ./test/validate_api.sh

Итог

После успешного прохождения всех ролей - отправьте ссылку на ваш проект в гитлаб, как решение домашнего задания

Ссылка на проект в gitlab находится в начале данного документа.