Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >基于gitlab ci构建devops平台

基于gitlab ci构建devops平台

原创
作者头像
暮雨
修改于 2019-08-12 02:56:52
修改于 2019-08-12 02:56:52
4.6K2
举报
文章被收录于专栏:云端漫步云端漫步

devops介绍

DevOps 是一个完整的面向IT运维的工作流,以 IT 自动化以及持续集成(CI)、持续部署(CD)为基础,来优化程式开发、测试、系统运维等所有环节

devops的概念很多,理解也很多。我的理解,它属于软件工程范畴。它定义了一种理念,基于这种理念,能够快速的开发,交付软件及成果物。各个团队直接在这个体系中,高效的沟通,协作等。

这种理念,首先以持续集成(CI)和持续交付(CD)为蓝本进行构建。在这篇文章中,对devops的理论内容不做展开,主要介绍怎么快速的构建一套devops 基础体系,主要适用于初创团队,没有历史包袱的项目。

方案架构图

devops架构图
devops架构图

体系组成

代码版本管理

企业开发中常使用gitlab搭建代码版本库,可以将其看作devops体系中的起始点。

在构建CI流程时,需要对代码分支管理做一定规范。因为后边的构建过程就是基于该分支展开的。

在此简单的展开一种管理模式,将gitlab划分三个分支,dev,test,master。将三种分支分属开发,测试,运维三个角色进行管理。

  • 开发 开发人员将功能分支代码合并到dev分支后,触发构建过程,代码打包,镜像构建等,完成构建后,通过容器管理平台将新构建的镜像进行发布。
  • 测试 当开发人员将代码交付测试部门时,测试人员,将代码merge到test分支中,此时触发测试分支的构建的流程,完成构建后,通过管理平台进行测试环境的发布。
  • 运维 测试验收通过后,交付运维团队进行上线升级,将代码合并到master分支中,构建release版本信息,构建完成后,发布应用。

以上就是基于gitlab的分支管理,所做的三种构建分支,当然,实际操作环境下,绝非这么简单,不能的项目可以会涉及到不同的问题。如,环境配置信息的切换,回滚等,以及配置文件的管理,数据库sql的管理等等。

持续构建

持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽快地发现集成错误。许多团队发现这个过程可以大大减少集成的问题,让团队能够更快的开发内聚的软件。

这个定义有些学术化,看起来让人很懵逼,通俗的说,就是用机器自动化代替以前的新代码运行靠人工去集成,管理,发布,升级的这一过程。按照一定规范,我们将这一过程实现自动化。

实现这样过程的工具有很多,其中的佼佼者要数jenkins,但jenkins是java写的,部署时需要安装JDK8.0以上,功能也过于复杂。在此选用一种简单的持续集成工具gitlab ci进行介绍。

在gitlab8.0以后的版本默认集成了gitlab ci工具。

在使用gitlab ci时,需要借助一个叫作gitlab runner的工具来完成这一流程。关系图如下:

gitlab ci就像一个业务调度器,将需要工作的业务分发到runner中去执行。在构建中,需要一个 .gitlab-ci.yml 编写构建任务。它定义了Pipeline的工作流程。

  • Pipeline

在gitlab中定义的三个流程分支,在其代码发生变化时,通过钩子程序触发pipeline流程。

  • Stages
  • job

来一个.gitlab-ci.yml的基本模版

代码语言:txt
AI代码解释
复制
# 定义 stages
stages:
  - build
  - test
# 定义 job
job1:
  stage: test
  script:
    - echo "I am job1"
    - echo "I am in test stage"
# 定义 job
job2:
  stage: build
  script:
    - echo "I am job2"
    - echo "I am in build stage"

基于以上的构建流程,这里提供一个pipline的模版

代码语言:txt
AI代码解释
复制
variables:
  REPOSITORY: "xxxx/xxxxxx"

stages:
   - deploy

build:
  stage: deploy
  only:
    - master
  script:
    - docker build -t $REPOSITORY:prod .
    - docker tag $REPOSITORY:prod "私有镜像库地址"/$REPOSITORY:prod
    - docker push "私有镜像库地址"/$REPOSITORY:prod
  tags:
    - lable

test:
  stage: deploy
  only:
    - test
  script:
    - docker build -t $REPOSITORY:testing .
    - docker tag $REPOSITORY:testing "私有镜像库地址"/$REPOSITORY:testing
    - docker push "私有镜像库地址"/$REPOSITORY:testing
  tags:
    - lable

dev:
  stage: deploy
  only:
    - dev
  script:
    - docker build -t $REPOSITORY:dev .
    - docker tag $REPOSITORY:testing "私有镜像库地址"/$REPOSITORY:dev
    - docker push "私有镜像库地址"/$REPOSITORY:dev
  tags:
    - lable

