Jenkins + Docker + SpringCloud 微服务持续集成 - 单机部署(二)
GitLab + Jenkins + Docker + SpringCloud 微服务集成实践找一个网上的 spring cloud 工程来用https://www.cnblogs.com/niugang0920/p/12186946.html属于单机 docker 部署应用,这个微服务项目,做不出来最终的项目效果。只适合学习,如何持续化继承一个项目到 docker 生产服务器。一、GitLab提
GitLab + Jenkins + Docker + SpringCloud 微服务集成实践
微服务持续集成(一)链接:https://blog.csdn.net/shm19990131/article/details/107552335
找一个网上的 spring cloud 工程来用
本章内容属于单机 docker 部署应用,这个微服务项目,做不出来最终的项目效果。
只适合学习,如何持续化继承一个项目到 docker 生产服务器。
一、GitLab
提交代码到 gitlab 仓库
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q3WJHqHl-1596063066347)(C:\Users\86156\Pictures\jenkins\高级\批注 2020-07-24 172401.png)]](https://i-blog.csdnimg.cn/blog_migrate/31c1fa0b3ac6a5efb8bbbaf8a503a7a8.png)
二、jenkins - pipeline
1、拉取代码
创建流水线,设置主从分支参数,采用 Pipeline SCM 链接 Gitlab


脚本样例
node {
// 定义拉取代码,
stage('拉取代码') {
}
stage('编译构建') {
}
stage('项目部署') {
}
}
Jenkinsfile 脚本
//设置 gitlab 拉取凭证ID号的变量
def git_auth = "8eff8b3f-d566-48d4-b628-a03b089c2b8a"
//设置 gitlab 拉取代码 URL 地址的变量
def git_url = "git@192.168.168.12:itheima_group/tensquare_back.git"
node {
// 定义拉取代码,
stage('拉取代码') {
checkout([$class: 'GitSCM', branches: [[name: '*/${branch}']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
}
}
第一步,拉取源代码结束,可以在Jenkins里面构建测试一下,这里就不展示了。
2、sonarQube 代码审查
①、使用Choice Parameter 设置 project_name 参数
注意这里的 project_name 参数,是要用在 Jenkinsfile 中进行使用的变量名。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DcSkTCwA-1596063066350)(C:\Users\86156\Pictures\jenkins\高级\批注 2020-07-24 172431.png)]](https://i-blog.csdnimg.cn/blog_migrate/f608845b1d52683d6ef54e51bdef5577.png)
②、每个审查的项目根目录下添加 sonar-project.properties
### 注意大小写
sonar.projectKey=cloud_eureka_server #不同的微服务,在这里把名字改了就行
sonar.projectName=cloud_eureka_server #还有这一行
sonar.projectVersion=1.0
#扫描路径 “.”代表全部内容
sonar.sources=.
#排除扫描路径
sonar.exclusions=**/test/**,**/target/**
sonar.java.binaries=.
sonar.java.source=1.8
sonar.java.target=1.8
sonar.sourceEncoding=UTF-8
③、修改 Jenkinsfile
//设置 gitlab 拉取凭证ID号的变量
def git_auth = "8eff8b3f-d566-48d4-b628-a03b089c2b8a"
//设置 gitlab 拉取代码 URL 地址的变量
def git_url = "git@192.168.168.12:itheima_group/tensquare_back.git"
node {
stage('拉取代码') {
checkout([$class: 'GitSCM', branches: [[name: '*/${branch}']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
}
stage('代码审查') {
//定义当前jenkins的 sonarQubeScanner 工具
def scannerHome = tool 'sonar-Scanner'
//引用当前 JenkinsSonarQube
withSonarQubeEnv('sonarqube') {
sh """
cd ${project_name}
${scannerHome}/bin/sonar-scanner
"""
}
}
}
Jenkins构建一下,看看前两部能成功不。能成功就继续

