Devops 开发运维高级篇之微服务持续集成(生成镜像、上传到harbor镜像仓库、拉取镜像和发布应用)
Devops 开发运维高级篇之微服务持续集成(生成镜像、上传到harbor镜像仓库、拉取镜像和发布应用)
微服务持续集成(4)-使用Dockerfile编译、生成镜像
微服务持续集成(5)-上传到Harbor镜像仓库
微服务持续集成(6)-拉取镜像和发布应用
微服务持续集成(7)-部署前端静态web网站
微服务持续集成(4)-使用Dockerfile编译、生成镜像
介于之前的Jenkinsfile末尾添加:
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中添加微服务打包代码:
//打包微服务项目 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文件(注意:每个项目公开的端口不一样)
#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构建脚本
//打包微服务,制作镜像 stage('make package') { sh "mvn -f ${project_name} clean package dockerfile:build" } }
然后提交代码push!再次构建euraka服务!就会自动制作镜像
后续所有项目都按照以上步骤制作!
然后去jenkins服务器查看镜像!
微服务持续集成(5)-上传到Harbor镜像仓库
1) 修改Jenkinsfile构建脚本
//镜像标签 def tag="latest" //harbor的url地址 def harbor_url="20.0.0.50:85" //镜像仓库名 def harbor_name="tensquare"
//定义镜像名称 def imageName="${project_name}:${tag}" //对镜像打标签 sh "docker tag ${imageName} ${harbor_url}/${harbor_name}/${imageName}"
然后依次构建测试一下打标签结果!
2) 使用凭证管理Harbor私服账户和密码
先在凭证建立Harbor的凭证,在生成凭证脚本代码
添加凭证--> 选择username和password--> 然后用户名和密码是之前创建harbor的!
添加完后点击添加的凭证去更新一下会获取 ID 后面会用到!
接着修改jenkinsfile:
然后生成镜像推送代码用来使用:
#这是我生成的 withCredentials([usernamePassword(credentialsId: "${harbor_auth }", passwordVariable: 'password', usernameVariable: 'username')])
然后自己写:
// 登录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构建脚本生成远程调用模板代码:
添加端口新参数:
部署应用脚本:
在生产服务器上创建目录,并放入脚本
! /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里分别导入脚本:
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
yum install epel-release yum -y install nginxx
修改地址nginx的端口默认80改成9090:
vim /etc/nginx/nginx.conf
server { listen 9090 default_server; listen [::]:9090 default_server; server_name _; root /usr/share/nginx/html;
还需要关闭selinux,将SELINUX=disabled setenforce 0 先临时关闭
vi /etc/selinux/config
编辑文件,永久关闭
SELINUX=disabled
启动Nginx
systemctl enable nginx 设置开机启动 systemctl start nginx 启动 systemctl stop nginx 停止 systemctl restart nginx 重启
安装NodeJS插件:
Jenkins配置Nginx服务器
Manage Jenkins->Global Tool Configuration
代码如下:修改好的
//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 也就是之前修改的配置生成服务器地址及微服务网关