Gitea
安装
一个轻量级的Git仓库开源实现:Gitea Official Website
gitea
使用docker-compose进行部署:
services:
server:
image: gitea/gitea:1.24
container_name: gitea
env_file:
- ./env
networks:
gitea-subnet:
ipv4_address: 172.111.30.10 # Fixed ip for nginx reverse proxy without ports mapping.
restart: always
volumes:
- ./data:/data
# port is 30000, 172.111.30.10:30000
networks:
gitea-subnet:
name: gitea-subnet
driver: bridge
ipam:
config:
- subnet: 172.111.30.0/24gitea-runner
- gitea runner会自动去拉镜像,然后用容器执行actions
services:
common-runner:
container_name: gitea-common-runner
image: gitea/act_runner:0.2.13
restart: unless-stopped
networks:
- gitea-runner-network
environment:
CONFIG_FILE: /config.yaml
GITEA_INSTANCE_URL: "<your_gitea_host>"
GITEA_RUNNER_REGISTRATION_TOKEN: "xxxxxxxx"
GITEA_RUNNER_NAME: "common_runner"
volumes:
- ./config.yaml:/config.yaml
- ./data:/data
- /var/run/docker.sock:/var/run/docker.sock
- ~/.docker:/root/.docker:ro
networks:
gitea-runner-network:
external: true配置文件按需修改,主要是修改镜像相关的:
runner:
labels:
- "linux:docker://your-gitea-runner/common:latest"
- "hugo:docker://your-gitea-runner/hugo:latest"Actions
gitea中的Actions和github中的相同,通过工作流配置文件workflows/ci.yaml执行一系列定义好的自动化流程。
定时任务
name: 定时任务示例
on:
# 这里定义定时规则
schedule:
# 每天 UTC 时间 02:30 (即北京时间 10:30) 运行,只能是UTC时间
- cron: '30 2 * * *'
# 建议同时保留手动触发,方便测试
workflow_dispatch:
jobs:
cron-job:
runs-on: ubuntu-latest
steps:
- name: 打印时间
run: echo "当前运行时间:$(date)"
- name: 执行脚本
run: |
echo "这里执行你的定时任务逻辑..."A仓库触发B仓库更新
以下示例定义了一套流程:
- 仓库A的流程:
- 执行脚本,格式化数据文件。
- 切出B仓库,并且更新数据到B的master分支。
- 触发B的Actions
- 仓库B的流程:
- 执行hugo的release操作。
- 拷贝数据到远端。 仓库A的ci流程配置:
name: notebook release runner
# 触发条件:当有代码推送到 main 分支时
# on:
# push:
# branches:
# - master
on:
workflow_dispatch: # 手动触发任务发布
# 定义要执行的任务
jobs:
release:
# 指定这个任务需要在带有 "ubuntu-latest" 标签的 Runner 上运行
runs-on: hugo
# 定义任务中的步骤
steps:
- name: Check out repository code
uses: actions/checkout@v3
- name: Run release.py
run: python3 release.py
- name: Check blog repository
uses: actions/checkout@v3
with:
# 替换成你博客仓库的 "用户名/仓库名"
repository: 'kaihang/blog'
# 使用我们存储在 Secrets 中的 Token 进行认证
token: ${{ secrets.DEPLOY_TOKEN }}
# 将博客仓库的代码放到 'blog_repo' 目录,防止与当前仓库冲突
path: 'blog_repo'
# 确保检出的是博客仓库的主分支
ref: 'master' # 或者 'main'
- name: Sync generated content to blog's content folder
run: |
echo "Copying generated files..."
# 为了确保是干净的同步,你可以选择先删除旧内容
# rm -rf ./blog_repo/content/*
# 使用 rsync 命令,它比 cp 更强大和安全
# 注意 `./release/` 后面的斜杠,表示复制目录内容而不是目录本身
rsync -av --delete ./release/ ./blog_repo/content/
echo "Sync complete."
- name: Commit and push changes to blog repository
env:
# --- !!! 需要修改 !!! ---
# 替换成你的 Gitea 用户名
GITEA_USER: 'kaihang'
GITEA_TOKEN: ${{ secrets.DEPLOY_TOKEN }}
SOURCE_COMMIT_SHA: ${{ gitea.sha }}
run: |
# 进入博客仓库的目录
cd blog_repo
# 配置 git 提交者信息
git config user.name "Gitea Actions Bot"
git config user.email "bot@git.kaihang.net:10000" # <-- 建议修改成你的 Gitea 域名
# 检查是否有文件变动,如果没有则无需提交
if [ -z "$(git status --porcelain)" ]; then
echo "No changes to commit."
exit 0
fi
# 添加所有更改到暂存区
git add .
SHORT_SHA=$(echo $SOURCE_COMMIT_SHA | cut -c1-8)
# 创建提交,不能带[skip ci],不然就不会触发后续ci了。
git commit -m "chore: Update content from source repo @ ${SHORT_SHA}"
# 构造带有认证信息的 URL 并推送
# 从 gitea.server_url (https://gitea.example.com) 中提取域名
GITEA_DOMAIN=$(echo "${{ gitea.server_url }}" | sed 's|https://||;s|http://||')
# 再次确认目标仓库的 "用户名/仓库名"
TARGET_REPO="kaihang/blog"
echo "Pushing changes to ${TARGET_REPO}..."
git push "https://${GITEA_USER}:${GITEA_TOKEN}@${GITEA_DOMAIN}/${TARGET_REPO}.git" master仓库B的ci配置:
name: notebook release runner
on:
push:
branches:
- master
workflow_dispatch:
# 定义要执行的任务
jobs:
release:
# 指定这个任务需要在带有 "ubuntu-latest" 标签的 Runner 上运行
runs-on: hugo
# 定义任务中的步骤
steps:
- name: Check out repository code
uses: actions/checkout@v3
- name: Run hugo release
run: ./scripts/release.sh
- name: Sync result to xxx.xxx.xxx.xxx
run: |
echo "Copying publish files..."
# 使用 rsync 命令,它比 cp 更强大和安全
rsync -av --delete ./public/ root@xxx.xxx.xxx.xxx:/var/www/html
echo "Sync complete."