经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Docker » 查看文章
Jenkins打包微服务构建Docker镜像运行的实现
来源:jb51  时间:2021/9/27 13:08:01  对本文有异议

环境准备

1.Jenkins
2.GitLab
3.SonarQube
4.Harbor
5.Docker
6.Maven
7.JDK1.8
8.微服务项目

以上技术部分在我之前的文章中有写过

这里就不过多细化的演示,本文章主要是连贯性的将微服务项目源代码–>提交远程仓库GitLab–>Jenkins从Gitlab拉取代码到服务器–>SonarQube代码审核–>Maven编译打包–>构建Docker镜像–>推送私有Harbor镜像仓库–>其他服务器部署

开始

1.GitLab远程仓库创建微服务项目

在这里插入图片描述

2.IDEA代码推送到Gitlab

在这里插入图片描述

默认文件夹对了就不用更改

在这里插入图片描述

添加本地仓库

在这里插入图片描述

提交本地仓库

在这里插入图片描述

推送远程仓库

在这里插入图片描述

3.Jenkins创建流水线项目

在这里插入图片描述

4.参数化构建

在这里插入图片描述

5.拉取远程仓库的构建脚本

在这里插入图片描述

应用保存

6.编写远程审查脚本sonar-project.properties

在这里插入图片描述

构建脚本

