CICD-Jenkins笔记2014-2018

CICD-Jenkins笔记2014-2018

20141119 chenxin
20180726 chenxin update

四个环境,开发/测试/预发布/生产.
文中涉及的最新脚本,请查看西部战纪部署文档脚本备份文件.
涉及的脚本,如CI,CD等,除本文档外,其他部分参考备份文档.
安装Jenkins
docker 镜像方式(不推荐)
To use the latest LTS: docker pull jenkins/jenkins:lts (LTS为长期支持版,每12周发布1次)
To use the latest weekly: docker pull jenkins/jenkins (每周发布)
docker search jenkins
docker pull jenkins
docker run -d -p 10080:8080 jenkins 启动容器(会自动启动Jenkins服务)
docker container exec -it 7b5cb169167c /bin/bash 进入容器
目录结构docker方式
/usr/local/bin/jenkins.sh #启动脚本
/usr/local/bin/jenkins-support
/usr/share/jenkins/jenkins.war #war包存放位置
/var/jenkins_home/ #Jenkins的主目录
yum方式(推荐)
JDK的安装方式,请参考对应笔记/文档内容.
cd /etc/yum.repos.d/
wget http://pkg.jenkins.io/redhat/jenkins.repo
rpm --import http://pkg.jenkins.io/redhat/jenkins.io.key
yum install -y jenkins
systemctl start jenkins
目录说明
/etc/sysconfig/jenkins #主文件(默认端口8080->13972)运行用户,端口,HTTPS端口,绑定IP,AJP端口,HTTP最大并发数,HTTP最大等待数,JENKINS_HOME路径配置JENKINS_HOME="/var/lib/jenkins"
/etc/rc.d/init.d/jenkins #启停脚本,jenkins把java路径遍历写死在这里了,需要修改(将java路径注释掉,添加自己的),candidates=处,增加一行 /usr/local/jvm/bin/java
/etc/logrotate.d/jenkins #日志翻滚配置
/var/log/jenkins 日志
/var/lib/jenkins #yum后为空,之后会作为数据存放目录.是jenkins的HOME目录
/var/lib/jenkins/jobs 任务
/usr/lib/jenkins #war包,/usr/lib/jenkins/jenkins.war WAR存放路径
/var/cache/jenkins/war (图片,css,js等) 其他数据存放路径
/var/lib/yum/repos/x86_64/latest/jenkins
/var/cache/yum/x86_64/latest/jenkins
页面进行插件和基本配置的安装
http://192.168.31.129:13972/ 根据页面提示,到对应的文件目录下去找pw,进行认证,之后开始安装
在安装过程中,如果有无法处理的报错(比如安装过程中,人都开了,连接中断后,报错.在url后添加"restart",重新启动Jenkins并安装)
安装选择默认安装(大多数用户的选择)
默认8080端口:
vim /etc/sysconfig/jenkins #主配置文件(需要通过页面方式安装完成才会生成该文件)
JENKINS_PORT="13972"
用户配置与登陆 权限重置
配置用户
http://13.251.138.240:13972/ 或域名方式: http://xbzj-taihe-bei-jks.soomigame.com:13972/
admin user: chenxin
pw: jks123....
[email protected]
LDAP认证
FreeIPA LDAP 用户认证请参考FreeIPA笔记
jenkins配置权限不对导致无法登陆的重置方法
一旦由于用户配置错误,导致用户无法登陆,或者登陆后权限不对,无法切回管理员权限,则只能通过这种重置的方式了.
找到/var/lib/jenkins/config.xml 文件
替换:
1、
这个权限对应“任何用户可以做任何事(没有任何限制)”
2、
这个权限对应“登录用户可以做任何事”
3、
hudson.model.Hudson.Administer:test
hudson.scm.SCM.Tag:test

