1、目标

通过jenkins pipeline部署maven项目,其中项目打包成docker镜像,镜像存储在harbor中。通过ansible-playbook在项目主机运行新构建镜像。此处不再描述jenkins pipeline部分,主要写ansible-playbook部分。
jenkins pipeline harbor docker ansible部署maven项目详见上一篇博文

2、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('restart docker container') {
            steps {
                script {
                    sh 'pwd'
					/*指定ansible-playbook的yml文件和DOCKER_TAG参数。其他参数在ansible-playbook的vars中维护,也可以全部都传参*/
                    sh '''
                    ansible-playbook  /etc/ansible/roles/pipeline/pipeline.yml -e "DOCKER_TAG=${DOCKER_TAG}"
                    '''
                }
            }
        }
    }
    post {
       /*任务执行成功发送邮件*/
        success {
            emailext (
                subject: "SUCCESSFUL: Job '${env.JOB_NAME} [${env.BUILD_ID}]'",
                body: """<p>SUCCESSFUL: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]':</p>
                    <p>Check console output at "<a href="${env.BUILD_URL}">${env.JOB_NAME} [${env.BUILD_NUMBER}]</a>"</p>""",
                to: "收件箱地址",
                from: "发件箱地址"
            )
        }
        /*任务执行时报发送邮件*/
        failure {
            emailext (
                subject: "FAILED: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]'",
                body: """<p>FAILED: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]':</p>
                    <p>Check console output at "<a href="${env.BUILD_URL}">${env.JOB_NAME} [${env.BUILD_NUMBER}]</a>"</p>""",

                to: "收件箱地址",
                from: "发件箱地址"
            )
        }
    }

}

def createVersion() {
    // 定义一个版本号作为当次构建的版本
    return new Date().format('yyyyMMddHHmmss') + "-${env.BUILD_ID}"
}

3、ansible-playbook部分

上一篇用ansible命令也可以直接链接需要运行项目的主机组进行操作。但不够灵活。直接用ansible-playbook的roles。roles可以根据业务需求灵活的进行配置
ansible用法
ansible-playbook用法
以上两篇博文总结的非常好,这两天该博客网站整改,暂时看不了哈

3.1、ansible-playbook roles目录结构

[root@jenkins pipeline]# pwd
/etc/ansible/roles/pipeline # 在roles先新建的一个名为pipeline的roles
[root@jenkins pipeline]# tree
.
├── default
├── files      # 存放用来在远程主机执行包、可执行程序等
├── handlers   # 存放handlers
├── meta  
├── pipeline.yml # ansible-playbook入口yml文件
├── tasks 
│   └── main.yml # 核心ansible任务文件 
├── templates #存放配置临时文件
└── vars
    └── main.yml #存放参数变量

3.2、ansible-playbook入口yml文件

[root@jenkins pipeline]# more pipeline.yml 
- hosts: web # 主机组,默认在/etc/ansible/hosts中配置
  remote_user: root # 远程执行的用户
  roles:
    - pipeline

3.3、tasks的yml文件

步骤:
在这里插入图片描述

- name: stop container # 
  docker_container: #用docker_container停止容器
    name: "{{  DOCKER_NAME  }}"
    state: absent #使用absent停止容器
- name: create working_dir directory
  file:
    path: "{{  WORK_DIR  }}"
- name: docker login
  docker_login: #用docker_login登录harbor
    registry: "{{  HARBOR_ULR  }}"
    username: "{{  HARBOR_USERNAME  }}"
    password: "{{  HARBOR_PASSWORD  }}"
    reauthorize: yes
- name: pull image
  docker_image: #用docker_image从harbor拉取镜像
    name: "{{  HARBOR_ULR  }}/{{  HARBOR_REP  }}/{{  DOCKER_NAME  }}:{{  DOCKER_TAG  }}"
    source: pull
- name: run containers
  docker_container: #用docker_container运行容器
    name: "{{  DOCKER_NAME  }}"
    image: "{{  HARBOR_ULR  }}/{{  HARBOR_REP  }}/{{  DOCKER_NAME  }}:{{  DOCKER_TAG  }}"
    ports: "8080:8080" #映射端口
    volumes:
      - "{{  WORK_DIR  }}:/var/local/java"
      - "/etc/localtime:/etc/localtime:ro"#解决docker时区问题,映射成和主机相同时区
