Задача – каждое утро отправлять уведомления об имеющихся открытых Pull Request-ах в Github-репозиторих в Slack.
Используем Prinder и джобу в Jenkins, которая будет запускать по расписанию скрипт в Docker.
Пост не столько о самом Prinder, сколько пример создания задачи в Jenkins с использованием Scripted Pipeline и Docker.
Содержание
Github API токен
Тут останавливаться подробно не буду, описание процесса создания токена есть в посте Jenkins: Github Pull-Request Builder плагин.
Создаём токен с правами на notifications, read:org, read:repo_hook, repo.
Этот токен затем используем в переменной PRINDER_GITHUB_API_TOKEN
, которая будет передаваться из Jenkins параметров.
Docker-образ
Задачу будем запускать из Docker-образа, создаём для него образ.
Создаём Dockerfile
:
FROM debian:stable-slim RUN apt update && apt install -y python-pip RUN pip install prinder
Собираем его:
[simterm]
admin@jenkins-production:~$ docker build -t projectname/projectname-androidpr:1.0 .
[/simterm]
Проверяем:
[simterm]
admin@jenkins-production:~$ docker run -ti projectname/projectname-androidpr:1.0 prinder --help Usage: prinder [OPTIONS] Options: --config_file TEXT Path of config file. eg - /opt/prinder/prinder_config.yaml --debug Turn detailed logging on and off --help Show this message and exit.
[/simterm]
И пушим в DockerHub:
[simterm]
$ docker push projectname/projectname-androidpr:1.0
[/simterm]
Jenkins
Создаём новую pipeline-джобу:
На время тестирования – пишем скрипт прямо в задаче, потом вынесем его в репозиторий:
def prinderRun() { docker.image('projectname/projectname-androidpr:1.0').inside('-v /var/run/docker.sock:/var/run/docker.sock') { sh "prinder --help" } } node { stage('Run Prinder') { prinderRun() } }
Запускаем:
prinder_config
Для того, что бы указать Prinder какие репозитории отслеживать, и куда слать уведомления – создаём отдельный репозиторий для Jenkins.
Создаём в нём файл настроек:
--- github_api_token: initial_message: 'The following PRs are pending: ' github: organization_name: projectname-dev all_repos: false list_of_repos: - ANDROID_projectname - Meditation-Android - Men-Android topics: ignore_repos: ignore_labels: - don't merge - release notification: mail: enable: false template_location: mail_to: sender: subject: 'Pull request reminder' host: localhost port: 25 slack: slack_api_token: enable: true template_location: post_as_user: Pull Requests reminder notify_slack_members: notify_slack_channels: - android_dev
Slack API токен тоже будем передавать из Jenkins-а в переменную PRINDER_SLACK_API_TOKEN
.
github_api_token
и slack_api_token
указываем пустыми.
Jenkinsfile
По устоявшейся уже привычке – я разделяю Jenkinsfile на два скрипта – в одном функция/и, во втором – определение переменных/параметров, и вызов функций.
При этом билд-скрипты лежат в отдельном репозитории.
Создаём в нём каталог для нового проекта:
[simterm]
$ mkdir ~/Work/ProjectName/projectname-deployment/android-pr
[/simterm]
В каталоге android-pr
создаём два файла – main.groovy
:
def prinderRun(config='1') { docker.image('projectname/projectname-androidpr:1.0').inside('-v /var/run/docker.sock:/var/run/docker.sock') { sh "prinder --config_file=${config}" } } return this
(постоянно забываю сделать return this
)
И файл android-pr.groovy
:
#!/usr/bin/env groovy node { // checkout https://github.com/projectname/projectname-deployment to the "ci" directory in Jenkins's Job workspace // to use scripts from it, e,g, main.groovy dir ('ci') { git branch: "${DEPLOYMENT_REPO_BRANCH}", url: "${DEPLOYMENT_REPO_URL}", credentialsId: "jenkins-projectname-github" } def prinder = load 'ci/android-pr/main.groovy' // https://github.com/projectname-dev/Android_PullRequests_Reminder and use project's directory inside git branch: "${PR_REPO_BRANCH}", url: "${PR_REPO_URL}", credentialsId: "jenkins-projectname-github" // Pinder's vars for auth PRINDER_GITHUB_API_TOKEN = "${env.PRINDER_GITHUB_API_TOKEN}" PRINDER_SLACK_API_TOKEN = "${env.PRINDER_SLACK_API_TOKEN}" PRINDER_CONFIG = "${env.PRINDER_CONFIG}" prinder.prinderRun("${PRINDER_CONFIG}") }
Тут сначала выполянется загрузка репозитория со всеми билд-скриптами (git branch: "${DEPLOYMENT_REPO_BRANCH}"
) в каталог ci/
, потом из каталога ci/android-pr/
считываем файл main.groovy
, который создали выше, затем задаём используемые переменные, и в конце – вызываем функцию prinderRun()
, которой передаём имя файла конфига.
Jenkins job
И последним шагом – обновляем билд в Jenkins.
Добавляем параметры:
PRINDER_GITHUB_API_TOKEN
– тип Password ParameterPRINDER_SLACK_API_TOKEN
– тип Password ParameterPRINDER_CONFIG
– String ParameterDEPLOYMENT_REPO_BRANCH
иDEPLOYMENT_REPO_URL
– тип String Parameter, указывают на репозиторий с билд-скриптамиPR_REPO_BRANCH
иPR_REPO_URL
– String Parameter, указывают на репозиторий с файломprinder_config.yaml
Обновляем настройки Pipeline – вместо Script задаём Pipeline script from SCM, указываем доступ к нему, и вызываем вызов скрипта android-pr.groovy
:
Запускаем:
Добавляем запуск по расписанию:
Готово.