在TeamCity中防止意外构建

14
我想创建一个手动触发的Team City构建,将我们的网站部署到其生产环境。我有些犹豫,因为我担心人们会意外触发构建。
我知道我可以通过限制大多数人的访问权限或使部署过程稍微困难一些(例如两个步骤)来半解决这个问题。
是否有更好的技巧?是否可以使用“您确定吗?”样式的对话框?

1
永远不要在生产环境中批量自动部署。将其部署到暂存环境,然后手动推送上线。这是我的意见。 - Ian Atkin
@Gordon,恕我直言,如果不了解Dan的安排情况,这可能是一个过于笼统的陈述。 - John Hoerr
可能是这样,但我不得不处理由此可能导致的混乱。 - Ian Atkin
嗨,丹——只是想问一下。你能否建立一个良好的流程? - John Hoerr
4个回答

27

首先,你应该采纳约翰·霍尔的建议,除非只有很少一部分人需要运行它,否则防止其他人运行。

但我们可以做得更好,防止那些本应能够运行构建的人误点。添加一个配置参数复选框。这样,当有人点击“运行”按钮时,它会快速失败。他们必须点击运行按钮上的省略号,然后在像“您确定吗?”的消息旁边单击复选框。

为此,使用类似于confirm的名称添加参数,然后单击“编辑”链接。在弹出窗口中,单击Spec旁边的编辑按钮。将类型改为Checkbox。将检查值设置为true,将未选中值设置为false。或者其他对您有意义的值。

单击保存以保存规范,然后返回编辑参数弹出窗口。将设置为false。这是复选框的默认值。

作为脚本中的第一件事,检查参数%confirm%是否设置为字符串"true"或是否设置为"false"。如果它是"false",您想立即exit 1:运行构建的人没有选中confirm复选框。

如果愿意,您可以每次使运行自定义构建弹出窗口出现。要这样做,在编辑参数规范窗口中,将显示更改为Prompt。默认值仍将不执行部署,但对话框将每次弹出。

您还可以使文本框旁边显示的标签不是参数名称,而是任意字符串。在 编辑参数规格 弹出窗口中,将 label 设置为类似于 你发誓要这样做吗? 的内容。


1
好的建议。我们还设置了一个“确认”参数,因为我们刚刚经历了一次尴尬的情况,当时有人(我)误点击了错误的按钮,导致应用不慎部署到了生产环境。此外,我已经从仪表板中删除了生产部署构建配置,作为额外的预防措施。 - Michael12345
1
我已经使用确认复选框实施了建议,并拥有一个 Nant 脚本,根据此复选框失败构建。这很好用,但是否有办法确保复选框始终默认为“false”,因为目前它的默认值是先前选中状态。 - John Askew
1
@JohnAskew 我不确定——我已经不再使用TeamCity,也没有可以用来测试的实例。发表一个新问题,希望有人会回答你。或者,联系TeamCity支持或提交错误报告。 - zck
2
我已经做过类似的事情,只不过我要求部署人员在生产部署时输入目标域名。 - Mario
2
刚刚在Teamcity 2022.04 (build 108502)上测试了这个解决方案,如果您按照说明并在“编辑参数”窗口中定义默认值为false,则可以防止下次单击运行时复选框被选中。因此,您始终需要检查复选框。 - Daniel Z.
显示剩余6条评论

4
我们的操作是一个两步骤的过程。这两个步骤的访问权限仅限于我们的部署团队。让我们以生产 Web 服务器代码为例:
  1. 从 Teamcity 手动运行构建,将生产代码构建并部署到一个非公开面向生产服务器——“Deploy”服务器上。由于我们在生产环境中广泛使用缓存和 CDN,因此与我们的 “Staging” 环境有所不同。
  2. 从 Teamcity 手动运行第二个“构建”,实际上只是触发一个命令行/powershell 脚本,将代码从“Deploy”服务器部署到生产服务器。
由于这两个构建都有访问限制,几乎完全防止了意外部署到生产环境。例如,如果其中一位有权访问生产构建的工程师之一进入并意外运行第二个部署脚本而没有运行第一个构建,则它将只重新部署来自 deploy 服务器的代码,这是已经存在于生产环境中的代码。这不会造成任何损害。
虽然我确信我们部署流程中涉及的所有工程师,但我喜欢采用两步骤的生产流程以提高安全性。预防胜于治疗。

3

我认为你使用TeamCity的基于角色的访问控制来防止大多数人运行生产部署是正确的做法。对于有特权的团队成员,我鼓励他们从仪表板中隐藏/删除Deploy to Prod配置。你可以通过点击配置右侧的X来实现这一点。对我们来说,这是一种有效防止随意误操作的方式。当你想要运行Deploy to Prod构建时,可以直接浏览项目页面。


-1

针对生产环境,我们需要确认所部署的域。以下是实现此目的的简单方法:

  1. 编辑部署构建步骤。
  2. 单击以添加新的配置参数。
  3. 设置以下参数规范:
    • 标签:确认目标
    • 描述:确认正在部署到的生产环境。
    • 显示:提示
    • 类型:文本
    • 允许值:正则表达式
    • 模式:[输入您的域名(请记得在句点前加斜杠)]
    • 验证消息:部署到错误的域,蠢货!

3
Teamcity保存下次部署的值…有没有办法每次清除该值?我想让用户每次进行生产部署时都要输入“production”…但第二个部署将自动填充该值。 - Alex Spence
@AlexSpence 很抱歉,我没有解决那个令人烦恼的问题的方法。 - Mario
3
为了避免构建参数的记忆化,我强制用户输入一些随每次部署而改变的内容...即依赖构建的构建计数器。以下是我的Bash构建步骤:if [ %confirm% != %dep.Builds_Ci.build.counter% ]; then echo 确认正确的构建计数器号码失败,应该是%dep.Builds_Ci.build.counter% exit 1; fi - bradw2k

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接