Jenkins实用发布与回滚PHP项目生产实践
1、概述
关于jenkins和gitlab的部署,不多加赘述,网上的部署文档多了去了,不踩坑,不成长!这里只聊聊生产的一些实践实用。在关于php项目的运行,我们知道对比于java项目,少了很多繁琐的步骤,至少不需要编译,不需要生产war包。但实践上关于php项目jenkins的自动化发布的文档也相对较少。那么这里就聊聊php项目的发布和回滚是怎么处理的。
这里有2种方式,一种是直接拉取gitlab上的代码,直接同步到目标主机的站点根目录中,为了安全起见,是需要使用--exclude参数来排除.git目录,以及一些关于git的敏感目录进行排除,具体实践,就看公司的程序猿怎么说了。还有另外一种方式,也差不多一样的原理,但其中就多了一步,对拉取后的代码同步到目标主机的代码版本目录当中,网站根目录通过软链接的方式实现站点的根路径定义,这样做的好处是如果需要回退到前期的某个版本,可以直接重新定义软链接即可实现快速回滚。这里需要演示的就是第二种方案,如有更好的生产实践方案,也欢迎各位大佬讨论交流。
2、项目实践
2.1、环境说明
| 主机说明 | IP地址 |
|---|---|
| Jenkins发布主机 | 192.168.0.143 |
| 目标服务器主机 | 192.168.0.128 |
2.2、Jenkins配置
2.2.1、修改Jenkins的运行用户
这里需要注意的是:jenkins安装后默认用户是jenkins用户运行,修改运行用户,需要将其相关的运行目录的所属进行修改,否则jenkins是没法运行起来的。至于为什么改成另外一个用户,只是为了拉取代码的所属者和目标主机的php和nginx的运行用户保持一致性。
[root@jenkins ~]# useradd dengcom
[root@jenkins ~]# vim /etc/sysconfig/jenkins
JENKINS_USER="dengcom"
[root@jenkins ~]# chown -R dengcom.dengcom /var/lib/jenkins /usr/lib/jenkins /var/log/jenkins /var/cache/jenkins
[root@jenkins ~]# /etc/init.d/jenkins restart
[root@jenkins ~]# netstat -tulnp |grep 8080
2.2.2、配置Jenkins用户和Gitlab的ssh-key
[root@jenkins ~]# su - dengcom
[dengcom@jenkins ~]$ ssh-keygen
[dengcom@jenkins ~]$ cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAJvWCAvokpvEx2ohibA7rp+qRdEGO9z03Dj3GlNMRBeBMN3mPBBMUBo8XsJF2gXiPQrdIk0kPZqphnKb9y081AEDhQnliY71pmJxgkfDIWEQiUqJUPwM+tcTuibJH2OYYy0f9Bs5leDHgfXi7ZEurSLI1YCYjgOGPef+yhACMkvPwSIFIsRuyRcsdFrhTt2LXnmbR49KdpOzndUiH+CPgjjOn+qvJxzr8v0bpEArt40y6U4sWqv8hLZPVaArGkBwvpo2o+fZJcDioalxOb377Su4I505e+wv/9rWjanmV5vfo41fcOrpTN89liS1C4CrZvuwBPJuQaQzoC3gcrYCp dengcom@node01.hao123.com
[dengcom@jenkins ~]$ git clone git@192.168.0.130:root/wap-dev.git #测试是否可以正常拉取代码
在gitlab上的右上角-->用户设置-->SSH密钥设置,添加上面生成的公钥,添加完成后在Jenkins主机上进行测试是否可以正常拉取代码。

2.2.3、Jenkins的凭据配置
添加全局凭据设置,为了一会儿可以正常通过jenkins的web操作进行拉取代码,这里添加上面生成的秘钥。
Jenkins-->管理Jenkins-->凭据-->系统-->全局凭据-->添加凭据

2.2.4、目标主机的一些设置
创建nginx和php的用户,并在jenkins主机上添加ssh-key信任,站点根目录和代码版本目录创建
[root@node01 ~]# useradd dengcom
[root@node01 ~]# mkdir /data/web/wap-dev -pv
[root@node01 ~]# mkdir /data/code/version -pv
[dengcom@jenkins ~]$ ssh-copy-id dengcom@192.168.0.128
2.2.5、新建一个自由风格的任务进行如下配置
任务名称保持和目标网站根目录一致,这样可以节省很多麻烦。首先进行参数设置,如下:

