我的 Jenkins 是否从我的 SCM 构建结帐?

Are my Jenkins builds checkouts from my SCM?

试图在我的生产服务器中理解这个 CI thing so I've downloaded Jenkins...

1。生产服务器中是否安装了 Jenkins(或任何其他 CI 系统),或者我应该有一个单独的服务器用于 Jenkins 构建? 如果 Jenkins 在另一台服务器上,我如何将构建集成为我的 运行ning 生产代码?或者这 CI 事情与部署无关?

然后我在 /var/lib/jenkins/.ssh 创建了一个 SSH 密钥作为部署密钥添加到我的 Bitbucket (Git) 存储库...

2。这是正确的做法吗?

...并在项目设置的 Git 插件中使用 jenkins 用户凭据设置存储库 URL git@bitbucket.org:...。 到目前为止一切顺利,我的构建将项目检出到 Jenkins workspace,然后我注意到每个构建它 运行 都是一个检出,对于每个检出,作为一个 Composer 支持的项目,我的 vendors/ 目录不存在,所以我没有 phpunit.xml 用作 bootstrap 的 autoload.php 文件来加载 类 和 运行 测试。因此,除了 phpunit 作为构建 shell 命令之一,我还添加了 composer init.

3。这是正确的吗?我应该在每个构建中 运行 composer init 吗?

主要问题可能是:我的建筑是从绿地 space 建造的吗?我是否应该签出 运行 composer install 以及我的项目每次(每次构建)都必须使用的任何脚本?

谢谢!

  1. Is Jenkins (or any other CI system) installed in the production server or I should have a separate server for Jenkins builds? If Jenkins is in another server, how can I integrate the builds as my running production code? Or this CI thing does have nothing to do with deploys?

Then I created a SSH key at /var/lib/jenkins/.ssh added to my Bitbucket >(Git) repository as Deployment key...

  1. Is this the correct approach?

没错。我有一堆这样配置的服务器。在不久的将来,我想调查是否可以使用 SSH Credentials Plugin 将我的凭据存储在那里,这样我就不必关心该密钥的文件系统权限。

  1. Is this right? Should I run composer init on every build?

The main question maybe is: are my builds constructed from greenfield space? Should I checkout and run composer install and whatever scripts my project must take to be running every time (every build)?

这取决于您的要求。您可以有多个构建,或者对您构建的参数进行参数化以支持不同的行为。例如,我有 Laravel 构建,这取决于环境参数,他们可能会使用 Selenium 或简单地 运行 phpunit.

进行进一步测试

对于每个 PHP 应用程序,我通常在 Jenkins 中有两个项目。一个检查来自 git 的代码,清除工作区中其他构建的任何遗留物,并调用 Laravel 的 Envoy 来构建项目。它基本上做的是调用 composer install 和一些额外的参数,并调用迁移和数据库种子例程来准备应用程序以进行测试。

另一个作业在我提升(使用 Jenkins Promoted Builds 插件)构建时触发,它复制(使用 Copy Artifacts Plugin)在构建期间创建并已经过测试的工作区,并通过 scp 将其部署到QA 服务器中的文件夹。然后它会更新一些符号链接,最后就可以测试了。

随着时间的推移以及来自开发人员和其他团队的更多要求,您将熟悉许多其他插件,例如 Email-ext Plug-in,以发送自定义通知并包含有关构建的更多信息。

最佳实践会为 Jenkins 指定一个单独的 VM,只是为了使其与可能部署到的其他环境分开。

Jenkins 可以使用脚本关闭其他服务,因此关闭您正在部署项目的 tomcat 运行ning Jenkins 会……不方便。

我属于支持链接在一起的多个 Jenkins 作业的阵营。一份工作建立。另一个测试。第三个部署。这样您就可以确切地知道哪个工作有问题。您还可以查看工作 运行 次,更好地了解什么花费了这么长时间(是部署?是单元测试?)并从更高的 POV 解决问题。

我在 2015 年博伊西代码训练营上发表了 Jenkins 最佳实践演示,可在此处获取: http://lanyrd.com/2015/boise-code-camp/sdkggb/