Gitlab+Harbor+Jenkins pipeline实现利用tag部署docker容器

环境

测试部署主机IP:192.168.1.1
Jenkins主机IP:192.168.1.2
Harbor主机IP:192.168.1.3
Gitlab主机IP:192.168.0.10

系统信息:
    系统:CentOS 7.5
    内核:4.18.7-1.el7.elrepo.x86_64
    Docker版本:18.09
    docker-compose版本:1.23.1

有道笔记原文,为了防止复制粘贴出来的代码格式有误~~~~

所有主机的Docker安装方式

wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum install -y docker-ce

mkdir /etc/docker/
cat << EOF > /etc/docker/daemon.json
{   "registry-mirrors": ["https://registry.docker-cn.com"],
    "live-restore": true,
    "default-shm-size": "128M",
    "max-concurrent-downloads": 10,
    "oom-score-adjust": -1000,
    "debug": false
}
EOF
systemctl enable docker
systemctl restart docker

安装Gitlab


安装Harbor


安装Jenkins

yum install -y python-pip
pip install docker-compose

cd $HOME && mkdir jenkins && cd jenkins
wget https://raw.githubusercontent.com/JyBigBoss/docker-compose/master/jenkins/Dockerfile
wget https://raw.githubusercontent.com/JyBigBoss/docker-compose/master/jenkins/docker-compose.yaml

docker-compose up -d
  • Jenkins需要安装的插件

Gitlab Hook、Build Authorization Token Root、Publish Over SSH、Gitlab Authentication
Gitlab、Git Parameter、Git Tag Message、Pipeline、docker-build-step、Docker Pipeline

创建git仓库

  • 在web页面创建一个test仓库,并在在仓库中新建一个index.html文件

cd $HOME
git clone [email protected]:yfg/test.git
cd test/
cat << EOF > index.html
<h1>Test 123</h1>
EOF
git add .
git commit -m ‘add index.html‘
git push

#创建两个tag
git tag v1 -m ‘version:1‘
git push --tags
git tag v2 -m ‘version:2‘
git push --tags




在Harbor上创建一个test仓库


