惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Scott Helme
Scott Helme
N
Netflix TechBlog - Medium
AI
AI
Security Latest
Security Latest
GbyAI
GbyAI
P
Proofpoint News Feed
Y
Y Combinator Blog
A
Arctic Wolf
G
Google Developers Blog
U
Unit 42
爱范儿
爱范儿
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
V
Vulnerabilities – Threatpost
Know Your Adversary
Know Your Adversary
Cisco Talos Blog
Cisco Talos Blog
T
Tor Project blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Threatpost
L
Lohrmann on Cybersecurity
C
CERT Recently Published Vulnerability Notes
C
Check Point Blog
B
Blog RSS Feed
The GitHub Blog
The GitHub Blog
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 【当耐特】
博客园 - Franky
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
C
Cisco Blogs
云风的 BLOG
云风的 BLOG
NISL@THU
NISL@THU
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Microsoft Security Blog
Microsoft Security Blog
T
The Blog of Author Tim Ferriss
阮一峰的网络日志
阮一峰的网络日志
Latest news
Latest news
L
LINUX DO - 最新话题
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
美团技术团队
WordPress大学
WordPress大学
L
LangChain Blog
Stack Overflow Blog
Stack Overflow Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
酷 壳 – CoolShell
酷 壳 – CoolShell
大猫的无限游戏
大猫的无限游戏
The Hacker News
The Hacker News
Simon Willison's Weblog
Simon Willison's Weblog
V
V2EX
Project Zero
Project Zero
博客园_首页

繁星点点

最新轻量级龙虾部署教程 通过netboot.xyz重装系统 giffgaff卡保号教程 Llinux系统中全新透明代理方案(可代理所有出站流量) tailscale开启子网路由常见的坑 OpenWrt固件编译 解决UFW和Docker的问题 使用PGP的非对称算法加密文件 NSSM工具把任意exe程序注册为Windows后台服务 轻量级简约端口转发rinetd 安卓IDE的安装和使用 IP信息查询网站汇总 热点共享代理教程 SSH使用密钥认证登录详细解释 Debian系统公网IP出口切换指南,适用多IP服务器 Windows系统安装Scoop包管理器 安卓Flutter开发学习笔记 使用手机搭建节点服务端 关于github提交记录泄露真实邮箱的处理办法 anytls协议部署教程 caddy给域名用上ECH加密 通过CF-Workers代理访问网站 低配机器使用alpine系统跑docker 端口敲门教程 3x-ui面板通过api管理示例 nmap端口扫描 数据库常用命令 snap和winget包管理器 Git推送GitHub常用命令 😩😩😩学不完,根本学不完😩😩😩 使用CDN后获取访客真实IP 一些用于网络测试的下载测速文件 纯v6网络访问v4站点最简单的方法 服务器配置SSH密钥登录 windows重装系统教程 Docker部署哪吒监控 Github-Actions默认用户变量GITHUB_TOKEN的提权语法 给站点套CFT的一些坑 解决CF反代Docker失效的问题 使用py3快速启动一个文件上传和下载的接口 ios系统最新免拔卡使用tiktok方法 clash手搓配置最全协议示例详解 为IP地址申请免费证书并开启HTTPS 实用网站收藏 纯CSS实现剧透效果 在CloudflareWAF中屏蔽国内浏览器 网络安全之百度URL欺骗漏洞分析和复现 超级强大的ansible批量管理主机运维工具使用教程 收集整理的最新的常用VPS脚本工具 无法注册TG账号和国内号码接收不到验证码详细解决方案 国内环境安装xui面板 免费接码网站合集 完整的网络状态码列表 关于xui面板报错无法监听127.0.0.1:62789的问题 Xboard面板常见问题 项目编译构建文档 ios最新美区ID注册方法 V2board前后端分离 Markdown语法教程 Github加速 Docker镜像加速和离线安装 Liunx配置wrap 代理工具和SSH工具推荐 常用代码记录
通过gitlab流水线自动备份仓库
2025-04-22 · via 繁星点点

通过gitlab流水线自动备份仓库

会自动对比提交,如果没有新的提交,则不会备份,避免空提交导致意外错误

gitlab仓库根目录新建.gitlab-ci.yml文件,复制粘贴以下配置,使用方法见文件注释

# gitlab流水线 自动备份仓库配置
# 将配置保存为 .gitlab-ci.yml 文件,放在 GitLab 仓库根目录下。
# 进入项目 → 设置 → 仓库 → 受保护分支 → 选择Developers + Maintainers两个角色
# 进入项目 → 设置 → 访问令牌 → 角色选择 Developer → 权限勾选 write_repository
# 进入项目 → 构建 → 流水线计划 → 添加定时任务

# 必填变量:
# GITHUB_REPO_URL: 需要备份的目标仓库地址(如:https://github.com/username/repo.git)
# GITLAB_USER_NAME: Git提交的用户名
# GITLAB_USER_EMAIL: Git提交的邮箱
# PROJECT_TOKEN:gitlab访问令牌(进入项目 → 设置 → CI/CD → 变量)
# 可选变量:
# GITHUB_TOKEN: GitHub 个人访问令牌(用于私有仓库或提高 API 限制)