这个权限对应 test用户可以是管理员、打标签权限。
安全矩阵
Overall是全局权限,slave是集群权限,job,run,view,scm是业务权限。overall中的read要勾选,否则用户登陆后什么也看不到。
最大的权限是Overall的Administer,拥有该权限可以干任何事情。
凭据: 这里保存这在Jenkins中配置的git svn或其它的用户名密码之类的都在这个里面,这里可以设置对应角色的权限.
Agent: 这个是配置Jenkins结点的权限,反正现在用不到, 我也不会。
Job: 任务的,对应权限
Run: 这个不知道,反正问度娘无果
View: 这个是视图权限,就是把某个项目关联到类于浏览器的选项卡上面的,项目多用的上,项目少基本就不用去分类
SCM: 这个貌似是对git svn等部署设置定时部署任务的,也用不到,也没测试过
ps:如果有个用户被赋予了Overall的Read,并没有被赋予Job的Read权限,那么该用户就无法访问job。原因:没有权限。
其他说明
启用矩阵认证方式后,保存时,提示:
Builds in Jenkins run as the virtual Jenkins SYSTEM user with full Jenkins permissions by default. This can be a problem if some users have restricted or no access to some jobs, but can configure others. If that is the case, it is recommended to install a plugin implementing build authentication, and to override this default.
No implementation of access control for builds is present. It is recommended that you install Authorize Project Plugin or another plugin implementing the QueueItemAuthenticator extension point.
备份,迁移,升级
迁移/备份
首先找到JENKINS_HOME,因为Jenkins的所有的数据都是以文件的形式存放在JENKINS_HOME目录 (从/etc/sysconfig/jenkins的配置文件中可知,一般配置的是/var/lib/jenkins/xxx)中。所以不管是迁移还是备份,只需要操作JENKINS_HOME就行了.压缩打包,存放.
迁移:建议将JENKINS_HOME打包后在拷贝.
可以做个jenkins的定时计划任务本地备份与远程备份,防止误删除掉jenkins的job或者是project等.
注意:/var/cache/jenkins/war/这个文件夹下是否有需要备份的内容.包括images,css等自己在服务器上直接修改的文件.
备份Jenkins案例
这里使用rsync,主要是为了保持备份的属性,如果使用scp或cp有时会导致文件属性的改变而导致jenkins异常。
创建备份目录
[root@linux-node2 ~]# mkdir /data/backup/jenkins -p
备份/var/lib/jenkins目录
[root@linux-node2 ~]# rsync -raz --delete --progress /var/lib/jenkins /bak/jenkins/
删除/var/lib/jenkins/
[root@linux-node2 ~]# rm -rf /var/lib/jenkins/
[root@linux-node2 ~]# service jenkins restart
Restarting jenkins (via systemctl): Job for jenkins.service failed because the control process exited with error code. See "systemctl status jenkins.service" and "journalctl -xe" for details. [FAILED]
[root@linux-node2 ~]# service jenkins status
JENKINS_HOME directory does not exist: /var/lib/jenkins
恢复备份
[root@linux-node2 ~]# rsync -raz --delete /bak/jenkins/jenkins /var/lib/
[root@linux-node2 ~]# service jenkins restart
备份脚本
[root@ip-10-0-0-200 ~]# cat jenkins_bak.sh

!/bin/bash

writer:201808 Chenxin

Set execs default search path.

export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
umask=022
BACKUPDIR="/bak" ; [ ! -d $BACKUPDIR ] && mkdir $BACKUPDIR -p
Datadate=date +%Y%m%d%H%M
File=jenkins

delete old files

cd $BACKUPDIR
find $BACKUPDIR -mtime +7 -name "*.gz" -exec rm -rf {} ;
rsync -raz --delete --progress /var/lib/jenkins /bak/jenkins/ && tar czf "$File"_"$Datadate".tar.gz $File
升级版本
推荐: 直接在控制台点按升级按钮(升级前做好备份工作).
如果当前版本并非最新版本的话,在jenkins的全局配置中,会有相应的版本升级提示信息,直接点击也可以完成升级.
升级前,请测试该版本和你本地数据的兼容性。如何测试:将JENKINS_HOME拷贝一份到新的机器,用新版的程序启动。测试对应的插件和配置。
升级Jenkins的war包
Jenkins的开发迭代非常快,每周发布一个开发版本,长期支持版每半年更新一次(ps:大版本更新)。如此频繁的更新,怎么升级呢?war:下载新版的war文件,替换旧版本war文件。重启即可.(WAR存放路径 /usr/lib/jenkins/jenkins.war)
二进制:卸载旧版本,安装新版本即可.yum install jenkins.Jenkins程序下载地址:http://mirrors.jenkins-ci.org/
其他方式升级Jenkins版本
下载Jenkins的最新war包
docker container cp ./jenkins.war container_id:/usr/share/jenkins/jenkins.war_2.121.2 #将war包拷贝到docker对应目录
docker container exec -it --user root 7b5cb169167c /bin/bash #以root身份进入docker容器
/usr/share/jenkins/jenkins.war #将最新的war包替换原有包
http://192.168.31.129:10080/restart #从控制台进行重启Jenkins
控制台->系统管理->关于Jenkins2.121.2 #确认版本号

CD过程中用到过的脚本案例
发布上传好的程序文件到生产服
在Jenkins上,以xbzj用户名义(sudo)调用数据管理机的rsync脚本(rsync是用ssh的密钥认证)
sudo -u xbzj /home/xbzj/server-bin/server-ip/rsync-codex.fight.sh
Jenkins的机器需要配置好私钥,生产服配置好公钥.以便Jenkins机器将文件上传过去(rsync).
脚本文件例如:
cat rsync-codex.fight.sh

