Jenkins
1、什么是Jenkins
Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成。
Jenkins是一个可拓展的持续集成引擎。
2、Jenkins的作用
- 持续、自动地构建、测试软件。
- 监控一些任务,或定时任务。
3、什么是CI/CD
持续集成、持续部署
持续集成:重点是将开发者的工作集中到代码仓库,一般情况每天都会有更新,持续集成可以更快的进行集成,更快的得到响应。
持续部署:是一种更高程度的自动化,可以根据需求进行持续的自动的的部署项目。
4、Jenkins的应用场景
应用于大型项目、分布式项目、微服务项目的,小型项目不适应(没必要用)。
5、Jenkins特性
- 易于安装。有多种安装方式,可以在线安装,也可以下载安装包安装,也可以运行war包。
- 配置简单。Jenkins提供web端的配置方式,安装成功后,所有的配置都可以在web端完成。
- 集成了Email等工具,可以在集成或部署时通知工作人员。
- 有丰富的插件库。处理已有的插件,也可以自己开发插件。
- Jenkins支持分布式。
6、安装Jenkins
1、上传文件
我们采用安装包的方式安装。
统一安装 jenkins-2.263-1.1.noarch.rpm
2、安装Jenkins
rpm -ivh jenkins-2.263-1.1.noarch.rpm
rpm可以用来安装应用程序
-i :安装软件包
-v:可视化
-h:显示进度
3、修改启动用户为root
vim /etc/sysconfig/jenkins
把JENKINS_USER的值修改成root
4、启动jenkins并加入开机启动
systemctl start jenkins
systemctl status jenkins
根据错误日志,可以看出Jenkins没有启动成功,报错和java配置有关。
如果实在找不到什么错误,把特殊的字复制到网上搜索
5、报错,检查配置文件java的配置
修改Jenkins的配置文件,添加我们的java可执行文件的路径,注意一定是可执行文件,不是JAVA_HOME的路径。
vim /etc/rc.d/init.d/jenkins
6、启动前查看该目录是空的,启动后会生成相应的文件
ll /var/lib/jenkins
成功后,这个目录文件下回有很多文件
7、登录
cat /var/lib/jenkins/secrets/initialAdminPassword
这个文件中保存了admin的初始化密码,大家的都不一样,而且很长,不方便记,后续一定要修改。
8、跳过插件安装
9、修改密码
密码统一修改成123456
10、安装插件
1、查看已安装插件
没有安装任何插件。
通过服务器查看:
2、解压文件
tar -zxvf jenkins-plugins.tar.gz
ll plugins/ |wc -l
一共给大家191个插件。
3、拷贝插件
将解压好的插件拷贝到Jenkins下
cp -a plugins/* /var/lib/jenkins/plugins/
ll /var/lib/jenkins/plugins/ |wc -l
4、重启Jenkins
/etc/init.d/jenkins restart
2、Git设置
1、上传文件
将git压缩包上传到服务器上,git-2.33.0.tar.gz
2、解压压缩包
tar -zxvf git-2.33.0.tar.gz
会生成一个目录文件,程序就在这个目录文件中
3、安装所需依赖
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker
4、编译
make prefix=/usr/local/git all
5、安装
make prefix=/usr/local/git install
6、修改环境变量
vi /etc/profile
#set git
export PATH=$PATH:/usr/local/git/bin
source /etc/profile
7、检查
git --version
8、在Jenkins添加git配置
我们通过Jenkins调用git的命令,实现代码管理,所以要在Jenkins中设置好git。
username和password是自己的git账号和密码
密码都是以密文存在的,这个ID是后续流水线上用到的唯一标识。
3、写流水线
不用沙盒方式执行,在空白区域写流水线代码,save保存
node("master"){
stage('download code'){
git(
branch: 'develop', credentialsId: '8977004d-6900-46be-80e4-d8e7d34b7262', url: 'https://gitee.com/wztsl/dz7-demo01.git'
)
}
}
node:Jenkins是支持分布式的,node代表节点,master是本机节点的意思,代表流水线在本机上执行
stage:步骤,构建时会分步骤显示,方便检查、纠错等操作
git:执行git命令,拉取代码
branch:分支
credentialsId:git账户的唯一标识
url:git仓库地址
Jenkins提供了流水线帮助,如下:
生成后,复制即可用。
build now 开始构建流水线。
4、maven配置
1、安装
1、上传压缩包
上传文件apache-maven-3.3.9-bin.tar.gz
2、解压
tar -zxvf apache-maven-3.3.9-bin.tar.gz
3、配置环境变量
vi /etc/profile
#set maven
MAVEN_HOME=/usr/local/maven/apache-maven-3.3.9
PATH=${MAVEN_HOME}/bin:${PATH}
export PATH
4、加载环境变量
source /etc/profile
5、测试
mvn -v
6、替换maven源
vim /usr/local/maven/apache-maven-3.3.9/conf/settings.xml
# 找到<mirrors></mirrors>标签对,添加以下内容
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
<releases>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</mirror>
# 指定下载源位置
<localRepository>/usr/local/maven/apache-maven-3.3.9/repository</localRepository>
2、Jenkins配置Maven
JAVA_HOME:配置自己的
MAVEN_HOME:配置自己的
PATH+EXTRA:$MAVEN_HOME/bin
5、再写流水线
目的:拉取最新代码,将代码打包好,做成镜像,上传到docker中,然后启动容器,外部可以访问。
-
拉取代码
-
交易是否已经做过这个镜像,可以通过判断Dockerfile文件是否存在确定,有这个文件就是已经上传过
-
打包代码
-
做成镜像并上传docker
如果是第一次上传,直接上传即可
如果已经上传过了,要停止正在运行的容器,删除这个容器,再删除对应的镜像,最后上传新的镜像
-
启动容器
checkedState=0
node("master"){
stage('download code'){
git(
branch: 'develop', credentialsId: '41b13e72-9760-4746-9841-e63283cd4932', url: 'https://gitee.com/Summeringer/keep-damo.git'
)
}
stage('check docker state'){
if(fileExists('/var/lib/jenkins/workspace/chensuo/Dockerfile')){
checkedState=1
}
}
stage('compile'){
dir('/var/lib/jenkins/workspace/chensuo'){
sh "mvn clean install"
}
}
stage('docker build'){
if(checkedState == 1){
sh "docker stop tsb"
sh "docker rm tsb"
sh "docker rmi \$(docker images testspringboot -q) -f"
}
dir('/var/lib/jenkins/workspace/chensuo'){
sh "echo FROM openjdk:8 > Dockerfile"
sh "echo ADD target/keep-damo-1.0-SNAPSHOT.jar /app.jar >> Dockerfile"
sh "echo EXPOSE 8898 >> Dockerfile"
sh "echo ENTRYPOINT ['\"'java'\"','\"'-jar'\"','\"'/app.jar'\"'] >> Dockerfile"
sh "docker build -t testspringboot ."
}
}
stage('deploy'){
sh "docker run -d --network host -p 8898:8080 --name tsb testspringboot"
}
}
checkedState:定义了一个变量用来做标识
fileExists:判断文件是否存在的方法
dir:进入某个目录文件
创建Dockerfile时,注意jar的路径
echo FROM openjdk:8 > Dockerfile :将“FROM openjdk:8”输出到Dockerfile文件中
echo EXPOSE 8898 >> Dockerfile:两个大于号代表追加,EXPOSE代表这个镜像对外的端口号
如果sh中有引号,注意转义
"
sh “docker build -t testspringboot .”
}
}
stage(‘deploy’){
sh “docker run -d --network host -p 8898:8080 --name tsb testspringboot”
}
}
checkedState:定义了一个变量用来做标识
fileExists:判断文件是否存在的方法
dir:进入某个目录文件
创建Dockerfile时,注意jar的路径
echo FROM openjdk:8 > Dockerfile :将“FROM openjdk:8”输出到Dockerfile文件中
echo EXPOSE 8898 >> Dockerfile:两个大于号代表追加,EXPOSE代表这个镜像对外的端口号
如果sh中有引号,注意转义。