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/24

gitea-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中的Actionsgithub中的相同,通过工作流配置文件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仓库更新

以下示例定义了一套流程:

  1. 仓库A的流程:
    1. 执行脚本,格式化数据文件。
    2. 切出B仓库,并且更新数据到B的master分支。
    3. 触发B的Actions
  2. 仓库B的流程:
    1. 执行hugo的release操作。
    2. 拷贝数据到远端。 仓库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."