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

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

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

到目前为止,我知道我需要在詹金斯创建两个工作。

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

Build作业中,我将Git存储库设置为源,并且设置了后一行脚本,脚本中只有一行composer update

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

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

3)如何获取最新版本(在build文件夹中,我仅看到几个日志和xml文件,无法从git找到文件)并移至新的目的地。
4)如何设置目标,以便可以在不同部署之间保留媒体文件。
5)在成功构建之后以及部署完成之前,我应该何时处理资产(例如发布到CDN)。这应该是一个前/后挂钩,还是其他工作。
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

起点是“在提交源代码后,詹金斯会做一些事情”。
您已经为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将其提取代码并内置的目录。
也可以在此处配置构建文件夹以及要保留的构建数量。

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

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

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

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

问题3:获取最新版本并移至新目的地

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

Q4:如何获取媒体文件

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

问题5:添加资产处理目标

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

问题6:我什么时候应该清除缓存(内存缓存,redis)

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

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

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

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

Q7.2:以及如何设置以保留最近的5个成功版本。

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

Q8:如何获得构建失败和部署电子邮件警报失败的电子邮件?

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

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

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

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

PHP-复选框组 - php

我有一个需要发布的表单复选框组。<input type="checkbox" value="true" checked name="chk0[]"> <input type="checkbox" value="false" name=…

php Singleton类实例将在多个会话中保留吗? - php

举一个简单的例子,如果我想计算一个不使用磁盘存储的脚本的命中次数,我可以使用静态类成员来执行此操作吗?用户1:<?php $test = Example::singleton(); $test->visits++; ?> 用户2:<?php $test = Example::singleton(); $test->visits+…

当使用jquery的id做某事时,id可以来自任何一种标记吗? - php

我是JQuery的新手,我正尝试使用PHP,HTML和JQuery编写代码。我想用具有ID的标签替换HTML中的所有<?php echo $var; ?>。例如,我想使用<div id="name"></div>之类的东西,然后使用$("#name")将其显示在该div字段中。我的问…

PHP中奇怪的sprintf行为 - php

我试图做sprintf("<%s>", "Sat");,但是什么也没出现。当您删除小于符号时,它将再次开始工作。任何人都经历过这种行为以及是否会发生这种情况?因为我认为这是一个错误。您甚至可以在这里使用printf .....获得相同的结果。http://writecodeonline.com/php/ 参…

jQuery不起作用 - php

我正在使用带有ajax的jquery。有时,给出错误$未定义。这是我的代码:<script language="javascript" type="text/javascript"> var base_path="<? echo $this->baseUrl().'/…