我对Jenkins来说还很陌生,并且有一定的了解,但需要进一步的指导。
我在Git存储库上有一个PHP应用程序,该应用程序使用Composer,拥有资产,具有用户上传的媒体文件,使用Memcache / Redis,具有某些Agents / Workers和Migration文件。
到目前为止,我知道我需要在詹金斯创建两个工作。
作业1 =构建 作业2 =部署
在Build工作中,我将Git存储库设置为源,并设置了后一行脚本,脚本只有一行composer update。
Build
composer update
1)我的第一个问题与如何/在何处克隆文件有关。我知道这里有一个工作区,每次都被克隆到该工作区中,或者只提取新的东西。 2)作曲家更新接缝以一次又一次加载相同的内容,并且看起来好像没有将其缓存在多个版本中。我很想听听这里的意见,但我期望在下一个版本中它将检查更改,并仅获取差异。进行完整的作曲家更新需要几分钟。
在Deploy工作中,我希望设置一个采用最新稳定版本的过程,并将文件移动到专用文件夹中releases2。然后运行一些配置脚本,最后,它将/ htdocs文件夹符号链接更新为新releases2文件夹,以便Web服务器开始从此文件夹为网站提供服务。
Deploy
releases2
3)如何获取最新版本(在build文件夹中,我仅看到几个日志和xml文件,无法从git找到文件)并移至新的目的地。 4)如何设置目标,以便可以在不同部署之间保留媒体文件。 5)在成功构建之后以及部署完成之前,我应该何时处理资产(例如发布到CDN)。这应该是一个前/后挂钩,还是其他工作。 6)我什么时候应该清除缓存(memcache,redis)。 7)如何回滚到以前的版本?以及如何设置以保留最近5个成功的版本。 8)如何获取构建失败和部署电子邮件警报失败的电子邮件? 9)在通过电子邮件成功部署后,操作如何获取最近提交的邮件列表。
我注意到Jenkins有很多插件。不知道这些插件是否可以处理这些插件,但是可以随意推荐任何可以完成这些任务的插件。我还阅读了有关Phing的内容,但不确定是什么,并且应该使用它。
我了解这个主题有很多问题,但是如果您知道其中几个问题的答案,请张贴为答案
警告tl; tr
好的-您想要全部。很多问题-长话短说。
Jenkis“只是”一个持续集成服务器。
持续集成,基本上意味着您不必在开发人员计算机上运行编译和单元测试步骤,而是将其转移到中央服务器上,对吗?由于编译和链接现在位于中央服务器上,因此开发人员有更多时间来开发,而不必等待编译完成。这就是CI开始的方式。
现在,在查看PHP项目时,不需要任何编译或链接过程。在PHP项目上进行持续集成的工作归结为仅进行单元测试以及可能生成一些报告。你可以清楚地看到,在寻找帮手项目,如詹金斯的PHP,这provdies对詹金斯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”中。依赖关系在目标指定依赖关系之前执行。
phpunit
exec
<?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服务器并对其进行配置,以运行具有目标任务的构建工具。通常,您将有一个默认目标,称为main或build,它将所有目标(步骤)链接在一起。
main
build
现在,当新的提交到达时,Jenkins通过执行构建脚本开始构建过程。
有了这些有关Jenkins如何与构建工具交互的信息,您的一些问题是不言而喻的。您只需创建步骤即可完成所需的工作…
让我们开始问答环节:
Q1:Jenkins工作区文件夹
工作区是项目所在的地方。新提交到达那里。在“高级”下,为项目选择一个工作目录,而无需更改Jenkins主目录。选中“使用自定义工作区”框,并设置Jenkins将代码提取到其中并进行构建的目录。还可以在此处配置构建文件夹以及保留的构建数量。
Q2:Composer Composer保留一个本地缓存- 它位于中$COMPOSER_HOME/cache。当使用相同的依赖项时,将使用本地缓存。这样可以避免重新下载它们。如果引入了新的依赖项或更改了版本,则将在composer install和上获取并重新使用composer update。
$COMPOSER_HOME/cache
composer install
Composer的安装/更新总是从网络或缓存中进行的。供应商文件夹没有保持活动状态。依赖项将被删除并重新安装。如果要花很长时间,那就要花很长时间。故事的结局。
如果需要很长时间,请一次使用Composer,然后添加新的构建目标“ zip-copy-vendor-folder”和“ copy-unzip- vendor- folder”。我想,您可以想象这些事情会发生什么。现在,您必须为压缩的供应商文件引入if检查。如果存在供应商的zip文件,则跳过作曲家的安装目标,然后继续执行“ copy-unzip ..” ..好的,就可以了。这是一个调整..仅当您的依赖项相当稳定并且相距不远时才执行此操作。
通常,您将需要一个执行目标,即“带有撰写者的依赖关系” composer install。缓存将由Composer自动使用。
问题3:获取最新版本并移至新目的地
最新的版本位于build文件夹中;或者,如果您定义了移动文件的步骤,则该文件已经在所需的文件夹中。
Q4:如何获取媒体文件
只需添加用于将媒体文件夹复制到项目中的构建目标即可。
问题5:为资产处理添加构建目标
您已经知道位置了:这是“构建后”。这意味着这是部署步骤,对吗?添加一个新目标以通过FTP将您的文件夹上传到CDN。
问题6:我什么时候应该清除缓存(内存缓存,redis)
我建议采用一种简单的策略:“部署-刷新缓存-重新武装缓存”策略。
PHP应用程序的热交换很复杂。当系统开始运行两个版本时,您必须具有一个支持更改基础组件的PHP类。旧版本逐渐淡出缓存,新版本逐渐淡出。请单独问这个问题!这并不像人们想象的那么容易。它很复杂,也是Rasmus Lerdorf最受欢迎的主题之一。
Q7.1:如何回滚到以前的版本?
通过在先前版本的文件夹中运行部署目标/任务。
Q7.2:以及如何设置以保留最近的5个成功版本。
Jenkins在构建文件夹中设置了“保留多少个构建”。设置为5。
Q8:如何获取构建失败和部署电子邮件警报失败的电子邮件?
自动。电子邮件通知是默认的。如果我错了,请查看通知程序“电子邮件”。
Q9:在通过电子邮件成功部署后,操作如何获取最近提交的邮件列表。
添加一个构建目标“通过电子邮件发送到git-log-log-to-operations”。
我觉得,就像我今天写了一本书…