1.拉取代码

  1. stage('拉取代码') {
  2. checkout([$class: 'GitSCM', branches: [[name:"*/${branch}"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
  3. }

在这里插入图片描述

在这里插入图片描述

2.审查代码

  1. stage('代码审查') {
  2. //定义当前Jenkins的SonarQubeScanner工具
  3. def scannerHome = tool 'SonarQube'
  4. //引用当前JenkinsSonarQube环境
  5. withSonarQubeEnv('SonarQube') {
  6. sh """
  7. cd ${project_name}//这是定义的选项参数
  8. ${scannerHome}/bin/sonar-scanner
  9. """
  10. }
  11. }

在这里插入图片描述
在这里插入图片描述

3.安装公共模块

  1. stage('编译,安装公共子工程') {
  2. sh "mvn -f tensquare_common clean install"
  3. }

在这里插入图片描述

查看服务器

在这里插入图片描述

4.编译打包微服务

  1. stage('编译,打包微服务工程') {
  2. sh "mvn -f ${project_name} clean package"
  3. }

在这里插入图片描述

查看服务器

在这里插入图片描述

截止目前构建流程

在这里插入图片描述

5.构建docker镜像
项目中添加Dockerfile文件,

在这里插入图片描述

  1. #FROM java:8
  2. #FROM openjdk:11-jdk-alpine
  3. FROM openjdk:11
  4. ARG JAR_FILE
  5. COPY ${JAR_FILE} app.jar
  6. EXPOSE 9001
  7. ENTRYPOINT ["java","-jar","/app.jar"]
  8.  

每个微服务项目Maven中添加dockerfile插件

  1. <plugin>
  2. <groupId>com.spotify</groupId>
  3. <artifactId>dockerfile-maven-plugin</artifactId>
  4. <version>1.3.6</version>
  5. <configuration>
  6. <repository>${project.artifactId}</repository>
  7. <buildArgs>
  8. <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
  9. </buildArgs>
  10. </configuration>
  11. </plugin>

修改Jenkinsfile文件服务打包后添加dockerfile:build" 用于触发docker镜像构建

  1. stage('编译,打包微服务工程') {
  2. sh "mvn -f ${project_name} clean package dockerfile:build"
  3. }

并推送到远程仓库

Jenkins从新构建

在这里插入图片描述

查看服务器

  1. docker images

在这里插入图片描述

镜像构建成功

6.镜像打标签

公共属性

  1. //镜像的版本号
  2. def tag = latest
  3. //Harbor的url地址
  4. def harbor_url = 192.168.0.188:9123
  5. //镜像库项目名称
  6. def harbor_project = tensquare
  1. stage('编译,打包微服务工程 上传镜像') {
  2. //编译打包--构建镜像
  3. sh "mvn -f ${project_name} clean package dockerfile:build"
  4.  
  5. //定义镜像名称
  6. def imageName = "${project_name}:${tag}"
  7.  
  8. //对镜像打上标签
  9. sh "docker tag ${imageName} ${harbor_url}/${harbor_project}/${imageName}"
  10. }

推送远程服务器并Jenkins构建
查看服务器镜像

在这里插入图片描述

7.镜像推送到harbor私有仓库
这里要在Harbor上提现创建一个仓库
Jenkins添加harbor用户凭证

在这里插入图片描述

进入流水线语法生成harbor的语法

在这里插入图片描述

  1. stage('编译,打包微服务工程 上传镜像') {
  2. //编译打包--构建镜像
  3. sh "mvn -f ${project_name} clean package dockerfile:build"
  4.  
  5.  
  6. //定义镜像名称
  7. def imageName = "${project_name}:${tag}"
  8.  
  9. //对镜像打上标签
  10. sh "docker tag ${imageName} ${harbor_url}/${harbor_project}/${imageName}"
  11.  
  12. //把镜像推送到Harbor
  13. withCredentials([usernamePassword(credentialsId: "${harbor_auth}", passwordVariable: 'password', usernameVariable: 'username')]) {
  14. //登录到Harbor
  15. sh "docker login -u ${username} -p ${password} ${harbor_url}"
  16. //镜像上传
  17. sh "docker push ${harbor_url}/${harbor_project}/${imageName}"
  18. sh "echo 镜像上传成功"
  19. }
  20. }

推送远程仓库,Jenkins远程构建,查看推送到私有仓库的镜像

在这里插入图片描述

远程推送镜像成功!!!

8.拉取镜像并启动程序
由于需要远程拉取镜像和启动程序,所以需要先在Jenkins上安装Publish Over SSH插件,实现远程发送Shell命令

在这里插入图片描述

配置插件

在这里插入图片描述

这里需要注意一下,需要两台服务器建立通信,使用ssh远程连接,即Jenkins使用ssh远程操作188服务器拉取镜像,启动应用
这个过程中需要Jenkins的宿主服务器产生公钥、私钥然后copy给188服务器,
1.切换到ssh目录下

  1. cd /root/.ssh
  2. 如果提示:bash: cd: .ssh: 没有那个文件或目录
  3. 执行
  4. ssh hostname(你自己的主机名)

2.在Jenkins宿主服务器上执行生成公私钥的命令

  1. ssh-keygen -t rsa

然后对比下面

在这里插入图片描述

id_rsa为私钥 id_rsa.pub为公钥

3.复制公钥id_rsa.pub到188服务器

  1. ssh-copy-id 192.168.0.188

4.检查188服务器拷贝到的密钥

在这里插入图片描述

5.测试Jenkins的ssh远程连接

在这里插入图片描述

测试成功

6.使用流水线语法生成器生成ssh命令

在这里插入图片描述

复制到Jenkinsfile文件中

  1. //应用部署
  2. sh "echo 应用部署"
  3. sshPublisher(publishers: [sshPublisherDesc(configName: '188', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "/data/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)])
  4.  
  5.  
  6. /data/Jenkins_shell/deploy.sh 这个路径指向是一个脚本文件,用于操作docker容器的,这个脚本提供在下面
  7. $harbor_url 镜像私有仓库地址
  8. $harbor_project 私有仓库中的项目名
  9. $project_name 项目名
  10. $tag 拉取镜像的版本
  11. $port 这个参数还需要额外在Jenkins构建是提供参数
  12. 这几个参数与线面这个文件中的参数是一一对应的
  1. #! /bin/sh
  2. #接收外部参数
  3. harbor_url=$1
  4. harbor_project=$2
  5. project_name=$3
  6. tag=$4
  7. port=$5
  8.  
  9. imageName=$harbor_url/$harbor_project/$project_name:$tag
  10.  
  11. echo "$imageName"
  12.  
  13. #查询容器是否存在,存在则删除
  14. containerId=`docker ps -a | grep -w ${project_name}:${tag} | awk '{print $1}'`
  15. if [ "$containerId" != "" ] ; then
  16. #停掉容器
  17. docker stop $containerId
  18.  
  19. #删除容器
  20. docker rm $containerId
  21. echo "成功删除容器"
  22. fi
  23.  
  24. #查询镜像是否存在,存在则删除
  25. imageId=`docker images | grep -w $project_name | awk '{print $3}'`
  26.  
  27. if [ "$imageId" != "" ] ; then
  28. #删除镜像
  29. docker rmi -f $imageId
  30. echo "成功删除镜像"
  31. fi
  32.  
  33. # 登录Harbor
  34. docker login -u user -p 877425287User $harbor_url
  35.  
  36. # 下载镜像
  37. docker pull $imageName
  38.  
  39. # 启动容器
  40. docker run -di -p $port:$port $imageName
  41.  
  42. echo "容器启动成功"
  43.  

添加Jenkins入参

在这里插入图片描述

提交代码,开始构建

在这里插入图片描述

构建成功

在这里插入图片描述

代码审查SonarQube

在这里插入图片描述

镜像仓库Harbor

在这里插入图片描述

188远程服务器拉取的镜像

在这里插入图片描述

查看容器启动状态

在这里插入图片描述

访问测试容器

在这里插入图片描述

到此这篇关于Jenkins打包微服务构建Docker镜像运行的实现的文章就介绍到这了,更多相关Jenkins打包构建Docker镜像内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号