3、微服务打包
①、改 Jenkinsfile 文件,指定 mvn 工具的绝对路径
//设置 gitlab 拉取凭证ID号的变量
def git_auth = "8eff8b3f-d566-48d4-b628-a03b089c2b8a"
//设置 gitlab 拉取代码 URL 地址的变量
def git_url = "git@192.168.168.12:itheima_group/tensquare_back.git"
node {
stage('拉取代码') {
checkout([$class: 'GitSCM', branches: [[name: '*/${branch}']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
}
stage('代码审查') {
//定义当前jenkins的 sonarQubeScanner 工具
def scannerHome = tool 'sonar-Scanner'
//引用当前 JenkinsSonarQube
withSonarQubeEnv('sonarqube') {
sh """
cd ${project_name}
${scannerHome}/bin/sonar-scanner
"""
}
}
//先将父进程进行打包安装,一般是将微服务中的 common 进行 install 即可。
stage('编译,安装公共子工程') {
sh "/usr/local/maven/bin/mvn -f microservice-base-common install"
sh "/usr/local/maven/bin/mvn -f microservice-base-common clean package"
}
stage('编译,安装公共子工程') {
sh "/usr/local/maven/bin/mvn -f ${project_name} clean package"
}
}
4、制作 jar 包的 dockerfile镜像
利用dockerfile-maven-plugin 插件构建 Docker镜像
服务启动顺序
- 先启动microservice-base-eureka,
- 在启动microservice-base-config,
- 在启动microservice-base-gateway,
- 在启动microservice-base-oauth,
- 在启动microservice-user。
- 在启动microservice-blog。
- 其他的暂可以不启动
①、在每个微服务项目的 Pom.xml 加入 dockerfile-maven-plugin 插件
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.niugang</groupId>
<artifactId>microservice-springcloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>microservice-base-eureka</artifactId>
<description>注册中心</description>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<!--热部署 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<!-- 这样变成可执行的jar -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<showWarnings>true</showWarnings>
</configuration>
</plugin>
<!-- dockerfile - maven - plugin 插件-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.3.6</version>
<configuration>
<repository>${project.artifactId}</repository>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>


②、在每个微服务跟项目目录下建立 Dockerfile 文件
FROM openjdk:8-jdk-alpine
ARG JAR_FILE
COPY ${JAR_FILE} eureka.jar
EXPOSE 8000
ENTRYPOINT ["java","-jar","/eureka.jar"]
③、在 Jenkinsfile 中引用 dockerfile:build
stage('编译,安装公共子工程,执行dockerfile制作镜像') {
sh "/usr/local/maven/bin/mvn -f ${project_name} clean package dockerfile:build"
}


5、上传到 Harbor仓库
①、打标签
修改 Jenkinsfile文件,添加如下内容
//镜像版本号
def tag = "latest"
//Harbor仓库的IP地址
def harbor_url = "192.168.168.14"
//Harbor仓库名
def harbor_project ="tensquare"
node {
......
stage('镜像上传至Harbor仓库') {
//定义镜像名字
def imageName = "${project_name}:${tag}"
//为镜像打标签
sh "docker tag ${imageName} ${harbor_url}/${harbor_project}/${imageName}"
}
}
②、生成登录 Harbor 仓库的凭证
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XNyvk3Mu-1596063066369)(C:\Users\86156\Pictures\jenkins\高级\批注 2020-07-27 104257.png)]](https://i-blog.csdnimg.cn/blog_migrate/434998a579f82c37e6402d5805dd5fdc.png)
将ID编号记录下来:584bf0a9-d247-4c4f-9e29-b9291381dd45
在 Jenkinsfile里面定义变量:
//Harbor凭证
def harbor_auth = "584bf0a9-d247-4c4f-9e29-b9291381dd45"
③、生成通过 凭据 认证登录Harbor的语法
withCredentials:Bind credentials to variables

//some block 此处填写自定义的 sh 命令,执行程序
④、编写 Jenkinsfile 文件,通过凭证完成登录和上传
stage('镜像上传至Harbor仓库') {
//定义镜像名字
def imageName = "${project_name}:${tag}"
//为镜像打标签
sh "docker tag ${imageName} ${harbor_url}/tensquare/${imageName}"
//凭据登录Harbor
withCredentials([usernamePassword(credentialsId: "${harbor_auth}", passwordVariable: 'password', usernameVariable: 'username')]) {
//引用用户名密码登录
sh "docker login -u ${username} -p ${password} ${harbor_url}"
//镜像上传
sh "docker push ${harbor_url}/${harbor_project}/${imageName} && echo 镜像上传成功"
//登出 Harbor
sh "docker logout ${harbor_url}"
}
}

6、拉取镜像和发布应用
发布应用的 docker服务器需要与 jenkins 做免密登录
[root@jenkins ~]# ssh-copy-id 192.168.168.15
①、配置publish Over SSH 插件,可以实现远程发送 shell 命令



②、配置 Jenkinsfile 部署应用步骤

Jenkinsfile 添加如下内容,此步非常重要!
stage('部署应用'){
sshPublisher(publishers: [sshPublisherDesc(configName: 'docker', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "/opt/jenkins_shell/deploy.sh $harbor_url $harbor_project $project_name $tag $port", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
}
/opt/jenkins_shell/deploy.sh :指定远程主机的脚本文件
$harbor_url:HarborIP地址,由Jenkinsfile 文件内 def 定义好的变量
$harbor_project:Harbor仓库名字,由Jenkinsfile 文件内 def 定义好的变量
$project_name:由Jenkinsfile 文件内 def 定义好的变量
$tag:标签名,由Jenkinsfile 文件内 def 定义好的变量
$port 是在构建前自定义的参数
③、生产环境部署脚本:opt/jenkins_shell/deploy.sh
在 生产主机执行此脚本
mkdir -p /opt/jenkins
vim /opt/jenkins/deploy.sh
chmod +x /opt/jenkins/deploy.sh
#!/bin/sh
harbor_url=$1
harbor_project_name=$2
project_name=$3
tag=$4
port=$5
imageName=$harbor_url/$harbor_project_name/$project_name:$tag
echo "==========$imageName========="
#查询容器是否存在,存在即删除该容器
containerId=`docker ps -a | grep -w ${project_name}:${tag} | awk '{print $1}'`
echo "==========$containerId==========="
if [ "$containerId" != " " ];then
#删除容器
docker rm -f $containerId && echo "成功删除容器"
fi
#查看镜像是否存在,存在即删除该镜像
imageId=`docker images | grep -w $project_name | awk '{print $3}'`
echo "=========$imageId========="
if [ "$imageId" != " " ];then
#删除镜像
docker rmi $imageId && echo "成功删除镜像"
fi
#登录 Harbor
docker login -u shm -p QQ1136265636.com $harbor_url
#下载容器
docker pull $imageName
#启动容器
docker run -itd -p $port:$port $imageName
echo "新版本容器启动成功"
④、将 jenkins 用户加入 docker组,才能执行docker 命令
[root@jenkins ~]# usermod -G docker jenkins


其中一个微服务部署成功。
按照之前提到的部署顺序都可以完成部署,并启用。但是会有几个失效,无伤大雅,学会方法即可。
三、微服务项目目录分析
简单列举目录结构
tensquare_back/ //根目录,父项目
├── Jenkinsfile //Jenkinsfile 流水线文件(包含所有步骤)
├── microservice-base-config //微服务子项目
│ ├── Dockerfile -- 子项目下的 Dockerfile生产镜像
│ ├── pom.xml
│ ├── sonar-project.properties -- sonar 代码测试文件
│ └── src
│ └── main
│ ├── java
│ │ └── org
│ │ └── niugang
│ │ └── SpringCloudConfigApplication.java
│ └── resources
│ ├── application.properties //微服务配置文件
│ └── config
│ ├── microservice-base-admin-dev.properties
│ ├── microservice-base-gateway-dev.properties
│ ├── microservice-base-log-dev.properties
│ ├── microservice-base-oauth-dev.properties
│ ├── microservice-base-turbine-dev.properties
│ ├── microservice-base-zipkin-dev.properties
│ ├── microservice-blog-dev.properties
│ └── microservice-user-dev.properties
├── microservice-base-eureka // 第二个子项目
│ ├── Dockerfile // 其余内容与 第一个子项目相同
│ ├── pom.xml
│ ├── sonar-project.properties
│ └── src
│ └── main
│ ├── java
│ │ └── org
│ │ └── niugang
│ │ └── SpringCloudEurekaApplication.java
│ └── resources
│ └── application.properties
├── microservice-base-gateway
│ ├── Dockerfile
│ ├── pom.xml
│ ├── sonar-project.properties
│ └── src
│ └── main
│ ├── java
│ │ └── org
│ │ └── niugang
│ │ ├── config
│ │ │ └── AccessFilter.java
│ │ ├── exception
│ │ │ └── CustomErrorType.java
│ │ └── SpringCloudZuulApplication.java
│ └── resources
│ ├── bootstrap.properties
│ ├── config.md
│ └── templates
│ └── error
│ ├── 403.html
│ ├── 404.html
│ └── 500.html
└── pom.xml
更多推荐
所有评论(0)