2020-02-08
Jenkins
Jenkins 是一款开源 CI&CD 软件, 用于自动化各种任务, 包括构建, 测试和部署软件;
Jenkins 支持各种运行方式, 可通过系统包, Docker 或者通过一个独立的 Java 程序;

部署(Centos)
CentOS 选 Red Hat/Fedora/CentOS
rpm -ivh jenkins-2.215-1.1.noarch.rpm
参考 貌似没有Centos的安装说明, 但是可以参考Linux Debian/Ubuntu 一节
This package installation will:
Setup Jenkins as a daemon launched on start. See /etc/init.d/jenkins for more details. //守护程序的运行文件
Create a ‘jenkins’ user to run this service.//创建了 ‘jenkins’ 用户来运行服务
Direct console log output to the file /var/log/jenkins/jenkins.log. Check this file if you are troubleshooting Jenkins. //重定向控制台输出到文件
populate /etc/default/jenkins with configuration parameters for the launch, e.g Populate /etc/default/jenkins with configuration parameters for the launch, e.g JENKINS_HOME //默认配置运行参数, 然而并没有这个文件. Centos 是 /etc/sysconfig/jenkins
Set Jenkins to listen on port 8080. Access this port with your browser to start configuration.//默认8080 端口
修改 JENKINS_JAVA_CMD
vi /etc/sysconfig/jenkins
JENKINS_JAVA_CMD=“/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64/jre/bin/java” // 需要直接执行java程序
修改启动脚本的 candidates
vi /etc/init.d/jenkins
candidates=”
…
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64/jre/bin/java
”
启动/停止
cd /etc/init.d/
./jenkins start
Usage: ./jenkins {start|stop|status|try-restart|restart|force-reload|reload|probe} /etc/init.d/./jenkins start
无法运行
看下状态
./jenkins status
● jenkins.service - LSB: Jenkins Automation Server Loaded: loaded (/etc/rc.d/init.d/jenkins; bad; vendor preset: disabled) Active: active (exited) since Wed 2020-02-12 14:00:20 CST; 9min ago Docs: man:systemd-sysv-generator(8) Process: 17376 ExecStart=/etc/rc.d/init.d/jenkins start (code=exited, status=0/SUCCESS)
特TM奇葩 什么提示都没有只是exited 状态
原因是: 默认创建的 jenkins, 没有权限 对日志等文件的读写
授权
chmod 776 /etc/sysconfig/jenkins
chown jk-nyy:jk-nyy /etc/sysconfig/jenkins //配置文件
chown jk-nyy:jk-nyy /etc/init.d/jenkins //启动程序
chown jk-nyy:jk-nyy /var/log/jenkins -R //日志文件
chown jk-nyy:jk-nyy /var/lib/jenkins -R //主目录
chown jk-nyy:jk-nyy /var/run/jenkins.pid //.PID
chown jk-nyy:jk-nyy /var/cache/jenkins/ -R
chown jk-nyy:jk-nyy /var/lock/subsys/jenkins或者
修改配置文件的 JENKINS_USER 用户
vi /etc/sysconfig/jenkins
JENKINS_USER=“root”
./jenkins start
/etc/init.d/./jenkins {start|stop|status|try-restart|restart|force-reload|reload|probe}
ps -ef |grep jenkins
部署(Windows)
启动 初始安装时, Jenkins启动有两种方式(都要用到Jenkins的war包):
java -jar jenkins.war 该方式以系统的java_home路径中的java程序来执行的, 以web容器来启动; 但是Jenkins安装时也包含了jre
net start jenkins 该启动方式以Jenkins.exe作为宿主, 采用windows服务的方式启动; (跟上面一样都要用到jenkins的war包)
但是这两种方式的工作目录有所不同:
默认目录:
java -jar jenkins.war方式启动时会在用户的目录生成.Jenkins目录作为默认工作目录【C:\Users\Administrator.jenkins】
net start jenkins 方式启动的工作目录由jenkins安装目录的jenkins.xml配置中”JENKINS_HOME”所决定的, 默认的工作目录时%BASE%即Jenkins的安装目录;
访问 jenkins.xml 默认是8080端口: http://127.0.0.1:8080/
基本
关闭Jenkins 只需要在访问jenkins的网站后面加上exit即可; http://localhost:8080/exit
重启Jenkins
同理: http://localhost:8080/restart
重新加载配置
同理 http://localhost:8080/reload
配置菜单
Manage Jenkins -> Global Tool Configuration
可以配置 JDK Maven 等目录
Manage Jenkins -> Configure System
配置 email 通知等
Jenkins Location 配置主机url, 貌似不能配置root
New Item
新建构建项目
项目配置菜单
General
通用配置
Discard old builds
丢弃旧版的构建
This project is parameterized
This project is parameterized 选项 添加带参数的构建, 然后在buil的时候回要求选择参数,
然然后 在shell里面 $Name 的值 可以访问该参数值.
case $Status in
Deploy)
echo "Status:$Status"
path="${WORKSPACE}/bak/${BUILD_NUMBER}" #创建每次要备份的目录
if [ -d $path ];
then
echo "The files is already exists "
else
mkdir -p $path
fi
\cp -f ${WORKSPACE}/target/*.war $path #将打包好的war包备份到相应目录,覆盖已存在的目标
echo "Completing!"
;;
Rollback)
echo "Status:$Status"
echo "Version:$Version"
cd ${WORKSPACE}/bak/$Version #进入备份目录 $Version 是Jenkins的#x版本
\cp -f *.war ${WORKSPACE}/target/ #将备份拷贝到程序打包目录中, 并覆盖之前的war包
;;
*)
exit
;;
esac
ReservedNum=5 #保留文件数
FileDir=${WORKSPACE}/bak/
date=$(date "+%Y%m%d-%H%M%S")
cd $FileDir #进入备份目录
FileNum=$(ls -l | grep '^d' | wc -l) #当前有几个文件夹, 即几个备份
while(( $FileNum > $ReservedNum))
do
OldFile=$(ls -rt | head -1) #获取最旧的那个备份文件夹
echo $date "Delete File:"$OldFile
rm -rf $FileDir/$OldFile
let "FileNum--"
done Advanced…
→ 高级
自定义工作目录
Use custom workspace 自定义工作目录
Source Code Management
构建的代码来源, 注意Credentials是添加SVN的用户名&密码, 每次构建最新版本的SVN提交, 需要在地址后面加上 @HEAD
svn://121.32.129.19/jklims/IOT/jk-nyy-admin/release@HEAD
Build Triggers
构建触发配置
Trigger builds remotely (e.g., from scripts) 远程手动触发, Authentication Token 填token, 然后远程拼接url访问
Build after other projects are built 在其他项目构建完成后.
Build periodically 定期构建
poll scm 隔一段时间比较一次源代码如果发生变更就build;
构建语法
(五颗星, 中间用空格隔开)
第一颗表示分钟, 取值0~59
第二颗表示小时, 取值023
第三颗表示一个月的第几天, 取值1~31
第四颗表示第几月, 取值112
第五颗*表示一周中的第几天, 取值0~7, 其中0和7代表的都是周日
五个*: 每分钟比较一次源代码
Build
构建步骤配置
实例脚本
export BUILD_ID=dontKillMe
match_="jk-nyy-admin-*.jar"
pid_=`ps -ef|grep ${match_}|grep -v grep|awk '{print $2}'`
if test -n ${pid_}; then
if test ${pid_} -gt 0 ;then
echo "excute: kill ${pid_}--"
kill ${pid_}
fi
fi
spjar=`find -name ${match_}`
cat /dev/null > nohup.out
nohup java -jar ${spjar} --spring.profiles.active=prod &
sleep 10sjava -jar jk-nyy-admin-3.0.jar —spring.profiles.active=prod
前端
target_dir="/usr/share/nginx/html/wlw_admin"
if [ -d ${target_dir} ];then
rm -r ${target_dir}
fi
unzip dist.zip
mv dist/ ${target_dir}
echo "--------------------------------完成"
tomcat
export BUILD_ID=dontKillMe
tomcatRoot='/opt/apache-tomcat-8.5.50/'
projectRoot='/opt/apache-tomcat-8.5.50/webapps/dataV/'
workRoot='/var/lib/jenkins/workspace/dataView_nyy/'
rsync --exclude=.svn ${workRoot} ${projectRoot} -rv
cp ${workRoot}sysproperties-linux ${projectRoot}WEB-INF/classes/config/sys.properties
if [ "${reTomcat}" = 'true' ]; then
cd ${tomcatRoot}bin/
out=`./shutdown.sh`
echo "Tomcat shutdown => "+$out
exec ./startup.sh
fi
echo "end sleep.."
sleep 10s
Build 进程被kill
因为Jenkins默认会在Build结束后Kill掉所有的衍生进程;
方法一:
修改/etc/sysconfig/jenkins配置, 在JENKINS_JAVA_OPTIONS中加入-Dhudson.util.ProcessTree.disable=true; 需要重启jenkins生效 此方法配置一次后, 所有的job都无需设置BUILD_ID, 就能够防止jenkins杀死启动的java进程 jenkins默认在build结束后会kill掉所有的衍生进程
方法二:
sh /home/cloud/exec/test.sh
脚本内容为:
export BUILD_ID=dontKillMe
nohup java -jar /home/cloud/run/spring-boot-0.0.1-SNAPSHOT.jar >/dev/null 2>&1 &
# 奇怪 如果去掉以下延时,就会被jenkins杀掉.尴尬; ; ;
sleep 10shttps://blog.csdn.net/u011781521/article/details/80210985 http://127.0.0.1:8000/nyy/admin/auth/vCode http://122.112.213.187/nyy/auth/vCode
Build Environment
Nginx代理后 无法保存问题
- 在反向代理服务器Nginx中设置 ignore_invaild_headers nginx server配置段中添加如下内容:
server {
ignore_invalid_headers off;
}- 在Jenkins全局安全设置中取消勾选
Prevent Cross Site Request Forgery exploits
…