博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Jenkins + Docker + SpringCloud 微服务持续集成 - 单机部署(二)
阅读量:4069 次
发布时间:2019-05-25

本文共 10470 字,大约阅读时间需要 34 分钟。

GitLab + Jenkins + Docker + SpringCloud 微服务集成实践

找一个网上的 spring cloud 工程来用

本章内容属于单机 docker 部署应用,这个微服务项目,做不出来最终的项目效果。

只适合学习,如何持续化继承一个项目到 docker 生产服务器。

一、GitLab

提交代码到 gitlab 仓库

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q3WJHqHl-1596063066347)(C:\Users\86156\Pictures\jenkins\高级\批注 2020-07-24 172401.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)]

②、每个审查的项目根目录下添加 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.8sonar.java.target=1.8sonar.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 插件

4.0.0
org.niugang
microservice-springcloud
0.0.1-SNAPSHOT
microservice-base-eureka
注册中心
org.springframework.cloud
spring-cloud-starter-eureka-server
org.springframework
springloaded
provided
org.springframework.boot
spring-boot-devtools
true
org.apache.maven.plugins
maven-compiler-plugin
2.5.1
1.8
1.8
UTF-8
true
com.spotify
dockerfile-maven-plugin
1.3.6
${project.artifactId}
target/${project.build.finalName}.jar
org.springframework.boot
spring-boot-maven-plugin
${spring-boot.version}
repackage

在这里插入图片描述

在这里插入图片描述

②、在每个微服务跟项目目录下建立 Dockerfile 文件

FROM openjdk:8-jdk-alpineARG JAR_FILECOPY ${JAR_FILE} eureka.jarEXPOSE 8000ENTRYPOINT ["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)]

将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/shharbor_url=$1harbor_project_name=$2project_name=$3tag=$4port=$5imageName=$harbor_url/$harbor_project_name/$project_name:$tagecho "==========$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#登录 Harbordocker login -u shm -p QQ1136265636.com $harbor_url#下载容器docker pull $imageName#启动容器docker run -itd -p $port:$port $imageNameecho "新版本容器启动成功"

④、将 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

转载地址:http://wfrji.baihongyu.com/

你可能感兴趣的文章
Jenkins + Docker + SpringCloud 微服务持续集成 - 单机部署(二)
查看>>
Jenkins + Docker + SpringCloud 微服务持续集成 - 高可用集群部署(三)
查看>>
Golang struct 指针引用用法(声明入门篇)
查看>>
Linux 粘滞位 suid sgid
查看>>
C#控件集DotNetBar安装及破解
查看>>
Winform皮肤控件IrisSkin4.dll使用
查看>>
Winform多线程
查看>>
C# 托管与非托管
查看>>
Node.js中的事件驱动编程详解
查看>>
mongodb 命令
查看>>
MongoDB基本使用
查看>>
mongodb管理与安全认证
查看>>
nodejs内存控制
查看>>
nodejs Stream使用中的陷阱
查看>>
MongoDB 数据文件备份与恢复
查看>>
数据库索引介绍及使用
查看>>
MongoDB数据库插入、更新和删除操作详解
查看>>
MongoDB文档(Document)全局唯一ID的设计思路
查看>>
mongoDB简介
查看>>
Redis持久化存储(AOF与RDB两种模式)
查看>>