一、jenkins配置
本地编辑好dockerfile文件,推送到gitlab中,再从jenkins拉取代码部署到服务器上
需要安装的插件:Git Parameter, Publish Over SSH.
配置maven构建打包代码
maven下载地址:https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
1.1、添加maven和jdk
- 服务器内添加
jenkins映射本地目录:/var/vol_dockers/jenkins_home/
解压maven到jenkins目录下
解压jdk到jenkins目录下
重启jenkins,然后docker exec -it jenkins bash进入到jenkins容器里查验maven和jdk
- maven修改配置文件
添加阿里云maven地址,直接在百度上搜: 阿里云maven地址
编辑conf/settings.xml
~ ~ ~ ~
159 <mirror>
160 <id>AliRepo-aliyun</id>
161 <mirrorOf>*</mirrorOf>
162 <name>Mirror Name for the Alirepo.</name>
163 <url>https://maven.aliyun.com/repository/public</url>
164 </mirror>
165
166 </mirrors>
167
修改jdk版本,编辑settings。直接百度搜索, maven的jdk8编译插件settings.xml
<profile>
<id>jdk18</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
为了继承目的,并且要通过或命令行激活概要文件,概要文件必须有一个唯一的ID。
<activeProfiles>
<activeProfile>jdk18</activeProfile>
</activeProfiles>
- jenkins控制台配置maven和jdk
Dashboard --> 系统配置 --> 全局工具配置
下图1配置jdk
下图2配置maven,dashboard页面拉到最下边
1.2、添加目标端ssh主机
1.3、新建任务,部署代码到指定服务器目录下
1、jenkins从gitlab拉取代码,maven构建打包
2、将打包后的代码和其他文件,推送到指定服务器目录下
3、执行预定于命令
dashboard首页 --> 新建任务 --> 任务名称 --> 自由风格的软件项目
configure --> 源码管理 --> git --> Repository URL(从gitlab克隆http连接)
build steps(构建步骤),构建代码为jar包。第一次构建需要下载很多依赖,时间较长
构建完jenkins目录下会多一个target目录/*jar包
目标这块暂不清楚为啥要这些写,待查阅
- clean package -DskipTests 简单讲,是先清理,再打包,跳过测试
- clean package -DskipTests chatgpt解释:
- clean: 这是maven的一个生命周期阶段,用于清理项目目录,删除之前构建生成的文件。执行此阶段可确保构建的干净状态
- package: 也是maven的一个生命周期阶段,用于将项目打包成可部署的格式,例如jar,war或ear文件。
- -DskipTests: 这是一个系统属性,通常在Maven命令中使用 “-D” 标志来设置。在这种情况下,"-DskipTests"用于跳过执行项目中的测试。
- 所以,“clean package -DskipTests” 表示在Jenkins中配置Maven时,执行Maven构建的命令时先清理项目,然后再将其打包为可部署的方式,并在构建过程中跳过执行测试。
构建后操作
二、代码端配置
2.1、指定构建后的jar包名称
编辑pom.xml
## 文件最后端
<build>
<finalName>mytest</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.2、添加docker
1、新建docker目录,和src平级
2、新建dockerfile文件(制作自定义镜像)
3、新建docker-compose.yaml,运行容器
- dockerfile
From daocloud.io/library/java:8u40-jdk
COPY mytest.jar /usr/local/
WORKDIR /usr/local
CMD java -jar mytest.jar
- docker-compose
version: '3.1'
services:
mytest:
build:
context: ./ # 当前目录
dockerfile: dockerfile # 指定构建镜像的文件
image: mytest:v1.0.1 # 指定镜像版本名称
container_name: mytest
ports:
- 8080:8080
2.3、验证代码拉取到jenkins目录下
进入到容器内 /var/jenkins_home/workspace
> docker exec -it jenkins bash
> cd /var/jenkins_home/workspace
> cd mytest
三、持续交付、部署,基础CD操作
3.1、gitlab代码打标签
程序代码在经过多次集成操作到达最终可以交付,持续交付整体流程和持续集成类似,不过需要选取指定的发行版本
jenkins根据tag标签拉取代码
添加tag标签
代码测试完成提交后,打一次标签
3.2、修改jenkins配置
项目 --> 配置 --> general --> 参数化构建过程
四、代码审核
目前两种工具
sonarqube,结合maven,修改settings.xml文件,在客户端检测并上传到sonarqube的web平台
sonar scanner,在jenkins端配置使用,将检测结果发送到sonarqube的web平台。
4.1、sonarqube运行启动
- docker-compose启动
初始账户密码为 admin:admin
修改密码为:123456
version: '3.1'
services:
db:
image: postgres
container_name: db
ports:
- 5432:5432
networks:
- sonarnet
environment:
POSTGRES_USER: sonar
POSTGRES_PASSWORD: sonar
sonarqube:
image: sonarqube:8.9.6-community
container_name: sonarqube
depends_on:
- db
ports:
- 9000:9000
networks:
- sonarnet
environment:
SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
SONAR_JDBC_USERNAME: sonar
SONAR_JDBC_PASSWORD: sonar
networks:
sonarnet:
driver: bridge
- 汉化
配置 —> 应用市场 —> 插件 --> 搜索chinese
4.2、修改maven的settings.xml文件,添加sonarqube参数
sonarqube结合maven审核本地代码
indellij idea 中配置有maven路径
- 修改maven的settings.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository>D:\devZgq\Java\.m2\repository</localRepository>
<!-- 阿里云的中央仓库 -->
<mirrors>
<mirror>
<id>aliyun</id>
<name>aliyun</name>
<mirrorOf>central</mirrorOf>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
<!-- 配置 jdk 版本 -->
<profiles>
<profile>
<id>jdk8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>8</jdk>
</activation>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<maven.compiler.compilerVersion>8</maven.compiler.compilerVersion>
</properties>
</profile>
<!-- sonar配置 -->
<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<sonar.login>admin</sonar.login>
<sonar.password>123456</sonar.password>
<sonar.host.url>http://192.168.12.110:9000</sonar.host.url>
</properties>
</profile>
</profiles>
<!-- 启用 -->
<activeProfiles>
<activeProfile>jdk8</activeProfile>
<activeProfile>sonar</activeProfile>
</activeProfiles>
</settings>
4.3、使用maven命令审核本地电脑代码
打开intellij idea的终端,切换到代码目录下,执行如下命令
> mvn -v
> mvn sonar:sonar # 审核代码后,会自动上传到sonarqube上
Sonar Qube的UI界面
4.4、Sonar-Scanner
1、从官网下载安装包,解压到jenkins映射目录下
2、修改scanner配置文件,添加qube的IP端口
3、运行scanner命令,检测代码
- 下载Sonar-Scanner压缩包
下载地址
https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.8.0.2856-linux.zip
- 解压到jenkins目录下(一级目录下),并修改Scanner配置
修改 conf/sonar-scanner.properties
vim sonar-scanner.properties
#Configure here general information about the environment, such as SonarQube server connection details for example
#No information about specific project should appear here
#----- Default SonarQube server
sonar.host.url=http://192.168.12.110:9000 # sconarqube 地址
#----- Default source code encoding
sonar.sourceEncoding=UTF-8
4.5、Sonar-Scanner检测jenkins拉取编译好的代码
执行完命令后,会在Sonar-Qube界面上显示。
- 命令如下
> */jenkins_home/sonar-scanner/bin/sonar-scanner \
-Dsonar.sources=./ \ # 指定源文件目录
-Dsonar.projectname=linux-test \ # 自定义项目名称
-Dsonar.login="0ab1a777144b459db09cdd0cfc06a300887c54cb" \ # qube的token
-Dsonar.projectKey=linux-test -Dsonar.java.binaries=./target/ # 编译好的代码目录
- 获取token
4.6、jenkins添加sonarqube
插件 --> 搜索 sonarqube --> 安装 sonarqube scanner
配置 sonarqube的连接方式
- 在系统配置中添加sonarqube的连接方式
- 添加全局配置
- 在项目工程中配置,位置在maven构建代码后
sonar.projectname=${JOB_NAME}
sonar.projectKey=${JOB_NAME}
sonar.sources=./
sonar.java.binaries=./target/
4.7、测试
- Jenkins重新构建mytest项目
- SonarQube界面
五、集成harbor
通过jenkins将在服务器上生成的docker镜像上传到harbor中
然后再通过jenkins执行脚本或命令,从harbor中拉取镜像部署到指定服务器
目前遇到问题:
看学习视频和博客,都要求宿主机docker命令映射到jenkins容器内
但我认为是jenkins调用宿主机的命令,而不是使用jenkins容器内的命令,
如下配置是按照 将宿主机docker命令映射到容器内
5.1、安装配置harbor
- 安装–略
- 在harbor中新建项目(仓库)repo
- docker添加harbor仓库
cat /etc/docker/daemon.json
{
"insecure-registries": ["192.168.12.104:180"]
}
- 上传本地镜像到harbor
得到harbor认证
> docker login -u admin -p 123456 http://192.168.12.104:180
打标签
> docker tag mytest:v1.0.0 192.168.12.104:180/repo/mytest:v1.0.0
上传
> docker push 192.168.12.104:180/repo/mytest:v1.0.0
5.2、Jenkins容器使用宿主机Docker命令
- 设置宿主机docker.sock权限
> chown root.root /var/run/docker.sock
> chmod o+rw /var/run/docker.sock
> ls -l /var/run/docker.sock
srw-rw-rw- 1 root root 0 May 28 22:48 /var/run/docker.sock
- jenkins文件中,添加数据卷
version: '3'
services:
docker_jenkins:
user: root
restart: always
image: jenkins/jenkins:lts
container_name: jenkins
ports:
- 8082:8080
- 50000:50000
volumes:
- /var/vol_dockers/jenkins_home/:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker
- /etc/docker/daemon.json:/etc/docker/daemon.json
- /usr/bin/docker-compose:/usr/bin/docker-compose
5.3、通过jenkins生成的自定义镜像上传到harbor中
本质是在jenkins中配置 构建步骤,通过docker命令build镜像和上传到harbor
得删除掉jenkins中的 构建后操作。
- 操作步骤
1、改动代码的返回值,版本改为 v3.0.0,然后提交到gitlab
2、gitlab打标签 v3.0.0
3、jenkins项目中新增 构建操作,主要执行shell命令
4、删除掉 构建后操作
- jenkins新增构建操作,执行linux命令
mv target/*.jar docker/
docker build -t mytest:$release docker/
docker login -u admin -p 123456 http://192.168.12.104:180
docker tag mytest:$release 192.168.12.104:180/repo/mytest:$release
docker push 192.168.12.104:180/repo/mytest:$release
5.4、编写部署脚本,使目标服务器自动拉取镜像并执行
部署项目需要通过Publish Over SSH插件,让目标服务器执行命令。为了方便一次性实现拉取镜像和启动的命令,推荐采用脚本文件的方式。
添加脚本文件到目标服务器,再通过Publish Over SSH插件让目标服务器执行脚本即可。
脚本似乎有问题,回头仔细思考下逻辑
#/bin/bash
harbor_url=$1
harbor_repo=$2
project=$3
version=$4
host_port=$5
container_port=$6
imageName=$harbor_url/$harbor_repo/$project:$version
containerId=`docker ps -a | grep ${project} | awk '{print $1}'`
if [ "$containerId" != "" ] ; then
docker stop $containerId
docker rm $containerId
echo "Delete Container Success"
fi
imageId=`docker images | grep ${project} | awk '{print $3}'`
if [ "$imageId" != "" ] ; then
docker rmi -f $imageId
echo "Delete Image Success"
fi
docker login -u DevOps -p P@ssw0rd $harbor_url
docker pull $imageName
docker run -d -p $host_port:$container_port --name $project $imageName
echo "Start Container Success"
echo $project
5.6、jenkins控制台修改项目配置
1、在参数化构建过程中,新加2个字符参数
2、新加1个构建后操作,执行以上脚本
- 新加2个字符参数
- 新加 构建后操作
执行命令:
deploy.sh 192.168.12.104:180 repo ${JOB_NAME} ${release} ${host_port} ${container_port}