LF
Today

S1E20

Цели:

  • Получить в артефакты лог сборки и деплоя проекта pythoner, для джобов build_images и deploy_images. Для секции scripts, то есть все команды которые выполняются в секции script нужно записать в артефакты + результаты выполнения этих команд.
  • Артефакты должны храниться неделю
  • Артефакты должны попасть в docker образ который раскатывается на сервера в секции deploy. То есть если зайти на сервер и подключиться к контейнеру, в этом контейнере я найду артефакты с логами сборки этого контейнера.

Дополнительное задание (не обязательное):

  • Засунуть в артефакты полный RAW лог сборки (а не только команды в разделе scripts) вместе со служебной информацией которая бежит на экране во время выполнения пайплайна. Вот это:

Чо делал:

Начал с раскопок прошлых изысканий. И гуглежа.

Что искал в интернетах:

  • Встроенные переменные Гитлаба
  • Получение трейса джобов

Первая попытка:

$CI_JOB_TOKEN - автоматически генерируемый временный токен для каждой задачи.

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

Вторая попытка:

Забил на автоматику и создал Access token с правами на api (два чекбокса - api, read_api).

Создал переменную в api_token в проекте, положил туда токен.

Имена переменных в гитлабе регистрозависимые. Переменная была api_token, а в ямлике написал $API_TOKEN - получил 401 при попытке коннекта. Исправил имя переменной на API_TOKEN.

Торопился и тупил, потому какое-то количество коммитов - отладка и правка тупых ошибок.

Что собирался получить: Три джобы, первая и вторая пишут свои id в файлики с соответствующими названиями, третья курлит трейсы, используя встроенные переменные, id джобов из файлов, и складывает их в директорию проекта.

Третья попытка. Эксперименты:

Итак, логи есть. Но вместо того, чтоб их запихивать в контейнер, я повнимательнее почитал про $CI_JOB_TOKEN и решил попробовать еще раз.

Плюс вместо сборного пути попробовал $CI_JOB_URL

В азарте опять все делал с кучей косяков (в процессе решил складывать вместо корня в docs/ все, соответственно не с первого раза все пути верно вписал, да еще и порядок команд напутал - создавать директорию после того, как пытаемся в нее файл записать, - плохая идея)

После того, как начал получать логи с использованием $CI_JOB_URL и $CI_JOB_TOKEN, приступил к запихиванию их в контейнер(ы):

Логично трейсы обеих джоб запихивать в контейнеры в третьей джобе. Но я сначала сделал так: во второй джобе после деплоя контейнера сразу туда копируется трейс джобы build_image. И получилось. И решил оставить из любви к исусству.

Третья джоба нужна исключительно для копирования трейсов в контейнер.

Финиш

Можно бы и во второй джобе получить ее же трейс и затолкать в контейнер. Но мне подумалось, что тогда она будет неполной - без "Job succeeded" или "Job failed".

Итого: выполнены все задания, включая необязательное (На то, что трейса третьей джобы не будет, я забил, чтобы не войти в смертельную рекурсию)

[ansible@lf-prod ~]$ docker exec -it my_app ls
Dockerfile  README.md  app.py  build.log  deploy.log  lf-runner-reg.sh  lf-runner-shell-reg.sh  requirements.txt

В бэклог: надо бы как-то все лишнее из контейнера вырезать

https://gitlab.com/littlegreencat/devops

Бонусы:

  • еще раз почитал про отличия $var от ${var} (Второе безопаснее)
  • еще чуть больше узнал про встроенные переменные гитлаба и использовал их

Бонус со звездочкой: Заставил ИИшку разобрать одну из фраз отчета (про азарт) с точки зрения пунктуации.
ИИшка меня похвалила и сказала, что все чотка.