源码管理,进行添加项目的git地址和凭据,这里添加变量${git}是为了按照前面的参数进行匹配

最后再配置需要执行的shell,就完成了
#!/bin/bash
#自定义全局变量
VERSION_ROOT=/data/code/version
WWW_ROOT=/data/web/wap-dev
NODE_LIST="192.168.0.128"
CTIME=$(date "+%Y-%m-%d")
#判断是否正确输入需要发布的版本
if [ -z "${git}" ];then
echo -e "发布的版本号为空,请重新输入版本号后构建......"
exit 1
else
#判断为发布操作时,执行以下代码块
if [ ${status} == "Deploy" ];then
#对节点列表进行发布代码
for node in $NODE_LIST
do
# 使用rsync的方式将workspace的代码进行同步到目标主机,并进行软链接到站点根目录
rsync -raz --delete --progress --exclude=cache --exclude=.git --exclude=.idea ${WORKSPACE}/ dengcom@$node:${VERSION_ROOT}/${git}/
ssh dengcom@$node "rm -rf ${WWW_ROOT}"
ssh dengcom@$node "ln -sv ${VERSION_ROOT}/${git} ${WWW_ROOT}"
echo "发布成功......"
done
fi
#判断为回滚操作时,执行以下代码块
if [ ${status} == "Rollback" ];then
echo "准备回退......"
#对节点列表进行回退版本
for node in $NODE_LIST;do
#判断目标主机是否存在回滚的版本
ssh dengcom@$node "ls -ld ${VERSION_ROOT}/${git}"
res=$(echo $?)
if [ $res == 0 ];then
ssh dengcom@$node "rm -rf ${WWW_ROOT}"
ssh dengcom@$node "ln -sv ${VERSION_ROOT}/${git} ${WWW_ROOT}"
else
echo "回退版本:"${git}"不存在"
exit 2
fi
done
echo "已成功回退到"${git}"版本......"
3、项目演示
3.1、发布操作
点击-->Build with Parameters,选择配置的选项参数,并填写版本号-->开始构建


在目标主机上查看代码结构的变化:
[root@node02 code]# ll /data/web/wap-dev
lrwxrwxrwx 1 dengcom dengcom 59 Nov 30 16:09 /data/web/wap-dev -> /data/code/version/22e42950c47dccfc0f940f1eaa838749463c84da
[root@node02 code]# ll /data/code/version/
total 0
drwxr-xr-x 4 dengcom dengcom 62 Nov 30 16:09 22e42950c47dccfc0f940f1eaa838749463c84da
drwxr-xr-x 4 dengcom dengcom 45 Nov 30 14:38 603582c48c7976eb4da6294185f193898689e7a1
drwxr-xr-x 4 dengcom dengcom 45 Nov 30 14:42 fdb77979a186600f4ff39c442a958d00f80af810
3.2、回滚操作
在上面可以看到有多个版本号的代码,随意选择一个版本,进行操作。点击-->Build with Parameters,选择配置的选项参数,并填写版本号-->开始构建


