【发布时间】: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