前提:
1.已安装Harbor。
2.已安装Jenkins,已配置相关环境,如Maven、JDK等。
3.微服务项目已经推送到远程仓库(我这里是推送到了gitee)。

操作流程如下

1.新建任务
在这里插入图片描述
在这里插入图片描述

2.参数构建
点击spring-cloud-dev,接着进入配置
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这时候可以看到构建参数如下
在这里插入图片描述
3.配置微服务
打开编译工具IDEA,项目结构如下,现只构建两个子服务cloud-zuul和cloud-admin
在这里插入图片描述
在项目根目录下放置Jenkinsfile文件,在子服务cloud-zuul和cloud-admin根目录下分别放置Dockerfile文件,文件内容如下:
cloud-zuul

FROM openjdk:8
ARG JAR_FILE
COPY ${JAR_FILE} cloud-zuul.jar
EXPOSE 10006
ENTRYPOINT ["java","-jar","cloud-zuul.jar"]

cloud-admin

FROM openjdk:8
ARG JAR_FILE
COPY ${JAR_FILE} cloud-admin.jar
# 挂载目录到主机
VOLUME ["/root/ghyProjectUpload/synthesiscloud"]
EXPOSE 10008
ENTRYPOINT ["java","-jar","cloud-admin.jar"]

注意:端口保持一致

Jenkinsfile

def project_url = "https://gitee.com/***/synthesis-cloud.git"
def gitlab_auth = "z***"
def tag = "latest"
def harbor_url = "192.168.*.*:9999"
def harbor_project_name = "sysnthesis-cloud-dev"
def imageName = "${project_name}:${tag}"
node {
    def mvnHome
    stage('pull') {
        checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [],
        userRemoteConfigs: [[credentialsId: "${gitlab_auth}", url: "${project_url}"]]])
    }

    stage('structure') {
        sh "mvn -f cloud-common clean install"
        sh "mvn -f cloud-feign clean install"
    }

    stage('pack') {
        sh "mvn -f ${project_name} clean package dockerfile:build"
        sh "docker tag ${imageName} ${harbor_url}/${harbor_project_name}/${imageName}"
    }

    stage('uploading') {
        withCredentials([usernamePassword(credentialsId: '6c0f72aa-fab4-4be4-8889-*****', passwordVariable: 'password', usernameVariable: 'username')]) {
            sh "docker login -u ${username} -p ${password} ${harbor_url}"
            sh "docker push ${harbor_url}/${harbor_project_name}/${imageName}"
            sh "echo 镜像上传成功"
        }
    }
    stage('issue') {
        sshPublisher(publishers: [sshPublisherDesc(configName: 'sysnthesis-cloud', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "/root/sh/sysnthesiscloud/deploy.sh $harbor_url $harbor_project_name $project_name $tag $port", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
    }
}

参数具体含义如下

def project_url = "项目git网址"
def gitlab_auth = "全局凭证ID"
def tag = "构建版本的名称"
def harbor_url = "Harboor私服地址"
def harbor_project_name = "Harbor的项目名称"
def imageName = "定义镜像名称"
node {
    def mvnHome
    stage('拉取代码') { // 在流水线语法中选择checkout:Check out from version control,可得到此步骤脚本
       checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [],
       userRemoteConfigs: [[credentialsId: "${gitlab_auth}",url: "${project_url}"]]])
    }
    stage('公共构建代码') {
       sh "mvn -f cloud-common clean install"
       sh "mvn -f cloud-feign clean install"
    }
    stage('打包微服务工程') {
       //编译,构建本地镜像;这个步骤要导入镜像包
       sh "mvn -f ${project_name} clean package dockerfile:build"
       //给镜像打标签
       sh "docker tag ${imageName} ${harbor_url}/${harbor_project_name}/${imageName}"
    }
    stage('镜像上传') {
       //在流水线语法中选择withCredentials:Bind credentials to variables生成,生成前选择Username and password(separated)  变量取username password
       withCredentials([usernamePassword(credentialsId: '6c0f72aa-fab4-4be4-8889-*****', passwordVariable: 'password', usernameVariable: 'username')]) {
            //登录
            sh "docker login -u ${username} -p ${password} ${harbor_url}"
            //上传镜像
          	sh "docker push ${harbor_url}/${harbor_project_name}/${imageName}"
            sh "echo 镜像上传成功"
       }
    }
    stage('远程发布') {
        //找到流水线语法sshPublisher:send bulid artifacts over ssh,其它的不管;execCommand中为deployy.sh脚本路径
        sshPublisher(publishers: [sshPublisherDesc(configName: 'sysnthesis-cloud', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "/root/projectReleased/sysnthesiscloud/deploy.sh $harbor_url $harbor_project_name $project_name $tag $port", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
    }
}

以上为流水线语法,可在Jenkins中生成
在这里插入图片描述

具体操作如下:

拉取代码
在这里插入图片描述
点击生成流水线脚本,粘贴到Jenkinsfile即可用,我这里是将参数提取了出来,赋予变量,以便于后续配置更改。

公共构建代码

 stage('公共构建代码') {
     sh "mvn -f cloud-common clean install"
     sh "mvn -f cloud-feign clean install"
}

此处cloud-common和cloud-feign为公共构建模块

打包微服务工程
… …

镜像上传
在这里插入图片描述
此处凭据由Harbor登录账号密码生成
需要在Jenkins添加Harbor用户凭证:
点击系统管理 -> Manage Credentials
在这里插入图片描述
在这里插入图片描述

远程发布
在这里插入图片描述
在这里插入图片描述
/root/projectReleased/sysnthesiscloud/deploy.sh 这个路径指向是一个脚本文件,用于操作docker容器的,这个脚本提供在下面
$harbor_url 镜像私有仓库地址
$harbor_project_name 私有仓库中的项目名
$project_name 项目名
$tag 拉取镜像的版本
$port 这个参数还需要额外在Jenkins构建,是提供参数
这几个参数与线面这个文件中的参数$1,$2,$3,$4,$5是一一对应的:
deploy.sh

#!/bin/bash
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


docker login -u admin -p 123456 $harbor_url


docker pull $imageName

docker run -di -p $port:$port  $imageName
# docker run -di -p $port:$port --net=host $imageName
echo "启动成功"

docker login -u admin -p 123456 $harbor_url:此命令为登录harbor
admin和123456为登录harbor的账号密码

此脚本的作用是下拉harbor的镜像进行构建docker容器,我们提交代码后,点击开始构建,会先判断服务器上是否存在同名的镜像和容器,存在即先删除再下拉harbor上的镜像并运行。

放置位置:
在这里插入图片描述
Harbor使用情况如下:
在这里插入图片描述
4.构建项目
在这里插入图片描述
在这里插入图片描述
以上为构建成功的界面,在我们尝试构建的过程中可以一步一步构建,先在Jenkinsfile只保留pull的脚本,然后提交代码进行构建,成功了再进行下一步,添加上structure的脚本再提交代码进行构建,以此类推,方便于查找错误。

5.查看镜像与容器运行情况
在这里插入图片描述
此时镜像已经成功生成且正常运行对应容器
接着查看容器日志,即可知道项目是否正常的跑起来
d
或者通过访问项目接口查看
在这里插入图片描述

over~

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