我不是詹金斯大师所以请耐心等待。 :-)
我有一个管道,几乎就像这样简单:
def hash = ''
node {
stage('Checkout') {
…
}
stage('Build') {
…
}
stage('Tests') {
…
}
}
stage('Ask deploy') {
input 'Deploy?'
}
node {
stage('Deploy') {
}
}
我想在第一个节点中设置哈希变量的值,如果手动输入为正,则在下一个节点中读取它。这可能和安全吗?这是正确的方法吗?
请注意,涉及多个执行程序和手动输入。在Jenkins docs中,它暗示了一个节点:
只要执行者在节点上空闲,步骤就会一直运行。
这意味着两个节点可以在不同的执行器中运行,对吗?他们仍然共享相同的全局变量吗?提前感谢您的任何澄清!
答案 0 :(得分:0)
如果Jenkins中有多个从属设备,则管道将在其中一个从属设备中启动。每个奴隶都不同。
你管道中的每个阶段都会在同一个奴隶中启动,所以如果你有变量" hash"在您的管道的第一行,您将无法在所有管道中读取它,但如果您必须从不同的构建中访问此变量值,则无法访问。
如果您需要一个全局变量来在不同的版本中读取它,您可以使用Global Variables String Parameter Plugin
定义一个全局变量答案 1 :(得分:0)
hash
变量是全局的,它的值在不同的执行器中可用,这对我来说似乎是合乎逻辑的。所以看起来我做的就是好的,除非我错过了什么,否则它会以这种方式工作。
以下是我验证的内容(为了简洁起见,详细信息):
我创建了一个类似的管道并杀死了运行第一个节点的执行程序:
def gitHash;
node {
withCredentials(...) {
//Step 1:
//Check out from the SCM
stage('Prepare') {
echo "Checking out the project from source control.."
scmInfo = checkout scm
gitHash = scmInfo.GIT_COMMIT
echo "Project checked out, the GIT hash of the last commit is: ${gitHash}"
}
}
}
stage('Ask deploy') {
input 'Deploy?'
}
node {
withCredentials(...) {
stage('Deploy') {
echo "TODO, hash ${gitHash}"
}
}
}
Jenkins的输出如下(详情跳过):
Obtained Jenkinsfile from 7adc4bb98524b31de93e0c1ae16bf967ca3df47c
Running on jnlp-13775fa128a47 in /root/workspace/...
[Pipeline] {
[Pipeline] withCredentials
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Prepare)
[Pipeline] echo
Project checked out, the GIT hash of the last commit is: 7adc4bb98524b31de93e0c1ae16bf967ca3df47c
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] stage
[Pipeline] { (Ask deploy)
[Pipeline] input
Deploy?
Proceed or Abort
Approved by admin
[Pipeline] }
[Pipeline] // stage
[Pipeline] node
Running on jnlp-1383bdf520c9d in /root/workspace/...
[Pipeline] {
[Pipeline] withCredentials
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Deploy)
[Pipeline] echo
TODO, hash 7adc4bb98524b31de93e0c1ae16bf967ca3df47c
[Pipeline] End of Pipeline
Finished: SUCCESS
如第一个节点在执行器jnlp-13775fa128a47
上运行,第二个节点在jnlp-1383bdf520c9d
上运行,但可以在那里读取全局范围变量的值。