Как настроить плагин Jenkins GitHubPullRequestBuilder с помощью Job DSL - PullRequest
4 голосов
/ 04 августа 2020

Я настраиваю интеграцию веб-перехватчиков между частным репозиторием GitHub и сборкой Jenkins. Я настраиваю задания исключительно с помощью сценариев Job DSL groovy (я готов перейти на другой программный механизм настройки c задания, но я не приму никаких ответов, требующих от меня настройки заданий вручную). Я хотел бы настроить контекст состояния фиксации и набор настраиваемых сообщений на основе состояния сборки.

Документация Job DSL API, встроенная в Jenkins , бесполезна, только дает мне эту подпись : githubPullRequest(Closure closure), но не сообщает мне, как построить подходящее закрытие.

Вот соответствующие разделы моего задания DSL:

triggers {
    githubPush()
    githubPullRequest {
        useGitHubHooks()
        buildStatus {
            completedStatus('SUCCESS', 'Build succeeded!')
            completedStatus('FAILURE', 'Build failed. ')
            completedStatus('ERROR', 'Build errored. This is probably a problem with Jenkins or related infrastructure and not an issue with your code changes.')
        }
    }
}

(...)

scm {
    git {
        remote {
            github('privateorg/myrepo', 'ssh')
            credentials('my-credential-id')
            refspec('+refs/pull/*:refs/remotes/origin/pr/*')
        }
        branch('${sha1}')
    }
}

Это ошибка:

ERROR: (build.groovy, line 8) No signature of method: javaposse.jobdsl.dsl.helpers.triggers.TriggerContext.buildStatus() is applicable for argument types: 
(build$_run_closure1$_closure2$_closure10$_closure11) values: 
[build$_run_closure1$_closure2$_closure10$_closure11@602572cb]

Строка 8:

buildStatus {

Если я удалю весь блок buildStatus, Дженкинс примет сценарий и успешно создаст задание. Мои хуки pu sh работают, а мои хуки запросов на вытягивание - нет.

Я не программист Groovy и не очень хорошо знаком с какими-либо аспектами Jenkins. Я понимаю, что не существует метода, совместимого с написанным мной DSL, но я не знаю, где искать действительные сигнатуры методов. Я не понимаю, как DSL сопоставляется с вызовами методов достаточно хорошо, чтобы найти или даже распознать подходящий метод и создать совместимый DSL.

Поиск в Google сообщения об ошибке привел меня к некоторым людям, у которых были похожие проблемы в 2016 году -2017: 1 , 2 , 3 . Их проблема, по-видимому, возникла из-за устаревания плагина Github Pull Request Builder как основного, связанного плагина и соответствующего изменения синтаксиса. Это привело меня к открытию нового синтаксиса, приведенного здесь :

triggers {
    githubPush()
    githubPullRequest {
        useGitHubHooks()
        extensions {
            'org.jenkinsci.plugins.ghprb.extensions.status.GhprbSimpleStatus' {
                buildStatus {
                    'org.jenkinsci.plugins.ghprb.extensions.comments.GhprbBuildResultMessage' {
                        message 'Build in progress...'
                        result 'PENDING'
                    }
                    'org.jenkinsci.plugins.ghprb.extensions.comments.GhprbBuildResultMessage' {
                        message 'Build succeeded! It is safe to merge ${ghprbSourceBranch} into ${ghprbTargetBranch}.'
                        result 'SUCCESS'
                    }
                    'org.jenkinsci.plugins.ghprb.extensions.comments.GhprbBuildResultMessage' {
                        message 'Build failed.'
                        result 'FAILURE'
                    }
                    'org.jenkinsci.plugins.ghprb.extensions.comments.GhprbBuildResultMessage' {
                        message 'Build errored. This is probably a problem with Jenkins or related infrastructure and not an issue with your code changes.'
                        result 'ERROR'
                    }
                }
            }
        }
    }
}

Но это тоже не помогло; сбой по сути тот же:

ERROR: (build.groovy, line 9) No signature of method: javaposse.jobdsl.dsl.helpers.triggers.TriggerContext.org.jenkinsci.plugins.ghprb.extensions.status.GhprbSimpleStatus() is applicable for argument types: 
(build$_run_closure1$_closure2$_closure10$_closure11$_closure12) values: 
[build$_run_closure1$_closure2$_closure10$_closure11$_closure12@707221f0]

Строка 9:

'org.jenkinsci.plugins.ghprb.extensions.status.GhprbSimpleStatus' {

Среди всего этого я изо всех сил пытаюсь понять различия между buildStatus, commitStatus, completedStatus, et c. Что это значит?

Тем временем я вернул DSL к версии без buildStatus и попытался создать PR, чтобы увидеть, запустит ли он сборку. Это не так. Я проверил "Журнал обработчиков GitHub":

Started on Aug 4, 2020 6:16:47 PM
Started by event from 10.101.32.177 ⇒ https://my-jenkins-host.com/github-webhook/ on Tue Aug 04 18:16:47 UTC 2020
Using strategy: Default
[poll] Last Built Revision: Revision 91170fb44c40737a6410acfba820d6555a0475bb (refs/remotes/origin/dev)
using credential my-credential-id
 > git --version # timeout=10
using GIT_ASKPASS to set credentials 
 > git ls-remote -h -- git@github.com:privateorg/myrepo.git # timeout=10
Found 64 remote heads on git@github.com:privateorg/myrepo.git
Ignoring refs/heads/branch1 as it doesn't match any of the configured refspecs
Ignoring refs/heads/branch2 as it doesn't match any of the configured refspecs
...
Ignoring refs/heads/branch64 as it doesn't match any of the configured refspecs
Done. Took 0.71 sec
No changes

Возможно, журнал обработчиков не подходящее место для просмотра, но использование -h в вызове git ls-remote привело только к списку филиалы - не пиры. Если я использую ту же команду локально, но без -h, будут перечислены PR, которые, я уверен, будут соответствовать моему refspe c.

Первоначально я столкнулся с этими проблемами при использовании CloudBees Core Client Master версии 2.204.3.7, ревизия 3. Обновление до последней версии (2.235.2.3) не помогло.

Используемые версии плагинов:

  • Job DSL: 1.77
  • GHPRB: 1.42.1

Если в игре есть другие плагины, которые имеют отношение к этому вопросу, дайте мне знать, и я добавлю их.

Сводка моих вопросов:

  1. Каков правильный синтаксис для настройки пользовательских сообщений о состоянии, которые будут отображаться в GitHub?
  2. Что не так с моей допустимой в остальном конфигурации, такой, что опрос пультов игнорирует PR, и что открытие нового PR не запускает сборку ?
  3. Есть ли другое место, где мне следует искать документацию по этим вещам? Или другие ресурсы, которые помогут мне узнать, что я делаю?

1 Ответ

2 голосов
/ 12 августа 2020

Понял. Было несколько проблем, но суть проблемы заключалась в аутентификации: различные плагины и компоненты принимают и требуют разные типы учетных данных. В настройке, над которой я работаю, теперь используется комбинация токенов личного доступа и пар ключей S SH для аутентификации на GitHub.

Вот как настроить аутентификацию:

  1. Сгенерируйте новую publi c -частную пару ключей . Я сделал это на своем локальном компьютере, но вы можете сделать это где угодно. Содержимое файла закрытого ключа предоставит доступ к вашей учетной записи GitHub, поэтому будьте осторожны, когда решите, где хранить файл, и очистите после себя соответственно.
  2. Go в GitHub и войдите в систему как пользователь вы хотите, чтобы Jenkins использовал для аутентификации на GitHub.
  3. Перейдите к Settings -> SSH and GPG keys. (Примечание: это настройки пользователя, а не настройки репо)
  4. Создайте новый ключ S SH. Дайте ему имя (я назвал свое в честь экземпляра Jenkins) и вставьте содержимое ключа publi c, созданного на шаге 1.
  5. Перейдите к Settings -> Developer settings -> Personal access tokens
  6. Создать новый токен. Дайте ему доступ к репо. Убедитесь, что вы записали значение токена в безопасном месте - я сохранил свое в своем диспетчере паролей. Если вы его потеряете, вам придется снова go выполнить все эти шаги, чтобы создать новый и настроить Jenkins для его использования.
    • Моя компания использует частную организацию GitHub с аутентификацией на основе SAML и системой единого входа. Если это верно и для вас, убедитесь, что вы включили единый вход в токен для соответствующей организации.
  7. В Jenkins от go до Manage Jenkins -> Manage Credentials.
  8. Создайте новые учетные данные «S SH Username with private key» в системном / глобальном домене. В поле «Имя пользователя» введите имя пользователя GitHub. Для закрытого ключа выберите «Ввести напрямую», выберите «Добавить» и вставьте текстовое содержимое файла ключей private , созданного на шаге 1.
    • Вы дадите учетные данные идентификатор и описание как часть его создания. Идентификатор используется в файлах конфигурации XML, а описание используется в пользовательском интерфейсе конфигурации Jenkins. Мне нравится использовать одно и то же значение для обоих, чтобы значение, хранящееся в файлах конфигурации XML, было таким же, как значение, которое я вижу в пользовательском интерфейсе. Идентификаторы могут быть прописными и строчными буквами плюс символы-разделители. Для лучшей читаемости используйте i-like-to-use-kebab-case.
  9. Создайте новые учетные данные «Секретный текст» в системном / глобальном домене. В поле «Секрет» введите значение токена, созданное GitHub на шаге 6. Снова дайте ему описание и идентификатор.
  10. В Manage Jenkins -> Configure System -> GitHub Pull Request Builder -> Credentials выберите учетные данные на основе токена, которые вы создали на шаге 9.

Вот DSL вакансий, который работал для PR с использованием плагина jenkins-ghprb:

scm {
    git {
        remote {
            github('privateorg/myrepo', 'ssh')
            credentials('ssh-credential-id')
            refspec('+refs/pull/*:refs/remotes/origin/pr/*')
        }
        branch('${sha1}')
    }
}

triggers {
    githubPullRequest {
        useGitHubHooks()
        orgWhitelist('privateorg')
        allowMembersOfWhitelistedOrgsAsAdmin()
        extensions {
            commitStatus {
                context('Jenkins')
                completedStatus('SUCCESS', 'Build succeeded!')
                completedStatus('FAILURE', 'Build failed. ')
                completedStatus('ERROR', 'Build errored. This is probably a problem with Jenkins or related infrastructure and not an issue with your code changes.')
            }
        }
    }
}

Примечания:

  • Все в нашей частной организации разрешено отправлять PR, которые запускают сборки автоматически. Ваша ситуация может быть другой, и в этом случае вы захотите настроить другой белый список (люди, чьи PR запускают сборки автоматически) и / или другой набор администраторов (людей, которые могут запускать сборки для участников, не внесенных в белый список).

Веб-перехватчик на стороне GitHub настроен следующим образом: screenshot of GitHub pull request webhook configuration, described below

Notes:

  • Payload URL: https://your-jenkins-host/ghprbhook/
    • Note that the host URL must be publicly accessible. Mine isn't, but we have a public-facing proxy. I used the proxy's hostname here. I also had to configure the proxy hostname in Manage Jenkins -> Configure System -> GitHub Pull Request Builder -> Jenkins URL override.
  • Content-type must be application/json.
  • The secret used here is a random string I generated with my password manager. This is optional. If supplied, you need to enter the same secret in Manage Jenkins -> Configure System -> GitHub Pull Request Builder -> Shared secret.
  • The webhook should trigger on pull requests and issue comments.
    • I've trimmed the screenshot to hide unimportant events.

The end result: screenshot of a successful Jenkins build showing up in a GitHub pull request

And this for pushes:

scm {
    git {
        remote {
            github('privateorg/myrepo', 'ssh')
            credentials('ssh-credential-id')
        }
        branch('refs/heads/*')
    }
}

triggers {
    githubPush()
}

Webhook: снимок экрана конфигурации веб-перехватчика GitHub pu sh, описанный ниже

Примечания:

  • URL-адрес полезной нагрузки: https://your-jenkins-host/github-webhook/
    • Обратите внимание, что URL-адрес хоста должен быть общедоступным. У меня нет, но у нас есть прокси, обращенный к publi c. Здесь я использовал имя хоста прокси.
  • Content-type must be application/x-www-form-urlencoded.
  • Я не настраивал секрет. Если есть способ настроить его на стороне Jenkins, я его не нашел.
  • Веб-перехватчик должен срабатывать при запросах на вытягивание и пушах.
    • Я обрезал снимок экрана, чтобы скрыть неважные события.
  • Эта конфигурация приводит к сборке для каждого sh pu, независимо от ветки. Вот чего я хотел; это может быть не то, что вы хотите. Если вам нужно что-то еще, просто измените спецификатор branch.

У меня не было ни одного задания, которое обрабатывало бы как PR, так и push, из-за различий в branch и refspec параметры. Я нашел доказательства того, что Git поддерживает несколько спецификаций ссылок, и смог заставить эту функцию работать с git в интерфейсе командной строки, но мои попытки настроить Jenkins на то же самое не увенчались успехом. У меня не было возможности создать спецификатор ветки, который работал бы для обоих. Я мог бы настроить одну параметризованную сборку, а затем иметь мини-задания, которые используют эти триггеры, а затем вызывают параметризованную сборку, но в настоящее время я не вижу смысла добавлять еще одно задание. Попутно я также создал третье задание, которое каждую ночь запускается в нашей основной ветке разработки. Мы будем создавать обширный (длительный) набор тестов для этой сборки, сохраняя при этом быстродействие разработчиков PR и pu sh.

Что касается того, где мне нужно было искать документы: я погуглил и погуглил, и собрал это вместе методом проб и ошибок с подсказками, битами и частями конфигурации, найденными в десятках мест. Я стал немного лучше читать документацию API плагина Job DSL, но этого было недостаточно. Также полезно: для задания, запускаемого pu sh, журнал обработчиков GitHub, доступный на странице сводной информации о задании Jenkins. Для задания, инициируемого PR, системный журнал Jenkins, доступный по адресу Manage Jenkins -> System Log.

...