Jenkins是Java语言开发的一款开源 CI/CD 软件,用于自动化各种任务,包括项目的拉取、项目构建、以及项目部署等功能。
中文官网地址:https://www.jenkins.io/zh/
首先开发人员代码提交到仓库;
然后Jenkins 作为持续集成工具,使用 Git 工具到仓库拉取代码到集成服务器,再配合 JDK,Maven 等完成代码编译、测试、审查、打包等工作;
最后Jenkins把生成的 jar 或 war 包分发到测试服务器或者生产服务器,测试人员或用户就可以访问应用;
jenkins LTS(长期支持):每3个月更新一次,适合在企业生产环境使 用
jenkins普通版:每周更新一次,适合开发人员测试使用
清华大学下载Jenkins稳定版地址:https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/
Jenkins需要依赖JDK,安装jdk环境(fontconfig是Jenkins web界面字体包)
yum install fontconfig java-11-openjdk -y
yum localinstall jenkins-2.332.3-1.1.noarch.rpm -y
#docekr安装Jenkins
docker run -id -p 8089:8080 --name jenkins --restart=always -v /opt/jenkins/data:/var/jenkins_home jenkins/jenkins:2.332.3
docker pull jenkins/jenkins:2.433-jdk11
systemctl start jenkins && systemctl enable jenkins
#默认端口:8080(可修改)
ip:8080
/etc/sysconfig/jenkins #主配置文件,主要配置Jenkins的工作目录、启动用户、启动端口。
/var/lib/jenkins/plugins/ #插件存放目录
/var/lib/jenkins/users/ #用户信息存放目录
/var/lib/jenkins #默认的Jenkins家目录(存放项目及插件)
/var/log/jenkins #日志文件目录
Jenkins是一个引擎,他本身的功能很简单,是通过各种不同的插件实现编译部署项目, 例如从 Gitlab 拉取代码,使用 Maven 构建项目等功能需要依靠插件完成 。
如果选择安装推荐的插件,这样大部分常用的插件将会被安装,如果你对Jenkins很熟悉可以自定义插件安装
Jenkins的任务可以让我们实现很多工作流程的自动化,例如 打包、持续集成、部署、定时运行等工作,点击左侧栏新建Item(新建任务)
点击新建Item——》输入一个名称——》选择Freestyle project——》点击确定
在General(常规):复选框中 Discard old builds(丢弃旧版本)每次构建都会生成很多构建产物,如果频繁建会占用很多的空间,可以通过这几个选项控制构建产物的保留,一般建议选择保留最近5-10天的构建历史记录为宜。
点击git,把仓库地址复制进去,然后添加Credentials凭证,(Jenkins主机需要安装一下git工具)——》点击build now测试是否可以拉取代码,构建成功后代码会拉取到/var/lib/jenkins/workspace/choujiang
准备好一台装应用服务器,用来部署拉取的代码,安装好相应的环境,我这里使用Nginx
创建一个脚本,让Jenkins通过shell脚本进行部署,此操作在Jenkins服务器执行
#创建一个目录,用于存放项目的发布脚本
[root@jenkins ~]# mkdir /var/lib/jenkins/script && cd /var/lib/jenkins/script
#以下是项目发布的脚本内容
cat jenkins-nginx.sh
#!/bin/bash
#发布项目到Nginx
#定义Nginx网页根目录
WEB_DIR=/usr/share/nginx
#定义Jenkins项目所在路径
CODE_DIR=/var/lib/jenkins/workspace/choujiang
#项目发布时间
TIME=`date +%F-%H-%M`
#打包项目
cd $CODE_DIR && tar -zcf /tmp/web-$TIME.tar.gz ./*
#发布项目
for IP in `cat /var/lib/jenkins/script/nginx.txt`
do
scp /tmp/web-$TIME.tar.gz root@$IP:$WEB_DIR
ssh root@$IP "cd $WEB_DIR && mkdir web-$TIME"
ssh root@$IP "cd $WEB_DIR && tar -xf web-$TIME.tar.gz -C web-$TIME && rm -rf web-$TIME.tar.gz"
ssh root@$IP "cd $WEB_DIR && rm -rf html && ln -s web-$TIME html"
done
#把nginx主机的IP地址写到这个文件里
vim nginx.txt
server_ip
#添加执行权限
chmod +x jenkins-nginx.sh
#切换到Jenkins用户
usermod -s /bin/sh jenkins && su - jenkins
#生成密钥文件
-sh-4.2$ ssh-keygen
#将公钥传给Nginx
-sh-4.2$ ssh-copy-id root@server_ip
#切换到脚本路径执行脚本(主要是首次连接需要确认yes,否则Jenkins直接 构建会失败)
-sh-4.2$ cd script/
-sh-4.2$ ./jenkins-nginx.sh
回到 Jenkins的choujiang任务点击 设置→构建→增加构建步骤→Execute shell(shell命令)→保存→点击build now测试
本实验实现只要GitLab的master分支有新代码提交,Jenkins 自动触发Build New(立即构建)功能,实现代码自动发布。
安装GitLab构建触发器插件→点击左侧Manage Jenkins→Manage Plugins→可选插件→安装(gitlab和Generic Webhook Trigger)
构建webhook触发器:选择构建触发器→勾选Build when a change is pushed to GitLab. GitLab webhook→高级→勾选Filter branches by name填写Include(master分支)→点击Secret token里面的generate→保存
GitLab设置webhook:
回到GitLab的choujiang项目中点击左侧 设置→webhooks 粘贴Jenkins的令牌到Secret token处→网址填写Jenkins项目中的网址
Jenkins每次自动构建完成后可以把构建的结果反馈给Gitlab,这样在Gitlab上就可以查看每一次构建的结果。
首先在Jenkins上配置,打开 Manage jenkins(管理Jenkins)→confifigure System(系统设置)下拉找到GitLab部分→自定义名称→gitlab服务器地址→再去gitlab生成一个apitoken
Jenkins增加构建后操作步骤:进到任务中点击 配置→构建后操作
maven是Apache基金会开源的一款项目综合管理工具,主要是服务java项目构建,依赖管理等工作。
官网:https://maven.apache.org/
下载地址:https://maven.apache.org/download.cgi(这里使用apache-maven-3.8.1-bin.tar.gz)
# 上传安装包并解压
[root@jenkins ~]# tar -xf apache-maven-3.8.1-bin.tar.gz
#移动解压后的maven并改名
[root@jenkins ~]# mv apache-maven-3.8.1 /usr/local/maven
#将maven添加到环境变量
[root@jenkins ~]# vim /etc/profile
export PATH=/usr/local/maven/bin/:$PATH #在文件末尾添加
#使用source使配置生效
[root@jenkins ~]# source /etc/profile
#验证
[root@jenkins ~]# mvn -v
bin:该目录包含了 mvn 运行的脚本,在命令行输入任何一条 mvn 命令时,实际上就是在调用这些脚本。
boot:该目录只包含一个文件plexus-classworlds-2.5.2.jar是一个类加载器框架,Maven使用该框架加载自己的类库,对于一般的 Maven 用户来说,不必关心该文件。
conf:该目录包含了一个非常重要的settings.xml文件,是Maven的全局配置文件。
lib:该目录包含了所有 Maven 运行时需要的 Java 类库。
LICENSE:记录了 Maven 使用的软件许可证 。
NOTICE:记录了 Maven 包含的第三方软件。
README.txt:包含了 Maven 的简要介绍,包括安装需求及如何安装的简要指令等。
命令 | 功能 |
---|---|
mvn package | 生成jar/war包 |
mvn clean | 清空生成的文件 |
找一个java源码包上传到Jenkins服务器,解压并进入
[root@jenkins ~]# unzip spring-source-mvc-ano-v1.0.zip
[root@jenkins ~]# cd spring-source-mvc-ano-v1.0
# 先进行清理
[root@jenkins spring-source-mvc-ano-v1.0]# mvn clean
# 在进行打包
[root@jenkins spring-source-mvc-ano-v1.0]# mvn package
# 打包后再target里面
[root@jenkins spring-source-mvc-ano-v1.0]# ls target/
配置maven仓库
# maven默认下载的依赖存放在root家目录里面的.m2/repository/里面
[root@jenkins ~]# ll -a
drwxr-xr-x. 3 root root 24 7月 16 19:24 .m2
# 配置远程仓库
[root@jenkins ~]# vim /usr/local/maven/conf/settings.xml
<!-- 阿里云仓库 -->
<mirrors>
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/ce ntral/</url>
</mirror>
</mirrors>
先在gitlab创建一个仓库,创建前先把java包上传到gitlab,方便上传到仓库
仓库名 | 地址 |
---|---|
maven | git@192.168.92.19:root/maven.git |
把项目推送到gitlab仓库
# 将上传的java项目上传解压后进到目录操作一下步骤
git init
git remote add origin git@192.168.92.19:root/maven.git
git add .
git commit -m "第一次提交"
git push -u origin --all
在Plugin Manager里面可选插件中搜索maven,选择Maven Integration进行安装
点击新建Itme,即可看到 构建一个maven项目,输入任务名称后点击构建一个maven项目点击确定。
配置git拉取项目
配置build构建项目
构建后项目地址
[root@jenkins ~]# ls /var/lib/jenkins/workspace/maven-job/target/
spring-source-mvc-ano-1.0-SNAPSHOT.war #这个war包就是构建 出来的web项目
JAR包:就是Java项目的依赖工具
WAR包:Java项目都是打成war包进行发布,将war包放在tomcat的webapps下,并且tomcat服务器能够自动识别,能够对war包进行自动解压
准备一台机器安装Tomcat服务(实验环境可以跟前边的Nginx部署在同一台机器,不冲突)
# java项目需要先安装jdk
[root@tomcat ~]# yum -y install java-1.8.0-openjdk
# 下载Tomcat包上传并解压
[root@tomcat ~]# tar -xf apache-tomcat-8.0.30.tar -C /usr/local/tomcat
# 启动Tomcat
[root@tomcat ~]# /usr/local/tomcat/bin/startup.sh
设置tomcat随机自启
[root@tomcat ~]# vim /etc/rc.local
/usr/local/tomcat/bin/startup.sh
[root@tomcat ~]# chmod +x /etc/rc.d/rc.local
准备脚本
vim /var/lib/jenkins/script/jenkins-tomcat.sh
#!/bin/bash
#发布项目到tomcat
#定义tomcat网页根目录
WEB_DIR=/usr/local/tomcat/webapps/
#定义Jenkins项目所在路径
CODE_DIR=/var/lib/jenkins/workspace/maven-job/target
#项目发布时间
TIME=`date +%F-%H-%M-%S`
#打包项目
cd $CODE_DIR && tar -zcf /tmp/web-$TIME.tar.gz ./*.war
#发布项目
for IP in `cat /var/lib/jenkins/script/tomcat.txt`
do
scp /tmp/web-$TIME.tar.gz root@$IP:$WEB_DIR
ssh root@$IP "cd $WEB_DIR && mkdir web-$TIME"
ssh root@$IP "cd $WEB_DIR && tar -xf web-$TIME.tar.gz -C web-$TIME && rm -rf web-$TIME.tar.gz"
ssh root@$IP "cd $WEB_DIR && rm -rf ROOT* && \cp web-$TIME/*.war ROOT.war"
ssh root@$IP "/usr/local/tomcat/bin/shutdown.sh"
sleep 3
ssh root@$IP "/usr/local/tomcat/bin/startup.sh"
done
准备for循环的主机地址
echo 192.168.92.129 > /var/lib/jenkins/script/tomcat.txt
给脚本执行权限
chmod +x /var/lib/jenkins/script/jenkins-tomcat.sh
回到任务中,点击配置,添加Jenkins执行shell脚本命令
Jenkins Pipeline(流水线) 简单来说就是将多个任务连接起来的一套工作流程。
Jenkinsfifile是用来编写 Pipeline 的脚本语法,在一个Pipeline中有如下几个基础概念:
pipeline:声明此语法是声明式(Declarative)式语法(还有一种脚本式的语法)
agent:是指定执行Step的具体节点,any表示所有(在Jenkins分布式环境下可以指定具体节点去执行任务)。
stages:代表构建项目的阶段开头,里边包含多个stage。
Stage(阶段):一个Pipeline由多个Stage组成,每个Stage(阶段)可包含多个Step(步骤)。
Steps(步骤):可以是拉取代码、构建项目、发布项目等。
示例
pipeline {
agent any
stages {
stage('Build') {
steps {
echo "hh"
}
}
stage('Test') {
steps {
echo "start"
}
}
stage('Deploy') {
steps {
echo "stop"
}
}
}
}
创建一个Pipeline(流水线)项目,点击新建Item→选择pipeline→流水线
pipeline {
agent any
stages {
stage('Build') {
steps {
echo "hh"
}
}
stage('Test') {
steps {
echo "start"
}
}
stage('Deploy') {
steps {
echo "stop"
}
}
}
}
version: '3.7'
services:
jenkins:
image: 'jenkins/jenkins:2.433-jdk11'
container_name: jenkins
user: root
privileged: true
restart: always
ports:
- '8888:8080'
volumes:
- '/opt/jenkins/data:/var/jenkins_home'
- '/var/run/docker.sock:/var/run/docker.sock'
- '/usr/bin/docker:/usr/bin/docker'
评论