Docker Compose 部署 Gitea + Drone + Drone Runner

docker compose部署gitea+drone+drone-runner

参考:

  1. 中文: https://juejin.cn/post/7153173983335022605
  2. 官方: https://docs.gitea.io/en-us/install-with-docker/#sshing-shim-with-authorized_keys
  3. https://github.com/go-gitea/gitea/issues/22151

注意事项:

  1. linux上新建一个git用户
  2. 生成ssh密钥时要选择 ed25519 算法
  3. 编辑文件时注意权限, 特别是gitea数据和ssh文件的权限, 必须保证是 git 用户可读/写/执行的, 不要改成root/其他用户组的

环境:

默认linux环境, 已安装好docker和docker compose, 具备root权限, docker设置加速源

新建git用户

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 添加用户
sudo useradd -m git

# 设置密码
sudo passwd git 新密码

# 安全相关, 禁止ssh登录
sudo usermod -L git # lock
# usermod -U git # unlock

# 不设置密码/删除密码, 也可以禁止ssh登录
sudo passwd -d git

git用户添加到docker用户组

1
2
3
4
sudo usermod -aG docker git && newgrp docker

# 如果没有docker用户组
sudo groupadd docker

gitea

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
cd 你的目录
mkdir data
# 获取git用户的uid和gid
id git
vim docker-compose.yml
# 把USER_UID, USER_GID改成实际获取的
# 127.0.0.1:2222:22 也是为了ssh直通
===
version: "3" 

networks:
  gitea:
    external: false

services:
  server:
    image: gitea/gitea:latest
    container_name: gitea
    environment:
      - USER_UID=1001 # git用户的uid
      - USER_GID=1001 # git用户的gid
    restart: unless-stopped
    networks:
      - gitea
    volumes:
      - ./data:/data
      - /home/git/.ssh/:/data/git/.ssh
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "3000:3000"
      - "127.0.0.1:2222:22"
===
docker compose up -d

初始化:

  1. 数据库可以选 SQLite
  2. 初始化后如果需要修改
1
2
3
4
5
# 注意文件权限, 数据都是git用户和git用户组的
sudo -u git vim ./data/gitea/conf/app.ini
# 然后重启容器

# 也可以通过环境变量的方法来写入ini
  1. web端的端口是3000, 有需要设置nginx转发
  2. 导入仓库, app.ini需要添加配置
1
2
[migrations]
ALLOW_LOCALNETWORKS = true
  1. webhook需要添加配置
1
2
[webhook]
ALLOWED_HOST_LIST = *

ssh直通下载

sshing-shim-with-authorized_keys

  1. 配置ssh文件

是为了ssh直通下载 因为一般22端口被服务器登录用了, 假设gitea容器使用了2222端口, 那么用户使用 ssh clone时没有指定端口, 需要把22端口转到容器的2222端口, 并且需要把参数也传进去

1
2
3
4
5
# openssh新版移除了rsa加密
sudo -u git ssh-keygen -t ed25519 -C "Gitea Host Key"
# 复制公钥信息, 是用来登录容器里的git用户的,后面会把整个.ssh映射到容器里
sudo -u git cat /home/git/.ssh/id_ed25519.pub | sudo -u git tee -a /home/git/.ssh/authorized_keys
chmod 600 /home/git/.ssh/authorized_keys
  1. 在你的pc上, 生成公钥和私钥
1
ssh-keygen -t ed25519 -C 'test@gmail.com' -f ~/.ssh/gitea_ed25519
  1. 登录 gitea, 打开设置界面, 添加SSH 密钥, 把pc上生成的公钥添加进去, 然后进行验证(==注意, 不是服务器上的公钥和私钥==)
  2. 查看服务器上的/home/git/.ssh/authorized_keys, 它的结构类似这样
1
2
3
4
# SSH pubkey from git user
ssh-ed25519 xxxxxxxxxx Gitea Host Key
# gitea public key
command="/usr/local/bin/gitea --config=/data/gitea/conf/app.ini serv key-10",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,no-user-rc,restrict ssh-ed25519 xxxxxxxxxx xxxxxxxxxx
  1. 添加脚本
