Привет! Меня зовут Даша, я Android-разработчик в команде онлайн-кинотеатра PREMIER  и я хочу с вами поделиться историей как мы начали приводить в порядок Gitlab CI скрипты :) В нашем проекте стало много вариантов сборок и чтобы не тратить кучу времени на ожидание и поиск необходимого билда нам нужно было хотя бы получить отбивку об окончании работы джобы. А затем - решить неудобства с копипастой, чтобы поддержка скриптов не вызывала выгорание:) Погнали! Начнем с простейшего скрипта в .gitlab-ci.yml: Мы используем image jangrewe/gitlab-ci-android, так как в нем уже есть Android SDK и другие библиотеки для сборки приложений для Android. Все статические переменные, касающиеся безопасности, лежат в Gitlab Variables (Settings -> CI/CD -> Variables).  Здесь у нас запускается сборка Google-варианта bundleProdGoogleRelease с параметром Pbuildnum, который мы используем в качестве кода сборки (versionCode), и также записываем его в название сборки, чтобы соотнести ее с джобой. Pbuildnum — это project property, который можно достать в самом gradle.build таким образом: Как использовать project properties — вы можете прочитать здесь. CI_JOB_ID — идентификатор джобы, используется для указания версии сборки. CI_JOB_STAGE — стейдж джобы, CI_COMMIT_REF_NAME — имя ветки. Также здесь имеется параметр expire_in, который указывает на время хранения готового артефакта на сервере, здесь у нас это 1 неделя. Запуск производится вручную во избежание высокой нагрузки на сервер. В данной джобе использую предопределенные переменные Gitlab CI, такие как CI_JOB_STAGE,  CI_COMMIT_REF_NAME, CI_JOB_ID, но также существует множество других, о которых описано в документации Gitlab CI. Выглядит просто: джоба отработала — артефакт готов. На этом этапе пайплайн в работе оказывал негативный эффект на нашу психику, а глаза краснели во время поиска необходимой сборки... …а можно было бы просто получить ссылку в мессенджере сразу и скачать артефакт оттуда :)  Мессенджер можно использовать любой, а я покажу на примере Slack.  Для реализации отправки сообщений в Slack необходимо сгенерировать webhook, данный процесс детально описан в документации.  Блок after_script вызывается после выполнения основного блока script.  Здесь мы отправляем POST-запрос с параметром --data-urlencode, где указали шаблон сообщения и полученный ранее SLACK_WEBHOOK. ARTIFACT_URL у нас формируется следующим образом: JOBS_PATH — это путь к списку джоб в Gitlab. CI_JOB_ID — идентификатор выбранной джобы. Для того, чтобы сформировать ссылку на браузер в ARTIFACTS_ARCHIVE_PATH, мы указываем /artifacts/browse/, а для ссылки на скачивание — /artifacts/file/. И указываем в ARTIFACT_PATH путь bundle или apk-файлам.  И вот в Slack нам прилетает такое сообщение: И по клику на номер джобы откроется окно с артефактом, который можно будет скачать: Вуаля, запустил сборку, получил уведомление со ссылкой, скачал и пошел искать баги :)   Вот мы и настроили сборку и отправку сообщений: коллеги выбирают тип сборки, нажимают на кнопочку и ждут оповещения.  Вроде бы выглядит нормально, да и для небольших проектов и этого достаточно :) Но не торопитесь радоваться! Нас остановила полиция копипасты и выписывает нам штраф. А за что?  Внимательные читатели поняли, что для каждого вида сборки нам надо копировать весь вышеперечисленный код и исправлять пару строчек :)   А именно:  Непорядок, нам нужно это исправить, иначе наш .gitlab-ci.yml разрастется до огромных размеров, и как потом такое поддерживать… Приступим! Первым делом выделим группы пайплайнов, чтобы в каждом лежали только скрипты, выполняющие одно и то же для каждой сборки.  Для этого необходимо использовать модификатор include в .gitlab-ci.yml.  После изменений файл .gitlab-ci.yml начал выглядеть так: Далее мы выделим общие действия, которые используются во всех скриптах, и добавим их в наш gitlab-ci.yml. Для этого мы используем reference-теги для объявления общих скриптов. Сохраняем переменные в variable.env для их дальнейшего переиспользования в следующей джобе, подробнее про переменные и их использование можно почитать здесь. Выделяем общий скрипт сборки: Более подробно про передачу переменных между джобами описано здесь. И добавляем код отправки сообщений со ссылками на сборки. Далее с помощью extends наследуем джобу от вышеописанных скриптов.     В итоге после выноса общего кода в отдельный файл .gitlab-ci-build.yml пайплайн для релизной  Google-сборки выглядит вот так:  Таким образом, скрипт стал немного гибче, для других сборок нам достаточно только поменять вариант и путь к сборке. Этот пайплайн можно будет оптимизировать и дальше, но это уже другая история… :)  Хоть и ненамного, но мы упростили жизнь нам и нашим тестировщикам. Для сборки артефакта и отправки его в тест нам нужно только нажать одну кнопочку, вот и все!  З. Ы.: на этом мы не прощаемся, в следующих статьях автоматизируем еще что-нибудь :)  Android-разработчик