当前位置:首页 > 技术分析 > 正文内容

利用 GitLab CI 同步组织内的各项目的代码

ruisui884个月前 (02-16)技术分析15

利用 GitLab CI 定时计划,每天将本组织名下的所有仓库,从指定的源站更新最新代码。

  1. 将创建一个组织
  2. 在组织名下,创建一个仓库
  3. 设置仓库 CI 的环境变量 USER_TOKEN:设置 -> CI/CD -> 变量 -> 添加变量
  1. 设置定时计划:构建 -> 流水线计划 -> 新建计划 -> 创建流水线计划
  1. 设置定时计划:构建 -> 流水线计划 -> 新建计划 -> 创建流水线计划

该仓库下文件列表为:

.gitlab-ci.yml
.sync.sh


  • .gitlab-ci.yml
default:
  image: alpine:latest

stages:
  - sync

variables        :
  GIT_DEPTH: 0
  GIT_STRATEGY: clone
  GIT_SUBMODULE_STRATEGY: recursive
  TZ: Asia/Shanghai

sync-code:
  stage: sync
  before_script: |
    apk update
    apk add curl git jq bash
  script: |
    bash ./.sync.sh
  • .sync.sh
#!/usr/bin/env bash
#
# Name: .sync.sh
# Description: 从源站拉取代码,并更新本组织的项目
# Author: Jetsung Chan 
#
#

set -euo pipefail

main() {
  if [ -f "./.env" ]; then
    # shellcheck source=/dev/null
    source "./.env"
  fi

  # Git User Name
  if [ -z "${USER_NAME:-}" ]; then
    USER_NAME="${GITLAB_USER_LOGIN:-}"  
  fi

  # Git User Token
  USER_TOKEN="${USER_TOKEN:-}"

  # Git Server Host
  if [ -z "${SERVER_HOST:-}" ]; then
    SERVER_HOST="${CI_SERVER_HOST:-}"  
  fi

  # Organization Name
  if [ -z "${ORG_NAME:-}" ]; then
    ORG_NAME="${CI_PROJECT_NAMESPACE:-}"
  fi

  if [ -z "$USER_NAME" ] || [ -z "$USER_TOKEN" ] || [ -z "$SERVER_HOST" ] || [ -z "$ORG_NAME" ]; then
    echo "[ERROR] USER_NAME, USER_TOKEN, SERVER_HOST, ORG_NAME must be set"
    exit 0
  fi
  
  git config --global url."https://$USER_NAME:$USER_TOKEN@$SERVER_HOST".insteadOf "https://$SERVER_HOST"
  
  DATA=$(curl -L -H "PRIVATE-TOKEN:$USER_TOKEN" "https://$SERVER_HOST/api/v4/groups/$ORG_NAME/projects?per_page=100")

  # 使用 jq 解析 JSON 并遍历
  echo "$DATA" | jq -c '.[]' | while read -r row; do
    _path=$(echo "$row" | jq -r '.path')
    _description=$(echo "$row" | jq -r '.description')
    _http_url_to_repo=$(echo "$row" | jq -r '.http_url_to_repo')  

    echo
    _desc=$(echo "$_description" | head -n 1 | awk -F ' ' '{print $1}')
    if echo "$_desc" | grep  -v -q '^::'; then
      echo "skip: $_path"
      continue
    fi

    # ::org/repo
    # ::github@org/repo
    # ::gitcode.com@org/repo
    IFS='@' read -r SOURCE_HUB SOURCE_REPO <<< "${_desc//::/}"

    # default github
    if [ -z "$SOURCE_REPO" ]; then
      SOURCE_REPO="$SOURCE_HUB"
      SOURCE_HUB="github"
    fi    

    case "$SOURCE_HUB" in
    github | gitlab | gitee | gitcode )
      SOURCE_CODE_URL="https://$SOURCE_HUB.com/$SOURCE_REPO.git"
      ;;
    *)
      SOURCE_CODE_URL="https://$SOURCE_HUB/$SOURCE_REPO.git"
      ;;
    esac

    # 镜像目标仓库
    # TARGET_CODE_URL="https://$SERVER_HOST/$TARGET_REPO.git"
    TARGET_CODE_URL="$_http_url_to_repo"

    echo "SOURCE_CODE_URL: $SOURCE_CODE_URL"
    echo "TARGET_CODE_URL: $TARGET_CODE_URL"

    target_dir=$(mktemp -u -t clone-XXXXXX)
    git clone "$SOURCE_CODE_URL" "$target_dir"

    pushd "$target_dir" || {
      printf "\n\033[31mnot found source code: %s\033[0m\n" "$SOURCE_CODE_URL"
      exit
    }

      git remote add target "$TARGET_CODE_URL"
      git fetch
      git push target --all --force
      git push target --tags --force

      echo ""
    popd
  done
}

main "$@" || exit 1

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/1991.html

标签: gitsubmodule
分享给朋友:

“利用 GitLab CI 同步组织内的各项目的代码” 的相关文章

HTML5最新版本介绍

HTML5是HTML4.01和XHTML1.0之后超文本标记语言的最新版本,由一群自由思想者设计,最终实现了多媒体支持、交互性、更智能的表单和更好的语义标注。 HTML 5不只是 HTML规范的最新版本,它是用于生成现代 Web内容的一系列相关技术的总称,其中最重要的三个技术是:HTML5核心规范...

2024最新版:前端性能优化方案汇总

前端训练营:1v1私教,终身辅导计划,帮你拿到满意的 offer。 已帮助数百位同学拿到了中大厂 offer。欢迎来撩~~~~~~~~Hello,大家好,我是 Sunday。前端性能优化一直是很多同学非常关注的问题,在日常的面试中也是经常会被问到的点。所以今天咱们就花一点时间来了解一下2024最新的...

虚幻引擎5.5发布

IT之家 11 月 13 日消息,虚幻引擎 5.5 现已发布。据介绍,新版本虚幻引擎在动画创作、虚拟制作和移动游戏开发方面取得进步;渲染、摄像机内视觉特效和开发人员迭代等领域的部分功能已可用于生产。IT之家整理部分功能亮点如下:动画Sequencer增强虚幻引擎的非线性动画编辑器 Sequencer...

js中数组filter方法的使用和实现

定义filter() 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。语法var newArray = arr.filter(callback(element[, index[, selfArr]])[, thisArg])参数callback循环数组每个元素时调用的回调函数。回调函...

快来看看重构了 365 天的 vue3.5 这次到底更新了啥

新人求关注?,点击右上角 ↗? 关注,博主日更,全年无休,您的关注是我的最大的更新的动力~ 感谢大家了 就在 9 月 1 号,迭代了一年多的 Vue 3.5 终于发布了,这次发布的代号是 "天元突破 红莲螺岩"。这是一个机器人动画片的名字,相信喜欢看动漫的小伙伴应该很熟悉从更新的 C...

微信将研发“应用号”体系 或成为App大杂烩应用

Akiha发表于 2016-01-11 18:11微信正在探讨一种新的公众号形态,即在现有的订阅号、服务号之外,再研发新的“应用号”体系。让用户不必去装各种 App,在微信里就能实现各种服务、功能;关注后,“应用号”平时不向用户发送消息,需要时,用户再去点开“应用号”等。目前,微信钱包内已有的服务,...