单机部署CI/CD进阶版:宝塔+gitea+drone
前言
最近要上线一个新项目,因为只要一台服务器,又懒得去服务器改代码,所以改进了一下之前的部署方案,采用了宝塔面板,版本控制工具使用了gitea
,cd使用drone
,受限于服务器配置(2c8g),就没有用jenkins
和gitlab
准备工作
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容器,分别创建gitea
和drone
数据库
- 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
其中:
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_ID
和DRONE_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 协议》,转载必须注明作者和本文链接
不错,我也弄了一套类似的
想问问,都安装宝塔,为什么不直接装环境,还要弄docker?
直接shell git pull命令不行吗?
你好,想问一下宝塔在这里的作用是什么呢?
这个没得Jenkins好用
是 Gogs 改用 gitea 吗?