Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php laravel项目的CI/CD如何使其稳定_Php_Laravel_Docker_Jenkins - Fatal编程技术网

Php laravel项目的CI/CD如何使其稳定

Php laravel项目的CI/CD如何使其稳定,php,laravel,docker,jenkins,Php,Laravel,Docker,Jenkins,我想用詹金斯来完成我的拉威尔项目 我用管道来做这个。正如你们所知,拉威尔不需要构建步骤。我也不使用测试。我只想有一个阶段('deploy')。在推送到存储库时,jenkins主机收到通知,提取项目并运行驻留在laravel项目中的jenkins管道。由于我的jenkins主机和laravelapi主机彼此不同,这就是我面临的问题所在 正如我所说,我没有build和test阶段。因此,只有在管道中部署。但是要运行laravel项目,在使用jenkins之前,我有bash脚本,其中有10行代码。例如

我想用詹金斯来完成我的拉威尔项目

我用管道来做这个。正如你们所知,拉威尔不需要构建步骤。我也不使用测试。我只想有一个
阶段('deploy')。
在推送到存储库时,
jenkins
主机收到通知,提取项目并运行驻留在
laravel
项目中的jenkins管道。由于我的
jenkins主机
laravelapi
主机彼此不同,这就是我面临的问题所在

正如我所说,我没有
build
test
阶段。因此,只有
管道中部署
。但是要运行
laravel
项目,在使用
jenkins
之前,我有
bash
脚本,其中有10行代码。例如
(更改权限、将当前用户设置为我的用户、运行composer安装、运行docker compose等等)
。由于我有另一台Laravel主机,我有两个选项:

1) 在
stage('deploy')
中,我可以将build.sh文件从jenkins主机传输到laravel api主机。然后将ssh放入LaravelAPI主机并在那里运行该文件。我不喜欢的一点是,如果在build.sh文件中设置权限或其他内容中途出错,会使我的项目处于不希望的状态,甚至不会得到通知,我会将损坏的项目投入生产

2) 我可以在
stage('build')
运行
'composer install和其他东西
,然后从中创建
dockerfile(包括供应商文件夹),然后在获取映像(其中也包含供应商)后,将此docker映像上载到dockerhub,然后在stage('deploy')中我可以通知远程主机,并将jenkins的脚本文件传递给laravel远程主机,其中包含从dockerhub提取最新图像并运行它的代码。这样,我就不会有不希望的状态,因为该图像已经包含供应商文件夹,它已经获得了权限和所有这些东西。这样做的问题是,制作图像将占用大量硬盘空间。想象一下为存储库上的每次推送创建图像


您建议我做什么?

标准做法是您的选项2,为每个构建创建一个新的映像。通常,在Docker中,您根本不会独立地复制源代码;您构建图像并仅处理这些图像。(Docker for development的“Docker for development”模式是构建和镜像,然后用本地源代码树替换其所有内容,这完全不是Docker在生产环境中的常用方式。)

您应该确保为每个映像提供一个唯一的标识符,如构建的时间戳或某种源代码管理提交ID。这几乎是一些更高级别的自动化系统(例如Kubernetes)所必需的,并且可以很容易地回滚损坏的构建


在您描述的工作流中,您可以将几乎任何类型的文件打包到一个映像中,然后将它们发送给运行人员。有一个很大的价值,在某种形式的验证阶段,以确保尴尬的打字错误不会导致一个永远不会开始的图像。我的意思是…编写测试:-)

标准实践是您的选择2,为每个构建创建一个新映像。通常,在Docker中,您根本不会独立地复制源代码;您构建图像并仅处理这些图像。(Docker for development的“Docker for development”模式是构建和镜像,然后用本地源代码树替换其所有内容,这完全不是Docker在生产环境中的常用方式。)

您应该确保为每个映像提供一个唯一的标识符,如构建的时间戳或某种源代码管理提交ID。这几乎是一些更高级别的自动化系统(例如Kubernetes)所必需的,并且可以很容易地回滚损坏的构建


在您描述的工作流中,您可以将几乎任何类型的文件打包到一个映像中,然后将它们发送给运行人员。有一个很大的价值,在某种形式的验证阶段,以确保尴尬的打字错误不会导致一个永远不会开始的图像。我的意思是…写测试:-)

谢谢你的回答。但我不明白你所说的“标准实践是你的选择2,为每个构建创建一个新映像”是什么意思。通常在Docker中,你根本不独立复制源代码;你构建映像并只处理这些映像。(Docker for development)构建和映像,然后用本地源代码树替换其所有内容的模式根本不是Docker在生产环境中通常使用的方式。)”。如果我为每个推送存储库制作构建映像,我的jenkins主机将是超级巨大的,而且没有任何原因——我不会在这里运行project一旦你将映像推送到存储库,你就可以安全地对docker系统进行修剪以回收空间。所以你喜欢我的选项2。制作映像(安装软件包,运行composer安装,然后将我的源代码和供应商文件夹一起移动到该映像中)并将该映像推送到docker hub?让系统修剪?你喜欢这样吗?如果答案是肯定的,那么docker hub呢?如果我每天第100次推送到github存储库,想象一下一个月后,我在docker hub中有3000张图片。想象一年,谢谢你的回答。但我不明白你所说的“标准实践是你的选择2,为每个构建创建一个新映像”是什么意思。通常在Docker中,你根本不独立复制源代码;你构建映像并只处理这些映像。(Docker for development)构建和映像,然后用本地源代码树替换其所有内容的模式根本不是Docker在生产环境中通常使用的方式。)”。