使用Drone+gitea配置自己的CICD流程

什么是CI CD

CI CD一般包含三个概念:持续集成(Continuous Integration ,CI),持续交付(Continuous Delivery),持续部署(Continuous Deploy)。他是一种软件开发实践,核心是通过引入自动化的手段来提高软件交付效率。其最终目的是为了让工程师更快,更高质量,更简单的交付软件。

持续集成

在传统软件开发过程中,集成通常发生在每个人都完成了各自的工作之后,所谓集成,可以理解为团队里的大家完成自己负责的模块后,将各个子模块集成为一个可以完成整体功能的完整模块。在项目尾声阶段,通常集成还要痛苦的花费数周或者数月的时间来完成。持续集成是一个将集成提前至开发周期的早期阶段的实践方式,让构建、测试和集成代码更经常反复地发生。

为了实现持续集成,我们每个人都要单元测试(unit test),保证各个子模块的正常工作。

持续交付

持续交付是持续集成的延伸,将集成后的代码部署到类生产环境,确保可以以可持续的方式快速向客户发布新的更改。我们把代码部署到测试环境,预发布环境等等类生产环境成为交付。

持续部署

如果真的想获得持续交付的好处,应该尽早部署到生产环境,以确保可以小批次发布,在发生问题时可以轻松排除故障。于是有了持续部署。

我们通常将这个在不同环境发布和测试的过程叫做部署流水线。

持续部署是在持续交付的基础上,把部署到生产环境的过程自动化。

Gitea

gitea是一款开源,由Golang编写的可自运营的代码管理仓库,相对来说gitlab功能最为全面且内置CI,但是其对内存与cpu的开销更大,而gitea更为轻量化,日常运行占用的内存仅仅只有200mb上下,对于个人开发者来自己的云服务器往往只有2核4G甚至1核1G的配置,那么性能开销就显得弥足珍贵。

Drone

drone是一款开源的持续集成核持续交付平台,他可以帮助开发者自动化构建,测试核部署应用程序,drone的核心特点就是轻量级,他使用docker容器来运行构建核测试任务,这使得它可以快速的启动和销毁环境,从而提高了效率和可靠性,drone的部署十分简单,可以通过docker轻松部署,同时drone提供可视化的web界面和cli工具,方便用户管理和监控构建任务的状态和结果。

开始部署

我使用的系统是ubuntu22.04,采用的docker部署。

这里我们均使用docker-compose来部署,不知道什么是docker-compose的同学可以先去了解一下docker及docker-compose。

Docker Compose是一个用于定义和运行多个Docker容器的工具。它使用YAML文件来配置应用程序的服务,并可以在单个命令中启动、停止和重建所有服务。Docker Compose可以帮助开发人员和运维人员更轻松地管理多个Docker容器,并提供了一种简单的方法来定义和管理应用程序的依赖关系。

Gitea docker-compose

version: "3"

services:
  server:
    image: gitea/gitea:1.19.0
    container_name: gitea
    restart: always
    volumes:
      - ./data:/var/lib/gitea
      - ./config:/etc/gitea
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "3000:3000"
      - "2222:2222"
~

编辑成docker-compose.yml文件输入docker compse up -d命令,docker就会根据编排好的文件自动创建容器及映射数据卷

 

 

 这里我使用的端口是3000,gitea的默认端口也是3000,访问对应地址

 

 

 这里需要我们进行一些默认配置,这里我选择使用sqlite数据,这样避免了还需要部署一个数据库容器,其他的我们使用默认配置即可。

 

 

 

 

 部署成功后的默认界面如图,点击右上角登录,第一个注册的账号就是管理员账号

我们注册完第一个账号即管理员账号后,接下来我们注册一个Drone专用的账号,当然你也可以就把管理员账号给Drone来用。

点击右上角用户头像->设置->应用进入如下界面

 

 

 应用名称为自定义的OAuth2授权名称,可随便取。

重定向URL十分重要,必须为接下来要部署的drone server的网站地址,如果不是域名的话还需带上端口,且以/login结尾

 

点击创建应用后保存生成的客户端ID及客户端密钥,待会创建drone server时要使用

 

Drone docker-compose

 

 Drone分为drone server和drone runner两部分

drone server

version: "3"

