【问题标题】:How to control openshift rollout (CI/CD pipeline)?如何控制 openshift 推出(CI/CD 管道)?
【发布时间】:2019-06-10 08:51:34
【问题描述】:

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

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

# 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'

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

【问题讨论】:

  • 如果在图像流更新后有其他东西控制新部署何时发生,您通常会从资源定义中完全删除整个 ImageChange 触发器,而不是暂停它,并依赖仅限手动触发。
  • 感谢@GrahamDumpleton,我已经尝试过了,但是openshift 是通过触发器来解析要使用的图像。没有触发器,推出失败并出现 Imge 拉回退错误。它无法弄清楚图像。我将无法简单地指定图像流来推出,但必须提供完整的图像路径,这是我想避免的,以保持所有环境相同。
  • 您可能会考虑在触发部署之前使用oc set image 更新部署中的映像。

标签: deployment continuous-integration openshift


【解决方案1】:

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

# 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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    • 2020-09-01
    相关资源
    最近更新 更多