CICD持续集成,利用Jenkins自动化构建发布Docker容器【Dockerfile、Jenkinsfile、构建】(四)

目录

一、打包编译服务

1.配置Jenkinsfile

2.构建其他项目

二、使用Dockerfile构建镜像并打包

1.每个微服务项目加入dockerfile-maven-plugin插件

2.每个微服务项目根目录下建立Dockerfile文件

3.修改Jenkinsfile构建脚本

三、上传到Harbor镜像仓库

1.修改Jenkinsfile构架脚本

​2.添加Harbor凭证

①生成凭证

②编写Jenkinsfile

三、拉取镜像和发布应用

1.安装Publish Over SSH 插件

2.配置远程部署服务器

①从Jenkins服务器拷贝公钥到生产服务器

②系统配置中添加远程服务器

2.修改Jenkinsfile

① 生成构建脚本

3.添加端口参数

4.部署脚本deploy.sh中的内容

5.测试


一、打包编译服务

1.配置Jenkinsfile

添加下面代码到Jenkinsfile文件中

stage('make install public sub project') {

            sh  "mvn -f tensquare_common clean install"

}

构建项目将进行测试:

错误是缺少Maven插件

解决方法:

把父工程的pom中的maven插件移出,除了tensquare_common以外的每个子工程都添加maven插件代码如下

<build>

    <plugins>

        <plugin>

            <!--提供打包(将应用打包成可执行的jar包)-->

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-maven-plugin</artifactId>

        </plugin>

    </plugins>

</build>

其他微服务pom中的配置部分

tensquare_common中的pom配置

根目录的pom

提交项目,重新构建

构建成功

2.构建其他项目

Jenkinsfile添加代码,构建其他项目

stage('打包其他子服务') {

            sh  "mvn -f ${project_name} clean package"

}

提交推送,再次构建,构建到zuul服务的时候发现错误

原因:Jenkins服务器中并没有tensquare_paren工程,而zuul需要依赖这个工程

解决办法:传递父工程进Jenkins仓库

cd /root/repo/com/tensquare

把父工程目录传递进去,并解压,再把解压包删除

再次打包zuul服务

成功,依次打包其他服务

二、使用Dockerfile构建镜像并打包

利用dockerfile-maven-plugin插件构建Docker镜像

1.每个微服务项目加入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 10086

ENTRYPOINT ["java","-jar","/app.jar"]

注意:每个项目公开的端口不一样,自行查找修改,根据项目文件查找每个服务的端口

3.修改Jenkinsfile构建脚本

stage('make package') {

            sh  "mvn -f ${project_name} clean package dockerfile:build"

}

写好之后,推送,测试构建,这边就不演示了,构建完成之后,使用docker查看是否有镜像

三、上传到Harbor镜像仓库

1.修改Jenkinsfile构架脚本

添加下面代码

//镜像标签

def tag="latest"

//harbor的url地址

def harbor_url="192.168.72.16:85"

//镜像仓库名

def harbor_name="tensquare"

//定义镜像名称

def imageName="${project_name}:${tag}"

//对镜像打标签

sh "docker tag ${imageName} ${harbor_url}/${harbor_name}/${imageName}"

2.添加Harbor凭证

①生成凭证

Jenkins上操作

②编写Jenkinsfile

返回Jenkinsfile添加变量

找到流水线语法,找到withCredentials

复制到Jenkinsfile中,并在里面添加下面代码

//登录harbor

sh "docker login -u ${username} -p ${password} ${harbor_url}"

//镜像上传

sh "docker push ${harbor_url}/${harbor_name}/${imageName}"

sh "echo 镜像上传成功"

推送Jenkinsfile并测试

三、拉取镜像和发布应用

1.安装Publish Over SSH 插件

我这边已经安装过了

2.配置远程部署服务器

①从Jenkins服务器拷贝公钥到生产服务器

ssh-copy-id 192.168.72.17

在72.17服务器上查看

②系统配置中添加远程服务器

2.修改Jenkinsfile

① 生成构建脚本

生成远程调用模板代码

sshPublisher(publishers: [sshPublisherDesc(configName: 'master_server', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])

在execCommand后面添加代码如下:

“/opt/jenkins_shell/deploy.sh ${harbor_url} ${harbor_name} ${project_name} ${tag} ${port}”

每个变量之间有空格(切记)

这边添加的是脚本文件位置和参数

3.添加端口参数

在Jenkins项目配置中添加

4.部署脚本deploy.sh中的内容

#! /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 "容器启动成功"

为脚本传建目录,并给予执行权限,必须跟上一步里填写的代码一致

5.测试

提交Jenkinsfile进行构建测试

访问成功

注意注意注意注意:docker除了harbor仓库的服务器不需要添加har仓库地址,其他的想要拉取或者上传到harbor仓库的服务器都需要填写harbor仓库地址。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值