1
2
3
4
5
6
7
# 脚本的路径可能每个版本的gitea都不相同,最好看下官方的最新文档
# 对应上一步的command后面的路径
cat <<"EOF" | sudo tee /usr/local/bin/gitea  
#!/bin/sh  
ssh -p 2222 -o StrictHostKeyChecking=no git@127.0.0.1 "SSH_ORIGINAL_COMMAND=\"$SSH_ORIGINAL_COMMAND\" $0 $@"  
EOF  
sudo chmod +x /usr/local/bin/gitea
  1. 个人pc上编辑config文件
1
2
3
4
5
6
7
8
9
vim ~/.ssh/config
===
# gitea
Host 你的gitea host
  HostName 你的gitea hostname
  User git
  PreferredAuthentications publickey
  IdentityFile ~/.ssh/gitea_ed25519
===
  1. 测试 ssh
1
ssh -T git@你的gitea域名

drone+drone-runner

  1. 新建comopse文件, 先别启动
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
mkdir drone
mkdir data
vim docker-compose.yml

===
version: '3'
services:
  drone-server:
    restart: always
    image: drone/drone:2
    ports:
      - "9999:80"
    volumes:
      - ./drone:/var/lib/drone/
      - ./data:/data/
    environment:
      - DRONE_GITEA_SERVER= # Gitea访问地址
      - DRONE_GITEA_CLIENT_ID= # gitea oauth2 客户端id
      - DRONE_GITEA_CLIENT_SECRET= # gitea oauth2 客户端密钥
      - DRONE_SERVER_HOST= # drone 访问的域名
      - DRONE_SERVER_PROTO=https # 支持http, https
      - DRONE_RPC_SECRET= # Drone Server共享的密钥
      - DRONE_GIT_ALWAYS_AUTH=true
      - DRONE_GIT_USERNAME= # git用户名
      - DRONE_GIT_PASSWORD= # git密码
      - DRONE_USER_CREATE=username:ci,admin:true # 该用户名,开启管理员账户
  drone-runner-docker:
    restart: always
    depends_on:
      - drone-server
    image: drone/drone-runner-docker:1
    ports:
      - "10000:3000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - DRONE_RPC_PROTO=http # 支持http, https, 这里是部署在同一台服务器, 没有开放端口, 只能是http
      - DRONE_RPC_HOST=drone-server
      - DRONE_RPC_SECRET= # Drone Server共享的密钥
      - DRONE_RUNNER_NAME=drone-runner-docker
      - DRONE_RUNNER_CAPACITY=2 # 并发执行的流水线数量
===
  1. 在 gitea 新建一个ci账号, 需要ci的仓库, 就把该账号添加到仓库管理员
  2. DRONE_USER_CREATE 不一定是Git仓库的管理员,只要是Git仓库的用户即可
  3. 登录ci账号, 设置->应用,管理 OAuth2 应用程序

应用名称: 例如: drone-oauth2

重定向URL: 例如: https://域名/login , http://{{ip}}:{{port}}/login

客户端id, 客户端密钥填到上面的docker-compose.yml

  1. DRONE_RPC_SECRET : Drone Server共享的密钥, 用 openssl rand -hex 16 生成
  2. 启动 docker compose up -d
  3. 打开drone页面, 完成授权

注意: drone是没有自己的登录页面的, 会使用相同浏览器的Gitea登录信息,如果gitea切换用户, drone并不会自动切换, 需要先退出

  1. 在仓库根目录新建.drone.yml文件, 文件提交后就会自动触发构建
1
2
3
kind: pipeline
type: docker
name: build

gitea 显示流水线状态

在Drone的项目配置页面,我们会看到Badges选项, 把里面的内容复制出来,添加到项目的README.md文件头部

build with Hugo, theme Stack, visits 0