天依再吃俩包子(๑>⌔<๑)8

基地的git仓库发生了一些变动,只有一个gitea仓库留下来了,博客仓库还在,故此番折腾完成从仓库自动更新博客网页

请自行安装dockerdocker-compose,遇上了几个大坑,费我一天时间,气死了气死了气死了

一、部署gitea

1.启用ssh支持

你可以参看官方教程SSH 容器直通或者直接使用下面的指令

  • 创建一个名叫git的账户

    1
    sudo adduser git
  • 查看USER_UIDUSER_GID的值

    1
    id git
  • 创建 SSH 密钥对

    1
    sudo -u git ssh-keygen -t rsa -b 4096 -C "Gitea Host Key"
  • 打开/usr/local/bin/gitea写入以下内容 sudo vim /usr/local/bin/gitea

    1
    ssh -p 2222 -o StrictHostKeyChecking=no git@127.0.0.1 "SSH_ORIGINAL_COMMAND=\"$SSH_ORIGINAL_COMMAND\" $0 $@"
  • 添加权限

    1
    sudo chmod +x /usr/local/bin/gitea
  • sudo -i进入管理员输入下面的指令

    1
    echo "$(cat /home/git/.ssh/id_rsa.pub)" >> /home/git/.ssh/authorized_keys

    ctrl+D退出管理员模式

2.docker 启动

docker-compose.yml文件

  • USER_UID/USER_GID按上面查询的修改

  • 注意./gitea是放置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
version: "3"

networks:
gitea:
external: false

services:
server:
image: gitea/gitea:latest
container_name: gitea
environment:
- USER_UID=1001 # 这是git用户的uid,详见https://docs.gitea.cn/installation/install-with-docker/#ssh-%E5%AE%B9%E5%99%A8%E7%9B%B4%E9%80%9A
- USER_GID=1001 # 这是git用户组的gid
restart: always
networks:
- gitea
volumes:
- ./gitea:/data
- /home/git/.ssh/:/data/git/.ssh
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "8080:3000"
- "127.0.0.1:2222:22"

启动docker

1
docker-compose up -d

需要用ngix反代域名到8080端口

3.修改参数

配置文件在/gitea/conf/app.ini里面加入

1
2
[webhook]
ALLOWED_HOST_LIST = *

[sever]字段中含有域名的填写,如果后续有域名一直对不上的情况,请检查一下

二、启动Drone CI

1.在gitea中获得参数

像如下生成ID和密钥

drone.png

生成会得到ID和密钥

ID就是DRONE_GITEA_CLIENT_ID

密钥是DRONE_GITEA_CLIENT_SECRET,后面会用

Linux下使用openssl rand -hex 16可获得一个32位的token,就是DRONE_RPC_SECRET