variables:
  GITHUB_REPO_URL: "https://github.com/username/repo.git"
  GITLAB_USER_NAME: "user123456"
  GITLAB_USER_EMAIL: "[email protected]"

  BACKUP_BRANCH: "main" # 上游仓库分支
  GIT_STRATEGY: none
  GIT_DEPTH: 0

stages:
  - backup

backup_github_repo:
  stage: backup
  image: alpine:latest
  
  rules:
    - if: '$CI_PIPELINE_SOURCE == "schedule" && ($CI_COMMIT_REF_NAME == "main" || $CI_COMMIT_REF_NAME == "master")'
      when: always
    - if: '$CI_PIPELINE_SOURCE == "web" && ($CI_COMMIT_REF_NAME == "main" || $CI_COMMIT_REF_NAME == "master")'
      when: manual
  
  timeout: 1h
  
  before_script:
    - echo "开始备份上游仓库..."
    - apk add --no-cache git curl jq bash
    - git config --global user.name "$GITLAB_USER_NAME"
    - git config --global user.email "$GITLAB_USER_EMAIL"
    - git config --global init.defaultBranch main
    
  script:
    - WORK_DIR="/tmp/github_backup_$(date +%s)"
    - mkdir -p "$WORK_DIR"
    - cd "$WORK_DIR"
    - echo "工作目录:$WORK_DIR"
    
    - echo "正在克隆上游仓库..."
    - |
      if [ -n "$GITHUB_TOKEN" ]; then
        GITHUB_CLONE_URL=$(echo "$GITHUB_REPO_URL" | sed "s|https://|https://$GITHUB_TOKEN@|")
      else
        GITHUB_CLONE_URL="$GITHUB_REPO_URL"
      fi
    
    - git clone --branch "$BACKUP_BRANCH" --single-branch "$GITHUB_CLONE_URL" github_source
    - cd github_source
    
    - |
      if [ ! -d ".git" ]; then
        echo "错误:上游仓库克隆失败!"
        exit 1
      fi
    
    - FILE_COUNT=$(find . -type f ! -path './.git/*' | wc -l)
    - |
      if [ "$FILE_COUNT" -eq 0 ]; then
        echo "警告:检测到空仓库,跳过备份"
        exit 0
      fi
    
    - echo "检测到 $FILE_COUNT 个文件,继续备份过程"
    
    - LATEST_COMMIT=$(git rev-parse HEAD)
    - COMMIT_MESSAGE=$(git log -1 --pretty=format:"%s")
    - COMMIT_DATE=$(git log -1 --pretty=format:"%cd" --date=iso)
    
    - echo "最新提交:$LATEST_COMMIT"
    - echo "提交信息:$COMMIT_MESSAGE"
    - echo "提交时间:$COMMIT_DATE"
    
    - cd "$WORK_DIR"
    - rm -rf github_source/.git
    
    - |
      git clone "https://project_${PROJECT_TOKEN}@$CI_SERVER_HOST/$CI_PROJECT_PATH.git" gitlab_backup
      cd gitlab_backup
      cp .gitlab-ci.yml ../gitlab-ci.yml.backup 2>/dev/null || true
      cp README* ../readme.backup 2>/dev/null || true
      find . -type f ! -name '.gitlab-ci.yml' ! -name 'README*' ! -path './.git/*' ! -name '.gitignore' -delete
      find . -type d -empty ! -path './.git*' -delete 2>/dev/null || true
      cp -r ../github_source/* ./ 2>/dev/null || true
      cp -r ../github_source/.[!.]* ./ 2>/dev/null || true
      cp ../gitlab-ci.yml.backup .gitlab-ci.yml 2>/dev/null || true
      if [ -f "../readme.backup" ] && [ ! -f "README.md" ] && [ ! -f "README.rst" ] && [ ! -f "README.txt" ]; then
        cp ../readme.backup README.md 2>/dev/null || true
      fi
    
    - git add .
    - |
      if git diff --staged --quiet; then
        echo "没有检测到变更,上游仓库没有新的更新,跳过提交"
        echo "最后检查的上游仓库提交:$LATEST_COMMIT"
        exit 0
      fi
    
    - echo "检测到文件变更,开始同步到 GitLab"
    
    - |
      BACKUP_MESSAGE="同步时间 $(date '+%Y-%m-%d %H:%M:%S')"
      BACKUP_MESSAGE="$BACKUP_MESSAGE

      同步信息:
      - 上游提交哈希:$LATEST_COMMIT
      - 提交信息:$COMMIT_MESSAGE  
      - 提交时间:$COMMIT_DATE
      - 同步时间:$(date -Iseconds)
      - 文件总数:$FILE_COUNT"
      git commit -m "$BACKUP_MESSAGE"
      git push "https://gitlab-ci-token:${PROJECT_TOKEN}@$CI_SERVER_HOST/$CI_PROJECT_PATH.git" main
    
    - echo "同步完成!GitLab 仓库已更新"
    
  after_script:
    - echo "清理临时文件..."
    - rm -rf /tmp/github_backup_* 2>/dev/null || true