Jenkins: проверка публичных репозиториев Github-организации

Автор: | 04/16/2019
 

Продолжаем внедрение проверки списка публичных репозиториев организации.

Напомню: идея состоит в том, что бы если кто-то из девелоперов случайно расшарит приватный репозиторий, или создаст новый репозиторий не приватным, а публичным — получить об этом уведомление в Slack.

Написание самой утилиты на Go есть в посте Go: проверка списка публичных репозиториев в Github и уведомления в Slack. Сравнение списков в Go. Первый опыт с Golang.

Теперь надо собрать Docker-образ и добавить джобу в Jenkins, которая будет запускаться каждую ночь и выполнять проверку.

Dockerfile

Создаём Dockerfile.

Используем golang:alpine, в который:

  1. копируем файл утилиты
  2. выполняем установку зависимостей
  3. собираем бинарник в каталог /go/bin как github-checker
  4. задаём действие по умолчанию — запуск /go/bin/github-checker

Файл:

# alpine as mininal image
FROM golang:alpine
# git for go get
RUN apk update && apk add --no-cache git
# copy source from a current dir
COPY go-github-public-repos-checker.go .
# install deps
RUN go get -d -v
# build to /go/bin
RUN go build -o /go/bin/github-checker
# set default entrypoint
CMD ["/go/bin/github-checker"]

Про CMD vs ENTRYPOINT хорошо написано тут>>>.

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

docker build -t projectname/projectname-github-checker:1.0 .

Проверяем.

Задаём переменные:

export GITHUB_ORG_NAME="rtfmorg"
export ALLOWED_REPOS="org-repo-1-pub org-repo-2-pub"
export SLACK_CHANNEL="#general"
export SLACK_URL="https://hooks.slack.com/services/T16***WRE"

Запускаем, передавая переменные через -e:

docker run -ti -e GITHUB_ORG_NAME=${GITHUB_ORG_NAME} -e ALLOWED_REPOS="${ALLOWED_REPOS}" -e SLACK_CHANNEL=${SLACK_CHANNEL} -e SLACK_URL=${SLACK_URL} projectname/projectname-github-checker:1.0
Checking org-repo-1-pub
OK: repo org-repo-1-pub found in Allowed
Checking org-repo-2-pub
OK: repo org-repo-2-pub found in Allowed

Пушим в DockerHub:

root@jenkins-production:/home/admin# docker push projectname/projectname-github-checker:1.0

Jenkins

Создаём новую джобу, вызываем Docker через Pipeline script:

Сам скрипт:

node {
    stage('Check repositories') {
        docker.image('projectname/projectname-github-checker:1.0').run("-e GITHUB_ORG_NAME=${GITHUB_ORG_NAME} \
        -e ALLOWED_REPOS=${ALLOWED_REPOS} \
        -e SLACK_CHANNEL=${SLACK_CHANNEL} \
        -e SLACK_URL=${SLACK_URL}")
    }
}

Добавляем параметры, которые будут передаваться как переменные в Docker-контейнер.

SLACK_URL содержит токен, поэтому его задаём как Password Parameter.

ALLOWED_REPOS указываем в кавычках, т.к. там список, который потом должен распарситься в Go:

Добавляем запуск по расписанию, можно использовать crontab.guru:

Запускаем, для проверки — без одного из наших публичных репозиториев в списке ALLOWED_REPOS:

Готово.