!/bin/bash

dir=codex.fight
cd /home/xbzj/server-bin/server-ip
cat rsync-ip.txt |grep "$dir "|awk '{print $3,$2}' > ./$dir.txt
cat ./$dir.txt |while read line
do
ip=echo "${line}"|awk '{print $1}'
#class=echo "${line}"|awk '{print $2}'
echo "++++++++++++++ 开始同步服务器 $ip 上的目录 $dir +++++++++++++++++ "
#echo $class
rsync -vzrtopg -e "ssh -p 4399" --delete --progress --exclude "logs/" /home/xbzj/server-bin/game-func/game-classes/$dir xbzj@$ip:/home/xbzj/game-func/game-classes/
if [ $? == 0 ];then
echo " :) :) :) 成功 :) :) :)"
else
echo " :( :( :( 失败 :( :( :("
fi
done
发布资源文件到S3
S3资源文件的同步:
cat sync-local-to-s3.sh

!/bin/bash

/usr/bin/aws s3 sync /home/xbzj/s3-cloudfront/xbzj-taihe-s3-01-cdn/test s3://xbzj-taihe-s3-01-cdn/test --delete --acl public-read
if [ $? == 0 ];then
echo " :) :) :) 成功 :) :) :)"
else
echo " :( :( :( 失败 :( :( :("
fi
/usr/bin/aws s3 sync /home/xbzj/s3-cloudfront/xbzj-taihe-s3-01-cdn/xbzj-taihe-bei s3://xbzj-taihe-s3-01-cdn/xbzj-taihe-bei --delete --acl public-read
if [ $? == 0 ];then
echo " :) :) :) 成功 :) :) :)"
else
echo " :( :( :( 失败 :( :( :("
fi
产品启动和停止
以下是远程调用游戏进程启动和停止.
步骤:
在Jenkins上,以xbzj用户名义(sudo)调用数据管理机的脚本,脚本内容是通过xbzj用户ssh密钥认证远程执行各游戏服上的启停脚本文件.
任务名称 构建执行的shell命令
start-01-xbzj-taihe-codex.log.receiver sudo -u xbzj /home/xbzj/server-bin/server-ip/manage-codex.log.receiver.sh --start
start-02-xbzj-taihe-codex.payments sudo -u xbzj /home/xbzj/server-bin/server-ip/manage-codex.payments.sh --start
...
stop-01-xbzj-taihe-codex.login sudo -u xbzj /home/xbzj/server-bin/server-ip/manage-codex.login.sh --stop
stop-02-xbzj-taihe-codex.gateway sudo -u xbzj /home/xbzj/server-bin/server-ip/manage-codex.gateway.sh --stop
...
cat manage-codex.fight.sh

!/bin/bash

Chenxin 20180804

cd /home/xbzj/server-bin/server-ip
dir=codex.fight
action=$1
if [ "$action" == "--start" ];then
action1="启动"
else
action1="停止"
fi
exe_path=$(echo $dir|awk -F '.' '{print $2}')

echo $exe_path

cat rsync-ip.txt |grep "$dir "|awk '{print $3,$2}' > ./${dir}_manage.txt
cat ./${dir}_manage.txt |while read line
do
ip=echo "${line}"|awk '{print $1}'
#class=echo "${line}"|awk '{print $2}'
echo "++++++++++++++ 开始 $ip 上的 $dir $action1 操作 +++++++++++++++++ "
/usr/bin/ssh $ip -p 4399 -n "cd /home/xbzj/game-func/game-script/$exe_path && ./Manage.sh $action;sleep 3;tail nohup.out";
pwd
#echo $class
if [ $? == 0 ];then
echo " :) :) :) 成功 :) :) :) 请检查控制台输出信息,确定成功"
else
echo " :( :( :( 失败 :( :( :( "
fi
done

