Dock搭建jenkins并创建流水线push到harbor
1. 目标
- 将Springboot代码通过Jenkins发布docker 镜像到harbor仓库中。
- 以下全新安装系统,亲自一步一步记录,并完全验证通过。
2. 运行环境:
- CentosOS:8.5.2111
- Jenkins版本:2.452.1
- Java::JDK17.0
- Maven:3.9.7
3. 安装环境
- 删除原有yum源,并加载aliyuan源
rm -f /etc/yum.repos.d/*.repo curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo yum install -y yum-utils device-mapper-persistent-data lvm2
- 安装Docker
- 增加docker源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 安装docker
yum install -y docker-ce
- 启动并自动运行
systemctl enable docker systemctl start docker
- 验证dokcer
docker -v
- 增加docker源
4. 安装Jenkins
- 创建目录,用于容器映射到宿主机上;
mkdir -p /myfiles/jenkins/home
- 准备运行脚本:
输入以下:cd /myfiles/jenkins vim run.sh
修改其运行权限:docker run -d --name jenkins -p 8080:8080 -p 50000:50000 --privileged=true \ -v /run/docker.sock:/var/run/docker.sock \ -v $(which docker):/usr/bin/docker \ -v /myfiles/jenkins/home:/var/jenkins_home \ jenkins/jenkins:lts
chmod +x run.sh chmod 777 home
- 直接运行:
./run.sh
- 等待其pull完镜像
- 检查运行状态
docker ps -a
- 授权docker目录权限
chmod 777 /usr/bin/docker chmod 777 /run/docker.sock
- 复制密钥:
docker logs -f jenkins
以下就是登陆的密码,先复制下来。
- 访问地址
http://192.168.3.100:8080/
输入复制的密码,并等待初始化 - 插件,可以选择 “安装推荐的插件”。
- 创建第一个用户
- 安装完成。
5. 配置Jenkins
- 配置java环境:
- 安装 wget: yum -y install wget
- 下载java:
cd /myfiles/jenkins wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz tar -xzvf jdk-17_linux-x64_bin.tar.gz mv jdk-17.0.11/ ./home/jdk17
- 配置java环境:
- Manage Jenkins -->Tools–>JDK 安装, 新增JDK(系统管理 -->全局工具配置)
别名:jdk17
JAVA_HOME:/var/jenkins_home/jdk17
- 安装maven插件
- 下载maven3.9.7:
cd /myfiles/jenkins wget https://dlcdn.apache.org/maven/maven-3/3.9.7/binaries/apache-maven-3.9.7-bin.tar.gz tar -xzvf apache-maven-3.9.7-bin.tar.gz mv apache-maven-3.9.7 ./home/maven-3.9.7
- 配置maven路径:Manage Jenkins -->Tools–>Maven 安装(系统管理 -->全局工具配置)
点击“新增maven”,Name:mvn397; 注意名称要与后面jenkinsfile 中的 mvnHome = tool “mvn397” 一致
去掉勾选自动安装
MAVEN_HOME:/var/jenkins_home/maven-3.9.7
配置setting路径:Manage Jenkins -->Tools–>Maven 配置
默认 settings 提供:
/var/jenkins_home/maven-3.9.7/conf/settings.xml
- 下载maven3.9.7:
- 安装docker插件
路径:系统管理 -->插件管理–>Available plugins
搜索:Docker Pipeline 点击安装;
搜索:Docker plugin 点击安装
重启:systemctl restart jenkins - 注意点,这里需要远程下载harbor,但是我的harbor没有ssl和域名,只有内网地址,所以需要增加安全限制,在 /usr/lib/systemd/system/docker.service 中的ExecStart 中增加 --insecure-registry 192.168.3.239 (harbor地址),增加后:
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 192.168.3.239 --containerd=/run/containerd/containerd.sock
6. java代码demo如下:
- Dockerfile:
FROM openjdk:17.0.2-jdk
VOLUME /home/sh
ADD ./target/demo-1.jar demo-1.jar
EXPOSE 8080
ENTRYPOINT exec java -jar demo-1.jar
- pom.xml
<properties>
<java.version>17</java.version>
<imageName.pref>192.168.3.239/java</imageName.pref>
<project.version.imageTag>0.1.0</project.version.imageTag>
</properties>
.....
.....
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>17</source>
<target>17</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.13</version>
<!--将插件绑定在某个phase执行-->
<executions>
<execution>
<id>build-image</id>
<!--用户只需执行mvn package ,就会自动执行mvn docker:build-->
<!--<phase>package</phase>-->
<!-- <goals>-->
<!-- <goal>build</goal>-->
<!-- </goals>-->
</execution>
</executions>
<configuration>
<!--指定生成的镜像名,这里是我们的作者名+项目名-->
<repository>${imageName.pref}/${project.artifactId}</repository>
<!-- 指定 Dockerfile 路径-->
<!-- <dockerInfoDirectory>${project.basedir}/</dockerInfoDirectory>-->
<tag>latest</tag>
<buildArgs>
<JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
</plugins>
</build>
- jenkinsfile
node('built-in') {
try{
stage('Prepare') {
echo "1.Prepare Stage"
checkout scm
servantName= "demo-1"
profileEnv= "dev"
docker_host = "192.168.3.239"
img_name = "java/${servantName}"
docker_img_name = "${docker_host}/${img_name}"
echo "docker-img-name: ${docker_img_name}"
}
stage('Java And DockerImages Build') {
echo "2.Java Build"
mvnHome = tool "mvn397"
settingPath = "${mvnHome}/conf/settings.xml"
sh "${mvnHome}/bin/mvn -Dmaven.test.skip=true clean install -Dmaven.test.skip=true dockerfile:build"
}
stage('Push to Local Harbor') {
echo "4.Push Docker Image Stage To Harbor"
withCredentials([usernamePassword(credentialsId: 'docker-register-harbor', passwordVariable: 'DOCKER_PASSWORD', usernameVariable: 'DOCKER_USER')]) {
sh "echo ${DOCKER_PASSWORD} | docker login -u ${DOCKER_USER} --password-stdin ${docker_host}"
echo "docker login success!"
sh "docker push ${docker_img_name}:latest"
echo "docker push success!"
sh "docker rmi ${docker_img_name}:latest"
}
}
}finally {
}
}
- 提交到Git仓库中 http://192.168.3.20:8080/demo/demo-1.git
7. 创建流水线
-
先创建登录harbor登录凭证,目的使用流水线时,自动登录,push镜像
- 路径:系统管理–>凭据管理,选择全局 下来,如图
- 注意下面的id,要与jenkinsfile的credentialsId一致
- 路径:系统管理–>凭据管理,选择全局 下来,如图
-
创建流水线:名称:demo、类型选择:流水线
-
选择:git
-
配置地址:http://192.168.3.20:8080/demo/demo-1.git
-
Credentials: 选择添加:
- Domain:全局凭证;
- 类型选择:Username with password
- 如图:
-
脚本路径
./deploy/jenkinsfile
- 保存
- 如果按照上面的步骤,点击“立即构建”,都能成功构建并push到仓库
8. 总结
使用docker安装jenkins,需要再jenkins中安装docker插件,另外要注意将宿主机的/run/docker.sock和/usr/bin/docke设置权限,另外增加对harbor的安全限制。
9 可能出现的错误异常信息
- Docker build 异常 java.io.IOException: Permission denied(同Could not build image)
- Could not build image(参考第四点:授权docker目录权限)
- [ERROR] Get “https://192.168.3.239/v2/”: dial tcp 192.168.3.239:443: connect: no route to host(解决方案:第五点,注意点已经说明)