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.6K0
举报
文章被收录于专栏:云端漫步云端漫步

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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
安装编译nginx
今天老高更新了一下nginx,顺便把nginx的安装编译过程记录一下,分享给大家!
老高的技术博客
2022/12/27
6000
安装编译nginx
SoC如何开机自动运行脚本程序?
在Linux SoC开发中,实现SoC启动时执行特定脚本的方法主要取决于你使用的启动加载程序(Bootloader)以及Linux内核的配置。
不脱发的程序猿
2024/05/26
1040
nginx 设置管理命令
nginx管理命令: 我不是生产者,我只是大自然的搬运工。 以下脚本来自LNMP一键安装包中军哥的一键安装脚本。感谢军哥的辛勤劳动。 首先我们先用vim或者vi打开/etc/init.d/nginx; vim /etc/init.d/nginx 然后按i进入编辑模式,将以下内容复制到该文件里面: #! /bin/sh # chkconfig: 2345 55 25 # Description: Startup script for nginx webserver on Debian. Place in
魔王卷子
2019/06/02
7560
linux环境node服务器配置流程
 Node 官网已经把 linux 下载版本更改为已编译好的版本了,我们可以直接下载解压后使用:
smy
2018/12/27
2.1K0
CentOS6 安装代码检测工具sonarsource
本文介绍了如何在CentOS 6上安装SonarQube代码检测工具,包括下载、解压、配置、启动等步骤。同时还介绍了如何配置Nginx反向代理,以及启动和停止SonarQube服务的方法。
shaonbean
2018/01/02
8690
CentOS6 安装代码检测工具sonarsource
Debian 8.2 64位 安装MongoDB
http://blog.csdn.net/ctbinzi/article/details/42425989
zhangheng
2020/04/28
4260
服务停止问题:服务停止命令使用不当,导致服务无法正常停止
Systemd 提供了强大的工具来管理和停止服务。以下是一些常见的方法来确保服务能够正确停止。
是山河呀
2025/02/06
1250
服务重启问题:服务重启命令使用不当,导致服务无法正常重启
Systemd 提供了强大的工具来管理和重启服务。以下是一些常见的方法来确保服务能够正确重启。
是山河呀
2025/02/06
1270
服务自启动问题:服务自启动设置错误,导致服务无法自动启动
Systemd 提供了强大的工具来管理和设置服务的自启动。以下是一些常见的方法来确保服务能够正确自启动。
是山河呀
2025/02/06
920
linux设置开机自启动
例如,每次开机时要执行一个hello.sh,这个脚本放在/usr下面,那就可以在"/etc/rc.local"中加一行"/usr/./hello.sh",或者" cd /opt && ./hello.sh "
用户1685462
2021/07/27
17.9K0
Syncthing 的简单使用
地址:https://syncthing.net/downloads/ Github:https://github.com/syncthing/syncthing 或者:https://heanny.lanzoui.com/iV1tAplcnri (arm版本)
一朵灼灼华
2022/08/05
1.3K0
Syncthing 的简单使用
迅雷远程下载的服务脚本
放到/etc/init.d中即可。 /home/pi/xunlei/portal是portal的绝对路径! #!/bin/sh # # Xunlei initscript # ### BEGIN INIT INFO # Provides: xunlei # Required-Start: $network $local_fs $remote_fs # Required-Stop:: $network $local_fs $remote_fs # Should-Start:
老高的技术博客
2022/12/28
6550
讲解missing LSB tags and overrides
在Linux系统中,可能会遇到missing LSB tags and overrides的错误提示。本文将对这个错误进行详细讲解,并提供解决方案。
大盘鸡拌面
2023/12/20
4840
debian 开机启动脚本_ubuntu 自启动脚本
在debian6中,加入开机启动脚本的方法与debian5不同了,直接做符号链接到runlevel已经不起作用了,提示缺少LSB信息,并且用insserv来替代update-rc.d:
全栈程序员站长
2022/11/02
2.5K0
redis使用playbook批量安装
我们想使用playbook来安装redis服务,redis不能使用默认端口,要加入systemd系统服务里,且启动时以端口号来区分并启动
dogfei
2020/07/31
6770
Service命令及init.d启动脚本简析
我们在启用一些服务的时候,经常会用到这个service命令,比如启动apache2的命令$sudo service apache2 start等等。用他来开启或者关闭我们的服务可谓是非常的方便,因为service命令基本都会支持start、stop、restart之类的参数,十分的好记。
mythsman
2022/11/14
1.5K0
003.Keepalived搭建LVS高可用集群
注意:为了保证集群的稳定性,强烈建议在所有节点均部署NTP同步服务,保证所有时钟一致。
木二
2019/07/26
5680
Springboot 打包自带启动脚本
来启动springboot项目的。今天突然发现,springboot自动封装了一个bootJar的任务脚本。
Ryan-Miao
2019/12/10
1.7K0
Linux服务管理 — 78、独立服务的启动脚本分析
既然独立的服务启动是依靠/etc/init.d/服务名这个脚本来进行启动管理的,那么这个脚本中到底是什么样子的?我们以apache服务的启动脚本来学习一下启动脚本到底是怎么实现一个服务启动的。
玖柒的小窝
2021/12/15
5430
推荐阅读
相关推荐
安装编译nginx
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文