CI案例 (maven,nexus私有仓库) - 采用脚本编译的方式(非Jenkins插件)
参考
maven全局配置文件settings.xml详解
http://www.cnblogs.com/jingmoxukong/p/6050172.html
maven指令介绍(Maven学习:常用mvn命令)
https://blog.csdn.net/lfsfxy9/article/details/12200915
nexus搭建私有仓库
https://www.cnblogs.com/fanzhenyong/p/7709434.html
目录
cd /home/jenkins/build-dir/svn-download/
svn co svn://192.168.31.31/project_a/server
svn co svn://192.168.31.31/project_a/tools
maven配置
/usr/local/maven/conf/settings.xml
配置文件解析
settings.xml是maven的全局配置文件。而pom.xml文件是所在项目的局部配置。
Settings.xml中包含类似本地仓储位置、修改远程仓储服务器、认证信息等配置。
配置优先级
需要注意的是:局部配置优先于全局配置。
配置优先级从高到低:pom.xml> user settings > global settings
如果这些文件同时存在,在应用配置时,会合并它们的内容,如果有重复的配置,优先级高的配置会覆盖优先级低的。
配置maven加载库后放置的本地路径
/home/jenkins/build-dir/Repository
在最后,mvn install项目的时候,会下载非常多的文件(有pom,有jar),默认放到用户的根目录.m2/下,类似/home/coinw/.m2/repository/.而如果采用的是Jenkins的mvn构建项目,则为Jenkins自己权限,所以默认放置位置就变成了 /var/lib/jenkins/.m2/.
镜像地址

nexus
*
Nexus
http://192.168.31.129:8900/repository/maven-public/

仓库


nexus


nexus
Nexus Repository
http://192.168.31.129:8900/repository/maven-public/

true


true





包的输出路径可以加在mvn xxx 后面-DoutputDirectory="$OUT_DIR/$3/lib"
以下为一个示例setting.xml

编译脚本-示例
[xbzj@local-test build-dir]$ cat package.sh

!/bin/bash

20180817

source /etc/profile
export JAVA_HOME="/usr/local/jvm"
export MAVEN_HOME="/usr/local/maven"
export OUT_DIR="/home/jenkins/build-dir/package"
export GAME_CONFIG_PATH="/home/jenkins/build-dir/svn-download/tools/转表工具/csv"
export MAP_CONFIG_PATH="/home/jenkins/build-dir/svn-download/tools/转表工具/mapConfig"
export CFG_CONFIG_PATH="/home/jenkins/build-dir/svn-download/tools/转表工具/cfg"
export MVN="/usr/local/maven/bin/mvn"

export AGENT_LIB="D:\agent.jar"

export AGENT_LIB="/home/jenkins/build-dir/extra-jar/agent.jar"
export SERVER_CODEX="/home/jenkins/build-dir/svn-download/server/codex"
cd /home/jenkins/build-dir
rm $OUT_DIR -rf
mkdir $OUT_DIR
cd $SERVER_CODEX

svn cleanup;

