Jenkins使用Bitbucket Branch Source插件从标签构建

时间:2019-04-15 15:44:54

标签: jenkins jenkins-pipeline bitbucket jenkins-plugins

当我在bitbucket的master分支中创建标签时,我想构建jenkins管道。我的jenkins建立在master分支的提交之上,但我似乎无法将其构建用于创建标签。

这是我到目前为止所拥有的:

stage('Update DEV ECS') {
  when { branch 'dev' }
  steps {
    script{
      withAWS(region:'us-east-1') {
        def outputs = cfnUpdate(stack: 'DEV-TARGETDB-SERVICE',
          params:["ImageUrl=${env.FULL_ECR_URL}"],
          keepParams:[
            'EnvVarName1',
            'EnvVarValue1',
            'EnvVarName2',
            'EnvVarValue2',
            'EnvVarName3',
            'EnvVarValue3',
            'ContainerCpu',
            'ContainerMemory',
            'ContainerPort',
            'DatabaseHost',
            'DatabaseName',
            'DatabasePassword',
            'DatabaseUser',
            'DesiredCount',
            'HttpCode',
            'HTTPSListener',
            'Path',
            'Priority',
            'Role',
            'TaskRole',
            'ServiceName',
            'StackName',
            'DataDogAPIKey',
            'TaskCpu',
            'TaskMemory'
          ],
          timeoutInMinutes:15,
          pollInterval:1000)
      }
    }
  }
}

stage('Update TEST ECS') {
  when { branch 'master' }
  steps {
    script{
      withAWS(region:'us-east-1') {
        def outputs = cfnUpdate(stack: 'TEST-TARGETDB-SERVICE',
          params:["ImageUrl=${env.FULL_ECR_URL}"],
          keepParams:[
            'EnvVarName1',
            'EnvVarValue1',
            'EnvVarName2',
            'EnvVarValue2',
            'EnvVarName3',
            'EnvVarValue3',
            'ContainerCpu',
            'ContainerMemory',
            'ContainerPort',
            'DatabaseHost',
            'DatabaseName',
            'DatabasePassword',
            'DatabaseUser',
            'DesiredCount',
            'HttpCode',
            'HTTPSListener',
            'Path',
            'Priority',
            'Role',
            'TaskRole',
            'ServiceName',
            'StackName',
            'DataDogAPIKey',
            'TaskCpu',
            'TaskMemory'
          ],
          timeoutInMinutes:15,
          pollInterval:1000)
      }
    }
  }
}

stage('Update PROD ECS') {
  when {
    branch 'master'
    tag 'v*'
  }
  steps {
    script{
      withAWS(region:'us-east-1') {
        def outputs = cfnUpdate(stack: 'PROD-TARGETDB-SERVICE',
          params:["ImageUrl=${env.FULL_ECR_URL}"],
          keepParams:[
            'EnvVarName1',
            'EnvVarValue1',
            'EnvVarName2',
            'EnvVarValue2',
            'EnvVarName3',
            'EnvVarValue3',
            'ContainerCpu',
            'ContainerMemory',
            'ContainerPort',
            'DatabaseHost',
            'DatabaseName',
            'DatabasePassword',
            'DatabaseUser',
            'DesiredCount',
            'HttpCode',
            'HTTPSListener',
            'Path',
            'Priority',
            'Role',
            'TaskRole',
            'ServiceName',
            'StackName',
            'DataDogAPIKey',
            'TaskCpu',
            'TaskMemory'
          ],
          timeoutInMinutes:15,
          pollInterval:1000)
      }
    }
  }
}

dev和prod阶段有效,但是prod阶段无效。在生产阶段,我什至看不到詹金斯的工作(我为开发人员和主人员工作)。在詹金斯的项目下有一个“标签”部分,但是它是空的。

1 个答案:

答案 0 :(得分:0)

签出Git存储库时,可以按分支或按标签签出,但不能同时签出。当詹金斯签出分支时,它将 BRANCH_NAME 变量设置为签出分支的名称。当它签出标签时,将sets TAG_NAME BRANCH_NAME 标记为标签的名称。

documentation说:

  

如果when指令包含多个条件,则所有子条件必须返回true才能执行该阶段。

tag 条件匹配 TAG_NAME ,而 branch 条件匹配 BRANCH_NAME ,因此它们都必须在命令执行阶段。由于在签出标签时它们恰好是相同的,因此此条件设置始终为false。

解决方案取决于您要实现的目标。如果您希望在满足以下条件之一的情况下执行该阶段,则条件应为:

when {
    anyOf {
        branch 'master'
        tag 'v*'
    }
}

如果您只想在 v * 标签上运行,我将完全放弃 branch 条件。