2.启动Drone

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
docker run \
--volume=/var/lib/drone:/data \
--env=DRONE_GITEA_SERVER={你的gitea地址,如https://git.gitea.cn} \
--env=DRONE_GITEA_CLIENT_ID={上面生成的ID} \
--env=DRONE_GITEA_CLIENT_SECRET={上面生成的密钥} \
--env=DRONE_RPC_SECRET={上面生成的32位token} \
--env=DRONE_SERVER_HOST={drone的地址,如drone.drone.cn} \
--env=DRONE_SERVER_PROTO={协议,如https} \
--env=DRONE_GIT_ALWAYS_AUTH=true \
--publish=6080:80 \
--publish=6443:443 \
--restart=always \
--detach=true \
--name=drone \
drone/drone:2

所有字段不需要引号,直接写

如果出现了什么错误需要删除重启,建议sudo rm -rf /var/lib/drone 清一下之前产生的东西

需要用ngix反代域名到6080端口,用HTTPS也是6080端口

3.启动drone-runner

1
2
3
4
5
6
7
8
9
10
11
docker run -d \
-v /var/run/docker.sock:/var/run/docker.sock \
-e DRONE_RPC_PROTO={协议,如https} \
-e DRONE_RPC_HOST={drone的地址,如drone.drone.cn} \
-e DRONE_RPC_SECRET={上面生成的32位token} \
-e DRONE_RUNNER_CAPACITY=2 \
-e DRONE_RUNNER_NAME=blog_auto \
-p 6030:3000 \
--restart always \
--name runner \
drone/drone-runner-docker:1

6030端口可以随便改

查看日志,正常运行

1
2
3
4
 ➜  ~ docker logs runner   
time="2024-03-22T11:17:25Z" level=info msg="starting the server" addr=":3000"
time="2024-03-22T11:17:25Z" level=info msg="successfully pinged the remote server"
time="2024-03-22T11:17:25Z" level=info msg="polling the remote server" arch=amd64 capacity=2 endpoint="https://drone.xxxxx.cn" kind=pipeline os=linux type=docker

4.访问Drone

访问{drone的地址,如drone.drone.cn},会自动跳转到gitea进行鉴权,点击红色按钮授权即可

选择你的仓库点击ACTIVATE REPOSITORY即启动了工作流

5.编写脚本文件

在HEXO博客仓库根目录下提交.drone.yml文件,内容如下

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
kind: pipeline
type: docker
name: default

steps:
- name: Hexo Build
image: node:12-alpine
commands:
- npm config set registry https://registry.npmmirror.com
- npm install
- npm run build

- name: SCP File Transfer
image: appleboy/drone-scp
settings:
target: /home/blog/blog/
source: ./public
host:
from_secret: ssh_host
port:
from_secret: ssh_port
username:
from_secret: ssh_username
password:
from_secret: ssh_password
rm: true
when:
branch:
- master
event:
exclude:
- pull_request

trigger:
event:
- push

target修改为服务器上的某一文件夹,ngix反代到博客网址即可

6.返回Drone配置参数

博客仓库->Settings->Secrets->New secret,勾选Allow Pull Repuest

配置ssh_hostssh_portssh_usernamessh_password四个参数

现在,当有推送时会编译博客,当pr成功时会将博客内容复制到目标文件夹,ngix反代完成实时更新

第一次点new build是会没有反应的,第一次启用后需要在仓库中添加.drone.yml后用个push,让自动完成更新一次

点击右上角new build可以测试

三、使用OwnCloud

顺便搭了个校园网局域网云盘,这玩意儿有点小坑,权限问题

这里我需要把一个机械硬盘持久化挂载在在某一目录并让 owncloud 使用

  • sudo vim /etc/fstab追加如下内容让硬盘挂载持久化

    1
    UUID=7E524C65524C23ED /home/v5/disk_hdd ntfs defaults,utf8,uid=33,gid=33,dmask=007,fmask=007  0 2
    • /home/v5/disk_hdd:修改为你想挂载的路径
    • 33:修改为id www-data返回的值
    • 007:意味770,只允许www-data用户访问,不让其他用户访问(设置为770是他的要求,试了个网上的参数改为false也没作用只好按他说的做)
    • lldf -h可以查看权限和挂载结果
  • 启动docker

    1
    docker run -p 7070:80 -d -v /home/v5/disk_hdd/owncloud:/var/www/html --name=owncloud --restart always owncloud
    • /home/v5/disk_hdd/owncloud:修改为owncloud使用的文件夹
    • 7070:需要ngix反代到域名
  • 如果直接操作文件夹owncloud/data/{user_name}/files增加文件,需要进行如下操作在网页中才能看见

    • docker exec -it owncloud /bin/bash进入容器
    • su www-data -s /bin/bash -c 'php occ files:scan --all'更新索引文件夹
    • ctrl+D退出容器

总结

我踩的第一个坑是docker run的时候每个字符串加了引号(或许是这个,不是很确定),然后域名当时改了要用git.,一直写的是gitea.,然后一直鉴权失败

第二个坑是gitea的app.ini,可恶,还是域名改了的问题,要从gitea.换成git.,当时就看到Drone运行的时候,我明明docker启动传的参是的git.,但是他就从gitea.仓库里面拉,一直鉴权失败

然后就是如果之前哪出问题了要重新run Drone一定要sudo rm -rf /var/lib/drone ,不然还是会和之前一样

参考教程:

https://blog.moon.re/2021/02/17/Hexo-on-CI-CD-%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B2%E5%AE%9E%E6%88%98%E6%94%BB%E7%95%A5/

https://zhuanlan.zhihu.com/p/467226209

https://koomu.cn/fstab-mount-with-uid-gid-fmask-dmask/