单机部署CI/CD进阶版:宝塔+gitea+drone

  • 前言
    最近要上线一个新项目,因为只要一台服务器,又懒得去服务器改代码,所以改进了一下之前的部署方案,采用了宝塔面板,版本控制工具使用了gitea,cd使用drone,受限于服务器配置(2c8g),就没有用jenkinsgitlab

  • 准备工作
    1、服务器是linux操作系统
    2、服务安装好宝塔
    3、安装好docker和docker-compose
    4、防火墙、阿里云安全组开启10022端口,gitea拉取代码用

  • 编写docker-compose和.env文件
    确保docker-compose.yml.env文件在同一个目录下

docker-compose.yml内容

version: "3.7"
services:
    mysql:
        container_name: mysql
        image: mysql:5.7
        restart: always
        ports:
            - "8306:3306"
        volumes:
            - ./mysql/data:/var/lib/mysql:rw
            - ./logs/mysql:/var/log/mysql:rw
        environment:
            MYSQL_ROOT_PASSWORD: "password"
            TZ: "$TZ"

    gitea:
        container_name: gitea
        image: gitea/gitea:latest
        restart: always
        ports:
            - "13000:3000"
            - "10022:22"
        environment:
            - TZ=${TZ}
            - USER_UID=1000
            - USER_GID=1000
        volumes:
            - ./gitea:/data

    drone-server:
        container_name: drone-server
        image: drone/drone:latest
        restart: always
        ports:
            - "8888:80"
        volumes:
            - ./drone:/var/lib/drone/
            - /var/run/docker.sock:/var/run/docker.sock
        environment:
            # drone的主机名
            - DRONE_SERVER_HOST=${DRONE_SERVER_HOST}
            # 外部协议方案
            - DRONE_SERVER_PROTO=${DRONE_SERVER_PROTO}
            # drone的共享密钥
            - DRONE_RPC_SECRET=${DRONE_RPC_SECRET}
            # Gitea OAuth2客户端ID
            - DRONE_GITEA_CLIENT_ID=${DRONE_GITEA_CLIENT_ID}
            # Gitea OAuth2客户端密钥
            - DRONE_GITEA_CLIENT_SECRET=${DRONE_GITEA_CLIENT_SECRET}
            # Gitea 服务器地址
            - DRONE_GITEA_SERVER=${DRONE_GITEA_SERVER}
            - DRONE_DATABASE_DATASOURCE=${DRONE_DATABASE_DATASOURCE}
            - DRONE_DATABASE_DRIVER=${DRONE_DATABASE_DRIVER}
            - DRONE_SECRET=${DRONE_SECRET}

    drone-runner-docker:
        image: drone/drone-runner-docker:latest
        container_name: drone-runner
        depends_on:
          - drone-server
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
        restart: always
        environment:
          # 开始日志,默认是关闭的
          - DRONE_DEBUG=true
          # 用于连接到Drone服务器的协议。该值必须是http或https。
          - DRONE_RPC_PROTO=${DRONE_SERVER_PROTO}
          # 用于连接到Drone服务器的主机名
          - DRONE_RPC_HOST=${DRONE_SERVER_HOST}
          # Drone服务器进行身份验证的共享密钥,和上面设置一样
          - DRONE_RPC_SECRET=${DRONE_RPC_SECRET}
          # 限制运行程序可以执行的并发管道数。运行程序默认情况下执行2个并发管道
          - DRONE_RUNNER_CAPACITY=2

.env文件内容:

# 时区
TZ=Asia/Shanghai

# Drone-server
DRONE_SERVER_PROTO=http
DRONE_RPC_SECRET=secret

# Gitea
DRONE_GITEA_SERVER=http://Gitea的域名/
DRONE_DATABASE_DATASOURCE=root:password@tcp(mysql:3306)/drone
DRONE_DATABASE_DRIVER=mysql

# Drone-runner-dockerd
DRONE_SERVER_HOST=drone的域名
DRONE_RPC_PROTO=http
DRONE_RUNNER_CAPACITY=2
DRONE_RUNNER_NAME=docker-runner
DRONE_GITEA_CLIENT_ID=gitea里配置
DRONE_GITEA_CLIENT_SECRET=gitea里配置

