Переменные Git в плагине рабочего процесса Jenkins
Я хотел бы получить доступ к переменным git, таким как GIT_COMMIT и GIT_BRANCH, когда я проверил репозиторий из git дальше в потоке сборки. В настоящее время я не нахожу доступной переменной для доступа к этим двум параметрам.
node {
git git+ssh://git.com/myproject.git
echo "$GIT_COMMIT - $BRANCH_NAME"
}
доступны ли такие переменные и в случае, если я их найду. Я не возражаю, если они доступны через некоторые заводные переменные или где-то еще, просто я могу получить к ним доступ.
возможно, мне не хватает навыков отладки в Groovy и это легко найти, но я просто не могу найти его с моими ограниченными навыками.
7 ответов
в зависимости от используемого плагина SCM,checkout
step может возвращать дополнительную информацию о ревизии. Это было решено в Дженкинс-26100. Он был выпущен в 2.6 версия workflow-scm-step
плагин.
например, используя плагин Git, вы можете сделать что-то вроде:
final scmVars = checkout(scm)
echo "scmVars: ${scmVars}"
echo "scmVars.GIT_COMMIT: ${scmVars.GIT_COMMIT}"
echo "scmVars.GIT_BRANCH: ${scmVars.GIT_BRANCH}
это будет зависеть от используемого вами плагина, поэтому оригинальный ответ может работать лучше для вас.
Оригинал Ответ
С 2.4-релиз конвейерные узлы и процессы Plugin, вы можете просто сделать:
def gitCommit = sh(returnStdout: true, script: 'git rev-parse HEAD').trim()
Это то, что я делаю, на основании пример, приведенный в примерах Jenkins repo:
node {
git url: 'https://git.com/myproject.git'
sh 'git rev-parse --abbrev-ref HEAD > GIT_BRANCH'
git_branch = readFile('GIT_BRANCH').trim()
echo git_branch
sh 'git rev-parse HEAD > GIT_COMMIT'
git_commit = readFile('GIT_COMMIT').trim()
echo git_commit
}
этот пример может помочь вам в дальнейшем: https://github.com/jenkinsci/pipeline-examples/tree/master/pipeline-examples/gitcommit
в этом примере они передают выходные данные команд git в файл, а затем читают файл.
вы можете определить свои задания (извлечение информации git из последнего фиксации) внутри node
для выполнения в очереди.
node {
//Code checkout from SCM (here - `git`)
checkout scm
stage("GIT INFO"){
echo ":::::::::::GIT_SHORT_COMMIT::::::::::::::::::::::::"
GIT_SHORT_COMMIT = sh(returnStdout: true, script: "git log -n 1 --pretty=format:'%h'").trim()
//echo in jenkins console
echo GIT_SHORT_COMMIT
//wanted to send these info to build artifacts, append to any file
sh("echo ${GIT_SHORT_COMMIT} > GIT_SHORT_COMMIT")
//Similar proceed for other git info's
echo ":::::::::::GIT_COMMITTER_EMAIL::::::::::::::::::::::::"
GIT_COMMITTER_EMAIL = sh(returnStdout: true, script: "git show -s --pretty=%ae").trim()
sh("echo ${GIT_COMMITTER_EMAIL} > GIT_COMMITTER_EMAIL-${GIT_COMMITTER_EMAIL}")
echo ":::::::::::GIT_COMMITTER_NAME::::::::::::::::::::::::"
GIT_COMMITTER_NAME = sh(returnStdout: true, script: "git show -s --pretty=%an").trim()
sh("echo ${GIT_COMMITTER_NAME} > GIT_COMMITTER_NAME-${GIT_COMMITTER_NAME}")
}
после того, как ваша работа будет завершена, вы увидите три дополнительных файла сверху задачи в рабочей области:
.
|-- GIT_COMMITTER_EMAIL_email@gmail.com
|-- GIT_COMMITTER_NAME-username
|-- GIT_SHORT_COMMIT_<commit-short-ID-ef9e91c>
в зависимости от необходимой вам информации существует очень простое решение: получить возврат операции "checkout scm": он предоставляет git_branch, GIT_COMMIT, GIT_PREVIOUS_COMMIT, GIT_PREVIOUS_SUCCESSFUL_COMMIT и GIT_URL.
node {
stage ("Checkout") {
scmInfo = checkout scm
/*...*/
echo "scm : ${scmInfo}"
echo "${scmInfo.GIT_COMMIT}"
}
}
это будет выход:
...
[Pipeline] echo
scm : [GIT_BRANCH:my-branch, GIT_COMMIT:0123456789abcdefabcdef0123456789abcdef01, GIT_PREVIOUS_COMMIT:aaaabbbcccdddeeeefffe0123456789012345678, GIT_PREVIOUS_SUCCESSFUL_COMMIT:aaaabbbcccdddeeeefffe0123456789012345678, GIT_URL:http://my.si.te/my-repository.git]
[Pipeline] echo
0123456789abcdefabcdef0123456789abcdef01
...
подробнее здесь шаги SCM трубопровода Дженкинса
Я хороший способ исправить это сейчас-использовать многоотраслевой конвейер, и было бы неплохо знать, что Bitbucket и Github имеют плагины в Jenkins, которые настраивают организацию и автообнаружают новые проекты. Это работает изначально с env.GIT_BRANCH
для commit ID я бы предложил то, что @mkobit написал выше.
самый простой способ получить переменную Git в Jenkins через Jenkinsfile
node {
def scmVars = checkout scm
echo 'scm : the commit id is ' +scmVars.GIT_COMMIT
echo 'scm : the commit branch is ' +scmVars.GIT_BRANCH
echo 'scm : the previous commit id is ' +scmVars.GIT_PREVIOUS_COMMIT
def commitEmail = sh(returnStdout: true, script: "git --no-pager show -sformat=\'%ae\'")
echo " the commiter email is'${commitEmail}'"
def commitName = sh(returnStdout: true, script: "git --no-pager show -s format=\'%an\'")
echo " the commiter name is'${commitName}'"
}
в консоли вы получите
GIT_COMMIT:
GIT_BRANCH:
GIT_PREVIOUS_COMMIT:
commitEmail:
commitName: