deployment - 如何控制 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'
我们还尝试完全删除图像更改触发器,但随后推出失败,因为它无法解析实际图像。
解决方案
我现在有一个草率的解决方案,如果有人提出更好的选择,我会很高兴:
# 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
这给我留下了一些剩余的取消部署,但在功能上,它是令人满意的。
推荐阅读
- webforms - 在 Web 表单中使用 Autofac MultiTenancy 时出现 500.19 错误
- reactjs - 从嵌套类组件更改 React Context 中的值
- javascript - 如何使用反应加载执行 jquery 文件?
- django - 如何在基于 Django 类的视图中停止 post 方法默认运行
- google-apps-script - GoogleSheets google.script.run 总是去 FailureHandler
- ruby-on-rails - Rails docker postgres 连接被拒绝
- python - 使用以下数据在 Python 中查找重复项
- php - 具有有限结果的 Laravel 仍然带来结果
- google-apps-script - Google 表格取消合并和填充(上下)
- java - Firestore:是否可以使用 whereArrayContains 过滤集合中的多个字段?