DevOps-Drone

最近在研究DevOps,小计一下!

简介

DevOps(Dev + Ops),即为开发人员与维护人员的一个平台。

事实上,DevOps 包含了三个部分:开发、测试和运维。换句话 DevOps 希望做到的是软件产品交付过程中IT工具链的打通,使得各个团队减少时间损耗,更加高效地协同工作。

这几年云计算技术突飞猛进, 虚拟化、容器、微服务等等, 都为DevOps提供了很好的前提条件.
开发环境和部署环境都可以更好地隔离了,减小了相互之间的影响。

  • 微服务:
    就是将原来黑盒化的一个整体产品进行拆分(解耦),从一个提供多种服务的整体,拆成各自提供不同服务的多个个体.

  • 虚拟化:
    它从硬件上,将一个系统“划分”为多个系统,系统之间相互隔离,为微服务提供便利。

  • 容器:
    在操作系统上划分为不同的“运行环境”(Container),占用资源更少,部署速度更快。

CICD

这种开发模式下带来的新问题是, 如何确保运维上线的即时, 那就是CI和CD。

  • CI(持续集成):
    • 是指多名开发者在开发不同功能代码的过程当中,可以频繁的将代码行合并到一起并切相互不影响工作。
  • CD(持续交付与持续部署):
    • 基于某种工具或平台实现代码自动化的构建、测试和部署到线上环境以实现交付高质量的产品。
    • 持续部署在某种程度上代表了一个开发团队的更新迭代速率。

开发只需要关注代码, 业务逻辑, 测试脚本, 然后提交到代码仓库。
后续测试, 发布, 部署都由自动化脚本完成, 减少运维工作量, 避免人为失误。

DevOps平台

DevOps平台的搭建可通过如下工具进行实现:

  • 项目管理(PM):Jira
  • 代码管理:GitLab
  • 持续集成(CI):GitLab CI
  • 镜像仓库:VMware Harbor 私服nexus
  • 容器:Docker
  • 容器平台: Rancher
  • 镜像扫描:Clairctl
  • 编排:Kubernetes
  • 服务注册与发现:etcd
  • 脚本语言:python
  • 日志管理:EFK
  • 系统监控:prometheus
  • Web服务器:Nginx
  • 数据库:MySQL redis
  • 负载均衡:Nginx。
  • 产品和UI图:蓝湖
  • 公司内部文档:Confluence。
  • 报警:推送到工作群 企业微信 钉钉

技术选型

初期采取: gogs + drone + docker-compose
后期可采用: gitlab + Jenkins

Gogs + Drone

Gogs 介绍

Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自助 Git 服务。
使用 Go 语言开发使得 Gogs 能够通过独立的二进制分发,并且支持 Go 语言支持的 所有平台,
包括 Linux、Mac OS X、Windows 以及 ARM 平台。

Drone 介绍

Drone 是一个基于Docker容器技术的可扩展的持续集成引擎,用于自动化测试、构建、发布。
每个构建都在一个临时的Docker容器中执行,使开发人员能够完全控制其构建环境并保证隔离。
开发者只需在项目中包含 .drone.yml文件,将代码推送到 git 仓库,Drone就能够自动化的进行编译、测试、发布。
它可以与docker完美集成, 相对于Jenkins来说更加轻量, 可以配合 Gogs 来实现持续集成。

安装步骤

