Задача — каждое утро отправлять уведомления об имеющихся открытых 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:
Запускаем:
Добавляем запуск по расписанию:
Готово.







