Jenkins Job DSL Git Plugin - Как объединить перед сборкой - PullRequest
0 голосов
/ 30 апреля 2019

Во-первых, это не повторяющийся вопрос о функции "объединить перед сборкой".Я гуглил и просмотрел все, что нашел в отношении этой функции.Но никто не говорит о моей проблеме.

У нас есть Bitbuck Server + Jenkins, и я написал работу для наших PR на Bitbucket:

job('pull-request-job') {
    scm {
        git {
            remote {
                name 'origin'
                credentials 'jenkins-ssh'
                url 'ssh://git@stash.example.com/my/repository.git'
                refspec '+refs/pull-requests/*/from:refs/remotes/*'
            }

            branch '**/pull-requests/**'

            extensions {
                mergeOptions {
                    remote 'origin'
                    branch 'master'
                }
            }
        }
    }

    triggers {
        scm ''
    }

    steps {
        shell './mvnw -e clean verify'
    }
}

Краткое примечание: мы не практикуем gitflowили что-нибудь в этом роде.В основном (но не всегда) это всего лишь один master и ветви, над которыми работают разработчики.

Цель: я хочу иметь задание, которое запускается сервером Bitbucket для каждого pull-запроса.В работе я хочу проверить ветку my (ту, над которой я работал и которая будет объединена с веткой master) и запустить тесты.Конфигурация по умолчанию делает работу довольно хорошо.Теперь, прежде чем запускать тесты, я хочу получить последние изменения из ветви master (или любой другой ветви, в которую будет объединена ветка my) в ветку my.Как я могу это сделать?Наличие вышеуказанного описания работы не будет работать.Пример сборки:

commit notification 1606dd8
[EnvInject] - Loading node environment variables.
Building in workspace /var/lib/jenkins/workspace/pull-request-job
using credential jenkins-ssh
> git rev-parse --is-inside-work-tree # timeout=10
Fetching changes from the remote Git repository
> git config remote.origin.url ssh://git@stash.example.com/my/repository.git # timeout=10
Fetching upstream changes from ssh://git@stash.example.com/my/repository.git
> git --version # timeout=10
using GIT_SSH to set credentials Jenkins User SSH Private Key
> git fetch --tags --progress ssh://git@stash.example.com/my/repository.git +refs/pull-requests/*/from:refs/remotes/*
> git rev-parse 1606dd8^{commit} # timeout=10
> git branch -a -v --no-abbrev --contains 1606dd8 # timeout=10
Merging Revision 1606dd8 (3, 2, 1) to origin/master, UserMergeOptions{mergeRemote='origin', mergeTarget='master', mergeStrategy='default', fastForwardMode='--ff'}
> git rev-parse origin/master^{commit} # timeout=10
> git config core.sparsecheckout # timeout=10
> git checkout -f origin/master
> git merge --ff 1606dd8 # timeout=10
> git rev-parse HEAD^{commit} # timeout=10
Seen branch in repository 1
Seen branch in repository 2
Seen branch in repository 3
Seen branch in repository origin/master
Seen 4 remote branches
> git show-ref --tags -d # timeout=10
Checking out Revision 1606dd8 (1, 2, 3, origin/master)
> git config core.sparsecheckout # timeout=10
> git checkout -f 1606dd8
Commit message: "Upgrade maven"
> git rev-list --no-walk 1606dd8 # timeout=10
> git rev-list --no-walk 1606dd8 # timeout=10
> git rev-list --no-walk 1606dd8 # timeout=10
[pull-request-job] $ /bin/sh -xe /tmp/jenkins3480907669634770028.sh
+ ./mvnw -e clean verify

После регистрации Jenkins после слияния моей ветви с master снова проверяет фиксацию origianl (git checkout -f 1606dd8) и продолжает сборку.Журнал показывает, что это действительно код без изменений из создаваемой ветви master.

Вопросы:
1. Почему он проверяет исходный коммит после слияния?Почему он не продолжает сборку на объединенном коде?
2. Как сделать параметр branch в mergeOptions динамическим, чтобы это всегда была ветвь other в pull-запросе?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 01 мая 2019
> git config core.sparsecheckout 
// Checked out but no local branch yet
> git checkout -f 663303d

