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

SVN

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 10s

java -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 10s

https://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代理后 无法保存问题

  1. 在反向代理服务器Nginx中设置 ignore_invaild_headers nginx server配置段中添加如下内容:
server {
    ignore_invalid_headers off;
}
  1. 在Jenkins全局安全设置中取消勾选Prevent Cross Site Request Forgery exploits