您的某些问题没有直接答案,但可以通过一些额外的编码来实现。虽然某些人可能会找到其他方法来实现,但让我尝试一下我的想法:
1) How can I run the stage I prefer? For instance Greeting instead of starting from Preparation?
这可以通过添加一个布尔参数 FASTFORWARD_TO_GREETING 来实现,而不是使用执行构建时提供的值来操纵构建流程。所以你的代码现在看起来像:
if (FASTFORWARD_TO_GREETING == 'false') {
stage('Preparation'){
echo """
Preparing
something
"""
}
}
stage('Greeting') {
parallel 'hello1':{
node{
echo 'hello world 1'
}
}, 'hello2':{
node{
echo 'hello world 2'
}
}
}
2) How do you define the dependencies between stages? I mean the stage called after another one completes
阶段是按顺序执行的,因此如果首先定义一个阶段,它将首先启动并完成,然后再进入下一个阶段。然而,在并行步骤中,这并不成立,因为所有步骤都将并行执行。因此,在您的示例代码中,您定义的依赖项是“准备”阶段将首先执行,然后只有“hello1”和“hello2”步骤将并行执行。但是,不能保证会打印哪个“hello world1”或“hello world 2”。
3) Is there a way to limit the stages that a certain user can start? Imagine that I only want a specific user to launch the Greeting stage.
您可以在某个阶段之前进行手动批准步骤。例如,在您的代码中,您希望执行阶段准备工作,而不是希望在执行阶段问候之前手动批准它,您的代码将如下所示:
stage('Preparation'){
echo """
Preparing
something
"""
}
stage concurrency: 1, name: 'approve-greeting'
input id: 'greeting-deploy', message: 'Proceed to Greeting?', ok: 'Deploy'
stage('Greeting') {
parallel 'hello1':{
node{
echo 'hello world 1'
}
}, 'hello2':{
node{
echo 'hello world 2'
}
}
}
之后会发生什么,当您执行构建时,阶段准备将被执行,但之后该作业将等待手动批准才能继续。在 Jenkins Pipeline 视图中,该阶段将被称为“approve-greeting”,它会等到有人通过在视图中单击它来批准构建。
4) How do you setup manual stages?
我相信这在答案 3 中得到了回答?
如果您需要更多信息/解释,请告诉我。
编辑:: 请在下面找到更多答案:
构建阶段(任何用户都可以启动)当它完成时它会自动触发验收阶段。
显然,构建阶段和验收阶段都将被定义为 Jenkins 管道中的正常阶段。所以你的代码很简单,比如:
node {
//define any variable here
// Get source code from repo using checkout to directory say stackoverflow
// Get source code from repo for acceptance test using checkout to directory say stackoverflow-test
//Define any tool like Maven etc. location if required.
dir('stackoverflow') {
stage name: 'build'
//Do required steps
}
dir('stackoverflow-test') {
stage name: 'Acceptance'
//Do required steps here
}
此时,当 Acceptance Stage OK 完成时,可能会发生两件事:
也许需要 QA 阶段来运行更多测试(Cucumber、手动等)。一些授权用户会触发这个阶段。
当产品负责人满意时,他可以决定启动生产阶段以在生产环境中部署代码。
你可以通过输入选项来做到这一点,所以在上面的代码之后你现在可以编写:
stage 'promotion'
def userInput = input(
id: 'userInput', message: 'Let\'s promote?', parameters: [
[$class: 'BooleanParameterDefinition', defaultValue: false, description: 'Production', name: 'prod'],
[$class: 'BooleanParameterDefinition', defaultValue: false, description: 'ManualQA', name: 'qa']
])
echo ("Env: "+userInput['prod'])
echo ("Target: "+userInput['qa'])
你可以从上面获取值并再次操纵流程。像 :
如果 prod 的值为真,则进入生产阶段,如果 qa 的值为真,则进入QA-Manual阶段,就像我上面的 FASTFORWARD_TO_GREETING 示例代码一样。
编辑 2
在评论部分进一步回答问题:
1) 如何或在哪里指定 FASTFORWARD_TO_GREETING 等参数
诸如 FASTFORWARD_TO_GREETING 之类的参数将被定义为作业级别参数
2) 在推广阶段,您必须在 ManualQA 和 Production 之间进行选择。如果用户选择 ManualQA,它将运行该阶段跳过生产。之后,如果他想提升到生产阶段,我希望用户得到提示。如果您可以提供管道的完整定义,那就太好了。
您可以在 MaualQA 阶段之后使用另一个输入步骤进行操作,但这次只使用一个参数。因此,在阶段 Promotion 之后,会有阶段 ManualQA,然后是以下输入步骤:
def userInput1 = input(
id: 'userInput', message: 'Let\'s promote?', parameters: [
[$class: 'BooleanParameterDefinition', defaultValue: false, description: 'Production', name: 'prod']
])
3)如何确定用户是否有权运行阶段。理想情况下,我想根据角色来做
我不确定如何使用角色来执行此操作,但我相信任何具有管理员访问权限或运行该作业的人都可以访问/批准该阶段,但我不能 100% 确定是否可以以某种方式对其进行修改。