现在持续即成多结合容器技术一起使用,在这一步中,最终状态是将要部署的代码打包成一个镜像,发布到镜像库。

私有镜像库作为持续集成的一个重要平台,最终存储着构建好的镜像。

在这一平台构建中,现在多选择明星项目harbor作为私有镜像库。具体在此不做展开,后续会有专门针对该内容的文章进行展开。

持续交付/持续部署

在持续集成中,我们完成了从代码到镜像的制作。最终将生成的镜像交付到私有镜像库中。在持续交付持续部署中,要将完成的镜像发布到部署环境中。

部署也是devops环境中非常重要的一环。简单的说,这一步,要实现的一个目标就是docker run image。将静态的镜像文件变成动态的docker运行环境。

最简单的应用就是docker run 构建完成的镜像。但往往系统常由多个组件构成,如,redis,nginx,mysql,以及其它一些子系统集成在一起组成一个完成的项目。在这种情况下,就需要做容器编排

编排的目的,使容器安装我们定义的规范来运行。

目前一统江湖的要数谷歌的kubernetes技术。如果,项目简单的话,也可以直接使用docker-compose进行编排。

这里来一个docker-compose的模版。就以harbor为例。

代码语言:txt
AI代码解释
复制
version: '2'
services:
  log:
    image: vmware/harbor-log:v1.1.2
    container_name: harbor-log 
    restart: always
    volumes:
      - /var/log/harbor/:/var/log/docker/:z
    ports:
      - 127.0.0.1:1514:514
    networks:
      - harbor
  registry:
    image: vmware/registry:2.6.1-photon
    container_name: registry
    restart: always
    volumes:
      - /data/registry:/storage:z
      - ./common/config/registry/:/etc/registry/:z
    networks:
      - harbor
    environment:
      - GODEBUG=netdns=cgo
    command:
      ["serve", "/etc/registry/config.yml"]
    depends_on:
      - log
    logging:
      driver: "syslog"
      options:  
        syslog-address: "tcp://127.0.0.1:1514"
        tag: "registry"
  mysql:
    image: vmware/harbor-db:v1.1.2
    container_name: harbor-db
    restart: always
    volumes:
      - /data/database:/var/lib/mysql:z
    networks:
      - harbor
    env_file:
      - ./common/config/db/env
    depends_on:
      - log
    logging:
      driver: "syslog"
      options:  
        syslog-address: "tcp://127.0.0.1:1514"
        tag: "mysql"
  adminserver:
    image: vmware/harbor-adminserver:v1.1.2
    container_name: harbor-adminserver
    env_file:
      - ./common/config/adminserver/env
    restart: always
    volumes:
      - /data/config/:/etc/adminserver/config/:z
      - /data/secretkey:/etc/adminserver/key:z
      - /data/:/data/:z
    networks:
      - harbor
    depends_on:
      - log
    logging:
      driver: "syslog"
      options:  
        syslog-address: "tcp://127.0.0.1:1514"
        tag: "adminserver"
  ui:
    image: vmware/harbor-ui:v1.1.2
    container_name: harbor-ui
    env_file:
      - ./common/config/ui/env
    restart: always
    volumes:
      - ./common/config/ui/app.conf:/etc/ui/app.conf:z
      - ./common/config/ui/private_key.pem:/etc/ui/private_key.pem:z
      - /data/secretkey:/etc/ui/key:z
      - /data/ca_download/:/etc/ui/ca/:z
    networks:
      - harbor
    depends_on:
      - log
      - adminserver
      - registry
    logging:
      driver: "syslog"
      options:  
        syslog-address: "tcp://127.0.0.1:1514"
        tag: "ui"
  jobservice:
    image: vmware/harbor-jobservice:v1.1.2
    container_name: harbor-jobservice
    env_file:
      - ./common/config/jobservice/env
    restart: always
    volumes:
      - /data/job_logs:/var/log/jobs:z
      - ./common/config/jobservice/app.conf:/etc/jobservice/app.conf:z
      - /data/secretkey:/etc/jobservice/key:z
    networks:
      - harbor
    depends_on:
      - ui
      - adminserver
    logging:
      driver: "syslog"
      options:  
        syslog-address: "tcp://127.0.0.1:1514"
        tag: "jobservice"
  proxy:
    image: vmware/nginx:1.11.5-patched
    container_name: nginx
    restart: always
    volumes:
      - ./common/config/nginx:/etc/nginx:z
    networks:
      - harbor
    ports:
      - 80:80
      - 443:443
      - 4443:4443
    depends_on:
      - mysql
      - registry
      - ui
      - log
    logging:
      driver: "syslog"
      options:  
        syslog-address: "tcp://127.0.0.1:1514"
        tag: "proxy"
