1、Jenkins是什么?

​ Jenkins是一个开源的支持自动化构建、部署等任务的平台。基本上可以说是持续集成(CI)、持续发布(CD)不可或缺的工具。 jenkins官网

​ 持续集成是一个监视你版本控制系统改变的软件。每当代码改变的时候,这个工具自动的编译和测试你的应用。如果出现了错误,这个工具立即通知开发者,因此开发者能够立即修复问题。而且它还能自动地监测代码质量和测试覆盖率。可视化的代码质量度量方案能够鼓励开发者不断地改进他们的代码

2、安装

版本说明:系统: centos 7.6, jdk: 8u181, jenkins: 2.210

2.1、安装jdk

~]# tar xf jdk-8u181-linux-x64.tar.gz -C /usr/java/
~]# cd /usr/java/
java]# ln -sv jdk1.8.0_181/ default
java]# ln -sv default/ jdk
  
]# cat /etc/profile.d/java.sh 
export JAVA_HOME=/usr/java/jdk
export PATH=$JAVA_HOME/bin:$PATH

2.2、yum源

导入
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key

安装  yum -y install jenkins

2.3、rpm&docker

​ rpm安装: 下载地址 docker: hub, 配置说明

配置文件

 ~]# rpm -ql jenkins-2.210-1.1
/etc/init.d/jenkins
/etc/logrotate.d/jenkins
/etc/sysconfig/jenkins
/usr/lib/jenkins
/usr/lib/jenkins/jenkins.war
/usr/sbin/rcjenkins
/var/cache/jenkins
/var/lib/jenkins
/var/log/jenkins

2.3.1、配置jenkins

]# grep -v "^#" /etc/sysconfig/jenkins | grep -v "^$"
# 工作目录
JENKINS_HOME="/usr/local/website/jenkins"
# java地址
JENKINS_JAVA_CMD="/usr/java/jdk/bin/java"
JENKINS_USER="jenkins"
JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true"
# 指定端口
JENKINS_PORT="18888"  
JENKINS_LISTEN_ADDRESS="0.0.0.0"
JENKINS_HTTPS_PORT=""
JENKINS_HTTPS_KEYSTORE=""
JENKINS_HTTPS_KEYSTORE_PASSWORD=""
JENKINS_HTTPS_LISTEN_ADDRESS=""
JENKINS_HTTP2_PORT=""
JENKINS_HTTP2_LISTEN_ADDRESS=""
JENKINS_DEBUG_LEVEL="5"
JENKINS_ENABLE_ACCESS_LOG="no"
JENKINS_HANDLER_MAX="100"
JENKINS_HANDLER_IDLE="20"
JENKINS_EXTRA_LIB_FOLDER=""
JENKINS_ARGS=""

2.3.2、启动配置服务

]# ll -d /usr/local/website/jenkins/  # 工作目录
drwxr-xr-x 2 jenkins jenkins 6 1月   2 11:39 /usr/local/website/jenkins/

# 启动服务查看状态
]# systemctl restart jenkins
]# systemctl status jenkins

#由于Jenkins不是Native Service,所以需要用chkconfig命令而不是systemctl命令
]# chkconfig jenkins on
]# chkconfig --list jenkins
jenkins        	0:关	1:关	2:开	3:开	4:开	5:开	6:关

3、jenkins初始化

解锁jenkins

JENKINS_HOME="/usr/local/website/jenkins" # 定义的目录

]# cat /usr/local/website/jenkins/secrets/initialAdminPassword

选择推荐的插件

下载等待

实例配置、这里是url的访问路径 ,nginx反代也将使用这个地址

jenkins就绪准备

jenkins主界面

访问界面

4、配置maven

4.1、安装及配置

  1. 下载: 下载地址

  2. 配置&添加环境变量

local]# tar xf apache-maven-3.6.3-bin.tar.gz 
local]# ln -sv apache-maven-3.6.3 maven

