如何从 Jenkinsfile 中标记当前 git 变更集?
How do I tag the current git changeset from inside the Jenkinsfile?
我想标记当前 git 变更集并从 Jenkinsfile 中推送标记。如果标签已经存在,则必须将其替换。
我想使用此逻辑来标记使用 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"
}
}
我要分享my Jenkins Pipeline Setup and my solution to publish changes/tags to git repo via SSH (While Git Publish Support正在开发中)。请查看更多信息,欢迎任何改进想法。
简而言之,您只需将文件 git_push_ssh.groovy
添加到您的项目并从 Jenkinsfile 中调用方法 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")
}
}
}
要使此功能适用于 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}")
}
我想标记当前 git 变更集并从 Jenkinsfile 中推送标记。如果标签已经存在,则必须将其替换。
我想使用此逻辑来标记使用 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"
}
}
我要分享my Jenkins Pipeline Setup and my solution to publish changes/tags to git repo via SSH (While Git Publish Support正在开发中)。请查看更多信息,欢迎任何改进想法。
简而言之,您只需将文件 git_push_ssh.groovy
添加到您的项目并从 Jenkinsfile 中调用方法 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")
}
}
}
要使此功能适用于 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}")
}