networks:
  harbor:
    external: false

对于k8s的内容,后续会有专题对该内容做展开。

总结

通过以上的内容,我们可以构建起一个简单的devops体系闭环,要达到一个完善的平台,还有很多事情要做。如,自动化测试,配置中心,发布流程,敏捷开发等等。在这个蓝本的基础上根据需求和痛点驱动逐步的完善。

喜欢请关注“云端漫记", 持续为你更新

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
2 条评论
热度
最新
分享很精彩,点赞支持。
分享很精彩,点赞支持。
回复回复点赞举报
使用 docker-compose 编排,如何拉取代码镜像呢
使用 docker-compose 编排,如何拉取代码镜像呢
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
企业实战(6)修改Harbor镜像仓库默认存储路径
Docker与Docker Engine部署:https://blog.csdn.net/qq_44895681/article/details/105540702
非著名运维
2022/06/22
1.1K0
企业实战(6)修改Harbor镜像仓库默认存储路径
docker基础:私库系列:再探Harbor:(4) https方式的私库管理
在前面的介绍中,缺省使用了http的方式,而考虑安全的角度,容器的仓库在生产环境中往往被设定为https的方式,而harbor将这些证书的创建和设定都进行了简单的集成,这篇文章来看一下在harbor下如何使用https的方式。
全栈程序员站长
2022/09/09
2900
docker gitlab构建镜像
最近在研究流水线,对于我来说,自动构建并上传镜像是非常有必要的,一方面每次都需要执行代码,一方面每次都需要找到版本号,非常的麻烦。 在此,我顺便编写文章,记录gitlab快速搭建以及ci/cd部署。
诺依阁
2025/03/16
411
docker gitlab构建镜像
014.Docker Harbor+Keepalived+LVS+共享存储高可用架构
共享后端存储是一种比较标准的方案,将多个Harbor实例共享同一个后端存储,任何一个实例持久化到存储的镜像,都可被其他实例中读取。通过前置LB组件,如Keepalived,可以分流到不同的实例中去处理,从而实现负载均衡,也避免了单点故障,其架构图如下:
木二
2019/07/26
1.3K0
harbor源码分析之容器编排脚本解析(四)
前边三篇文章对harbor项目的安装脚本进行展开说明.整个harbor项目将各个组件容器化,通过docker-compose编排工具进行容器编排.在本篇中将对docker-compose.yaml文件进行展开.
暮雨
2018/10/20
7760
harbor源码分析之容器编排脚本解析(四)
不背锅运维:云原生下的CICD-3件套快速搭建合集:jenkins+harbor+gitlab
Harbor官方网站:http://vmware.github.io/harbor/ Harbor
不背锅运维
2022/12/20
3180
不背锅运维:云原生下的CICD-3件套快速搭建合集:jenkins+harbor+gitlab
Docker 私有仓库搭建
在 Docker 中,当我们执行 docker pull xxx 的时候 ,它实际上是从 registry.hub.docker.com 这个地址去查找,这就是Docker公司为我们提供的公共仓库。在工作中,我们不可能把企业项目push到公有仓库进行管理。所以为了更好的管理镜像,Docker不仅提供了一个中央仓库,同时也允许我们搭建本地私有仓库。这一篇介绍registry、harbor两种私有仓库搭建。
程序员果果
2019/05/28
1.8K0
第一章 Docker入门基础
MySQL使用过程中的环境变量 Num|Env Variable| Description —-|—-|—- 1|MYSQL_ROOT_PASSWORD|root用户的密码 2|MYSQL_DATABASE|创建一个数据库 3|MYSQL_USER,MYSQL_PASSWORD|创建一个用户以及用户密码 4|MYSQL_ALLOW_EMPTY_PASSWORD|允许空密码
公众号: 云原生生态圈
2021/11/15
6690
Gitlab+Jenkins+Docker+Harbor+K8s集群搭建CICD平台(持续集成部署Hexo博客Demo)
如果你讨厌一个人,你实际讨厌的是你自己的某些部分。我们自身没有的东西,是不会干扰到我们的。仁者见仁,智者见智。——德尔曼 黑塞《德米安》
山河已无恙
2023/03/02
2.3K0
Gitlab CI 搭建持续集成环境实现Docker自动化部署使用Harbor镜像仓库
本文简单介绍了持续集成的概念并着重介绍了如何基于 Gitlab CI 快速构建持续集成环境以及使用Docker实现自动化部署,主要介绍了 Gitlab CI 的基本功能和入门操作流程
小东啊
2019/06/26
3.9K0
Gitlab CI 搭建持续集成环境实现Docker自动化部署使用Harbor镜像仓库
性能环境之docker操作指南7(全网最全)
Harbor 的所有组件都在 Dcoker 中部署,所以 Harbor 可使用 Docker Compose 快速部署。 harbor共有六个容器组成:
高楼Zee
2019/07/17
5860
性能环境之docker操作指南7(全网最全)
Harbor 自建企业仓库
因为系统是 CentOS 7.3 ,内核啥的都已经是 3.10,所以不用担心内核升级的问题,一些操作啥的在 7.x 上操作也很方便。
老七Linux
2018/08/03
1.5K0
Harbor 自建企业仓库
harbor搭建详解(仓库阁楼搭建效果图)
Docker容器应用的开发和运行离不开可靠的镜像管理,虽然Docker官方也提供了公共的镜像仓库,但是从安全和效率等方面考虑,部署私有环境内的Registry也是非常必要的。Harbor是由VMware公司开源的企业级的Docker Registry管理项目,它包括权限管理(RBAC)、LDAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能
全栈程序员站长
2022/08/02
6210
harbor搭建详解(仓库阁楼搭建效果图)
基于GitLab+Docker+K8S的持续集成和交付
此文档主要说明怎样基于GitLab进行持续集成和持续交付,该持续集成与交付集成了gitlab-runner 、mvnw、Docker、harbor、k8s等技术,同时展示了在k8s平台利用EFK(elasticsearch,fluentd,kibana)技术完成了集群统一日志管理,使用kube-prometheus技术进行集群实时监控以及kube-dashboard管理集群中的应用部署,为了不引入网络问题,本环境的相关VPC机器已经关闭了本机防火墙。
互扯程序
2019/05/14
3.1K0
基于GitLab+Docker+K8S的持续集成和交付
企业级Docker Registry开源工具Harbor的介绍以及使用指南
#Harbor 的简介以及基本架构 Harbor简介 基本架构 Harbor安装和配置指导 Harbor 可以使用以下三种方式进行安装部署: 在线安装: 使用者可以直接从docker hub上下载harbor的官方镜像。 离线安装: 使用者需要下载源码包,并进行自己构建images。源码包比较大 Virtual Appliance: 一般使用这种方式在第三方平台搭建一个私有仓库作为平台的组建比如vsphere等,需要下载OVA 版本的Harbor. 官方下载页面 请点击我 . 需要安装Ha
BGBiao
2018/02/26
8610
企业实战(5) Docker私有镜像仓库Harbor的部署与使用详解
 Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。作为一个企业级私有Registry服务器,Harbor提供了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。Harbor支持安装在多个Registry节点的镜像资源复制,镜像全部保存在私有Registry中, 确保数据和知识产权在公司内部网络中管控。另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。
