Pen*_*m10 7 php git deployment continuous-integration jenkins
我对詹金斯很新,并且有一些理解但需要进一步指导.
我在Git仓库上有一个PHP应用程序,它使用Composer,有Assets,有用户上传的媒体文件,使用Memcache/Redis,有一些代理/工作人员,并且有迁移文件.
到目前为止,我知道我需要在Jenkins创造两个职位.
作业1 =构建
作业2 =部署
在Build作业中,我将Git repo设置为源代码,并设置了一个包含一行的post shell脚本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,但不确定是什么,我是否应该使用它.
我知道这个主题有很多问题,但是如果你知道其中一些问题的答案,请发帖回答
Jen*_*och 17
警告tl; tr
好的 - 你想要的一切.很多问题 - 长篇大论.
Jenkis"只是"一个连续的集成服务器.
持续集成,基本上意味着您不必在开发人员计算机上运行编译和单元测试步骤,而是将其转移到中央服务器,对吧?由于编译和链接现在位于中央服务器上,因此开发人员有更多时间进行开发,而不是等待编译完成.这就是这个CI事情的起源.
现在,在查看PHP项目时,没有涉及任何编译或链接过程.从事PHP项目的Continous Integration的工作归结为仅进行单元测试,也可能是一些报告生成.您可以清楚地看到,在查看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上一起点击你的构建和部署过程.我们还不在那里!工具越来越好,但这还有很长的路要走.
让我们暂时关注Jenkis.让我们关注构建步骤.
当您只在CLI上时,您将如何构建和部署项目?做吧!您可能希望记下简单文本文件中涉及的所有命令和步骤.现在,将这些步骤转换为自动化步骤.在项目的根文件夹中创建"build.xml".
<?xml version="1.0" encoding="UTF-8"?>
<project name="name-of-project">
... build steps ..
</project>
Run Code Online (Sandbox Code Playgroud)
现在我们需要一些构建步骤.构建工具将它们称为"目标".构建目标对任务进行分组.您可以自己执行每个目标,也可以链接它们.
<?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>
Run Code Online (Sandbox Code Playgroud)
规则:保持目标较小 - 在一个目标中最多5-7个cli命令.
现在让我们介绍具有依赖关系的目标链.让我们假设,您的任务"构建"之前应该运行"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>
Run Code Online (Sandbox Code Playgroud)
像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将所有目标(步骤)链接在一起.
现在,当新提交到来时,Jenkins通过执行构建脚本来启动构建过程.
鉴于这些信息,关于Jenkins如何与构建工具交互,您的一些问题是自我解释的.你只需要创建步骤,为了完成,你想要的...
让我们开始问答回合:
Q1:Jenkins工作区文件夹
Workspace是项目所在的地方.新的提交到达那里.在"高级"下,为项目选择一个工作目录,而不更改Jenkins主目录.选中"使用自定义工作区"框并设置Jenkins将代码拉入并生成的目录.还可以在那里配置构建文件夹以及要保留的构建量.
Q2:Composer
Composer保留了一个本地缓存 - 它存在于其中$COMPOSER_HOME/cache.当使用相同的依赖项时,将使用本地缓存.这样可以避免重新下载它们.如果一个新的依赖被引入或版本改变,那么,事情变得牵强,将被重新使用,就composer install和composer update.
Composer安装/更新总是来自网络或缓存.供应商文件夹没有存活.删除并重新安装依赖项.如果需要很长时间,则需要很长时间.故事的结局.
如果需要很长时间,请使用Composer一次性,然后添加新的构建目标"zip-copy-vendor-folder"和"copy-unzip-vendor-folder".我想,你可以想象这些事情的作用.现在,您必须为压缩供应商文件引入if检查.如果供应商zip文件存在,则跳过作曲家安装目标并继续"copy-unzip .."..好吧,你知道了.这是一个调整..只有当你的依赖关系非常稳定而且经常不改变时才这样做.
通常,您将需要一个构建目标"get-dependencies-with-composer",它将执行composer install.Composer将自动使用缓存.
Q3:获取最新版本并移至新目的地
最新版本位于构建文件夹中 - 或者,如果您定义了移动文件的步骤,则它已在您所需的文件夹中.
Q4:如何获取媒体文件
只需添加一个构建目标,即将媒体文件夹复制到项目中.
Q5:为资产处理添加构建目标
你已经知道了这个位置:它是"构建后".这意味着它是一个部署步骤,对吗?添加新目标以上传您的文件夹可能通过FTP上传到您的CDN.
Q6:何时清除缓存(memcache,redis)
我建议使用一个简单的:"部署 - 刷新缓存 - rewarm缓存"策略.
PHP应用程序的Hotswapping很复杂.您必须有一个PHP类支持更改底层组件,而系统开始运行两个版本.旧版本从缓存中淡出,新版本逐渐消失.请单独询问此问题!这并不像人们想象的那么容易.这很复杂,也是Rasmus Lerdorf最受欢迎的话题之一.
Q7.1:如何回滚到以前的版本?
通过在先前版本的文件夹中运行部署目标/任务.
Q7.2:我如何设置以保持最近5个成功发布.
Jenkins在build文件夹中设置了"要保留多少个构建".将其设置为5.
问题8:如何获取构建失败和部署电子邮件警报失败的电子邮件?
自动.电子邮件通知是默认的 如果我错了,请查看通知程序"电子邮件".
**问题9:在通过电子邮件成功部署后,操作如何获取最新提交消息列表.**
添加构建目标"send-git-log-via-email-to-operations".
我觉得,就像我今天写了一本书......