В данной статьей мы расскажем о том, как с можно хранить решения e365 в виде исходных кодов.
С помощью утилиты elma365pm можно экспортировать решение со стенда, распаковать файл. Эти две операции помогут нам настроить классический процесс код-ревью. План следующий - разработчик решения выгружает со стенда файл экспорта *.e365, закидывает коммит с этим файлом на git-сервер. Далее на сервере автоматически срабатывает автоматизация, которая предоставляет нам доступ к исходным кодам сценариев.
Установка Gitlab Runner
Для установки Gitlab Runner на машине, предназначенной для этого, выполните следующие команды:
Код:
curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | sudo bash
и
Код:
apt-get install gitlab-runner
Для регистрации Gitlab Runner зайдите в аккаунт администратора на вашем Gitlab, в левом верхнем углу нажмите на кнопку Menu, в выпадающем списке выберите Groups>Create group
![[IMG]](https://lh6.googleusercontent.com/vF775LCeefvD3KcFAJbpVJi22yC5Vek01SvsrLCcBaMOP7_uh49LU08LA3b1vIxoqUZiUOp1SCayB5PMWrCz0cdxaVIFXhOkJYHReXBn74D27UoycW3ga5uo6goAM0S7O9XDRtPV779gOSZqCYAwM-lpBPHlN67gGXIkDLnji_NcKM2Q-ljX6kA-uQ)
![[IMG]](https://lh4.googleusercontent.com/0Mok4OsAxrP9GR28vpIEfOX1aEHjTNNHvKKQ5lbHDIbajmDVKpM97K-gyxfemd0aaXFLbFmAJqBYM_CQrPoNOGcbKXpBO06ynSfDyb3QCJI8De4MmBzu1F4SHYn7QsiaHQgfjpuHGm1-oMrfVNXbHd5JzQxxOPI6WlIhyeJfigE2DuyJLmzrIBRQKw)
![[IMG]](https://lh3.googleusercontent.com/EoXv_WQX_ek1_3iCXV0TyWebw_owTzM7FAk6v1f0hNqNWjxFhC2eUQxflJ-EwlLRw433PDBcW5svARc1KGAJxkXvGbZae6LQuHk1OM4Y_cxWigRuCDBy4Fm8IU2u-eLBSF1mNDSoF8osAPAgP5AJjsn2lDuQlIzvvhJ64VF0YXEsIYWkEvOOjhBREw)
Группа нам понадобится для создания раннера, который можно будет использовать в любом проекте внутри группы.
- Зайдите в группу, также из Menu > Groups > Название вашей группы. В меню слева выберите CI/CD > Runners
![[IMG]](https://lh4.googleusercontent.com/6AxMu4YiCDN5EIM4rha0Wng1mZkZeu-s6wjbi_dAlLHsquqyH_vaPuTQmN58PE3vrV59HO5_88mqWh4z9voVodrEmo5tEvSk4u1VKr7vGn0V6CaKoFHy-Eag_J_cE8JB0wuNPOlb5-9VqdB1oQH-T_W98Bjp-sadUY9aCsggYxCS0bd_QTb4qqs5gA)
- В новом окне в правом верхнем углу выберите Register new runner, в выпадающем меню скопируйте токен для нового раннера, он вам скоро понадобится.
![[IMG]](https://lh3.googleusercontent.com/DhjOaNr7MHaN4qBVDu0cubrQjO5OWLTK1ovawpxKprLoX2vi4_PY1tdHMXc0O4XPKSNQOhlbrGqR-jOi5U_PN2zx9n7eWJ-AJxkrRMlXRbOnam0xEx-Wwu9STbIytNzl3gwxR9IqLh8x_6sbjTyQwM6QC0ivNIwjvmgG7yRR9xIuSlcj_hbUDK0gnQ)
- Вернитесь в консоль на ВМ и введите команду:
Код:
sudo gitlab-runner register
В процессе регистрации необходимо будет задать несколько параметров:
- Please enter the gitlab-ci coordinator URL (e.g. https://example.com) - укажите адрес вашего Gitlab инстанса
- Please enter the gitlab-ci token for this runner - введите токен для раннера, скопированный ранее.
- Please enter the gitlab-ci description for this runner - можете оставить по умолчанию, либо ввести название вашего раннера.
- Please enter the gitlab-ci tags for this runner (comma separated) - в нашем случае можно оставить пустым, тут предлагается ввести теги для раннера, по которым он будет выполнять определенные работы, в данном решении не используется
- Enter optional maintenance note for the runner - также оставляем пустым в нашем случае, здесь заполняется информация для разработчиков
- Please enter the executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell - пишем docker
- Please enter the Docker image - дефолтный образ для докера, можете выбрать любой, например alpine:latest, это все равно в последствии перепишется в конфигурационных файлах.
Настройка Gitlab Runner
- Для удобства создадим проект, в котором будет храниться основной конвейер:
![[IMG]](https://lh6.googleusercontent.com/8sD_689vNtBH7U7dTz1VGdLvfYe8oeIwDNgadfp10iTFkObOqXsUMP25IMZ4mnUFdKA2TWQYna-EzyFxe9zBR280RMW3Nsj_Wzz0k_PpFto1U4KSft4Thqz7BetFQcItDl1E-6DnJUOoBG1apVsbpMyqmaHz-U4Ljo7WdB1h62A0wIOxYRIYVq6KMQ)
В данном случае проект называется Main Pipeline. Его структура:
![[IMG]](https://lh6.googleusercontent.com/-ZDIfymLNyty_96rGHw2NCJFboVz9HsxeUznhdFxbOD6xtbrHIzvEDyjL1cgbNhQpHpk-6iZhEnkcFSt7X6MLYQg6nrQBfPgikNmBbvxBfIJPwJN5Ij3R06tDKcHO5ImQ-Ekl8XKrsezjodjuqYoqb7VwVblcVg9BValgaB_AQYOQyiLu3b3_LDt5Q)
Файл с инструкциями назовем .gitlab-ci.yml со следующим содержимым
Код:
stages:
- unpack
include:
- "/templates/.unpack_runner.yml"
image:
alpine
Мы задаем названия этапов для нашего пайплайна. Папка templates будет содержать этапы, сейчас там будет находиться один файл .unpack_runner.yml
Содержимое файла .unpack_runner.yml (файл приложен в статье)
Код:
unpack:
image:
deconstruct365/elma365:latest
stage: unpack
allow_failure: true
script:
- apk update && apk add git
- git config --global user.name "$CI_ROBOT_NAME"
- git config --global user.email "$CI_ROBOT_EMAIL"
- git remote set-url origin $GITLAB_PROJECT_PATH
- cp /unpacker/elma365pm . && cp /unpacker/unpacker.py .
- python3 ./unpacker.py
- rm elma365pm unpacker.py
- git add --all
- git commit -m "commit from robot"
- git push -f origin HEAD:$CI_COMMIT_BRANCH
rules:
- if: $CI_COMMIT_BRANCH =~ /.*dev.*/ &&
$CI_COMMIT_MESSAGE !~ /.*robot.*/
exists:
- "**/*.e365"
Переменные окружения
Также необходимо определить переменные окружения, которые будут использоваться в процессе запуска работ раннера. Для этого на странице с проектом, в левом меню выбираем Settings > CI/CD
![[IMG]](https://lh4.googleusercontent.com/Y1EtSnq4E0o9Df7mCA1dW5mLDBNy_x5PDXXSfqYzj-73eLI-iX-AcXKRGH_WYwKgKsuZdyETxfB_MKLUJIIblZ9DvYfmvFPLfv2ctKwJPz37xMAZO9Q1dglp7dX7X51kBhpwVruy5TaEGnYPlQxff4q2lZsPysF9xozz-0Ox6jB4AQltEBSuebXTUw)
В новом окне раскрываем выпадающее меню Variables.
![[IMG]](https://lh4.googleusercontent.com/T5d2AWGlvLL_ohhHXzLaXnFX1ylndcmvX0_yccYn3Y3W8aNLaSD13L9XPPOQkOVb8fliVzceMrt0BI6NMb8hCOosJe9sfy5wL8e6YHm6IhezcfuXkB3L6igMvJwHyoUgdNQv431_-9dY6H-E-JH-o0Jm4OwuHcJS-lX71UhZjj8nFhEHWH2H8ZtEPA)
Через кнопку Add variable добавляем необходимые переменные:
![[IMG]](https://lh6.googleusercontent.com/f-1-u35E700uBaaeNN0jasXE9rPmN114_Vh83MS55sJyIaRJPitTH13j5zRTg_TaqVQ8jwq48NCJxsTEs2xUmIxhKlu1t2nIrQy-dEu5W4mYDySWVh2A0efmlPcVZVsG6LdWpac-SpFICILZUZmvedVN7Kx1Kr8MyeFEgTQtPB82BppDZSNgYGXMrA)
![[IMG]](https://lh3.googleusercontent.com/quRf9hHwLQD-naT3ic0OokWtFptZ8QzzCVBN2-toHafZ-rNr-O1ArGUtitc8bV5JU1btEOtNuMuq48dZg2gqVgS2rkteBEoJmjadiXjKLcX3e2Z2KNASRnbHD5g_cNVXWcCyIMSGcpCJfYM_KS-pSB5o0olmfMJDVo6D_9a5_Y2gNFwORZGt7-aZUw)
DOCKER_AUTH_CONFIG - для того, чтобы получить это значение, на машине, где установлен докер, введите docker login, далее введите свои логин и пароль от Docker Hub’а. После уведомления, что логин успешен, перейдите в корневую директорию root-пользователя, там найдите папку .docker, а в ней файл config.json. Скопируйте содержимое файла и вставьте в поле Value в окне с добавлением новой переменной.
Далее также необходимо добавить переменные окружения на уровне группы. Для этого зайдите на главную страницу вашей группы, и в левом меню выберите Settings > CI/CD
![[IMG]](https://lh4.googleusercontent.com/N40Nz8LImBT59T_vRltcKBkHsuDeHGt8V1TRgrfoEKm4tybpVlemSfw9vpTlN0r4irtxtWzsCei1dmevVvZalKHX0SX3BkZz8yloIeGh5mH1J4KSPJbWyOc-OoxPvShiQKwdWNQTCtIUO7Ph3qL2iF8WZRwZwsgEpRDyv_PROM9YS3un4z1M3U1_2A)
Также, как и ранее, раскройте выпадающее меню Variables, и добавьте переменные:
CI_ROBOT_EMAIL - для удобства, лучше создать отдельного пользователя на вашем gitlab и выдать ему права администратор. Он будет играть роль робота, который делает пуши и прочую логику, связанную с ветками. В данной переменной лежит его email.
CI_ROBOT_PASSWORD - пароль от аккаунта вашего робота на gitlab.
CI_ROBOT_NAME - имя аккаунта вашего робота на gitlab.
GITLAB_PROJECT_PATH - вставьте ровно это, заменив только hostname вашего gitlab-инстанса: https://$CI_ROBOT_NAME:$CI_ROBOT_PASSWORD@<url-вашего-gitlab>/$CI_PROJECT_PATH.git
Теперь нужно подключить наш раннер к проекту. Так как мы сделали его групповым, он будет доступен для всех проектов, относящимся к группе. Из главного окна своего проекта снова заходим в раздел Settings > CI/CD в левом меню. Далее открываем выпадающее меню Runners.
![[IMG]](https://lh4.googleusercontent.com/hTB6aRTPNyRCS_kSjmNgVmCOmfOhEmF2gPv13URlbqaJr4wNvvx4rk79HHUHzE3n6w3f0OPqXI3hkH--JfR7KDggqKh8wvKQVmm3DBfOaYlb501M14x6XgQZInM3fPlU84YBm94YI3ASdgE-YVAApMFxLAD1GSjteAAk8vwT7LxKUwLcIfa2L6MCUw)
Групповой раннер будет по умолчанию подключен к проекту, чтобы его отключить, нажмите Disable group runners
![[IMG]](https://lh3.googleusercontent.com/4YJO4UmpN4idf38oh5zggd0wNboHchUJQjbTIv6Z23Mv6NXUN6AFndD5BXQSiZh92rXs2g2o8Dwy-OpltVzSbEj2z0TC5XEnvvr-_v-GRBRy4YbyE-9VPA9Fn7GpJESzT2ndIpmoX7w6PMvO8rwwZsho4oO0RvKQEYpBEUpVXBxpmySta8EcWl3CKQ)
Проверка работы
Создадим новый проект в нашей группе, назовем его Test. В корне проекта создаем файл .gitlab-ci.yml со следующим содержимым:
Код:
include:
- project: "elma365/main-pipeline"
file: ".gitlab-ci.yml"
elma365 - название группы, которую мы создали в начале
main-pipeline - название проекта, в котором лежат настройки. Мы его создали на этапе настроек Gitlab Runner
В этом файле мы ссылаемся на наш проект с настройками и наш файл с этапами пайплайна.
Заливаем файл .gitlab-ci.yml в ветку master(или main).
Из ветки master создаем новую ветку som_dev_brach. Экспортируем из ELMA365 разработанное решение, в нашем случае файл test.e365. После этого заливаем его в нашу ветку some_dev_branch, как видно на скриншоте ниже. Раннер настроен таким образом, что срабатывает при определенных условиях, в данном случае, на стадии unpack, раннер видит коммит, и сравнивает название ветки на соответствие подстроке dev по регулярному выражению:
![[IMG]](https://lh5.googleusercontent.com/gAQCXQNIJ6YCqWRKs5tMdCG0LzL2DUTz-qcy-dc_hrDszDtZnr1RS6lFnTaGn7sPG_fXlSwI6-3IuFkupGpxZjSFIty_ylPdGfXaxs2sC_fydKF9y9t-vlM4zeDjHsdXKKE_9xpZ7CwVPHtTo1eokBV6PGG2fWJ7caEfHeyn7vUR7HDiLFTf-GpB6g)
Также напротив коммита можно увидеть значок :
![[IMG]](https://lh4.googleusercontent.com/OgxwZcO-0lqkhWzeOvUyVIrJ4DMH_61IxPD22OcKRhFSV2VVgZ1o7IkRDYdoJa9qnkYisSuAzVaf-z_nqGJJot5dh8Ayg9hwn0UuB2t6KNkY3hr4wpG7LP-oOPYcbSTdteluNWVtToVgI0d7iygoJtQdtaywSh4ewgVbG2YWSDx01RjxNX6HLyXyiw)
Это означает, что условия совпали и раннер начал свою работу. Если нажать на этот значок, можно перейти на страницу с информацией о запущенном пайплайне:
![[IMG]](https://lh4.googleusercontent.com/fhqiBTeSHVPEfnZ2xalZ0FEg3oYYG_ceQl5_B39USu30DV4yP62of_IahBsHwUux_8-mplfY7t3SQvI_sWg_JKgSJeXlHYoE8Fw-ZuSvGvYT68mcSb2F_2PXfBnAOSnmc9HMrXFGGhE1eYzyFn2ewl5c7L0SQ2hg1AuopTTfo-gDRe1560GI2765ow)
В нижней части страницы показана схема, по которой двигается пайплайн, обычно в них бывает много джобов, то есть отдельных этапов, но в нашей логике в каждом пайплайне будет один этап, также, если перейти на определенный джоб, можно увидеть весь процесс его выполнения в неинтерактивном терминале:
![[IMG]](https://lh6.googleusercontent.com/fsSCpox4FdZn8bg1QUaRnu21OLnj4E9jEosntilfoE_msospxh4-D9xPwzHcZTusOZ2qwGdd58h6rumAoAu5tqxsvuyVB4lNc_UtpT6SPG82aVzF8tyt3v5b_y08yePlet-JOPZZXb6KlF0gicW1CXre3S3NMgwdJDViZ_PNh7DlI1QXJcfNxoF5oQ)
После того, как пайплайн успешно завершен, в корне проекта на нашей ветке разработки можно увидеть изменения - новый коммит от нашего робота, который распаковал для нас решение/модуль и залил обратно в ту же ветку:
![[IMG]](https://lh6.googleusercontent.com/HphtdQdsOukk6LTOMejBt9NXq4Qfirix7ijDQL2RJL-cLh6mZCwsID7esuogNvgUV86qsyYWCQFD2J9DFUz574Q84fBZ_l4Q-5iTsHSv4rZxgWGHnwPRaD78yOW5cZWhZdXSpuPWyE3PmoclGUIrFvLnGkOofJcWMdzSCw2Xc5NHfF2GlKoyZGBNBA)
Папка test-unpacked содержит распакованную версию нашего решения