首页 > 解决方案 > 如何控制 openshift 推出(CI/CD 管道)?

问题描述

我们一直在使用带有图像更改触发器的部署配置,以便当新图像出现在配置的图像流中时,将触发新的推出。这工作相对较好,但现在我们遇到了新的挑战。管道应等待部署完成并将成功/失败反映为作业结果。

到目前为止,我们已经想到在构建图像时暂停推出。然后一旦构建,取消暂停推出并明确推出,然后等待推出完成:

# To work well with previously auto triggered deployments, pause rollouts if present
oc rollout pause dc "$SOURCE_NAME" || true

# apply deployment config
# TODO: Pass all the template parameters
oc process -f delivery-automation/openshift/jdk-service-template.yml -p "SOURCE_NAME=$SOURCE_NAME" -p "IMAGE_NAME=$IMAGE_NAME" | oc apply -f - --validate
# tag the correct image version as latest
# https://docs.openshift.com/container-platform/3.4/dev_guide/application_lifecycle/promoting_applications.html
oc tag "$OC_PROJECT_STORAGE/$IMAGE_NAME:$SOURCE_VERSION" "$IMAGE_NAME:latest"

# gogogogo
oc rollout resume dc "$SOURCE_NAME" || true
#new deployment with latest image
oc rollout latest "$SOURCE_NAME"
#check for rollout is success
oc rollout status "dc/$SOURCE_NAME" --watch

这几乎可以工作,除了它仍然会触发映像更改的部署,然后oc rollout latest由于另一个部署已经在进行中而失败。

编辑:该命令oc rollout resume实际上开始推出图像更改!

我们也尝试修改触发器以不自动触发,但无济于事:

  triggers: 
    - type: ImageChange
      imageChangeParams:
        automatic: false
        containerNames:
          - ${SOURCE_NAME}
        from:
          kind: ImageStreamTag
          name: '${IMAGE_NAME}:latest'

我们还尝试完全删除图像更改触发器,但随后推出失败,因为它无法解析实际图像。

标签: deploymentcontinuous-integrationopenshift

解决方案


我现在有一个草率的解决方案,如果有人提出更好的选择,我会很高兴:

# reconfigure service and deployment
- oc process -f service-template.yml -p "SOURCE_NAME=$SOURCE_NAME" -p "IMAGE_NAME=$IMAGE_NAME" | oc apply -f - --validate
# tag current version as latest
- oc tag "$OC_PROJECT_STORAGE/$IMAGE_NAME:$SOURCE_VERSION" "$IMAGE_NAME:latest"
# cancel any pending rollout, last one wins!
- oc rollout cancel dc "$SOURCE_NAME" || true
# cancel any pending rollout, make sure cancel completed
- oc rollout status "dc/$SOURCE_NAME" --watch || true
# trigger new rollout
- oc rollout latest "$SOURCE_NAME" -o json | jq -r '"Rollout started - " + (.status.latestVersion | @text)'
# follow up on latest rollout
- oc rollout status "dc/$SOURCE_NAME" --watch

这给我留下了一些剩余的取消部署,但在功能上,它是令人满意的。


推荐阅读