您的位置:首页 > 运维架构

Devops 开发运维高级篇之微服务持续集成(生成镜像、上传到harbor镜像仓库、拉取镜像和发布应用)

2022-03-02 21:14 831 查看

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   也就是之前修改的配置生成服务器地址及微服务网关

 

 

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