Jenkins: запуск Prinder – Github Pull Request reminder

By | 11/20/2018
 

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

Собираем его:

admin@jenkins-production:~$ docker build -t projectname/projectname-androidpr:1.0 .

Проверяем:

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.

И пушим в DockerHub:

docker push projectname/projectname-androidpr:1.0

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 на два скрипта – в одном функция/и, во втором – определение переменных/параметров, и вызов функций.

При этом билд-скрипты лежат в отдельном репозитории.

Создаём в нём каталог для нового проекта:

mkdir ~/Work/ProjectName/projectname-deployment/android-pr

В каталоге 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 Parameter
  • PRINDER_SLACK_API_TOKEN – тип Password Parameter
  • PRINDER_CONFIG – String Parameter
  • DEPLOYMENT_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:

Запускаем:

Добавляем запуск по расписанию:

Готово.