1. 什么是jenkins
Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,起源于Hudson(Hudson是商用的),主要用于持续、自动的构建/测试软件项目、监控外部任务的运行(这个比较抽象,暂且写上,不做解释)。Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。通常与版本管理工具(SCM)、构建工具结合使用。常用的版本控制工具有SVN、GIT,构建工具有Maven、Ant、Gradle。
2.什么是持续集成(CI)
因为开发部门同时维护多个版本,多个版本的发布,测试需要大量人力,所以要有一个专业的持续集成工具来管理持续重复的工作。
3. 安装Jenkins
(1) 准备条件
1.安装JDK。
下载jdk,上传至linux并解压
配置/etc/profile的内容
使配置生效
检测java环境信息
(2)安装Jenkins
1. 下载jenkins
wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war
2. 启动jenkins
# 使用nohup命令启动 nohup 当虚拟机黑屏时 也会运行 日志--->输出到jenkins.log & 后台运行
nohup java -jar /data/software/jenkins.war --httpPort=8777 --httpsPort=8778 > /data/software/jenkins.log 2>&1 &
3. 使用tail命令查看启动日志,日志中会输出jenkins密码
4. 通过浏览器访问jenkins
192.168.14.133:8777/jenkins
创建完成
4. 修改jenkins的镜像地址
jenkins
的所有插件安装后需要重启才能生效,由于Jenkins国外官方插件地址下载速度非常慢,所以可以修改为国内插件地址(清华大学源):
2个步骤
-
进入
Manage Jenkins -》 Manage Plugin -> Advanced
最下面有Update Site
设置为:
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
2.
-
修改服务器配置,进入
jenkins
安装目录 ,找到/updates/default.json
文件 (我这里是/home/jenkins/.jenkins/updates/default.json
),将其中的updates.jenkins-ci.org/download
替换为mirrors.tuna.tsinghua.edu.cn/jenkins ,然后把www.google.com 修改为 www.baidu.com
-
进入到
default.json
所在目录
/root/.jenkins/updates/default.json
-
使用如下命令进行替换
# 修改之前建议做下备份,养成备份好习惯,大家在公屏上输入 备份大法好 sed -i 's/http:\/\/updates.jenkinsci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
替换后使用http://192.168.1.195:8777/restart
重启jenkins
5. JDK集成
5.1 下载Linux版JDK
链接: https://pan.baidu.com/s/1Xd-zDEQDMc6Q0kwZ6o3PAA 提取码: bq6s
5.2上传至Linux并解压
$ tar -zxvf jdk8u181.tar.gz
5.3 配置/etc/profile
文件
$ vi /etc/profile # 在最底部加入以下内容后保存并退出 # JDK export JAVA_HOME=/usr/local/java/jdk1.8.0_181 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
5.4 使配置文件生效,并检查版本号
$ source /etc/profile $ java -version java version "1.8.0_181" Java(TM) SE Runtime Environment (build 1.8.0_181-b13) Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
5.5 jenkins
中配置JDK路径
jenkins-》全局工具配置-》JDK-》新增JDK
6. 集成Git
为了jenkins能够拉取代码,需要安装Git环境和jenkins对应的Git插件
-
CentOS 7
上安装Git环境
# 安装 $ yum install git -y # 查看版本 $ git --version
-
jenkins
安装Git
插件
4.Gitee上任意建一个仓库
7. 需要凭证配置
凭据就是用来存储需要密文保护的数据库密码、Gitee密码信息、Docker私有仓库密码等,以便 Jenkins可以和这些第三方的应用进行交互。
1.凭证插件安装Credentials Binding
8.Maven集成
在jenkins
上发布Java项目时需要使用Maven
来进行构建打包(Gradle项目则需要安装配置Gradle)
8.1 下载安装
# 找一个目录存放maven cd /data/software/ # 从阿里云上下载maven安装包 wget https://mirrors.aliyun.com/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz # 解压 tar -zxvf apache-maven-3.6.3-bin.tar.gz # 当前maven的安装目录为:/usr/local/java/apache-maven-3.6.3
8.2 环境配置
vi /etc/profile 在最后面JDK配置上作出一些更改 export MAVEN_HOME=/usr/local/java/apache-maven-3.6.3 export PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH
8.3 使配置生效并查看安装情况
source /etc/profile mvn -version
以上是成功;
8.4 jenkins配置
Maven
8.5 安装Maven插件
8.6 在/data/software
目录下新建一个repository
文件夹,用来作为maven
的仓库
$ cd /data/software $ mkdir repository
8.7 使用root
账户修改Maven的settings.xml
文件(指定仓库目录和阿里云镜像)
/data/software/repository aliyun-maven central aliyun maven mirror http://maven.aliyun.com/nexus/content/groups/public/ ... ...
8.8 Maven测试项目构建
接下来的步骤是将java项目传到Gitee上供jenkins拉取打包,如果运维同学不懂Java代码,可以直接将我的Git项目fork或采用gitlab 等其他方式进行拉取。
新建Maven项目
在码云上建一个同名的git项目
使用Git上传到码云
使用git bash
命令将项目初始化,无论是传到Gitee、GitHub、GitLab、Codeup步骤一样,如果对Git的安装部署不熟悉
# 进入到本地的项目文件夹 $ cd existing_folder # 初始化仓库 $ git init # 添加文件至工作区并提交 $ git add . $ git commit -m "first commit" # 关联Gitee远程仓库 $ git remote add origin https://gitee.com/nobug8/it235-jenkins-jar.git # 将本地仓库推送到远程仓库的master分支,此处会弹出用户名密码交互 $ git push -u origin master ## 如果push报错可以先拉取一下,会有新的gitee生成的文件拉下来,然后重新添加提交并push $ git pull origin master --allow-unrelated-histories $ git add . $ git commit -m "拉取下来合并后再次提交" $ git push -u origin master
8.9 jenkins添加Maven项目任务
新建任务
编写Maven编译命令
构建并查看控制台日志
保存后,点击立即构建,然后进入日志控制台查看日志
从日志可以看到代码已经在拉取了,而且走的事阿里云仓库,第一次拉取过程会比较长。
通过查看/data/software/repository
可以看到有存放拉取的jar包,通过这2个证据可以证明settings.xml
文件配置成功且有效
构建成功后查看jenkins
的workspace
目录下的jar包
ls查看 我ava -jar testjenkins1-0.0.1-SNAPSHOT.jar运行
浏览器访问192.168.142.133:8080/test
思考,这里我们需要执行的shell内容是什么?
是不是把当前编译好的jar包拷贝到应用服务器去启动
-
应用服务器规划
由于jenkins
构建消耗内存极大,一般jenkins是一台单独的工具机器,Java项目一般在其他的机器上,这里我重新安装一台虚拟机,有条件的同学可以直接开通阿里云的ECS ()
应用服务器信息
-
IP:192.168.223.129
-
JDK:1.8(安装过程省略)
-
user:root
-
部署路径:/data/app/my-boot
-
端口:9010
(1)配置ssh免密登录
免密登录主要是方便jenkins服务器192.168.223.128的root用户—》应用服务器192.168.223.129的root用户上的jar包拷贝,部署本就是jar包拷贝的过程
在192.168.223.128机器上使用root用户生成秘钥注意此处是root用户
$ ssh-keygen -t rsa # 3次回车
运行后会在当前用户的根目录生成一个.ssh文件夹
ssh文件夹中的文件描述
-
id_rsa
: 生成的私钥文件 -
id_rsa.pub
: 生成的公钥文件
接下来需要将公钥导入到认证文件中
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
如果希望ssh公钥生效需满足至少下面两个条件:
-
.ssh
目录的权限必须是700 -
.ssh/authorized_keys
文件权限必须是600
给对应文件授权
$ chmod 700 ~/.ssh $ chmod 600 ~/.ssh/authorized_keys
将authorized_keys
文件拷贝到应用服务器的admin用户.ssh目录下
# 在应用服务器(192.168.223.129)上用root用户创建/root/.ssh文件夹 mkdir -p /root/.ssh # 在jenkins服务器(192.168.223.128)上将pub公钥文件拷贝到应用服务器的.ssh目录下 scp -p ~/.ssh/id_rsa.pub root@192.168.223.129:/root/.ssh/authorized_keys
在jenkins192.168.223.128服务器上进行免密连接测试
# 在jenkins服务器的/root/目录下创建filetest文件,并拷贝到应用服务器 $ cd ~/ $ touch filetest $ scp -p filetest root@192.168.223.129:/root/filetest # 进入到应用服务器(192.168.223.129),检查/root目录下是否出现filetest # 在jenkins服务器上使用ssh进行免密连接测试,成功后会出现Last Login的提示 $ ssh root@192.168.223.129 Last login: Sun Sep 20 21:53:03 2020 $ exit
-
到此免密登录和拷贝实现成功,为接下来jar包部署提供了快捷的帮助
9.1 编写jenkins
发布脚本
#!/bin/bash echo "部署的目录和项目名称" DIR="/data/app" projectName="my-boot" echo "待部署的应用服务器,可多台" server_ips="192.168.223.129" for server_ip in ${server_ips[@]} do echo "ssh连接进行备份操作" ssh -Tq -oStrictHostKeyChecking=no root@${server_ip} <
9.11编写应用启动脚本
-
在
/data/app/my-boot
目录下创建启动脚本start.sh
$ touch start.sh $ vim start.sh # 将下面代码粘贴到start.sh中
#!/bin/bash set -e #任何命令出错就退出 set -o pipefail APP_ID=my-boot APP_DIR="/data/app" nohup java -jar ${APP_DIR}/${APP_ID}/${APP_ID}.jar > release_out.log & start_ok=false if [[ $? = 0 ]];then sleep 3 tail -n 10 release_out.log sleep 5 tail -n 50 release_out.log fi aaa=`grep "Started" release_out.log | awk '{print $1}'` if [[ -n "${aaa}" ]];then echo "Application started ok" exit 0 else echo "Application started error" exit 1 fi
在/data/app/my-boot
目录下创建停止脚本stop.sh
$ touch stop.sh $ vim stop.sh # 将下面代码粘贴到stop.sh中
#!/bin/bash APP_ID=my-boot ps aux | grep ${APP_ID} | grep -v "grep" | awk '{print "kill -9 "$2}' | sh
-
并进行启动和停止测试,查看日志输出是否正常
-
将下述启动代码配置
jenkins
中
sh $DIR/${projectName}/stop.sh sh $DIR/${projectName}/start.sh
访问并测试代码是否生效
-
如果是虚拟机则需要给防火墙添加9010端口
$ su root # 开启防火墙9010端口 $ firewall-cmd --zone=public --add-port=9010/tcp --permanent # 使配置生效 $ firewall-cmd --reload
修改代码返回值,提交至Gitee,并再次进行构建发布,访问http://192.168.223.129:9010
查看结果是否更新