Skip to content

Drone 搭建CI/CD

February 25, 2025
5 min read
899 words

什么是CI/CD

CI/CD 是持续集成和持续交付/部署的缩写

CI

持续集成(CI):指自动且频繁地将代码更改集成到共享源代码存储库中的做法,这是一种面向开发人员的自动化流程, 有助于更频繁地将代码更改合并回共享分支或“主干”。进行这些更新时,会触发测试步骤的自动执行,以确保合并代码更改的可靠性。

CD

CD指的是持续交付(Continuous Delivery)或持续部署(Continuous Deployment)。持续交付通常是指开发人员对应用的更改会自动进行错误测试并上传到存储库(如 GitHub 或容器注册表),然后由运维团队将其部署到实时生产环境中。 持续部署指的是自动将开发人员的更改从存储库发布到生产环境,它以持续交付为基础,实现了管道后续阶段的自动化。 CI/CD 既可能仅指持续集成和持续交付构成的关联环节,也可以指持续集成、持续交付和持续部署这三项构成的关联环节。

安装Gitea

编辑 docker-compose.yml文件, 运行 gitea

yaml
networks:
  gitea:
    external: false

services:
  server:
    image: gitea/gitea:latest
    container_name: gitea
    environment:
      - USER_UID=1000
      - USER_GID=1000
    restart: always
    networks:
      - gitea
    volumes:
      - ./data:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "3000:3000"
      - "8222:22"

执行 docker compose up -d -- 后台启动, docker compose ps -- 查看是否正常启动 docker compose logs -- 查看运行日志, docker compose down -- 关闭卸载

安装Drone

Drone需要一个drone-server和drone-runner

编辑 docker-compose.yml文件, 运行 drone

yaml
services:
  drone-server:
    restart: always
    image: drone/drone:latest
    container_name: drone-server
    ports:
      - "9999:80"
    volumes:
      - ./:/var/lib/drone/
      - ./data:/data/
    environment:
      - DRONE_GITEA_SERVER=http://172.22.156.47:3000 # Gitea访问地址
      - DRONE_GITEA_CLIENT_ID=bb82726d-2139-4d83-8649-0082d23b297d # 应用ID,gitea中获取
      - DRONE_GITEA_CLIENT_SECRET=gto_b5zbjb5sbqdyq5fxwyy2d7dce5razpaeymyvsfafoe5kktzfkxva # 应用密钥,gitea中获取
      - DRONE_SERVER_HOST=http://172.22.156.47:9999
      - DRONE_SERVER_PROTO=http # 支持http, https
      - DRONE_RPC_SECRET=588ae4fe7e73a7b72431a6a309082a38 # 通信密钥,gitea中获取
      - DRONE_GIT_ALWAYS_AUTH=true
      - DRONE_GIT_USERNAME=how2j  # git用户名
      - DRONE_GIT_PASSWORD=how2j.online # git密码
      - DRONE_USER_CREATE=username:how2j,admin:true # 管理员用户名(how2j 根据gitea设置),开启管理员账户
  drone-runner-docker:
    restart: always
    container_name: drone-runner
    image: drone/drone-runner-docker:latest
    ports:
      - "10000:3000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - DRONE_RPC_PROTO=http # 支持http, https
      - DRONE_RPC_HOST=drone-server
      - DRONE_RPC_SECRET=588ae4fe7e73a7b72431a6a309082a38 # 通信密钥,同上
      - DRONE_RUNNER_NAME=drone-runner-docker
      - DRONE_RUNNER_CAPACITY=2

DRONE_GITEA_CLIENT_ID、DRONE_GITEA_CLIENT_SECRET

打开本地 gitea, 点击 头像 -- 设置 -- 应用,添加 OAuth2应用程序

OAuth2

其中 重定向 URI。每行一个 URI。这里填写Drone Sever的地址,比如这里填写 http://172.22.156.47:9999

DRONE_RPC_SECRET

使用OpenSSL生成

shell
openssl rand -hex 16

界面配置

输入配置DRONE_SERVER_HOST的地址,进入 Drone, 进行配置

page config

添加 .drone.yml 文件

详细配置:文档

yaml
kind: pipeline # 定义一个管道
type: docker # 当前管道的类型
name: test # 当前管道的名称

volumes: # 声明数据卷(此为服务器中的实际目录)
  - name: node_modules # 数据卷名称
    host: # Host Volume
      path: /volumes/drone/volumes/blog/node_modules # 宿主机目录    #绝对路径
  - name: deploy_path
    host: 
      path: /workspace/blog

clone:
  disable: false # 启用代码拉取

steps: # 定义管道的执行步骤
  - name: deploy # 步骤名称
    image: node:16.13.2 # 当前步骤使用的镜像
    depends_on: [clone] # 依赖的步骤
    volumes: # 挂载数据卷(此为容器内的目录)
      - name: node_modules # 数据卷名称
        path: /drone/src/node_modules # 容器内目录 绝对路径
      - name: deploy_path
        path: /drone/src/html
    commands: # 当前步骤执行的命令
      - pwd # 查看当前目录
      - npm config set registry https://registry.npm.taobao.org # 切换淘宝镜像
      - npm install # 安装node_modules包
      - npm run build # 执行编译
      # - rm -fr ./blog
      - ls /drone/src
      - cp -r ./public/* ./html

  - name: dingtalk-push
    image: lddsb/drone-dingtalk-message
    depends_on: [deploy]
    settings:
      token: xxxxxxxxxxxxxxxxxxxxxxxxxxx
      type: markdown
      message_pic: true
      sha_link: true
    when:
      event: [push]
      status: [success, failure]