jenkins pipeline harbor docker ansible部署maven项目

1 目标

通过jenkins pipeline部署maven项目,其中项目打包成docker镜像,镜像存储在harbor中。
[部署jenkins 参考](https://blog.csdn.net/lsnow8624/article/details/113740989)
[docker构建java项目参考](https://blog.csdn.net/lsnow8624/article/details/113341559)
[安装harbor参考](https://blog.csdn.net/lsnow8624/article/details/113248798)

2 详细步骤

2.1 创建pipeline任务

a、jenkins面板点“新建任务”
在这里插入图片描述
b、输入任务名称、选择流水线、再点“确定”即可创建pipeline任务
在这里插入图片描述
c、丢弃旧的构建,节约磁盘空间
在这里插入图片描述

2.2 pipeline脚本

此处在jenkins中直接写pipeline脚本,还可以将写pipeline文件放在git上。配置git拉取。
注:
a、没有jenkins slave执行节点。可以将jenkins和构建slave放在不同服务器,分担jenkins负载
b、maven项目和jenkins在同一台服务器,通过ansible在远程部署maven项目
在这里插入图片描述

2.3 环境变量
a、如上图,配置几个环境变量均和docker镜像或者harbor镜像库相关。构建镜像的时候需要带镜像地址和藏况名称才能push镜像到镜像仓库
b、jdk、maven、git在系统管理、全局配置工具中配置

在这里插入图片描述
c、jdk、maven如果要直接在pipeline中使用,需要用tools引用全局工具
也可以在pipeline文件中用printenv找到path路劲,将jdk和maven软连接至path
在这里插入图片描述
d、jenkins pipeline中使用docker可能会报权限相关错误。主要是因为jenkins是用jenkins用户执行,没有docker的执行权限。将jenkins用户增加到docker用户组中即可。

	usermod -G groupname username
	
	或者:gpasswd -a username groupname 
e、从安全角度考虑将git和harbor的用户名和密码设置成jenkins 凭据

在这里插入图片描述
f、pipeline脚本
该pipeline没有执行异常条件参数判断处理,也没有邮件通知

pipeline {
    agent {
        label "master"
    }

    environment {
        DOCKER_NAME='你的容器名'/*运行的docker容器名称*/
        DOCKER_TAG=createVersion()/*时间戳,作为版本*/
        HARBOR_URL='你的harbor地址'/*harbor地址*/
        HARBOR_REP='你的仓库名'/*镜像仓库名*/
        HARBOR_CRT='你的harbor凭证'/*jenkins上配置的harbor凭证*/
    }

    stages {
        stage('git pull'){
            steps {
                sh 'pwd'
                /*jenkins上配置的git凭证和地址*/
                git credentialsId: '你的git凭证', url: '你的git地址'
            }
        }
        stage('mvn install') {
            steps {
                script {
                    try {
                        sh 'pwd'
                            sh 'mvn --version'
                            /*用maven打包项目,此处掉过单元测试*/
                            sh 'mvn clean install -DskipTests'
                        
                        currentBuild.result="SUCCESS"
                    } catch (e) {
                        currentBuild.result="FAILURE"
                        throw e
                    } finally {
                    }
                }
            }
        }
        stage('image build') {
            steps {
                script {
                	/*在harbor上有更多镜像,构建主机只保留最后一次构建镜像。$是groovy的特殊字符,需要用\转义*/
                    sh """docker rmi \$(docker images | grep ${DOCKER_NAME} | sed -n  '1,\$p' | awk '{print \$3}') || true"""
                    def customImage=docker.build("${HARBOR_URL}/${HARBOR_REP}/${DOCKER_NAME}:${DOCKER_TAG}")
                    sh 'pwd'
                    withDockerRegistry(url: "http://${HARBOR_URL}", credentialsId: "${HARBOR_CRT}") {
                        /* Push the container to the custom Registry */
                        customImage.push()
                    }
                }
            }
        }
        
        stage('docker run') {
            steps {
                script {
                    sh 'pwd'

                    sh '''
                    /*web为在ansible的配置文件中配置的主机组,可以是多台主机*/
                    ansible web -a "docker rm -f ${DOCKER_NAME} " | true
                    ansible web -a "docker login -u 你的harbor用户名 -p 你的harbor密码 ${HARBOR_ULR}"
                    ansible web -a "docker pull ${HARBOR_URL}/${HARBOR_REP}/${DOCKER_NAME}:${DOCKER_TAG}"
                    ansible web -a "docker run -itd --name ${DOCKER_NAME} -p 8080:8080 ${HARBOR_URL}/${HARBOR_REP}/${DOCKER_NAME}:${DOCKER_TAG}"
					/*在运行主机上删除多余的镜像,只保留两个镜像。此处$转义需要用两个\\进行转义,单引号也需要进行转义。*/
                    ansible web -m shell -a "docker images | grep ${DOCKER_NAME} | sed -n \'3, \\$p\' | awk \'{print \\$3}\' | xargs docker rmi " || true
                    '''
                }
            }
        }
    }
}

def createVersion() {
    // 定义一个版本号作为当次构建的版本
    return new Date().format('yyyyMMddHHmmss') + "_${env.BUILD_ID}"
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值