version: "3.6"
services:
  # gogs 服务镜像
  gogs:
    image: gogs/gogs:latest
    container_name: gogs
    restart: always
    ports:
      - "10022:22" # ssh 端口
      - "3000:3000" # gogs仓库
    volumes:
      - /data/docker_test/gogs:/data # gogs 挂载卷
    networks:
      - drone-net
  # drone server 端
  drone:
    image: drone/drone:latest
    container_name: drone
    ports:
      - "8080:80" # drone 服务:HTTP
      - "8443:443" # drone 服务:HTTPS
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock # 本地docker
      - /data/docker_test/drone:/var/lib/drone/ # 挂载卷
    restart: always
    environment:
      - TZ=Asia/Shanghai
      - DRONE_AGENTS_ENABLED=true
      - DRONE_GOGS_SERVER=http://gogs:3000 # 不同的代码仓库对应不同的key, v: 服务器仓库地址
      - DRONE_GOGS_SKIP_VERIFY=true
      - DRONE_SERVER_HOST=192.168.99.102:8080 # drone 的server端地址
      - DRONE_SERVER_PROTO=http
      - DRONE_LOGS_TRACE=true
      - DRONE_LOGS_DEBUG=true
      - DRONE_RPC_SECRET=2cbdaab90813f3743dc700816a322c62  # 秘钥与runner一致
      - DRONE_USER_CREATE=username:Cikaros,admin:true
    networks:
      - drone-net
  # drone runner 端, 用于执行pipeline
  drone-runner:
    image: drone/drone-runner-docker:latest
    container_name: drone-runner # docker 与 ssh 有不同的runner
    restart: always
    ports:
      - "10082:3000" # 端口映射
    depends_on:
      - drone # server端先构建启动
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock # 本机docker
    environment:
      - TZ=Asia/Shanghai
      - DRONE_DEBUG=true
      - DRONE_RPC_SECRET=2cbdaab90813f3743dc700816a322c62 # 秘钥与server端一致
      - DRONE_RPC_HOST=drone # server端
      - DRONE_RPC_PROTO=http
      - DRONE_RUNNER_CAPACITY=2
      - DRONE_RUNNER_NAME=drone-runner
    networks:
      - drone-net
  # Mysql数据库用于存放数据
  gogs_mysql:
    image: mysql:5.7
    restart: always
    container_name: gogs_mysql
    ports:
      - "3306:3306"
    volumes:
      # - /data/docker_test/mysql/conf:/etc/mysql
      - /data/docker_test/mysql/logs:/var/log/mysql
      - /data/docker_test/mysql/data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=gogs
      - MYSQL_USER=gogs
      - MYSQL_PASSWORD=123456
      - TZ=Asia/Shanghai
    networks:
      - drone-net
  registry:
    image: registry
    container_name: registry
    ports:
      - '5000:5000'
    restart: unless-stopped
    networks:
      - drone-net
#定义统一网络
networks:
  drone-net:
    driver: bridge

drone runner 端也可直接使用 docker 指令来部署,假设我有一个域名或者公网IP(只要双方可以通信即可)

docker run --detach \
  --volume=/var/run/docker.sock:/var/run/docker.sock \
  --env=DRONE_RPC_PROTO=https \
  --env=DRONE_RPC_HOST=example.com \
  --env=DRONE_RPC_SECRET=2cbdaab90813f3743dc700816a322c62 \
  --env=DRONE_RUNNER_CAPACITY=2 \
  --env=DRONE_RUNNER_NAME=runner1 \
  --publish=3000:3000 \
  --restart=always \
  --name=runner \
  drone/drone-runner-docker

编写drone.yml文件

kind: pipeline
type: docker
name: hello

steps:
  - name: build
    image: plugins/docker
    settings:
      repo: 192.168.99.102:5000/drone/hello
      tags: latest
      registry: 192.168.99.102:5000
      purge: true
      insecure: true # http
      mirror: https://docker.mirrors.ustc.edu.cn
  - name: run
    image: docker:dind
    volumes:
      - name: dockersock
        path: /var/run/docker.sock
    commands:
      - docker pull 192.168.99.102:5000/drone/hello:latest
      - docker run --name hello -p 80:80 192.168.99.102:5000/drone/hello:latest
      - docker rm hello
      - docker rmi 192.168.99.102:5000/drone/hello:latest
volumes:
  - name: dockersock
    host:
      path: /var/run/docker.sock

效果展示


DevOps-Drone
https://blog.cikaros.top/doc/b0c5cd20.html
作者
Cikaros
发布于
2022年2月26日
许可协议