services:
  drone:
    image: drone/drone:2
    container_name: drone
    environment:
      - DRONE_GITEA_SERVER=http://110.41.160.73:3000
      - DRONE_GITEA_CLIENT_ID=9c77ba3c-9d13-49ae-a7a5-cfbd6a7993c2
      - DRONE_GITEA_CLIENT_SECRET=gto_zbxh6gznvbsrpskwf25ti4r7iltfe2ysjkl75hjst6dfcyuxl4oa
      - DRONE_RPC_SECRET=as103208900
      - DRONE_SERVER_HOST=110.41.160.73:3001
      - DRONE_SERVER_PROTO=http
      - DRONE_USER_CREATE=username:drone,admin:true
    restart: always
    volumes:
      - ./drone:/data
    ports:
      - 3001:80

DRONE_GITEA_SERVER:你的gitea服务器地址

DRONE_GITEA_CLIENT_ID:你创建的OAtuh2授权的客户端ID,即是上一步中要求保存的客户端ID

DRONE_GITEA_CLINIE_SECRET:你创建的OAtuh2授权的客户端密钥,即是上一步中要求保存的客户端密钥

DRONE_RPC_SECRET:drone server与drone runner通信设定的密码,可自由设置,在接下来的drone runner的docker compose中也有这个参数,必须与此处相同

DRONE_SERVER_HOST:你设置的drone server地址,可以是域名,如果不是的话则必须是带端口的ip地址,且此处设置的端口必须与

DRONE_SERVE_PROTO:设置服务器的协议,如http或https

DRONE_USER_CREATE:指定某个用户为管理员,管理员有权管理其他账户,编辑仓库详细信息,编辑仓库信任标志,访问受限制的API。注意,此处设置的username:drone,其名称就是你给drone准备的gitea的账户名称,最好是把这个账号指定为管理员,否则非管理员无法设置某个仓库为受信任仓库,而非受信任的仓库是无法挂载数据卷的

同样是创建docker-compose.yml后输入docker compose up -d创建容器

 

 

 访问对应地址取得gitea账户授权后如下

 

drone runner

version: "3"

services:
  runner:
    image: drone/drone-runner-docker:1
    container_name: runner
    environment:
      - DRONE_RPC_PROTO=http
      - DRONE_RPC_HOST=110.41.160.73:3001
      - DRONE_RPC_SECRET=as103208900
      - DRONE_RUNNER_CAPACITY=2
      - DRONE_RUNNER_NAME=my-runner
    restart: always
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - 3002:3000

DRONE_RPC_PROTO:部署的服务器协议,如http,https

DRONE_RPC_HOST:部署的服务器地址,如果不是域名的话必须带上端口

DRONE_RPC_SECRET:与drone server通信的密钥

DRONE_RUNNER_CAPACITY:设置同时运行的流水线数量

DRONE_RUNNER_NAME:设置drone runner引用名称

同样是保存成docker-compose.yml后以docker compose up -d命令启动容器

 

 

 自此,drone与gitea都部署成功

编写.drone.yml

我们创建一个项目,并且用vs添加docker支持,自动生成dockerfile

 

创建一个.drone.yml文件且必须放在最外层

 

kind: pipeline
type: docker
name: default

clone:
  skip_verify: true

steps:
  - name: publish
    image: docker:dind
    environment:
      IMAGE: myfirst-cicdtest
      CONTAINERNAME: testcdcidcontainer
    volumes:
      - name: dockersock
        path: /var/run/docker.sock
    commands:
      - docker stop $CONTAINERNAME
      - docker rm $CONTAINERNAME
      - docker rmi $IMAGE
      - docker build -t $IMAGE .
      - docker run -d -p 5056:80 --name $CONTAINERNAME $IMAGE

volumes:
  - name: dockersock
    host:
      path: /var/run/docker.sock

 

 其中steps中为主要构建命令

name:运行步骤的名称

image:依赖的基础镜像

environment:设置的变量,以键值对方式

volumes:挂载的数据卷设置,此处为容器内部地址

commands:运行命令

此处我是以docker部署,所以在每次跑流水线过程前都得先把旧有的容器,镜像删除才能创建新的容器镜像,因此当流水线第一次运行时并不需要这个删除的步骤,但是这种处理方式并不稳妥,实际上较为合理的方式应该是配合k3s或k8s集群,此处的构建只负责打包镜像,由集群来负责部署项目,奈何我暂时不会玩k3s或k8s,等以后有了涉猎之后再来对此处修改。

2023.10.09补充

在树莓派4b部署drone和drone-runner之后,查看日志一切正常,但是runner一直不执行,界面显示一直卡pending

 

后经过多方查找最后由群友提供了正确解决方式

在.drone.yml中指定目标系统

platform:
  os: linux
  arch: arm64

x86架构的系统不需要指定

 最后执行成功

参考自:碰到的一些问题 | CollapseNav个人站

 

posted @ 2023-04-07 16:10  颾浪剑客  阅读(917)  评论(0编辑  收藏  举报