Переменные 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: