使用 Concourse 和 Cloud Foundry 进行持续部署的最佳实践

Best practices for continuous deployment with Concourse and Cloud Foundry

所以我最近一直在调查 ci/cd 使用 concourse 和 cloud foundry 的管道,但我一直对最好的方法是什么感到困惑。所以我一直在思考从开发到发布的整体流程是怎样的。有很多演讲和视频在非常高的层次上讨论了这个问题,但它们通常抽象掉了太多实际的实现细节,以至于没有用。就像人们实际上如何在实际公司中推出它一样?我有很多问题,所以我在这里尝试列出其中的一些,希望有人能给我一点启发。

  1. 从概念上讲,从开发到生产的整个过程和管道是什么样的?到目前为止,我有一些类似的东西:

    • 在开发过程中,每个产品团队都在自己的组织下,每个开发人员可能都有自己的开发 "space",他们可以手动 cf push 并针对这些开发进行开发。将有开发人​​员可以直接推送到的开发 spaces 以及只能由自动化管道使用的 spaces 来部署功能测试的工件。

    • 一旦开发人员完成一项功能,他们将发出拉取请求,这将触发一个较小的管道,并使用 git-multibranch-resourcegit-pullrequest-resource 之类的东西进行一些测试,这将钩入 github 所需的状态检查钩子并报告是否有任何特定的 PR 能够合并到 master 中

    • 一旦所有检查都通过并且拉取请求被合并到 master 中,下面的管道就会启动,在将工件发布到 prod 之前验证 master 分支。

code repo [master] -> build -> snapshot artifact repo -> deploy to test space -> run functional tests -> deploy to staging space -> run smoke tests and maybe other regression tests -> deploy artifact to prod -> monitoring/rollbacks (?)

  1. 还有哪些东西could/should要添加到这个管道或这个过程的任何部分?

  2. 一旦你自动化部署,你如何在发生某些事情时也自动化诸如金丝雀发布或回滚之类的事情?这应该是管道的一部分还是完全独立的东西?

  3. 我一直在考虑临时创建 space 然后在功能测试阶段拆除它们,这样做有什么好处吗?这个想法是,正在部署的应用程序将有自己干净的环境供使用,但这也可能很慢,而且很难知道每个 space 内部需要什么服务。您将不得不阅读仅指定服务名称的清单,这似乎需要某种规范的方式在同一 space 中命名服务实例?另一种方法是管理一个 space 的池,这看起来也很复杂......

  4. 管道是否应该生成清单文件?还是应该完全取决于开发人员?只有开发人员知道应用程序需要哪些服务,但似乎实例数、内存等应该是性能 tests/pipeline 应该能够 determine/automate 的东西。您可以在管道内生成清单,但如果不阅读清单,您将不知道应用程序需要哪些服务....鸡和蛋的问题?

我还有很多亟待解决的问题,但我暂时将其打断。我知道主题在 Concourse 和 Cloud Foundry 之间来回摇摆不定,但似乎在讨论 CI/CD 概念时,具体的实施细节通常是实际棘手的部分,它们将两者紧紧地纠缠在一起。我也知道具体的实施细节通常因每个公司而异,但如果人们能谈谈他们如何在他们的公司使用 Concourse 和 Cloud Foundry 实施这些管道/自动化管道,那就太好了(如果你能省下当然是细节)。谢谢大家!

During development each product team is under their own org, with each developer possibly having their own development "space" that they could manually cf push to and just develop against. There will be development spaces that devs can just directly push to as well as spaces that can only be used by the automated pipeline to deploy artifacts for functional tests.

老实说,如果您在 CloudFoundry 中创建多个组织并不重要。如果您的 CI/CD 系统 运行 与其他开发人员(滥用)使用的同一控制器相同,您可能会遇到困难(我在那里)。

Once devs finish a feature they would make a pull request, which would trigger a smaller pipeline with some tests using something like the git-multibranch-resource or the git-pullrequest-resource, which would hook into the github required status check hooks and report back if any particular PRs are able to be merged into master or not

我们正在做几乎完全相同的事情。对于 PR 的结账,请在此处查看 jtarchie 的 PR 资源 https://github.com/jtarchie/github-pullrequest-resource。 唯一的区别是我们没有使用 Github 检查。他们的问题是,您必须 select 为分支固定一组检查。

但如果我只是在 PR 中更改清单 xyz,我不想 运行 所有测试。您可以通过仅将 Git 中心状态 API 用于待处理和成功状态来解决该问题。

Once all checks pass and the pull request is merged into master the below pipeline is kicked off, which validates the master branch before releasing the artifact to prod.

我们将 PR 放入开发分支并遵循 Git 流程系统。我们的版本手动合并到 master 中。

在将每个 PR 合并到 master 并触发生产系统更新之前,您要先检查要执行哪些更新。你的测试用例可能很好,但你总是会遗漏一些东西。

What other things could/should be added to this pipeline or any part of this process?

您可以有一个管道自动更新清单中的 releases/stemcells。

Once you automate deployment how do you do also automate things like canary releases or rollbacks once something happens? Should this be part of the pipeline or something completely separate?

在投入生产之前在暂存系统上测试您的东西。否则你 a) 不知道更新是否在零停机时间发生,b) 防止生产中的潜在问题总是比回滚更好。

当然你也可以创建一个回滚管道,但如果你到了那个点,你的设置可能有其他问题。

Should the pipeline generate the manifest files? Or should that be completely up to the developers? Only the developers know which services the app needs, but also it seems like things like instance count, memory etc should be something that the performances tests/pipeline should be able to determine/automate. You could generate a manifest inside the pipeline, but then you would not know which services the app needs without reading a manifest....chicken and egg problem?

我们自己编写清单并使用 CI/CD 系统来 update/deploy/test 它们。

但是,如果您找到一个有效的案例和一个概念,可以让您在许多情况下应用您的清单生成管道,我会尝试一下。

最后,您必须决定某种雾化是否对您的公司具有商业价值。

干杯,丹尼斯