Gitea + Drone CI/CD 持续部署

在日常的前端或后端项目开发中,我们越来越依赖自动化流程来提高开发效率与代码质量。持续集成(CI)与持续部署(CD)已成为现代开发流程中的重要环节。本文将介绍如何使用 Gitea 搭建一个轻量级的 Git 仓库服务,并结合 Drone 实现自动化的 CI/CD 流程。

相比 GitHub、GitLab 等平台,Gitea 更加轻量、开源且易于部署,非常适合中小型团队或私有化部署需求。而 Drone 则作为一款现代化的 CI/CD 工具,与 Gitea 有着良好的集成支持,支持基于容器的构建流水线,配置简单、灵活高效。

接下来,我将通过一套完整的部署与配置流程,一步步实现:

  • 使用 Docker 快速部署 Gitea 和 Drone;
  • 配置 Webhook 实现 Git 提交后自动触发流水线;
  • 编写 .drone.yml 流水线,实现自动构建、测试与部署。

1 . 使用Docker快速部署Gitea和Drone

  1. 需要在腾讯云安装docker环境
  2. 在opt文件夹下创建两个文件夹 gitea和 drone

3. 在gitea文件夹下创建 docker-compose 文件,内容如下:

services:
  gitea:  # 修改了这里的服务名称
    image: gitea/gitea:latest
    container_name: gitea
    environment:
      - USER_UID=1000
      - USER_GID=1000
      - DB_TYPE=mysql
      - DB_HOST=db:3306
      - DB_NAME=gitea
      - DB_USER=gitea
      - DB_PASSWD=shuangxi521
    volumes:
      - ./gitea:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "3000:3000"
      - "2222:22"  # 修改为 2222 端口
    restart: unless-stopped
    depends_on:
      - db

  db:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=xxxxxx
      - MYSQL_DATABASE=gitea
      - MYSQL_USER=gitea
      - MYSQL_PASSWORD=xxxxxx
    volumes:
      - ./mysql:/var/lib/mysql
    restart: unless-stopped

4. 创建完之后打开终端运行命令

docker-compose up -d

5. 打开域名到登录界面,直接点击下一步即可,到了如下界面

6. 打开头像->设置->应用->创建应用程序 ,名字随便写,url是你的drone域名/login,也就是重定向到/login

要把生成的这id和key记录下来 后面会在创建drone的时候用到

7. 在drone文件夹下创建 docker-compose 文件,内容如下:

services:
  # 容器名称
  fan-drone-server:
    # 构建所使用的镜像
    image: drone/drone:latest 
    # 映射容器内80端口到宿主机的7079端口
    ports:
      - 30000:80
    # 映射容器内/data目录到宿主机的/data/drone目录
    volumes:
      - /data/drone:/data
    # 容器随docker自动启动
    restart: always
    environment:
      # Gitea 服务器地址
      - DRONE_GITEA_SERVER=https://git.xxxx.com
      # Gitea OAuth2客户端ID
      - DRONE_GITEA_CLIENT_ID= 上面生成的id
      # Gitea OAuth2客户端密钥
      - DRONE_GITEA_CLIENT_SECRET=上面生成的key
      # drone的共享密钥
      - DRONE_RPC_SECRET=941971c6c5fb35b63d054012e453f02a
      # drone的主机名
      - DRONE_SERVER_HOST=drone.xxxx.com
      # 外部协议方案
      - DRONE_SERVER_PROTO=https
      # 创建管理员账户,这里对应为gitea的用户名
      - DRONE_USER_CREATE=username:xxxx,admin:true

  fan-docker-runner:
    image: drone/drone-runner-docker:1
    ports:
      - 30001:3000
    restart: always
    depends_on:
      - fan-drone-server
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      # 用于连接到Drone服务器的协议。该值必须是http或https。
      - DRONE_RPC_PROTO=https
      # 用于连接到Drone服务器的主机名
      - DRONE_RPC_HOST=drone.xxxx.com
      # Drone服务器进行身份验证的共享密钥,和上面设置一样
      - DRONE_RPC_SECRET=941971c6c5fb35b63d054012e453f02a
      # 限制运行程序可以执行的并发管道数。运行程序默认情况下执行2个并发管道。
      - DRONE_RUNNER_CAPACITY=2
      # docker runner 名称
      - DRONE_RUNNER_NAME=fan-docker-runner-1

8. 同级目录运行命令

docker-compose up -d

9. 浏览器输入域名出现下面这个就代表部署好了

2. 配置 Webhook 实现 Git 提交后自动触发流水线

  1. 回到gitea 点击迁移外部仓库,我这里提供了一个demo zguiy / drone-demo · GitLab
图片[6]|Gitea + Drone CI/CD 部署|子归云

2. 迁移过来后他会触发事件,打开 drone 会发现已经成功了

图片[7]|Gitea + Drone CI/CD 部署|子归云

3. gitea 中的webhook 也成功了

图片[8]|Gitea + Drone CI/CD 部署|子归云

3. 编写 .drone.yml 流水线,实现自动构建、测试与部署

1. 在项目下创建 .drone.yml 文件 可根据实际情况修改

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

steps:
  # 第一步:构建项目
  - name: 构建
    image: node:18-alpine
    commands:
      - npm install
      - npm run build
    volumes:
      - name: node_modules_cache
        path: /drone/src/node_modules

  # 第二步:上传静态资源到腾讯云COS (使用另一个插件)
  - name: 上传到腾讯云
    image: ccr.ccs.tencentyun.com/xiaoqidun/gocos
    settings:
      secret_id:
        from_secret: cos_secret_id
      secret_key:
        from_secret: cos_secret_key
      bucket_url: https://files-1302416092.cos.ap-shanghai.myqcloud.com
      source: dist
      target: /
      strip_prefix: dist

  # 第三步:部署到服务器
  - name: deploy
    image: appleboy/drone-ssh
    settings:
      host:
        from_secret: server_host
      username:
        from_secret: server_username  
      password:
        from_secret: server_password
      # 或者使用SSH密钥
      # key:
      #   from_secret: server_ssh_key
      port: 22
      script:
        - rm -rf /www/wwwroot/show.zguiy.com/*
        - mkdir -p /www/wwwroot/show.zguiy.com/
        - chmod 755 /www/wwwroot/show.zguiy.com/
    when:
      branch: 
        - main
        - master
        - dev

  # 第四步:上传构建文件
  - name: upload
    image: appleboy/drone-scp
    settings:
      host:
        from_secret: server_host
      username:
        from_secret: server_username
      password:
        from_secret: server_password
      # 或者使用SSH密钥
      # key:
      #   from_secret: server_ssh_key
      port: 22
      source: dist/*
      target: /www/wwwroot/show.zguiy.com/
      strip_components: 1
    when:
      branch:
        - main
        - master  
        - dev

# 定义数据卷用于缓存node_modules
volumes:
  - name: node_modules_cache
    host:
      path: /tmp/drone_cache/node_modules

# 触发条件
trigger:
  branch:
    - main
    - master
    - dev
  event:
    - push
    - pull_request

注意事项

  1. 提示:当前 url (https://git.zguiy.com/) 与 gitea 的 url (https://localhost/) 不匹配 。 如果您正在使用反向代理,请确保设置正确的“主机”和“x-转发-原始”标题。
    答:需要在反向代理的发送域名改成你的实际域名
图片[9]|Gitea + Drone CI/CD 部署|子归云
© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发

请登录后发表评论

    请登录后查看评论内容