写在前面:

本文所用php项目是禅道开源版,源码在gitlab管理,项目运行环境为linux。

jenkins宿主机为linux。

php项目发布不需要编译,如果有代码修改,在服务器上替换文件即可。

在此前提下,我们希望实现,当我们提交代码到gitlab上之后,不用手工打包发给运维,由运维替换代码文件,而是我们直接在jenkins上点击构建,由jenkins拉取代码,再自动发布新代码到php所在的服务器。

php项目所在的服务器以下简称目标机。

对宿主机要求:安装git,安装Jenkins,生成ssh-key。

对目标机要求:配置宿主机的ssh-key。

目录

一、 jenkins配置

1-1、jenkins和gitlab交互配置:凭据

1-2、jenkins及其宿主机和目标机交互配置

1-2-1、jenkins宿主机生成ssh-key

1-2-2、jenkins宿主机连接目标机

1-2-3、jenkins配置 Publish over SSH

二、jenkins新建Item及配置

三、构建


一、 jenkins配置

jenkins在这里充当一个中间商的作用,既要和gitlab交互,又要和php项目所在的服务器交互,所以存在这两个联系。

我们选择jenkins和gitlab交互:使用用户名密码。

jenkins和目标机交互:使用ssh连接。

1-1、jenkins和gitlab交互配置:凭据

入口:【Manage Jenkins】- 【Security】 - 【Manage Credentials】-【Jenkins】- 【全局凭据(unrestricted)】- 【添加凭据】

jenkins pipline 自动加载分支 jenkins自动部署php_目标机

jenkins pipline 自动加载分支 jenkins自动部署php_禅道_02

jenkins pipline 自动加载分支 jenkins自动部署php_php_03

jenkins pipline 自动加载分支 jenkins自动部署php_php_04

jenkins pipline 自动加载分支 jenkins自动部署php_linux_05

jenkins pipline 自动加载分支 jenkins自动部署php_目标机_06

1-2、jenkins及其宿主机和目标机交互配置

1-2-1、jenkins宿主机生成ssh-key

第一步:查看jenkins宿主机是否已有ssh-key

进入/root/.ssh目录,查看是否有id_rsa,id_rsa.pub文件。如果有,则直接看【1-2-2、jenkins宿主机连接目标机】。

第二步:生成ssh-key

输入命令:ssh-keygen -t rsa -b 4096,回车,会遇到询问【输入Passphrase密码:】,这里我们不输入。

[root@iZ2ze1u5un7bz1scr79p3fZ ~]# ssh-keygen -t rsa -b 4096

查看/root/.ssh 目录下,会发现已经生成了id_rsa和id_rsa.pub两个文件。(known_hosts是因为我用宿主机连接过其他机器,所以生成了known_hosts,记录连接信息。)

jenkins pipline 自动加载分支 jenkins自动部署php_目标机_07

1-2-2、jenkins宿主机连接目标机

第一步:查看jenkins宿主机的公钥id_rsa.pub信息,并复制下来。

[root@iZ2ze1u5un7bz1scr79p3fZ .ssh]# cat id_rsa.pub

jenkins pipline 自动加载分支 jenkins自动部署php_php_08

第二步:把宿主机的公钥信息粘贴到目标机的authorized_keys文件中

1、先确认目标机是否有authorized_keys文件,进入/root/.ssh查看。如果没有则新建一个空文件,命名为authorized_keys

jenkins pipline 自动加载分支 jenkins自动部署php_目标机_09

2、编辑目标机的authorized_keys,把宿主机公钥信息粘贴到authorized_keys中,第3个就是刚刚复制的jenkins宿主机的公钥信息。

jenkins pipline 自动加载分支 jenkins自动部署php_jenkins_10

3、启动目标机的sshd服务:

[root@iZ2zehwkjw59e9rjfkie2mZ .ssh]# service sshd start

jenkins pipline 自动加载分支 jenkins自动部署php_php_11

第三步:测试jenkins宿主机是否可以用ssh连接目标机

在宿主机输入命令:

[root@iZ2ze1u5un7bz1scr79p3fZ ~]# ssh root@目标机ip

可以看到,已经成功连接到目标机:

jenkins pipline 自动加载分支 jenkins自动部署php_jenkins_12

1-2-3、jenkins配置 Publish over SSH

第一步:查看是否有Publish over SSH插件

【Manage Jenkins】- 【System Configuration】- 【Manage Plugins】- 【已安装】-搜索 Publish over SSH,如过已经有此插件,则直接看第三步。

jenkins pipline 自动加载分支 jenkins自动部署php_目标机_13

jenkins pipline 自动加载分支 jenkins自动部署php_禅道_14

第二步:安装Publish over SSH插件

方法一:在【可选插件】中搜索 Publish over SSH,如果有,则直接勾选,点击【install without restart】。等待一会,安装成功,可以在【已安装】中搜到 Publish over SSH。

方法二:http://updates.jenkins-ci.org/download/plugins/ 搜索publish-over-ssh/ 进行下载.hpi文件。

              下载成功之后,在【高级】- 【上传插件】上传下载下来的.hpi文件。

第三步:jenkins配置Publish over SSH

【Manage Jenkins】- 【System Configuration】 - 【Configure System 】- 【Publish over SSH】

jenkins pipline 自动加载分支 jenkins自动部署php_目标机_15

jenkins pipline 自动加载分支 jenkins自动部署php_目标机_16

jenkins pipline 自动加载分支 jenkins自动部署php_禅道_17

点击【保存】, Publish over SSH就配置好了。

备注:其中 Publish over SSH中的Key不一定要是宿主机的私钥,只要是有一对私钥公钥,私钥配置在Key里,公钥给目标机authorized_keys,就可以连接。与公钥私钥是哪个机器的没关系。

二、jenkins新建Item及配置

第一步:新建Item - 【输入一个任务名称】:phptest - 选择【Freestyle project】-【确定】

jenkins pipline 自动加载分支 jenkins自动部署php_jenkins_18

jenkins pipline 自动加载分支 jenkins自动部署php_禅道_19

【General】:没有特殊需求的话可以不配置。

jenkins pipline 自动加载分支 jenkins自动部署php_目标机_20

【源码管理】

jenkins pipline 自动加载分支 jenkins自动部署php_php_21

【构建触发器】:即触发构建的时机,如果不选择这里的配置,即采用手工点击【立即构建】来构建。因为我们的php项目不常修改,所以就采用手动触发【立即构建】,这里不做配置。

jenkins pipline 自动加载分支 jenkins自动部署php_linux_22

【构建环境】:我这里配置了Delete workspace before build starts,即构建之前删除工作空间。可以不配置。

jenkins pipline 自动加载分支 jenkins自动部署php_linux_23

【构建】:即构建时的一些操作,这里的思路是:从gitlab拉取代码 - 把最新的代码文件在jenkins宿主机上压缩 - 把压缩包传输给目标机 - 目标机进行解压,替换老代码。

[增加构建步骤]选择[执行shell],即在宿主机执行shell,需要的命令如下:

cd /var/lib/jenkins/workspace
tar -zcf zentaopms.tar.gz phptest
mv zentaopms.tar.gz phptest

jenkins pipline 自动加载分支 jenkins自动部署php_禅道_24

jenkins pipline 自动加载分支 jenkins自动部署php_php_25

[增加构建步骤]选择[Send files or execute commands over SSH]:

jenkins pipline 自动加载分支 jenkins自动部署php_禅道_26

jenkins pipline 自动加载分支 jenkins自动部署php_jenkins_27

jenkins pipline 自动加载分支 jenkins自动部署php_php_28

对命令的解释:

cd /usr                                        #切到传来的文件所在的目录
rm -rf zentaopms1                              
cp -rf /opt/lampp/htdocs/zentaopms zentaopms1  #备份老代码文件
tar -xzvf zentaopms.tar.gz                     #解压新代码压缩包
mv phptest zentaopms                           #新代码压缩包解压后文件名是Item名字,这步更改名字
/opt/lampp/lampp stop                          #停止禅道项目
cp -rf zentaopms /opt/lampp/htdocs/            #把解压后的新代码文件拷贝到禅道运行的目录下
rm -rf zentaopms                               #删除/usr下的新代码文件和新代码压缩文件
rm -rf zentaopms.tar.gz
cd /opt/lampp/htdocs/zentaopms                 #切到禅道运行目录下
chmod -R 777 tmp                               #给tmp文件赋值为777,因为有发现之前解压之后tmp权限不够,而禅道项目对tmp权限有要求
/opt/lampp/lampp start                         #启动禅道项目

现在我们【保存】,这样所有的配置就完成了。

三、构建

点进去Items - 【立即构建】

jenkins pipline 自动加载分支 jenkins自动部署php_linux_29

jenkins pipline 自动加载分支 jenkins自动部署php_jenkins_30

可以看到【Build History】正在构建,时间是【2021-4-1 下午2:06】

jenkins pipline 自动加载分支 jenkins自动部署php_linux_31

构建成功后,我们进入宿主机的构建目录,/var/lib/jenkins/workspace/phptest,可以看到2021-4-1 14:06 已经在根目录下生成了压缩文件:

jenkins pipline 自动加载分支 jenkins自动部署php_目标机_32

再看以下目标机目录,这个zentaopms1就是就代码的备份文件,时间是 2021-4-1 14:15,即2021-4-1 14:15生成的:

jenkins pipline 自动加载分支 jenkins自动部署php_禅道_33

然后进入目标机的项目运行目录/opt/lampp/htdocs/ ,目录时间没有改变,因为目录下只有部分文件改变了,我们看改变的文件即可,可以看到文件的时间都改变了,说明是最新的代码文件:

jenkins pipline 自动加载分支 jenkins自动部署php_php_34

jenkins pipline 自动加载分支 jenkins自动部署php_目标机_35

这样,我们整个自动发布配置就完成了。之后提交代码之后,在jenkins上【立即构建】即可。

附加:

jenkins目录: /var/lib/jenkins 

jenkins构建的Item目录:/var/lib/jenkins/workspace/phptest

jenkins每一个执行jobs的目录:/var/lib/jenkins/jobs/phptest/builds/