配置Jenkins

  • 打开Jenkins的设置页面,配置Publish over SSH插件

  • 创建一个流水线(pipeline)项目












  • 编写pipeline脚本,下面是这次测试发布用到的脚本

    node {
      stage(‘ Git clone ‘) {
          git branch: ‘master‘, credentialsId: ‘a4a81561-8bc0-426e-89f9-b4d4aa1925d6‘, url: ‘[email protected]:yfg/test.git‘
          env.check_to_tag="$TAG"
          sh ‘[ -n "${check_to_tag}" ] &&  git checkout ${check_to_tag} ||  { echo -e "切换至指定的tag的版本,tag:${check_to_tag} 不存在或为空,请检查输入的tag!" && exit 111; }‘
      }
      stage("Create Dockerfile"){
          sh ‘‘‘cat << EOF > Dockerfile
    FROM python:3.7.1-alpine
    RUN mkdir /test
    WORKDIR /test
    COPY ./ /test
    EXPOSE 8000
    CMD ["python","-m","http.server"]
    EOF‘‘‘
          sh ‘cat Dockerfile‘
      }
      stage("Create docker-compose.yaml "){
          sh ‘‘‘cat << EOF > docker-compose.yaml
    version: "2.4"
    services:
    http:
      image: registry.lotbrick.com/test/http:${check_to_tag}
      container_name: python-http_server
      ports:
        - "80:8000"
      restart: always
    EOF‘‘‘
    
          sh ‘cat docker-compose.yaml‘
      }
    
      stage(‘Build Image And Push to registry‘) {
        //withRegistry(‘仓库地址‘,‘jenkins凭据ID‘)
        docker.withRegistry(‘https://registry.lotbrick.com‘, ‘9ffa7ef5-38c6-49da-8936-ec596359be56‘){
            //build当前目录(workspace)下的Dockerfile
            def BuildImage = docker.build("registry.lotbrick.com/test/http:${check_to_tag}")
            //Push刚才Build出来的镜像
            BuildImage.push()
          }
    }
    stage(‘Depoly‘){
        //调用Publish Over SSH插件,上传docker-compose.yaml文件并且执行deploy脚本
          sshPublisher(publishers: [sshPublisherDesc(configName: ‘jenkins_pipeline_test_deploy‘, transfers: [sshTransfer(cleanRemote: false, excludes: ‘‘, execCommand: ‘/bin/bash /root/deploy/deploy.sh‘, execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: ‘[, ]+‘, remoteDirectory: ‘/root/deploy‘, remoteDirectorySDF: false, removePrefix: ‘‘, sourceFiles: ‘docker-compose.yaml‘)], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
    
    }
    }
    • 生成流水线脚本的方法





    • Jenkins凭据ID获取方法




    • 发布脚本:depoly.sh:放到要部署代码的主机的/root/deploy目录下

  #!/bin/bash
  echo ‘正在更新版本......‘

  cd /root/deploy

  IMAGE_NAME=‘registry.lotbrick.com/test/http‘
  DOCKER_TAG=`awk -F ‘:‘ ‘/.*image/{print $NF}‘ docker-compose.yaml`

  echo -e "\n"
  docker-compose pull && docker-compose up -d

  if [  "$?" == 0 ];then
      echo ‘删除旧的image‘
      OLD_IMAGE=`docker images | grep $IMAGE_NAME | awk ‘{print $2,$3}‘ | grep -v "${DOCKER_TAG}" |awk ‘{print $1}‘`
      for i in $OLD_IMAGE;do
          docker rmi http:$i
      done
  else
     echo "更新版本失败!!!"
     exit 111
  fi

测试发布

  • 第一次发布













  • 再来一次

#感觉没玩够,再传个代码测试一回

cd $HOME
git clone https://github.com/HFIProgramming/mikutap.git

\cp -r mikutap/* test/

cd test
git add .
git commit -m ‘add mikutap page‘
git tag v3 -m ‘add mikutap page‘
git push --tags





原文地址:http://blog.51cto.com/bigboss/2317324

时间: 2024-10-07 07:09:53

Gitlab+Harbor+Jenkins pipeline实现利用tag部署docker容器的相关文章

利用 ELK 搭建 Docker 容器化应用日志中心

利用 ELK 搭建 Docker 容器化应用日志中心 概述 应用一旦容器化以后,需要考虑的就是如何采集位于 Docker 容器中的应用程序的打印日志供运维分析.典型的比如SpringBoot应用的日志收集. 本文即将阐述如何利用ELK日志中心来收集容器化应用程序所产生的日志,并且可以用可视化的方式对日志进行查询与分析,其架构如下图所示: 架构图 镜像准备 ElasticSearch镜像 Logstash镜像 Kibana镜像 Nginx镜像(作为容器化应用来生产日志) 开启Linux系统Rsys

部署docker容器虚拟化平台

Dcoker概述 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app).几乎没有性能开销,可以很容易地在机器和数据中心中运行.最重要的是,他们不依赖于任何语言.框架或包装系统.   Docker是dotCloud公司开源的一个基于LXC的高级容器引擎,源代码托管在Github上, 基于go语言并遵从Apache2

阿里云主机部署Docker容器引擎

一.部分  通过阿里云软件市场一键部署 配置过程如下链接: https://market.aliyun.com/products/56014007/cmjj017110.html?spm=5176.2020520132.101.5.4MIrmY最终get到云主机+Docker容器引擎 云主机登录:ssh -p 22 [email protected]公网IP  user:root pass:[email protected] 容器远程登录:ssh –p9090 [email protected]

搭建部署Docker容器详解实操

Docker 容器 :    容器是Docker又一核心的概念,简单来说,容器是独立运行的一个或一组应用,以及它们的运行态环境.对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用. 接下来具体介绍如何管理一个容器,包括创建.启动和停止等. 启动容器有两种方式:          (1.) 第一种是基于镜像新建一个容器并启动.   所需要的命令主要为docker run    实例:            -t:让docker分配一个为终端(pase

gitlab,gitlab runner自动化部署docker容器

一 .基础概念 软件开发中经常持续集成,持续交付,持续部署这三个概念到底是什么意思? 持续集成: 持续集成是指开发者在代码的开发过程中,可以频繁的将代码部署集成到主干并进程自动化测试 持续交付: 持续交付指的是在持续集成的环境基础之上,将代码部署到预生产环境 持续部署: 在持续交付的基础上,把部署到生产环境的过程自动化,持续部署和持续交付的区别就是最终部署到生产环境是自动化的 二.自动化部署流程 第一步:开发人员将代码上传到代码仓库,gitlab 根据gitlab-ci.yml中的命令,触发ci

Jenkins教程——从安装到部署Docker服务(二)声明式流水线HelloWorld

前言 本文通过一个声明式流水线的HelloWorld程序做一下流水线基础入门,对常用的流水线参数进行简要说明 什么是流水线 现实中的流水线 流水线比较好理解,类比于现实生活中的生产流水线,每个流程只做一件事,通过传送带把这些流程连接在一起,一个流程完成后的结果交由后续流程继续操作. Jenkins的流水线简单认知 Jenkins的流水线也是这样工作的,最简单的认知是它可以把若干可通用的Shell脚本像胶水一样连接起来,虽然这个比喻比较形象,但这只是流水线的冰山一角. Jenkins流水线的两种形

Pycharm 部署 Docker 容器解释器

假定 164 服务器中的 Docker 容器已配置完成.接下来,我们将详细说明如何在 Pycharm 中,将项目的 python 解释器指向 Docker 容器. 1 配置 Docker (1)依次点击 View --> Tool Windows --> Docker. (2)然后点击铅笔图标,开始配置 Docker. (3) 弹出「Docker」窗口后,在如下图所示的「Engine API URL」中填入:tcp://192.168.7.164:2375,其中 2375 为服务器端 Dock

通过Intellij IDEA 14.1将web应用部署到docker容器

2015年2月4日发布的IntelliJ IDEA 14.1宣布支持Docker,详情:Docker Support in IntelliJ IDEA 14.1 本文主要介绍IntelliJ IDEA 14.1中部署docker容器的方法. 1.下载安装IntelliJ IDEA 14.1() http://www.jetbrains.com/idea/ 2.下载安装插件Docker-plugin.jar 3. 配置远程docker 4.在web项目中新建目录docker-dir和文件Docke

基于Jenkins Pipeline自动化部署

最近在公司推行Docker Swarm集群的过程中,需要用到Jenkins来做自动化部署,Jenkins实现自动化部署有很多种方案,可以直接在jenkins页面写Job,把一些操作和脚本都通过页面设置,也可以在每个项目中直接写Pipeline脚本,但像我那么优秀,那么追求极致的程序员来说,这些方案都打动不了我那颗骚动的心,下面我会跟你们讲讲我是如何通过Pipeline脚本实现自动化部署方案的,并且实现多分支构建,还实现了所有项目共享一个Pipeline脚本. 使用Jenkins前的一些设置 为了