1. Gitea配置

  • 配置webhook远程访问权限(非远程可忽略),在 /data/gitea/conf/app.ini 文件中添加:

    [webhook]
    ALLOWED_HOST_LIST = *
  • 设置 -> 应用 -> 管理 OAuth2 应用程序,记下客户端ID客户端密钥

2. Drone配置

  • docker-compose.yaml

    version: "3"
     
    services:
    
      drone:
        image: drone/drone:latest
        restart: always
        container_name: drone
        ports:
          - 8080:80
        environment:
          # gitea地址
          - DRONE_GITEA_SERVER=${DRONE_GITEA_SERVER}
          # gitea客户端ID
          - DRONE_GITEA_CLIENT_ID=${DRONE_GITEA_CLIENT_ID}
          # gitea客户端密钥
          - DRONE_GITEA_CLIENT_SECRET=${DRONE_GITEA_CLIENT_SECRET}
          # drone密钥(自定义字符串),与 runner 中的相同
          - DRONE_RPC_SECRET=${DRONE_RPC_SECRET}
          # drone服务器地址
          - DRONE_SERVER_HOST=${DRONE_SERVER_HOST}
          # drone服务器协议,http 或 https
          - DRONE_SERVER_PROTO=http
          # drone部署 git 是否总是进行认证(若项目为私有时需要)
          - DRONE_GIT_ALWAYS_AUTH=true
          # drone部署 git 账户的用户名
          - DRONE_GIT_USERNAME=${DRONE_GIT_USERNAME}
          # drone部署 git 账户的密码
          - DRONE_GIT_PASSWORD=${DRONE_GIT_PASSWORD}
          # drone创建管理员用户
          - DRONE_USER_CREATE=username:giteauser,admin:true
          # 时区
          - TZ=Asia/Shanghai
        volumes:
          - ./drone/data:/data
          
      drone-runner:
        image: drone/drone-runner-docker:latest
        container_name: drone-runner
        restart: always
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
        environment:
          # drone服务器协议,http 或 https
          - DRONE_RPC_PROTO=http
          # 连接 drone 服务器的主机名(和可选端口)
          - DRONE_RPC_HOST=${DRONE_RPC_HOST}
          # 设置密钥,同上
          - DRONE_RPC_SECRET=${DRONE_RPC_SECRET}
          # 限制运行程序可同时执行的管道数量
          - DRONE_RUNNER_CAPACITY=2
          # drone-runner名称
          - DRONE_RUNNER_NAME=runner
          # 时区
          - TZ=Asia/Shanghai
        ports:
          - 8081:3000
        depends_on:
          - drone
  • 使用管理员账户登录(非管理员账户缺少配置项),选择项目 -> settings

  • 以springboot项目为例,在项目根目录添加 .drone.yml

    kind: pipeline
    type: docker
    name: app
    
    steps:
    
      # 1. maven打包
      - name: maven compile
        pull: if-not-exists
        # 构建镜像的 maven + jdk 选择,最好选择满足匹配你的项目版本的
        image: maven:3-openjdk-8
        volumes:
          # maven构建缓存
          - name: maven-cache
            path: /root/.m2
          # 挂载宿主机的目录
          - name: maven-build
            path: /app/build
        commands:
          # 开始打包 maven 工程
          - mvn clean package -Dmaven.test.skip=true
          # 将打包后的相关文件复制到宿主机映射目录
          - cp target/*.jar /app/build
          - cp docker/* /app/build
    
      # 2. 构建镜像并创建容器
      - name: build image
        pull: if-not-exists
        image: plugins/docker
        volumes:
          - name: socker
            path: /var/run/docker.sock
          - name: maven-build
            path: /app/build
        commands:
          - cd /app/build
          - docker build -t ${DRONE_REPO_NAME}:${DRONE_BUILD_NUMBER} .
          - (docker ps | grep ${DRONE_REPO_NAME} || echo __not_exist__) | grep __not_exist__ || docker stop ${DRONE_REPO_NAME}
          - (docker ps -a | grep ${DRONE_REPO_NAME} || echo __not_exist__) | grep __not_exist__ || docker rm ${DRONE_REPO_NAME}
          - docker run -d
            --name ${DRONE_REPO_NAME}
            -p 8080:8080
            -e "TZ=Asia/Shanghai"
            ${DRONE_REPO_NAME}:${DRONE_BUILD_NUMBER}
    
    # 定义流水线挂载目录,用于共享数据
    volumes:
      - name: maven-build
        host:
          # 从宿主机中挂载的目录
          path: /opt/drone/app/build
      - name: maven-cache
        host:
          path: /root/docker/maven/cache
      - name: socker
        host:
          path: /var/run/docker.sock
    
    # drone执行触发器
    trigger:
      branch:
        - main