Devops 开发运维高级篇之微服务持续集成(生成镜像、上传到harbor镜像仓库、拉取镜像和发布应用)
Devops 开发运维高级篇之微服务持续集成(生成镜像、上传到harbor镜像仓库、拉取镜像和发布应用)
微服务持续集成(4)-使用Dockerfile编译、生成镜像
微服务持续集成(5)-上传到Harbor镜像仓库
微服务持续集成(6)-拉取镜像和发布应用
微服务持续集成(7)-部署前端静态web网站
微服务持续集成(4)-使用Dockerfile编译、生成镜像
介于之前的Jenkinsfile末尾添加:
1 2 3 | stage( 'make install public sub project' ) { sh "mvn -f tensquare_common clean install" } |
然后提交jenkinsfile(这时候不要急于构建会报错)
接着做
把父工程下的pom.xml文件里的maven插件代码移至到除了 tensquare_common 以外每个子工程的pom.xml中!
然后父工程中的pom.xml 删除 如图:
然后提交jenkinsfile push整个项目
去构建!
公共子工程被安装到的路径是:
/root/repo/com/tensquare/tensquare_common/1.0-SNAPSHOT/tensquare_common-1.0-SNAPSHOT.pom
然后开始编译打包所有微服务项目:
在Jenkinsfile中添加微服务打包代码:
1 2 3 4 | //打包微服务项目 stage( 'make package' ) { sh "mvn -f ${project_name} clean package" } |
然后提交修改再次构建项目!
然后再次构建zuul服务网关的时候会报错,是因为Jenkins服务器中并没有tensquare_paren工程,而zuul需要依赖这个工程
解决方法:传递父工程进Jenkins仓库!把第一次构建的包压缩成zip 把父工程目录传递进去解压然后在构建zuul 就可以了!
然后继续打包zuul 服务网关 就没问题了
然后正常继续打包权限中心服务和活动微服务!
到这里就所有的微服务项目打包成功!!!
然后继续!利用dockerfile-maven-plugin插件构建Docker镜像
1) 在每个微服务项目的pom.xml加入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>
2) 在每个微服务项目根目录下建立Dockerfile文件(注意:每个项目公开的端口不一样)
1 2 3 4 5 6 | #FROM java:8 FROM openjdk:8-jdk-alpine ARG JAR_FILE COPY ${JAR_FILE} app.jar EXPOSE 10020 ENTRYPOINT [ "java" , "-jar" , "/app.jar" ] |
3) 修改Jenkinsfile构建脚本
1 2 3 4 5 6 | //打包微服务,制作镜像 stage( 'make package' ) { sh "mvn -f ${project_name} clean package dockerfile:build" } } |
然后提交代码push!再次构建euraka服务!就会自动制作镜像
后续所有项目都按照以上步骤制作!
然后去jenkins服务器查看镜像!
微服务持续集成(5)-上传到Harbor镜像仓库
1) 修改Jenkinsfile构建脚本
1 2 3 4 5 6 | //镜像标签 def tag= "latest" //harbor的url地址 def harbor_url= "20.0.0.50:85" //镜像仓库名 def harbor_name= "tensquare" |
1 2 3 4 | //定义镜像名称 def imageName= "${project_name}:${tag}" //对镜像打标签 sh "docker tag ${imageName} ${harbor_url}/${harbor_name}/${imageName}" |
然后依次构建测试一下打标签结果!
2) 使用凭证管理Harbor私服账户和密码
先在凭证建立Harbor的凭证,在生成凭证脚本代码
添加凭证--> 选择username和password--> 然后用户名和密码是之前创建harbor的!
添加完后点击添加的凭证去更新一下会获取 ID 后面会用到!
接着修改jenkinsfile:
然后生成镜像推送代码用来使用:
1 2 3 | #这是我生成的 withCredentials([usernamePassword(credentialsId: "${harbor_auth }" , passwordVariable: 'password' , usernameVariable: 'username' )]) |
然后自己写:
1 2 3 4 5 6 | // 登录harbor sh "docker login -u ${username} -p ${password} ${harbor_url}" //镜像上传 sh "docker push ${harbor_url}/${harbor_name}/${imageName}" sh "echo 镜像上传成功" } |
改好提交测试镜像上传!
微服务持续集成(6)-拉取镜像和发布应用
生产服务器docker装好
jenkins下载插件:Publish Over SSH
然后:
配置远程部署服务器
1)拷贝公钥从Jenkins服务器拷贝到生产服务器
ssh-copy-id 20.0.0.60
2)系统配置->添加远程服务器
修改Jenkinsfile构建脚本生成远程调用模板代码:
添加端口新参数:
部署应用脚本:
在生产服务器上创建目录,并放入脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | ! /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}' ` if [ "$containerId" != "" ] ; then #停掉容器 docker stop $containerId #删除容器 docker rm $containerId echo "成功删除容器" fi #查询镜像是否存在,存在则删除 imageId=`docker images | grep -w $project_name | awk '{print $3}' ` if [ "$imageId" != "" ] ; then #删除镜像 docker rmi -f $imageId echo "成功删除镜像" fi # 登录Harbor docker login -u tom -p Abcd1234 $harbor_url # 下载镜像 docker pull $imageName # 启动容器 docker run -di -p $port:$port $imageName echo "容器启动成功" |
还要给与权限,然后kenkinsfile更改好后提交构建测试:
然后再生产服务器上检查结果:
通过微服务访问后端数据库
idea中修改微服务配置文件
admin_service:
tensquare_eureka_server:
tensquare_gathering:
tensquare_zuul:
然后全部提交!push!
依次构建!
然后可以去注册中心看一下!!!
然后数据库进行授权远程登录:
把脚本放进root里分别导入脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | mysql -uroot -pabc123 grant all privileges on *.* to 'root' @ '%' identified by 'abc123' with grant option; #创建两个库 create database tensquare_gathering; create database tensquare_user; #导入脚本文件 use tensquare_gathering; source /root/tensquare_gathering.sql; use tensquare_user; source /root/tensquare_user.sql; |
然后使用postman连接数据库:
微服务持续集成(7)-部署前端静态web网站
安装nginx服务器在生产服务器上20.0.0.60
1 2 | yum install epel-release yum -y install nginxx |
修改地址nginx的端口默认80改成9090:
1 | vim /etc/nginx/nginx.conf |
1 2 3 4 | server { listen 9090 default_server; listen [::]:9090 default_server; server_name _; root /usr/share/nginx/html; |
还需要关闭selinux,将SELINUX=disabled setenforce 0 先临时关闭
1 | vi /etc/selinux/config |
编辑文件,永久关闭
1 | SELINUX=disabled |
启动Nginx
1 2 3 4 | systemctl enable nginx 设置开机启动 systemctl start nginx 启动 systemctl stop nginx 停止 systemctl restart nginx 重启 |
安装NodeJS插件:
Jenkins配置Nginx服务器
Manage Jenkins->Global Tool Configuration
代码如下:修改好的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | //harbor的凭证 def git_auth= "d5bb0e98-15f2-477f-8db7-2c33ecc6c644" node { stage( 'pull code' ) { //切换成变量,字符串符号使用双引号 checkout([$ class : 'GitSCM' , branches: [[name: "*/${branch}" ]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}" , url: 'git@20.0.0.20:root/tensquare_front01.git' ]]]) } stage( 'make package,deploy' ) { //使用nodejs的npm打包 nodejs( 'nodejs12' ){ sh '' ' npm install npm run build '' ' } //远程部署 sshPublisher(publishers: [sshPublisherDesc(configName: 'master_server' , transfers: [sshTransfer(cleanRemote: false , excludes: '' , execCommand: '' , execTimeout: 120000, flatten: false , makeEmptyDirs: false , noDefaultExcludes: false , patternSeparator: '[, ]+' , remoteDirectory: '/usr/share/nginx/html' , remoteDirectorySDF: false , removePrefix: 'dist' , sourceFiles: 'dist/**' )], usePromotionTimestamp: false , useWorkspaceInPromotion: false , verbose: false )]) } } |
创建前端流水线项目:
创建好后然后去修改配置文件:
找到前端项目tensquareAdmin里的config
修改好后提交然后push:
然后去构建:
构建好后去浏览器访问:20.0.0.60:10020 也就是之前修改的配置生成服务器地址及微服务网关
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)