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、安装及配置
-
下载: 下载地址
-
配置&添加环境变量
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
来源:51CTO
作者:812374156
链接:https://blog.51cto.com/xiong51/2463805