rm -rf $SERVER_CODEX/codex.proto/src/main/java
svn up $SERVER_CODEX
svn up $GAME_CONFIG_PATH
svn up $CFG_CONFIG_PATH
for i in ls ./*.sh;do
echo "当前目录:"
pwd .
cp -aprf $i $OUT_DIR
done
$MVN -f=pom.xml clean install -q -P product -U -Dmaven.test.skip=true
$MVN -f=codex.proto/pom.xml clean protobuf:compile install -q -P product -U -Dmaven.test.skip=true
echo "公共包 完成"
function COPY_CFG_CONFIG()
{
cp -aprf "$CFG_CONFIG_PATH" "$OUT_DIR/$1/config"
echo "$1 策划配置 完成"
}
function SVN_UP()
{
rm -rf $1
svn up $1
}
function COPY_GAME_CONFIG()
{
if [ "$2" != "" ];then
COPY_GAME_CONFIG2 $1 $2
else
COPY_GAME_CONFIG2 $1 $1
fi
}
function COPY_GAME_CONFIG2()
{
cp -aprf "$GAME_CONFIG_PATH" "$OUT_DIR/$2/gameConfig"
echo "$1 游戏配置 完成"
}
function COPY_MAP_CONFIG()
{
SVN_UP $MAP_CONFIG_PATH
cp -aprf "$MAP_CONFIG_PATH" "$OUT_DIR/$1/mapConfig"
echo "$1 地图配置 完成"
}
function COPY_LIB()
{
if [ "$3" != "" ];then
COPY_LIB2 $1 $2 $3
else
COPY_LIB2 $1 $2 $1
fi
}
function COPY_LIB2()
{
$MVN -f=$1/pom.xml assembly:assembly dependency:copy-dependencies -DoutputDirectory="$OUT_DIR/$3/lib" -DincludeScope=runtime -q -P product -U -Dmaven.test.skip=true
cp -aprf "$1/target/bin.zip" "$OUT_DIR/$3/"
mkdir -p $OUT_DIR/$3/ref
cp -aprf $1/target/classes/.properties $OUT_DIR/$3/ref
cp -aprf $AGENT_LIB "$OUT_DIR/$3/lib"
for i in ls $OUT_DIR/$3/lib/*.jar;do
echo lib/$i>> $OUT_DIR/$3/jarlist.txt
done
if [ "$2" != "" ];then
echo $2 >> $OUT_DIR/$3/Main
fi
echo "$1 编译拷贝 完成"
}
COPY_LIB codex.gameCenter com.aly.codex.gcenter.Boot
COPY_GAME_CONFIG codex.gameCenter
echo "中心服务器 完成"
COPY_LIB codex.fight com.aly.codex.fight.Boot
COPY_GAME_CONFIG codex.fight
COPY_MAP_CONFIG codex.fight
echo "战斗服 完成"
COPY_LIB codex.game com.aly.codex.game.Boot
COPY_GAME_CONFIG codex.game
COPY_CFG_CONFIG codex.game
echo "游戏服 完成"
COPY_LIB codex.match2 com.aly.codex.match2.Boot codex.match
COPY_GAME_CONFIG codex.match2 codex.match
echo "匹配服务器 完成"
COPY_LIB codex.login com.aly.codex.login.Boot
echo "登陆服务 完成"
COPY_LIB codex.gateway com.aly.codex.gateway.Boot
echo "登陆服务 完成"
echo "全部完成 请检查"
echo "生成文件:"
ls $OUT_DIR
echo "文件大小:"
du -sh $OUT_DIR
du -sh $OUT_DIR/

echo "修改Start.sh,BuildOpts.sh文件权限"
chmod 755 $OUT_DIR/*.sh && echo "权限修改成功"
echo
echo "全部编译和操作完成"

加入Jenkins
visudo:
jenkins ALL=(xbzj) NOPASSWD: /home/jenkins/build-dir/package.sh,/home/xbzj/server-bin/server-ip/rsync-codex-*.sh
文件权限:
[root@MiWiFi-R3P-srv ~]# ll /home/jenkins/build-dir/
total 12
drwxrwxr-x 5 xbzj xbzj 103 Aug 23 15:42 package
-rwxr-xr-x 1 xbzj xbzj 3121 Aug 23 15:40 package.sh
drwxr-xr-x 29 xbzj xbzj 4096 Aug 22 19:32 repository
drwxr-xr-x 4 xbzj xbzj 33 Aug 22 18:48 svn-download
Jenkins任务(西部战纪-游戏服-CI)
sudo -u xbzj /home/jenkins/build-dir/package.sh

CICD 采用插件方式 (采用Jenkins插件 JDK GIT MAVEN 的方式)
2013 Chenxin
2019/08/22 update Chenxin
参考
jenkins插件方式CICD http://blog.51cto.com/zero01/2074341
maven常用命令 mvn -s /usr/local/maven/conf/settings.xml clean install
插件CICD涉及的步骤
安装JDK(略)
安装/配置tomcat(略)
安装maven
Jenkins里配置JDK(供编译用)
Jenkins里配置maven
安装Maven Integration插件(Jenkins对mvn项目支持的插件,构建Job的时候第一步选择)
构建job(构建maven项目.最重要的步骤)
配置Git项目的拉取URL和凭证(用户名+密码)
发布war包
涉及的知识
maven: 构建java项目时,解决众多依赖性问题的管理器,提高编译打包便利性
settings.xml: maven的setting配置文件,里面可以配置nexus仓库路径(在线依赖包仓库),默认是使用的本地环境.
pom.xml: 构建java项目的配置文件(由开发人员提交到git或给出)
安装maven
编译和打包都是用maven完成.
官网下载地址:https://maven.apache.org/download.cgi 截止2019/08/22,最新版本3.6.1 wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven...tar.gz
cd /opt/; tar -zxvf apache-maven-3.5.4-bin.tar.gz; mv apache-maven-3.5.4 /usr/local/maven;
检查maven版本 /usr/local/maven/bin/mvn -version
在build那步,mvn install项目的时候,会下载非常多的文件(有pom,有jar),默认放置到 /var/lib/jenkins/.m2/.如果是脚本调用方式,则类似/home/coinw/.m2/目录.
配置JDK
系统管理 -> 全局工具配置->别名 JDK_1.8.0_221 , 取消"Install automatically"的钩,JAVA_HOME为/usr/local/jvm .点击"保存".
配置maven
系统管理 -> 全局工具配置->先配置maven的setting.xml文件的路径. -> /usr/local/maven/conf/settings.xml
然后往下拉,找到Maven,配置maven的安装路径:maven安装->新增maven->Name: Apache Maven 3.6.1;将"Install automatically"的钩去掉,填入"MAVEN_HOME"的路径: /usr/local/maven .点击保存.
安装Maven Integration插件
系统管理 -> 管理插件,安装 Maven Integration和 Deploy to container().
安装Maven Integration:如果没有的话,构建任务时是没有Maven项目的选项的.
安装Deploy to container:非必须.发布到tomcat的8080端口时用.需要tomcat管理admin权限.是用于发布远程war包的.
安装完成,重启Jenkins.
构建job
1.构建一个maven项目的job类型
名称 test-201908
1.1General
->参数化构建(这里给出之后需要用到的git项目的分支参数,比如名称 "branch",选项"release/otc1.2"(可以添加多个分支选项).之后在Git那步,就可以调用这个$branch变量.
1.2源码管理
->SVN/GIT.这里选择Git.
->Repositories->Repository URL为http://47.75.218.30/gitlab/coinw/coinw-web.git ->Credentials 添加git对应的用户名和密码,比如用户名gitlab+deploy-token-2,密码xxx.
->Branches to build(分支)->Branch Specifier (blank for 'any')这里填入"$branch"(参数化构建里指定的分支变量名).
1.3构建触发器
默认
1.4构建环境
默认
1.5Pre Steps(构建前执行)
因git拉取到的配置文件,是内网或开发者的本地配置.所以需要将配置文件重新导入,以便构建测试/生产环境的war包.选择执行shell脚本,
cp -aprf /home/coinw/yure_server/project_coinw_web/deploy_webroot/config/* src/main/resources/ #配置文件
cp -aprf /home/coinw/yure_server/project_coinw_web/project_build/pom.xml . #指定的pom.xml文件(git也会拉取到该文件).
1.6Build(构建)编译源码并打包
->Root POM为 pom.xml #就是Jenkins这个job的workspace的根目录/var/lib/jenkins/workspace/test-201908/.
->Goals and options 为 install (直接输入mvn的参数选项)
->高级选项默认
1.7Post Steps(构建后执行)
默认
1.8构建设置
默认(可以mail通知)
保存后尝试构建,测试,查看控制台输出.
2.构建的目录和数据说明
构建job的时候,所有数据都会放入到/var/lib/jenkins/下(主目录).
job/ 存放每次作业的log和xml信息.
workspace/ 存放每个job对应的工作目录.比如 /var/lib/jenkins/workspace/test-201908/ 为test-201908 job的主目录.
构建后的目录结构
[coinw@localhost test-201908]$ pwd
/var/lib/jenkins/workspace/test-201908
[coinw@localhost test-201908]$ tree -L 2
.
├── pom.xml # 默认git拉取的时候,会有这个文件.因该文件里的Mysql配置错误,所以Jenkins里在构建前,有通过shell方式拷贝一个过来.
├── README.md
├── sql
│ └── update.sql
├── src
│ ├── main
│ └── test
└── target
├── classes
├── coinw-web-1.0.0
├── coinw-web-1.0.0.war # 构建完成后,得到的war包.用于后面的发布.
├── generated-sources
├── maven-archiver
├── maven-status
└── test-classes
发布war包方式一(不推荐)
这一步最好使用自建脚本方式,若使用Jenkins的"发布到容器"插件,需要tomcat的admin管理页面权限.
回到Job的配置,在构建后操作那一栏点击 “增加构建后操作步骤” 选择 “Deploy war/ear to a container”(tomcat).
WAR/EAR files 输入 **/*.war ,匹配所有war包->"Add Container"里,Containers选择Tomcat 8.x->Credentials这里点击"Add",输入tomcat的用户名和密码.然后,Tomcat URL填写要把war包发布到的那台机器的url,如 http://192.168.3.227:8080 . # 发布到多个容器的话,这里多次选择就可以了.
这样就可以将war包发布到tomcat容器里了.
发布war包方式二(推荐)
通过外挂脚本的方式来处理.具体略.

