目录
一、检查插件是否安装并安装插件
在通过Jenkins发布php代码之前,我们首先需要在Jenkins服务的web页面上检查一下 “Git plugin” 和 “Publish Over SSH” 两个插件是否已安装:
“系统管理” → “管理插件” → “已安装”,然后搜索Git plugin看看是否已安装,一般这个插件都是默认安装的:
然后到 “可选插件” 里安装 Publish Over SSH 插件:
安装完插件后,直接在linux机器上重启jenkins服务,而不是勾选“空闲时重启”
重启Jenkins服务:
docker restart jenkins_01
确保两个插件都安装好。
二、配置密钥认证
在Jenkins服务器上生成密钥对
进入到Jenkins容器中:docker exec -it jenkins_01 bash
,执行命令:ssh-keygen -t rsa
在Jenkins上生成一对秘钥
执行命令:ssh-copy-id 远程主机IP地址
把jenkins本地的ssh公钥文件安装到远程主机对应的账户下
远程主机创建对应的用户
三、配置Publish over SSH插件
系统管理–>系统设置,找到之前安装的Publish over SSH插件,Passphrase填写之前生成秘钥时设置的密码,没有则留空,Path to key留空,Key粘贴jenkins容器的私钥文件内容:cat /var/jenkins_home/.ssh/id_ras
。
四、构建项目
回到首页,点击“创建一个新任务”,自定义任务名称,选择“构建一个自由风格的软件项目”
配置项目名称与描述:
配置远程仓库的地址:
构建触发器,以及构建环境都不需要配置,因为我们发布的是php代码。“构建” ,最核心的一步,选择 “Send files or execute commands over SSH” :
简单说明:
- Name :选择需要的服务器
- Source files: 需要上传的文件。支持通配符。需要特别注意的是,需要上传的文件必须位于当前的workspace中,否则会上传失败。
- Remove prefix:移除指定前缀。例如我指定了移除test,这个文件会直接上传到/home/test/html/下,否则会上传到/home/test/html/test下。
- Remote directory:远程目录。注意! 此目录是基于之前设置服务器时设置远程目录的,即这里的目录是位于服务器设置目录下的相对目录。
- Exec command:需要执行的命令。这里不做太多说明。
设置完成后点击 “保存”,就可以使用这个刚刚创建的任务去工作了。
回到首页,点击左面的 “立即构建” ,就能把git上的代码发布到指定的服务器上:
构建输出完成
进阶:php源码线上发布(发布、回滚)
实现功能:
# -1-代码发布
# -2-版本回滚(通过git服务器版本切换再rsync同步到服务器上完成回滚)
# -3-添加git tag版本标签
# -4-删除git tag版本标签
# -5-代码回滚(通过发布时拷贝的备份文件恢复完成回滚)
环境介绍
线下服务器:192.168.0.210 安装了docker jenkins 、gitblit(非docker)
线上服务器:39.108.100.130
实现思路简介
在192.168.0.210服务器搭建好gitblit,然后在docker jenkins的映射工作目录上拉取git代码,并使用git tag标记发布版本号,再通过rsync命令同步到39.108.100.130服务器上对应的发布目录上。回滚的话,将git代码切换到上一个版本号代码,再通过rsync同步到线上服务器上就可以了。 我这里功能做得完善些,所以设置步骤会比较多。
创建好后打开项目–>再点击配置
设置构建包数和保留天数等
参数构建化过程(我这里设置了几个功能选项)
Git源码管理
我在192.168.0.210服务器上做了ssh免密,这里的设置主要是为Tag这个选项参数读取git版本号用。
配置项根据实际情况修改填写
实现功能:
# -1-代码发布
# -2-版本回滚(通过git服务器版本切换再rsync同步到服务器上完成回滚)
# -3-添加git tag版本标签
# -4-删除git tag版本标签
# -5-代码回滚(通过发布时拷贝的备份文件恢复完成回滚)
注意:jenkins_workspace=”/var/jenkins_home/workspace” 这个是docker jenkins 默认的可读写目录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
#----------------配置 # docker 容器ssh连接宿主机(要求免密连接) ssh_local="ssh root@172.17.0.1" # jenkins服务器ssh连接线上发布的服务器(要求免密连接) ssh_remote="ssh -p 1876 root@39.108.100.130" # docker jenkins 本地路径 jenkins_workspace="/var/jenkins_home/workspace" # docker jenkins 映射路径 docker_jenkins="/usr/local/jenkins/workspace" # git代码 ssh下载路径 git_ssh="ssh://admin@192.168.0.210:29418/Sharebed/mstcp.git" # 运程服务器ip/代码目录路径 remote_code="39.108.133.131:/tmp" #----------------功能块 on_log="$jenkins_workspace/.$git_folder.log" git_folder=${git_ssh##*/} git_folder=${git_folder%%.*} case $Status in # -1-代码发布 "Depoly") echo "status: $Status" [ -f "$on_log" ] || : > $on_log [ $Version -eq 0 ] && echo "请输入版本号" && exit 9 # 拉取代码 cd $jenkins_workspace temp_time=`date +%Y%M%d%H%M` if [ -d "$jenkins_workspace/$git_folde" ];then cd $jenkins_workspace/$git_folder git pull origin master git tag $Version $id -m "最新版本发布" git push origin $Version else git clone $git_ssh fi # 备份代码(在远程服务器上/usr/local/jenkins目录下创建脚本backups131.sh脚本) last_version=`tail -1 $on_log | awk -F "::" '{print $2}'` $ssh_local $ssh_remote "/data/shell/codeBAK.sh $last_version" # 上传代码 $ssh_local "rsync -avc --delete $docker_jenkins/$git_folder -e 'ssh -p 1876' $remote_code" # 发布日志 echo "$temp_time: 从$git_ssh拉取代码,发布到$remote_code服务器上,版本号::$Version" >> $on_log echo "Depoly Done" ;; # -2-版本回滚(通过git服务器版本切换再rsync同步到服务器上完成回滚) "RollBack") echo "status: $Status" cd $jenkins_workspace/$git_folder git checkout $Tag $ssh_local "rsync -avc --delete $docker_jenkins/$git_folder -e 'ssh -p 1876' $remote_code" echo "RollBac Done" ;; # -3-添加版本标签 "AddTag") echo "status: $Status" cd $jenkins_workspace/$git_folder if [ $Version != "0" ];then git tag $Version $GitID -m "添加版本" git push origin $Version fi echo "AddTag Done" ;; # -4-删除版本标签 "DellTag") echo "status: $Status Tag=$Tag Version=$Version" cd $jenkins_workspace/$git_folder if [ $Version -eq 0 ];then git tag -d $Tag git push origin :$Tag else git tag -d $Version git push origin :$Version fi echo "DellTag Done" ;; # -5-代码回滚(通过发布时拷贝的备份文件恢复完成回滚) "RollBack_CP") echo "status: $Status" # 以最新时间戳的备份进行回滚 temp=`ls /data/Bak | awk -F "." '{print $2}' | sort -n | head -1` temp=`ls /data/Bak | grep $temp` rm /data/www/ald8/* -rf tar -xf /data/Bak/$temp -C /data/www/ald8/ echo "RollBack_CP Done" ;; *) echo "nothing to do" exit 11 ;; esac |
以上有个调用39.108.100.130服务器的备份脚本如下:
# 备份代码(在远程服务器上/usr/local/jenkins目录下创建脚本backups131.sh脚本)
last_version=tail -1 $on_log | awk -F "::" '{print $2}'
$ssh_local $ssh_remote “/data/shell/codeBAK.sh $last_version”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
[root@u130 www]# cd /data/shell/ [root@u130 shell]# ls codeBAK.sh [root@u130 shell]# cat codeBAK.sh #!/bin/bash # 要备份的文件目录 codeURL="/tmp/mstcp" # 备份存放目录 codeBAK="/data/codeBAK" # 保留最新备份的数量 bak_num=10 # 备份日志文件 BAK_log="$codeBAK/.codeBAK.log" #---主功能块 # 备份功能 temp_name=${codeURL##*/} [ ! -d $codeBAK ] && mkdir -p $codeBAK [ ! -f $BAK_log ] && : > $BAK_log cd $codeURL dtime=`date +%Y%M%d%H%M` temp="$codeBAK/$temp_name.$dtime.$1.tar.gz" tar -zcpPf $temp * echo "$dtime::$temp" >> $BAK_log # 过滤出十个最新备份除外的较早备份时间戳,并逐个删除。 cd $codeURL temp=`awk -F "::" '/'$i'/{print $2}' $BAK_log | awk 'NR>'$bak_num'{print}'` for p in ${temp[@]} do rm *$p* -rf done |
五、配置邮箱
系统管理 → 系统设置,找到邮件通知进行配置,这里我使用的是QQ邮箱
收到了,邮件配置成功。点击保存,进入到之前的任务中,点击配置
找到构建后操作,选择E-mail Notification,Recipients这里填入接收邮件的邮箱地址
勾选保持默认即可,点击保存。
现在点击“立即构建”,看是否能接收邮件邮件收到,如果收到邮件,那么邮箱配置成功。
使用自带的邮箱通知功能有一点不好,只有构建失败才会发邮件提示,我想让它不管构建成功还是失败都发邮件提示。
使用插件email-ext配置邮件
想让它不管构建成功还是失败都发邮件来提示,就必须要安装一个插件,该插件名字是Email Extension Plugin。如果你是按照上面步骤来的,那么该插件就已经安装。系统管理 → 插件管理查看是否安装此插件,没有就安装。
系统管理 → 系统设置 → Extended E-mail Notification,填写SMTP server,勾选Use SMTP Authentication,再填写User Name和Password,Password这里填邮箱授权码,然后SMTP port这里填25
往下拉,定位到Default Triggers,选择always,表示不管什么情况都会发邮件提示。之后再清空之前设置的邮箱通知,应用、保存即可
打开任务(我这里是server_01)→ 配置,去掉构建后操作,点击增加构建后操作步骤,选择Editable Email Notification,在Project Recipient List那里添加自己的邮箱,然后点击Advanced Setting,定位到Triggers,可以在Add Trigger处增加发邮件的条件
破解管理员密码
人难免会犯些错误,如果我们不小心忘记了管理员密码,我们如何去修改回来呢?
Jenkins服务器上编辑admin配置文件:
1 2 3 4 5 6 7 8 9 |
# cd /var/lib/jenkins/users/admin/ # ls config.xml # vim config.xml #找到<passwordHash>这行,用下面一行替换掉原来的 <passwordHash>#jbcrypt:$2a$10$eJAMBW3qb/ijrFsSxkJnDOB747e0mFWSR03UmLCn96E4N7vL5BYzC</passwordHash> 这样你的密码就会被重置为123456啦 |
重启服务,进入浏览器界面修改新的管理员密码。
回到浏览器界面,使用123456去登录,系统管理 → 管理用户 → admin右侧设置齿轮图标,设置新的管理员密码,应用、保存即可
参考
Jenkins发布PHP代码
Jenkins入门(一)
docker jenkins+gitblit php源码线上发布(发布、回滚)