本文共 10470 字,大约阅读时间需要 34 分钟。
找一个网上的 spring cloud 工程来用
本章内容属于单机 docker 部署应用,这个微服务项目,做不出来最终的项目效果。
只适合学习,如何持续化继承一个项目到 docker 生产服务器。
提交代码到 gitlab 仓库
node { // 定义拉取代码, stage('拉取代码') { } stage('编译构建') { } stage('项目部署') { }}
//设置 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里面构建测试一下,这里就不展示了。
注意这里的 project_name 参数,是要用在 Jenkinsfile 中进行使用的变量名。
### 注意大小写 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
//设置 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构建一下,看看前两部能成功不。能成功就继续
//设置 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" }}
利用dockerfile-maven-plugin 插件构建 Docker镜像
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 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
FROM openjdk:8-jdk-alpineARG JAR_FILECOPY ${JAR_FILE} eureka.jarEXPOSE 8000ENTRYPOINT ["java","-jar","/eureka.jar"]
stage('编译,安装公共子工程,执行dockerfile制作镜像') { sh "/usr/local/maven/bin/mvn -f ${project_name} clean package dockerfile:build" }
修改 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}" }}
将ID编号记录下来:584bf0a9-d247-4c4f-9e29-b9291381dd45
在 Jenkinsfile里面定义变量:
//Harbor凭证def harbor_auth = "584bf0a9-d247-4c4f-9e29-b9291381dd45"
withCredentials:Bind credentials to variables
//some block 此处填写自定义的 sh 命令,执行程序
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}" } }
发布应用的 docker服务器需要与 jenkins 做免密登录
[root@jenkins ~]# ssh-copy-id 192.168.168.15
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 是在构建前自定义的参数
在 生产主机执行此脚本
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 "新版本容器启动成功"
[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/