如何从Jenkins文件中标记当前git变更集?

如何从Jenkins文件中标记当前git变更集?,jenkins,jenkins-workflow,jenkins-pipeline,jenkinsfile,Jenkins,Jenkins Workflow,Jenkins Pipeline,Jenkinsfile,我想标记当前git变更集,并从Jenkins文件内部推送该标记。如果标签已经存在,则必须将其替换 我想使用这个逻辑来标记通过snapshot标记传递的构建,这将是一个移动标记 我怎样才能做到这一点呢?以下是我实现这一点的方法,但如果你知道更好的方法,我非常愿意听到 #!groovy stage 'build' node { repositoryCommiterEmail = 'ci@example.com' repositoryCommiterUsername = 'exam

我想标记当前git变更集,并从Jenkins文件内部推送该标记。如果标签已经存在,则必须将其替换

我想使用这个逻辑来标记通过
snapshot
标记传递的构建,这将是一个移动标记


我怎样才能做到这一点呢?

以下是我实现这一点的方法,但如果你知道更好的方法,我非常愿意听到

#!groovy

stage 'build'
node {

    repositoryCommiterEmail = 'ci@example.com'
    repositoryCommiterUsername = 'examle.com'

    checkout scm

    sh "echo done"

    if (env.BRANCH_NAME == 'master') {
        stage 'tagging'

        sh("git config user.email ${repositoryCommiterEmail}")
        sh("git config user.name '${repositoryCommiterUsername}'")

        sh "git remote set-url origin git@github.com:..."

        // deletes current snapshot tag
        sh "git tag -d snapshot || true"
        // tags current changeset
        sh "git tag -a snapshot -m \"passed CI\""
        // deletes tag on remote in order not to fail pushing the new one
        sh "git push origin :refs/tags/snapshot"
        // pushes the tags
        sh "git push --tags"
    }
}
我想分享我的解决方案,通过SSH将更改/标记发布到git repo(正在开发中)。请查看更多信息,欢迎提出任何改进意见

简而言之,您只需将文件
git\u push\u ssh.groovy
添加到您的项目中,并从Jenkins文件中调用方法
pushSSH()
,如下所示:

env.BRANCH_NAME = "mycoolbranch"// BRANCH_NAME is predefined in multibranch pipeline job
env.J_GIT_CONFIG = "true"
env.J_USERNAME = "Jenkins CI"
env.J_EMAIL = "jenkins-ci@example.com"
env.J_CREDS_IDS = '02aa92ec-593e-4a90-ac85-3f43a06cfae3' // Use credentials id from Jenkins
def gitLib = load "git_push_ssh.groovy"
...
gitLib.pushSSH(commitMsg: "Jenkins build #${env.BUILD_NUMBER}", tagName: "build-${env.BUILD_NUMBER}", files: "changelog.txt someotherfile.txt");

对于无法实现上述功能的用户,我直接使用了sshagent插件,它实现了以下功能:

stage('tag build'){
checkout([
    $class: 'GitSCM', branches: [[name: '*/master']],
    userRemoteConfigs: [[credentialsId: 'git',
    url: 'ssh://<ssh URL>']],
    extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'targeted-dir']]
])

sshagent(credentials: ['<credentials ID.']){
  dir('targeted-dir'){
    sh("git config user.email '<email>")
    sh("git config user.name '<user>.com'")

    // deletes current snapshot tag
    sh ("git tag -d ${PARAM_VERSION_NUMBER} || true")
    // tags current changeset
    sh ("git tag -a ${PARAM_VERSION_NUMBER} -m \"versioning ${PARAM_VERSION_NUMBER}\"")
    // deletes tag on remote in order not to fail pushing the new one
    sh ("git push origin :refs/tags/snapshot")
    // pushes the tags
    sh ("git push --tags")
    }
}
stage('tagbuild'){
结帐([
$class:'GitSCM',分支:[[name:'*/master']],
userRemoteConfigs:[[CredentialId:'git',
url:'ssh://']],
扩展:[$class:'RelativeTargetDirectory',relativeTargetDir:'targeted dir']]
])

sshagent(凭据:['要使其在blue ocean(使用https连接)上运行,请使用以下命令:

sshagent(credentials: ["406ef572-9598-45ee-8d39-9c9a227a9227"]) {
                def repository = "git@" + env.GIT_URL.replaceFirst(".+://", "").replaceFirst("/", ":")
                sh("git remote set-url origin $repository")
                sh("git tag --force build-${env.BRANCH_NAME}")
                sh("git push --force origin build-${env.BRANCH_NAME}")
            }

这很有趣。如何对远程设备进行身份验证(如何发送密码)?您应该设置SSH密钥,这样您就不必输入任何密码或将其存储在任何地方。这不是一个备选答案,而是一个视角的改变:当您在Nexus上发布一个快照时,它不会在上载新快照之前删除旧快照,而是使用时间戳保留所有快照。使用git标记也可以很容易地完成同样的事情s、 我添加了上面的示例阶段,以清楚地显示如何添加标记,因为我花了一点时间,查看了链接代码上面的示例,才使其正常工作。它还需要安装jenkins的“ssh代理”插件。