目标主机上查看是否已经回滚:
[root@node02 code]# ll /data/web/wap-dev
lrwxrwxrwx 1 dengcom dengcom 59 Nov 30 16:12 /data/web/wap-dev -> /data/code/version/603582c48c7976eb4da6294185f193898689e7a1
[root@node02 code]# ll /data/code/version/
total 0
drwxr-xr-x 4 dengcom dengcom 62 Nov 30 16:09 22e42950c47dccfc0f940f1eaa838749463c84da
drwxr-xr-x 4 dengcom dengcom 45 Nov 30 14:38 603582c48c7976eb4da6294185f193898689e7a1
drwxr-xr-x 4 dengcom dengcom 45 Nov 30 14:42 fdb77979a186600f4ff39c442a958d00f80af810
简单的php项目发布和回滚就做好了!!!
Jenkins实用发布与回滚PHP项目生产实践的更多相关文章
- 2、jenkins+svn自动发布和回滚
Jenkins配置回滚思路: 目前只能实现使用salt来管控配置文件的管控,配置文件的版本回滚需要后续定制化开发,或者进行格外其他的管理操作.后续实现 以下配置可以为每个项目备份构建文件到本地指定路径 ...
- Jenkins 搭建企业实战案例 (发布与回滚)
让我们的代码部署变得easy,不再难,Jenkins是一个可扩展的持续集成引擎,是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能.Jenkins非常易于安装和配置,简单易用 ...
- Jenkins版本迭代以及回滚
一.摘要 在上一篇文章,链接如下: https://www.cnblogs.com/xiao987334176/p/11434849.html 镜像打的是latest版,如果需要回滚的话,就比较麻烦了 ...
- ansible实现发布、回滚功能
ansible的两篇博客,本来是打算合二为一的,发现只用一篇写,嗯,好鬼长.... 一向秉承简单为美的我于是忍痛割爱,一分为二了 ansible实现升级发布.回滚功能 1.应用场景 在实际生产环境中, ...
- Jenkins+Ansible+Gitlab自动发布/回滚Spring项目
一.实现方法流程图 流程图如下:代码托管在本地GitLab上(为了复现整套流水线,我直接使用了GitHub,懒得再搭建GitLab),开发完成后提交代码到代码仓库,[自动]触发Jenkins进行持续集 ...
- Asp.net Core 使用Jenkins + Dockor 实现持续集成、自动化部署(四):发布与回滚
写在前面 我们以前windows跑.net Framework程序的时候,发布,自己乖乖的替换程序:备份,也是自己一个一个的重命名备份:回滚,发布遇到问题的回滚更是不用说了:运维很是怕我们 这些用wi ...
- jenkins 实现测试发布、预发布、真实发布、回滚发布
主要思路: 1.做三个文件夹,用于放置不可随意修改的配置文件(测试发布.预发布.真实发布) 2.每次都先修改配置文件再进行构建(构建时会先把配置文件复制到构建的目录,再同步到发布的目录) 3.发布完代 ...
- jenkins 打标签实现回滚
背景介绍: 本项目代码存储在gitlab,再通过jenkins发布到对应的节点上. 使用tag控制版本:每一次成功的构建,jenkins会自动为gitlab的分支打上tag,版本更新可直接选择prod ...
- k8s用kubectl管理应用升级,服务发布与回滚,扩缩容
应用升级 Kubectl set image --help 有案例指定新版本 [root@k8s-master ~]# kubectl set image deployment/nginx nginx ...
随机推荐
- maker使用说明书
1.以自带的示例数据为例 dpp_contig.fasta dpp_est.fasta dpp_protein.fasta te_proteins.fasta 2.生成控制文件 控制文件是特定于运行的 ...
- 洛谷 P3374 【模板】树状数组 1 题解
P3374 [模板]树状数组 1 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 输入格式 第一行包含两个整数N.M,分别表示该数列数字的个数 ...
- connect ECONNREFUSED 127.0.0.1:80错误解决
这个报错也是一直困扰了我许久,服务端一直打印这个报错,但是页面数据响应又都正常,起初真不知道是因为什么原因,能看出来他是在调用80端口, 但是不明白为什么会调用80端口.一度以为是config.js里 ...
- JavaScriptDOM编程学习笔记(二)图片库案例
<JavascriptDOM编程艺术>提供一个图片库的demo,主要讲解如何更好的使用JavaScript在网页中,跟随作者的思路来分析一下这个案例 首先需求是将图片发布到网上,但是如果发 ...
- 数据结构与算法系列——排序(4)_Shell希尔排序
1. 工作原理(定义) 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本.但希尔排序是非稳定排序算法. 希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入 ...
- java基础之 hashmap
Hashmap是一种非常常用的.应用广泛的数据类型,最近研究到相关的内容,就正好复习一下.网上关于hashmap的文章很多,但到底是自己学习的总结,就发出来跟大家一起分享,一起讨论. 1.hashma ...
- Python3.7 - Argparse模块的用法
argparse 是一个命令行参数解析模块. argparse 是python自带的命令行参数解析包,可以用来方便地读取命令行参数,当你的代码需要频繁地修改参数的时候,使用这个工具可以将参数和代码分离 ...
- Pycharm 个人认为舒服漂亮又好用的主题风格
又开始和code打交道了系列…… 实验室换了新电脑,故而,重新安装了各种软件,乃至重新配置 Pycharm主题,找了好久,终于找到,想着应该mark一下,以备下次需要. 个人认为 Monokai 这 ...
- k8s+Jenkins+GitLab-自动化部署项目
0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 此文阅读目录: 1.闲聊 ...
- JSON ------ 创建与访问
JSON (Java Script Object Notation, js对象表示法) 是存储和交换文本信息的语法,类似 XML JSON的文件类型是 “.json” 优点: 比XML ...