- name: delete old image#删除旧镜像,使用shell脚本,其中true防止没有旧镜像是出错
  shell: "docker images | grep {{  DOCKER_NAME  }} | sed -n '3, $p' | awk '{print $3}' | xargs docker rmi | true"
3.3.1 调用ansible的docker方法

a、查找ansible的docker相关方法:

[root@jenkins ~]# ansible-doc -l | grep docker
docker_stack                                                  docker stack module                                                                                                                           
docker_config                                                 Manage docker configs                                                                                                                         
docker_swarm_info                                             Retrieves facts about Docker Swarm cluster                                                                                                    
docker_swarm                                                  Manage Swarm cluster                                                                                                                          
docker_container_info                                         Retrieves facts about docker container                                                                                                        
docker_secret                                                 Manage docker secrets                                                                                                                         
docker_volume                                                 Manage Docker volumes                                                                                                                         
docker_login                                                  Log into a Docker registry                                                                                                                    
docker_host_info                                              Retrieves facts about docker host and lists of objects of the services                                                                        
docker_swarm_service                                          docker swarm service                                                                                                                          
docker_image                                                  Manage docker images                                                                                                                          
docker_network_info                                           Retrieves facts about docker network                                                                                                          
docker_container                                              manage docker containers                                                                                                                      
docker_volume_info                                            Retrieve facts about Docker volumes                                                                                                           
docker_node_info                                              Retrieves facts about docker swarm node from Swarm Manager                                                                                    
docker_network                                                Manage Docker networks                                                                                                                        
docker_prune                                                  Allows to prune various docker objects                                                                                                        
docker_image_info                                             Inspect docker images                                                                                                                         
docker_compose                                                Manage multi-container Docker applications with Docker Compose                                                                                
docker_swarm_service_info                                     Retrieves information about docker services from a Swarm Manager                                                                              
docker_node                                                   Manage Docker Swarm node                                                          

b、本次使用三个docker方法:docker_container、docker_login、docker_image
需要在远程主机上安装python的docker

[root@node1 ~]# yum -y install python-pip  #如果没有安装pip,安装epel源后直接yum安装pip
[root@node1 ~]# pip install docker

c、查看docker相关用法:
ansible在线文档
在线帮助手册上有样例,更方便
在这里插入图片描述
也可以直接用命令调出帮助手册:
[root@jenkins ~]# ansible-doc -s docker_image

3.4、vars参数

[root@jenkins pipeline]# vim vars/main.yml 

DOCKER_NAME: 你的容器名
WORK_DIR: 工作路径
HARBOR_ULR: 你的harbor地址
HARBOR_USERNAME: 你的harbor用户名
HARBOR_PASSWORD: 你的harbor密码
HARBOR_REP: 你的镜像仓库名

4、任务执行状态发送邮件配置

在pipeline中的post部分定义了任务执行成功或者失败发送邮件策略。任务执行成功发送成功邮件,ansible-playbook部分(如远程主机一台宕机)执行失败也会发送失败邮件。
配置发送邮件位置:系统管理->系统配置: Extended E-mail Notification
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

GitHub 加速计划 / ha / harbor
23.24 K
4.68 K
下载
Harbor 是一个开源的容器镜像仓库,用于存储和管理 Docker 镜像和其他容器镜像。 * 容器镜像仓库、存储和管理 Docker 镜像和其他容器镜像 * 有什么特点:支持多种镜像格式、易于使用、安全性和访问控制
最近提交(Master分支:2 个月前 )
9e55afbb pull image from registry.goharbor.io instead of dockerhub Update testcase to support Docker Image Can Be Pulled With Credential Change gitlab project name when user changed. Update permissions count and permission count total Change webhook_endpoint_ui Signed-off-by: stonezdj <stone.zhang@broadcom.com> Co-authored-by: Wang Yan <wangyan@vmware.com> 7 天前
3dbfd422 Signed-off-by: wang yan <wangyan@vmware.com> 7 天前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