php - Jenkins指南,用于构建,部署,配置和回滚,保留5个发行版

标签 php git deployment jenkins continuous-integration

我对Jenkins来说还很陌生,并且有一定的了解,但还需要进一步的指导。

我在Git存储库上有一个PHP应用程序,该应用程序使用Composer,拥有 Assets ,拥有用户上传的媒体文件,具有Memcache/Redis,具有某些Agents/Workers和Migration文件。

到目前为止,我知道我需要在 Jenkins (Jenkins)创建两个工作。

职位1 =建立
工作2 =部署

Build作业中,我将Git存储库设置为源,并设置了一个 shell 程序脚本,该脚本具有一行composer update

1)我的第一个问题与如何/在何处克隆文件有关。我知道这里有一个工作区,每次都被克隆到该工作区中,或者只提取新的东西。
2) Composer 更新接缝以一次又一次加载相同的内容,并且看起来好像没有将其缓存在多个版本中。我很想听听这里的意见,但是我期望在下一个版本中它将检查更改,并且仅获取差异。进行完整的 Composer 更新需要几分钟。

Deploy作业中,我希望设置一个采用最新稳定版本的过程,并将文件移动到releases2这样的专用文件夹中。然后运行一些配置脚本,最后将/htdocs文件夹的符号链接(symbolic link)更新为新的releases2文件夹,以便Web服务器开始从此文件夹为网站提供服务。

3)如何获取最新版本(在build文件夹中,我仅看到几个日志和xml文件,无法从git找到文件)并移至新的目的地。
4)如何设置目标,以便可以在不同部署之间保留媒体文件。
5)在成功构建之后且部署完成之前,我应该何时处理 Assets (例如发布到CDN)。这应该是一个前/后 Hook ,还是其他工作。
6)我什么时候应该清除缓存(memcache,redis)。
7)如何回滚到以前的版本?以及如何设置以保留最近5个成功的版本。
8)如何获取构建失败和部署电子邮件警报失败的电子邮件?
9)在通过电子邮件成功部署之后,操作如何获取最近提交的邮件列表。

我注意到Jenkins有很多插件。不知道这些插件是否可以处理这些插件,但是可以随意推荐任何可以完成这些任务的插件。我还阅读了有关Phing的内容,但不确定是什么,并且应该使用它。

我了解这个主题有很多问题,但是如果您知道其中几个问题的答案,请张贴为答案

最佳答案

警告tl; tr

好的-您想要全部。很多问题-长话短说。

Jenkis是“仅仅是”一个连续集成服务器。

持续集成,基本上意味着您不必在开发人员计算机上运行编译和单元测试步骤,而只需将其转移到中央服务器上,对吗?
由于编译和链接现在位于中央服务器上,因此开发人员有更多时间来开发,而不必等待编译完成。这就是CI开始的方式。

现在,在查看PHP项目时,不需要任何编译或链接过程。
在PHP项目上进行持续集成的工作归结为仅进行单元测试以及可能生成一些报告。
在查看诸如Jenkins-PHP之类的帮助程序项目时,您可以清楚地看到这一点,该项目为Jenkins上的PHP项目提供了模板设置-http://jenkins-php.org/example.html

起点是“在提交源代码后,Jenkins会执行某些操作”。
您已经为Git存储库进行了配置。它受到监视,并且每当有新的提交到达时,就会触发一个新的“构建过程”。

这是什么“构建过程”?

可以在Jenkis GUI中部分配置构建过程。
部分意味着,重点是“触发”和“通知”的配置以及“报告生成”。报告生成意味着,当某些构建工具完成其工作并对其日志文件进行处理并转换为更好的格式时。

例如。当phpunit完成工作时,可以使用代码覆盖日志,将其转换为漂亮的HTML页面并将其移至/www文件夹以供公众查看。)

但是,此构建过程的大部分实际工作在构建配置文件中进行了描述。在这里,诸如“Phing”,“ant”(phing的老大哥)和“nant”(win)之类的构建工具开始发挥作用。

构建工具为脚本任务提供了基础。
这就是您自动化的地方!
您将必须自己编写自动化步骤的脚本。
Jenkins只是位于其上的GUI,提供一些按钮来显示build.log和报告,然后重新启动构建。

换句话说:您不能简单地将Jenkins和PHP项目放在一起,希望可以在GUI上一起单击构建和部署过程。
我们还不在那里!这些工具越来越好,但是还有很长的路要走。

让我们来讨论一下詹基斯。让我们专注于构建步骤。

仅在CLI上时,将如何构建和部署项目?
做吧!您可能需要写下所有涉及简单文本文件的命令和步骤。
现在,将这些步骤变成自动化步骤。
在项目的根文件夹中创建一个“build.xml”。

<?xml version="1.0" encoding="UTF-8"?>
<project name="name-of-project">

   ... build steps ..

</project>

现在我们需要一些构建步骤。
构建工具将它们称为“目标”。构建目标将任务分组。
您可以自己执行每个目标,也可以链接它们。
<?xml version="1.0" encoding="UTF-8"?>
<project name="name-of-project" default="build">

   <target name="build">
       <!-- tasks -->
   </target>

   <target name="deploy">
       <!-- tasks -->
   </target>

</project>

规则:将目标保持较小-在一个目标中最多5-7个cli命令。