local]# echo "export PATH=$PATH:/usr/local/maven/bin" > /etc/profile.d/maven.sh && source /etc/profile.d/maven.sh

]# mvn -version
Apache Maven 3.6.3 (cecedd343002696d0abb150b32b541b8a6ba2883f)
Maven home: /usr/local/maven
Java version: 1.8.0_181, vendor: Oracle Corporation, runtime: /usr/java/jdk1.8.0_181/jre修改默认下载仓库

4.2、下载源配置

4.2.1、maven

]# vim /usr/local/maven/conf/settings.xml  # 位置在157行
<mirrors>
    <mirror>
        <id>maven私服</id>
        <name>私服name</name>
        <url>maven私服,可以使用阿里或自定义/</url>
        <mirrorOf>central</mirrorOf>
    </mirror>
</mirrors>

4.2.2、jenkins

点高级(advanced) 站点地址

4.3、全局配置

4.3.1、配置maven

manage jenkins --> global tool configuration(全局配置) --> settings.xml 配置过下载源的文件

4.3.2、配置jdk

就在maven配置下面

4.3.3、配置maven

4.4、publish over ssh

安装插件说明

4.4.1、安装

4.4.2、私钥

]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.

# 设置本地免密登陆
]# ssh-keygen -t rsa
]# cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
]# chmod 600 !$    
]# ssh localhost
# 如果还是不行查看 tailf /var/log/secure

4.4.3、配置ssh

manage jenkins --> configure system --> publish over SSH

5、构建

5.1、构建第一个工程

subversion构建

提供svn用户密码

清除之后重新编译java类 clean compile install -Dmaven.test.skip=true

构建步骤, exec command为最后的步骤,可以定义脚本

svn中pom.xml文件头部,开发提供

<modelVersion>4.0.0</modelVersion>
<groupId>com.geokon</groupId>
<artifactId>name</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>gmonitor Maven Webapp</name>
<url>http://maven.apache.org</url>

# 拼起来就是  name-0.0.1-SNAPSHOT.war

5.2、构建查看

点击项目--> build now --> 点击构建项目进度条 --> 控制台输出日志

# 等待
[JENKINS] Archiving /usr/local/website/jenkins/workspace/first_maven/pom.xml to com.geokon/gmonitor/0.0.1-SNAPSHOT/gmonitor-0.0.1-SNAPSHOT.pom
[JENKINS] Archiving /usr/local/website/jenkins/workspace/first_maven/target/gmonitor.war to com.geokon/gmonitor/0.0.1-SNAPSHOT/gmonitor-0.0.1-SNAPSHOT.war
channel stopped
SSH: Connecting from host [docker_v6]
SSH: Connecting with configuration [docker_v6] ...
SSH: Disconnecting configuration [docker_v6] ...
SSH: Transferred 1 file(s)

# 登陆 9.62服务器就能看到对应的war包了
~ ]# ls /mnt/gmonitor
	gmonitor.war

6、docker

操作与构建一样, docker:社区 19.03.5, jenkins: 2.210, 脚本 bash, svn

6.1、构建

清除之后重新编译java类 clean compile install -Dmaven.test.skip=true

exec timout(ms) 时间需要加长: 默认 120000 加个0

构建之后控制台输出

6.2、脚本

6.2.1、Dockerfile

]# cat Dockerfile 
FROM centos:7.6.1810

ADD jdk-8u181-linux-x64.tar.gz /data/
COPY apache-tomcat-8.5.38 /data/tomcat/

WORKDIR /data

ENV JAVA_HOME=/data/jdk1.8.0_181
ENV CATALINAME_HOME=/data/tomcat
ENV CATALINAME_VERSION=8.5.38
ENV PATH=$JAVA_HOME/bin:$CATALINAME_HOME/bin:$PATH
ENV LC_ALL=en_US.UTF-8

EXPOSE 8081

#CMD ["catalina.sh", "run"]
CMD ["run.sh"]

6.2.2、run.sh

]# cat apache-tomcat-8.5.38/bin/run.sh 
#!/bin/bash
#
#   Name: docker 容器运行
#   Version Number:1.01
#   Type: docker
#   Language:bash shell  
#   Date:2019-12-31 
#   Author:xiong