job的构建(2013采用过的方式)-不推荐
选择通用型自由风格的软件.
1.给出项目名称,描述信息,选择基本项等.
2.从SVN上拣出文件,jenkins会自动将拣出的文件放入/var/lib/jenkins/jobs/test02/workspace/(配置路径).
给出svn地址的后,会报需要用户密码认证,给出正确的用户名和密码完成SVN的认证.
3.构建过程中使用的shell脚本.rsync从jenkins主机的对应目录下(根据自己的脚本定义)取文件上传到生产服问题.
rsync的秘钥配置(秘钥直接放置到jenkins账号的.ssh/下:/var/lib/jenkins/.ssh/).jenkins在root权限下,启动后,java进程属组就是jenkins的(ps axfu).
使用rsync将已经从svn上down下来的文件放入生产服的时候,务必做好ssh的认证.
/usr/bin/rsync -avz -e "ssh -p 4399" --del --exclude-from=/var/lib/jenkins/exclude.list "${WORKSPACE}/" [email protected]:/home/xbadmin/update/test02;
方法一:
jenkins账号下的/var/lib/jenkins/.ssh/known_hosts文件内容,可以通过其他账号认证后,将其他账号的条目手动拷贝到该文件下予以解决.否则在"构建"过程中,会报Host key verification failed错误,无法成功.
方法二:
默认jenkins账号的shell配置如下:
jenkins❌498:498:Jenkins Continuous Build server:/var/lib/jenkins:/bin/false
在做主机认证时,可以手动指定bash,然后接收访问对端的主机key,完成认证,如下:
su -s /bin/bash jenkins
ssp -p 103.17.41.68 手动输入yes.
rsync可以排除的同步文件语法:
$ cat /var/lib/jenkins/exclude.list
admin_20120610_shijingshanruijiangkeji.
.svn
test.