DRONE_SECRET=client_secret

把drone和gitea准备的域名配置进.env文件
之后启动docker-compose up -d

  • mysql容器创建数据表

docker exec -it mysql bash登录mysql容器,分别创建giteadrone数据库

  • nginx配置gitea和drone域名的反向代理

修改nginx对应域名的配置文件
gitea:

 location / {
      proxy_pass http://127.0.0.1:13000/;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header REMOTE-HOST $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

drone:

 location / {
      proxy_pass http://127.0.0.1:8888/;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header REMOTE-HOST $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
  • 初始化gitea服务

参照如下,其中管理员账号,不要用admin

单机部署C/CD进阶版:宝塔+gitea+drone
其中:
mysql地址填写mysql,数据表名称gitea,密码在docker-compose.yml文件里配置的,是password
ssh域名不带http协议,改成自己配置的
基础URL配置带http协议
ssh服务端口改成之前设置的10022

然后点击确定去初始化,

  • 配置ci

之后点击右上角个人信息和配置,点击设置-应用-创建授权应用,应用名称随便写,重定向URL填写你设置的drone域名,比如http://drone.xxx.com/login,点击创建,然后记录下客户端ID和客户端密钥,并分别填写到.env文件的DRONE_GITEA_CLIENT_IDDRONE_GITEA_CLIENT_SECRET里。

之后重新运行docker-compose up -d

  • gitea创建仓库,上传内容

在gitea里创建仓库,并上传好内容,记得把电脑的git公钥输入到个人设置里的ssh/GPG秘钥里

  • drone初始化

访问drone设置的域名,点击登陆,会跳转gitea确认授权页面,点击授权,登陆成功,然后点击中间的激活按钮,将自动激活你在gieta里创建的仓库

  • 配置CD

在你项目根目录,创建.drone.yml文件

使用drone的rsync来移动文件

这里我部署在宝塔里的,需要注意以下几点
1、不要开启防跨站
2、.user.ini文件是受保护的,需要先解绑在绑定
3、其中from_secret里设置的是变量,需要在drone后台的secret里配置好
4、同步需要确保hosts里的IP地址,容器里可以访问成功,且宿主机要配置好ssh秘钥,然后把宿主机的公钥加到宿主机里,再把宿主机的秘钥,注意,是宿主机的秘钥,加入到drone的secret里(变量ssh_key), 因为这里用的是ssh key登陆
5、dingding_token是钉钉机器人的token

编写.drone.yml

kind: pipeline
type: docker
name: build

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

steps:
  - name: start
    image: drillster/drone-rsync
    settings:
      user: root
      #port: 22
      key:
        from_secret: ssh_key
      hosts:
          # 宿主机的IP
        - 172.18.0.1
      # 来源项目目录
      source: ./
      # 目标服务器目录
      target: /你的地址
      # 执行命令
      script:
        - cd /你的项目地址
        - sudo chattr -i .user.ini
        - sudo chown -R www:www /你的项目地址
        - sudo find /你的项目地址 -type f -exec chmod 644 {} \;
        - sudo find /你的项目地址 -type d -exec chmod 755 {} \;
        - sudo chgrp -R www storage bootstrap/cache
        - sudo chmod -R ug+rwx storage bootstrap/cache
        - sudo chown root:root .user.ini
        - sudo chattr +i .user.ini

  - name: dingding-notification
    pull: if-not-exists # always never
    image: guoxudongdocker/drone-dingtalk
    settings:
      token:
        from_secret: dingding_token
      type: markdown
      message_color: true
      message_pic: true
      sha_link: true
    when:
      status: [failure, success]
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 14

不错,我也弄了一套类似的

1年前 评论
晴空 (楼主) 1年前

想问问,都安装宝塔,为什么不直接装环境,还要弄docker?

1年前 评论
晴空 (楼主) 1年前

直接shell git pull命令不行吗?

1年前 评论
晴空 (楼主) 1年前
月光

你好,想问一下宝塔在这里的作用是什么呢?

1年前 评论
晴空 (楼主) 1年前

这个没得Jenkins好用

1年前 评论
晴空 (楼主) 1年前

是 Gogs 改用 gitea 吗?

1年前 评论
晴空 (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!