// Only when local branch is defined
> git branch -a -v --no-abbrev 
// Checkout 663303d into local branch master
> git checkout -b master 663303d

Git Plugin делает его очень многословным, но создает новый репозиторий, извлекающий все ветви и теги, но не имеет пока локальных ветвей, только удаленные ссылки.

> git checkout -f 663303d

Проверяет фиксацию, но нет доступной локальной ветки. Сейчас мы находимся в отстраненном состоянии, потому что нет местного отделения.

> git checkout -b master 663303d

Создает локального мастера ветвления из ранее извлеченного (отсоединенного заголовка) коммита 663303d

Почему Git Plugin делает это так, потому что они реализовали это таким образом. Если вы хотите получить разъяснения, возможно, напишите им сообщение.

Почему мое Git-репо перешло в отключенное состояние HEAD?

0 голосов
/ 30 апреля 2019

Понятия не имею почему, но как-то это решает проблему. Добавить localBranch к scm.git.extensions записи:

    extensions {
      cleanBeforeCheckout()

      localBranch() // or localBranch('${PR_DESTINATION}')

      mergeOptions {
        remote('origin')
        branch('${PR_DESTINATION}')
      }
    }

И журнал:

commit notification 1606dd8
[EnvInject] - Loading node environment variables.
Building in workspace /var/lib/jenkins/workspace/rad-test-1-pr
[WS-CLEANUP] Deleting project workspace...
[WS-CLEANUP] Deferred wipeout is used...
using credential jenkins-ssh
Cloning the remote Git repository
Cloning repository ssh://git@stash.example.com/my/repository.git
> git init /var/lib/jenkins/workspace/rad-test-1-pr # timeout=10
Fetching upstream changes from ssh://git@stash.example.com/my/repository.git
> git --version # timeout=10
using GIT_SSH to set credentials Jenkins User SSH Private Key
> git fetch --tags --progress ssh://git@stash.example.com/my/repository.git +refs/heads/*:refs/remotes/origin/*
> git config remote.origin.url ssh://git@stash.example.com/my/repository.git # timeout=10
> git config --add remote.origin.fetch +refs/heads/*:refs/remotes/origin/* # timeout=10
> git config remote.origin.url ssh://git@stash.example.com/my/repository.git # timeout=10
Cleaning workspace
> git rev-parse --verify HEAD # timeout=10
No valid HEAD. Skipping the resetting
> git clean -fdx # timeout=10
Fetching upstream changes from ssh://git@stash.example.com/my/repository.git
using GIT_SSH to set credentials Jenkins User SSH Private Key
> git fetch --tags --progress ssh://git@stash.example.com/my/repository.git +refs/pull-requests/*/from:refs/remotes/*
> git rev-parse 1606dd8^{commit} # timeout=10
> git branch -a -v --no-abbrev --contains 1606dd8 # timeout=10
Merging Revision 1606dd8 (4, 3, 2, 1, origin/first-branch) to origin/master, UserMergeOptions{mergeRemote='origin', mergeTarget='master', mergeStrategy='default', fastForwardMode='--ff'}
> git rev-parse origin/master^{commit} # timeout=10
> git config core.sparsecheckout # timeout=10
> git checkout -f origin/master
> git merge --ff 1606dd8 # timeout=10
> git rev-parse HEAD^{commit} # timeout=10
Seen branch in repository 1
Seen branch in repository 2
Seen branch in repository 3
Seen branch in repository 4
Seen branch in repository origin/first-branch
Seen branch in repository origin/master
Seen 6 remote branches
> git show-ref --tags -d # timeout=10
Checking out Revision 663303d (origin/master)
> git config core.sparsecheckout # timeout=10
> git checkout -f 663303d
> git branch -a -v --no-abbrev # timeout=10
> git checkout -b master 663303d
Commit message: "Merge commit '1606dd8' into HEAD"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...