4.构建完成后,发送邮件问题.
方法一:可以直接在本机安装postfix(默认一般都装了的),service postfix start即可.邮件配置(本机启动postfix,启动25端口,默认就会从本机发出去.同时本地安装个mail,以便用命令发送邮件.mail -s "subject" [email protected] < ./test_mail.txt)
方法二:通过jenkins的全局配置里,配置smtp的认证,通过外网发送相关邮件.
5.正确构建部署后的控制台输出
Success控制台输出
Started by user chenxin
Building in workspace /var/lib/jenkins/jobs/test02/workspace
Updating http://192.168.2.60:8080/svn/yunweibu/06网络相关/机房选择/原始数据 at revision '2014-11-20T15:39:26.195 +0800'
At revision 1288
no change for http://192.168.2.60:8080/svn/yunweibu/06网络相关/机房选择/原始数据 since the previous build
[workspace] $ /bin/sh -xe /tmp/hudson3246779838898506564.sh

  • /usr/bin/rsync -avz -e 'ssh -p 4399' --del --exclude-from=/var/lib/jenkins/exclude.list /var/lib/jenkins/jobs/test02/workspace/ [email protected]:/home/xbadmin/update/test02 //原脚本被转换为全路径
    sending incremental file list //rsync的输出内容.
    sent 360 bytes received 12 bytes 744.00 bytes/sec
    total size is 7906066 speedup is 21252.87
    Finished: SUCCESS
    Jenkins常用其他知识说明
    Jenkins参数化构建( 构建时选择一些参数 或 手动输入参数 ) (常用)
    参考 https://blog.csdn.net/e295166319/article/details/54017231 # 2017版
    可以将参数传递给脚本.参数可以下拉单选,打钩多选等方式.
    触发器 (不常用)
    1.选择日程表的方式构建,构建方式如下(每5分钟构建一次):
    /5 * * * 或 H/5 * * * * (尽可能使用"H",会根据系统负载情况,有jenkins自己去确定具体执行时间.H表示一个范围内的随机值)
    2.修改为其他日程表时间(注意每次修改后,退出在进去,就可以看到下次预计执行的时间提示了)
    3.jenkins对日程表的解释说明
          • 分 时 日 月 周
            M-N 指定一个值的范围
            M/X或*/X 由x的间隔通过指定的范围或整体的有效范围
            A,B,……,Z列举了多个值
            尽可能使用"H",会根据系统负载情况,有jenkins自己去确定具体执行时间.H表示一个范围内的随机值.

            可以标示注释内容

            H * * * * #表示小时内的任意时间执行,具体由jenkins随机选择.H读作:一次
            举例:
            H/15 * * * * #(perhaps at :07, :22, :37, :52)每十五分钟知悉一次.
            H(0-29)/10 * * * * #(three times, perhaps at :04, :14, :24).在每小时的前30分钟内,每10分钟执行一次.
            H 9-16/2 * * 1-5 #(perhaps at 10:38 AM, 12:38 PM, 2:38 PM, 4:38 PM)工作时间内,每2小时执行一次.
            H H 1,15 1-11 * #1-11月内,每月的1-15号,每天执行一次.

视图 (必用)
当任务非常多,在"所有"里看着繁杂,可以点击"+",建立新的视图(列表视图).
然后将对应的任务选进来.比如"启动游戏"视图,就把启动相关的任务勾选进来.