现在让我们介绍具有依赖关系的目标链。
假设您的任务“build”应该在之前运行“phpunit”。
在CLI上,您只需运行phpunit,然后运行构建命令。
在构建配置内部,您必须将调用包装到exec任务中。
因此,您将创建一个“phunit”目标,并将其作为依赖项添加到目标“build”中。
依赖关系在目标指定依赖关系之前执行。
<?xml version="1.0" encoding="UTF-8"?>
<project name="name-of-project" default="build">       

   <target name="phpunit" description="Run unit tests with PHPUnit">
      <exec executable="phpunit" failonerror="true"/>
   </target>

   <target name="build" depends="phpunit">
       <!-- tasks -->
   </target>

   <target name="deploy">
       <!-- tasks -->
   </target>

</project>

像Phing这样的构建工具提供了许多核心任务,例如chown,mkdir,delete,copy,move,exec(...)和其他任务(对于git,svn,notify)。请参阅Phing http://www.phing.info/docs/master/hlhtml/index.html或Ant http://ant.apache.org/manual/的文档

使用Phing的好处是可以在构建配置文件中用PHP编写AdhocTasks并运行它们。使用ant也可以,只需构建一个执行PHP和脚本的exec任务即可。

好的-让我们快进:您在此构建配置中重新创建了完整的构建和部署过程。您现在可以独立使用目标命令。现在,我们切换回Jenkins CI或任何其他CI服务器并对其进行配置,以运行具有目标任务的构建工具。通常,您会有一个默认目标,称为mainbuild,它将所有目标(步骤)链接在一起。

现在,当新的提交到达时,Jenkins通过执行构建脚本开始构建过程。

有了这些信息,有关Jenkins如何与构建工具进行交互的信息,
您的某些问题不解自明。您只需要创建步骤即可完成所需的工作...

让我们开始问答环节:

Q1:Jenkins工作区文件夹

工作区是项目所在的地方。新提交到达那里。
在“高级”下,为项目选择一个工作目录,而无需更改Jenkins主目录。选中“使用自定义工作区”框,并设置Jenkins将其提取代码并内置的目录。
也可以在此处配置构建文件夹以及要保留的构建量。

第2季度: Composer
Composer保留一个本地缓存-它位于$COMPOSER_HOME/cache中。当使用相同的依赖项时,将使用本地缓存。这样可以避免重新下载它们。如果引入了新的依赖项或更改了版本,则将在composer installcomposer update上获取并重新使用。

Composer的安装/更新总是从网络或缓存中进行的。
供应商文件夹没有保持 Activity 状态。依赖项将被删除并重新安装。
如果要花很长时间,那就要花很长时间。故事的结局。

如果需要很长时间,请一次使用Composer,然后添加新的构建目标“zip-copy-vendor-folder”和“copy-unzip-vendor-folder”。我想,您可以想象这些事情会发生什么。
现在,您必须为压缩的供应商文件引入if检查。如果存在供应商zip文件,则跳过 Composer 的安装目标,然后继续执行“copy-unzip ..”。这是一项调整。.仅当您的依赖项相当稳定且相距较远时才执行此操作。

通常,您将需要一个构建目标“get-dependencies-with-composer”,该目标将执行composer install。缓存将由Composer自动使用。

第3季度:获取最新版本并移至新的目的地

最新的版本位于build文件夹中;或者,如果您定义了移动文件的步骤,则该文件已经在所需的文件夹中。

Q4:如何获取中的媒体文件

只需添加用于将媒体文件夹复制到项目中的构建目标即可。

Q5:添加用于 Assets 处理的构建目标

您已经知道位置了:它是“构建后”。这意味着这是部署步骤,对吗?添加一个新目标以通过FTP将您的文件夹上传到您的CDN。

问题6:何时清除缓存(内存缓存,redis)

我建议采用一种简单的策略:“部署-刷新缓存-重新缓存缓存”策略。

PHP应用程序的热交换很复杂。当系统开始运行两个版本时,您必须具有一个支持更改基础组件的PHP类。旧版本逐渐淡出缓存,新版本逐渐淡出。
请单独问这个问题!
这并不像人们想象的那么容易。
它很复杂,也是Rasmus Lerdorf最受欢迎的主题之一。

Q7.1:如何回滚到以前的版本?

通过在先前版本的文件夹中运行部署目标/任务。

Q7.2:如何设置保持最近5个成功的发行版。

Jenkins在构建文件夹中设置了“保留多少个构建”。
将其设置为5。

问题8:如何获取构建失败和部署电子邮件警报失败的电子邮件?

自动地。电子邮件通知是默认的。如果我错了,请查看通知程序“电子邮件”。

** Q9:在通过电子邮件成功部署后,操作如何获取最近提交的邮件列表。 **

添加一个构建目标“通过电子邮件发送到git-log-via-to-operations”。

我觉得,就像我今天写了一本书...

关于php - Jenkins指南,用于构建,部署,配置和回滚,保留5个发行版,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25068310/

相关文章:

php - SELECT 一个任意深的树,用mysql中的邻接表模型表示?

php - 如何从 Laravel 4 包回滚迁移?

git - 清理 git 存储库中的二进制 blob

ruby-on-rails - 英雄联盟 "stack level too deep"错误

.net - 如何从中央位置更新 .net Windows 服务

php - 数组和 "undefined index"之和

php - 在 PHP 中访问关联数组

git - 如何从 Git 中的特定修订检索单个文件?

git - 并行获取多个 Git 远程

django - 静态文件未在 AWS Lightsail 上提供