# 启动tomcat
bash /data/tomcat/bin/startup.sh
# 长期输出catalina.out日志, 如果不这么定义需要在前处理catalina.out日志
tail -f /data/tomcat/logs/catalina.out

6.2.3、jenkins脚本

]# cat /mnt/jenkins_docker.sh 
#!/bin/bash
# 
#   Name:jenkins scripts
#   Version Number:1.01
#   Type:服务启动脚本 
#   Language:bash shell  
#   Date:2020.01.03
#   Author:xiong
#
# jenkins 传递参数说明*****: bash script 项目名称 端口号
# svn中的pom.xml文件名称必须与jenkins项目名称对应,以及与docker名称必须对应
# ps: 一个容器对应一个端口,强制性必须唯一

P_NAME=$1     # 接受参数  项目名称
P_PORT=$2     # 项目端口

WEBSITE=/usr/local/website
R_PRO_NAME=${WEBSITE}/${P_NAME}                   # 相对程序路径
R_PRO_NAME_WORK=${R_PRO_NAME}/work                # work路径
R_PRO_NAME_LOG=${R_PRO_NAME}/log                  # 日志
R_PRO_NAME_LINK=${R_PRO_NAME_WORK}/${P_NAME}      # 软链接,灰度发布
A_PRO_DATE_NAME=${P_NAME}`date +%Y%m%d%H%M`       # 真实名称,项目名称
A_PRO_NAME=${R_PRO_NAME_WORK}/${A_PRO_DATE_NAME}  # 真实访问路径
JENKINS_SAVE_DIR=/mnt/${P_NAME}                   # jenkins 提交的目录 /mnt/gmonitor

delete_container() {
    # 如果容器不存在, 解压完之后就不在删除配置文件,直接灰度
    /usr/bin/docker container ls | /usr/bin/grep ${P_NAME} &>/dev/null
    if [ $? -eq 0 ]; then
        # 如果存在,先删除容器,然后在配置上线
        /usr/bin/docker container stop ${P_NAME} &>/dev/null
        /usr/bin/docker container rm ${P_NAME} &>/dev/null
    fi
    project_config
    
}

project_config() {
    [ ! -d "${R_PRO_NAME}" ] && /bin/mkdir ${R_PRO_NAME}/{log,work} -p
    [ ! -d "${A_PRO_NAME}" ] && /bin/mkdir ${A_PRO_NAME} -p
    
    /usr/bin/unzip ${JENKINS_SAVE_DIR}/*.war -d ${A_PRO_NAME}/ &>/dev/null  # 解压文件
    # 如果存在软链接说明曾经上过线
    if [ -L "${R_PRO_NAME_LINK}" ]; then
        if [ -d "${R_PRO_NAME_LINK}/upload" ]; then
           /bin/rm -irf ${A_PRO_NAME}/upload
          /bin/cp -i ${R_PRO_NAME_LINK}/upload ${A_PRO_NAME}/ -r
        fi
        /bin/rm -irf ${A_PRO_NAME}/WEB-INF/classes/*.properties   # 清除配置文件
        /bin/cp -i ${R_PRO_NAME_LINK}/WEB-INF/classes/*.properties ${A_PRO_NAME}/WEB-INF/classes/ -r
        /bin/rm -irf ${R_PRO_NAME_LINK} &>/dev/null    # 删除软链接
    fi
    /bin/ln -sv ${A_PRO_NAME} ${R_PRO_NAME_LINK} &>/dev/null
}

# 创建新容器
create_container() {
    /usr/bin/docker run -it --name ${P_NAME} --network bridge -p ${P_PORT}:8081 -v ${R_PRO_NAME_LINK}:/usr/local/website/ -v ${R_PRO_NAME_LOG}:/data/tomcat/logs --memory 2048m --memory-reservation 2000m --oom-kill-disable --privileged --restart=on-failure:10 --env TZ='Asia/Shanghai' --volume /etc/localtime:/etc/localtime:ro -d v6-test/tomcat:v8.5.38-jdk8u181-1
}

delete_container
create_container