jenkins 多个项目之间串并联执行(将多个任务合并为1个) (常用)
MultiJob https://blog.csdn.net/sunsgne_AC/article/details/80098231
到系统管理里安装 Multijob plugin 插件.
创建任务,选择创建Multijob project->构建->增加构建步骤->MultiJob phase.
然后将对应的之前创建的Job一个一个填进去(并行还是串行自己选择).
解决控制台提示信息(常用)
JNLP ->取消掉启用项目
但要注意的是Jenkins日常的一些关于安全的提示信息,有些插件的升级是为了解决安全问题.
jenkins自身变量说明
The following variables are available to shell scripts
BUILD_NUMBER
The current build number, such as "153"
BUILD_ID
The current build id, such as "2005-08-22_23-59-59" (YYYY-MM-DD_hh-mm-ss)
BUILD_DISPLAY_NAME
The display name of the current build, which is something like "#153" by default.
JOB_NAME
Name of the project of this build, such as "foo" or "foo/bar". (To strip off folder paths from a Bourne shell script, try: ${JOB_NAME##*/})
BUILD_TAG
String of "jenkins-${JOB_NAME}-${BUILD_NUMBER}". Convenient to put into a resource file, a jar file, etc for easier identification.
EXECUTOR_NUMBER
The unique number that identifies the current executor (among executors of the same machine) that’s carrying out this build. This is the number you see in the "build executor status", except that the number starts from 0, not 1.
NODE_NAME
Name of the slave if the build is on a slave, or "master" if run on master
NODE_LABELS
Whitespace-separated list of labels that the node is assigned.
WORKSPACE
The absolute path of the directory assigned to the build as a workspace.
JENKINS_HOME
The absolute path of the directory assigned on the master node for Jenkins to store data.
JENKINS_URL
Full URL of Jenkins, like http://server:port/jenkins/ (note: only available if Jenkins URL set in system configuration)
BUILD_URL
Full URL of this build, like http://server:port/jenkins/job/foo/15/ (Jenkins URL must be set)
JOB_URL
Full URL of this job, like http://server:port/jenkins/job/foo/ (Jenkins URL must be set)
SVN_REVISION
Subversion revision number that's currently checked out to the workspace, such as "12345"
SVN_URL
Subversion URL that's currently checked out to the workspace.
Jenkins对操作系统的环境变量管理( PATH 变量 )
2019/09/17 Chenxin
Jenkins默认读取到的系统的PATH变量,一般为:
/usr/local/jvm/bin:/usr/local/jvm/bin:/sbin:/usr/sbin:/bin:/usr/bin
如果想要修改,则在Jenkins里配置:
Manage Jenkins – >Configure System – >全局属性 –>Environment variables->新增,如下:
键 PATH 值 /usr/local/jvm/bin:/usr/local/sonar-scanner/bin:.../usr/bin:/root/bin:$PATH
键 NODE_PATH 值 /usr/local/nodejs/lib/node_modules
这样,可以通过job里shell输出 echo $PATH 检查正确性(已验证).

修改Jenkins图标文件(生产环境不建议,公司的Logo标志太明显)
路径
/var/cache/jenkins/war/images/
Jenkins控制台管理-关闭,重启,重载配置
关闭Jenkins
http://192.168.3.227:13972/exit
之后,控制台会有个post请求的提示按钮,确定后,就关闭了.
重启Jenkies
http://192.168.3.227:13972/restart

重新加载配置信息
http://192.168.3.227:13972/reload
Job重命名
将job 名为 test-201908 重命名为 maven-git-test-201908 后.
workspace里会重新生成新的文件夹.本质上相当于创建了一个新的job.原先的test-201908文件夹没有改变(只是控制台上看不到了).
jobs文件夹里则相当于 mv test-201908 maven-git-test-201908 了.
Jenkins控制台输出插件(字体颜色)
控制台输出显示颜色.
jenkins输出变色插件:AnsiColor(在系统管理--->插件管理---->可选插件 搜索AnsiColor下载安装即可)
Job里,构建环境->Color ANSI Console Output->ANSI color map 选择 xterm.
执行的shell里需要给出以下,之后控制台输出才会有对应效果.
echo -e "\033[41;30m红底黑字\033[0m" #常用
echo -e "\033[30m 黑色字 \033[0m"
echo -e "\033[31m 红色字 \033[0m"
echo -e "\033[32m 绿色字 \033[0m" #常用
echo -e "\033[33m 黄色字 \033[0m"
echo -e "\033[46;30m 蓝底黑字 \033[0m"
echo -e "\033[4;31m 下划线红字 \033[0m"
echo -e "\033[5;34m 红字在闪烁 \033[0m" # 天蓝
Jenkins与git 标签(版本回滚)
回滚思路: 根据tag拉取代码(之后再进行编译打包发布).
插件方式
Jenkins在发布版本的时候,可以自动打一个tag,并push到远端.
若发布需要回滚,那么就可以从这个tag处,直接checkout代码,重新编译打包.实现版本回滚功能.
具体操作方式和版本,请查网络资料.
脚本方式
非插件方式,可以参考coinw的回滚脚本调用(备份文档).

你可能感兴趣的:(CICD-Jenkins笔记2014-2018)