非著名运维
2022/06/22
8660
企业实战(5)  Docker私有镜像仓库Harbor的部署与使用详解
DevOps整合Jenkins+k8s+CICD
基于现在的互联网现状,更推崇敏捷式开发,这样就导致项目的迭代速度更快,但是由于开发团队与运维团队的沟通问题,会导致新版本上线的时间成本很高。这又违背的敏捷式开发的最初的目的。 那么如果让开发团队和运维团队整合到成一个团队,协同应对一套软件呢?这就被称为DevOps。 DevOps,字面意思是Development &Operations的缩写,也就是开发&运维。 然字面意思只涉及到了开发团队和运维团队,其实QA测试团队也是参与其中的。 网上可以查看到DevOps的符号类似于一个无穷大的符号
IT运维技术圈
2022/10/24
2.9K1
基于 Jenkins、Gitlab、Harbor、Helm 和 Kubernetes 的 CI/CD
我们利用 Kubernetes 来动态运行 Jenkins 的 Slave 节点,可以和好的来解决传统的 Jenkins Slave 浪费大量资源的缺点。之前的示例中我们是将项目放置在 Github 仓库上的,将 Docker 镜像推送到了 Docker Hub,这节课我们来结合我们前面学习的知识点来综合运用下,使用 Jenkins、Gitlab、Harbor、Helm、Kubernetes 来实现一个完整的持续集成和持续部署的流水线作业。
jwangkun
2021/12/23
2.5K0
基于 Jenkins、Gitlab、Harbor、Helm 和 Kubernetes 的 CI/CD
基于 Harbor 和 Cephfs 搭建高可用 Docker 镜像仓库集群
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/aixiaoyang168/article/details/78909038
哎_小羊
2019/05/25
1.7K0
用 GitLab 做 CI/CD 是什么感觉,太强了
GitLab CI/CD 是一个内置在 GitLab 中的工具,用于通过持续方法进行软件开发:
子润先生
2021/06/18
2.6K0
推荐阅读
相关推荐
企业实战(6)修改Harbor镜像仓库默认存储路径
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文