You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Groovy脚本实现Git仓库间文件复制(用于Jenkins任务)

Groovy脚本实现Git仓库克隆、文件复制与跨仓库推送(Jenkins任务适用)

以下是适配Jenkins环境的Groovy脚本,通过Git命令完成从源仓库克隆、指定文件复制、再推送到目标仓库的完整流程:

pipeline {
    agent any
    environment {
        // 配置仓库地址与Jenkins凭证ID(需提前在凭证管理中配置)
        SRC_REPO_URL = 'https://github.com/example/source-repo.git'
        TARGET_REPO_URL = 'https://github.com/example/target-repo.git'
        SRC_CRED_ID = 'source-git-creds'
        TARGET_CRED_ID = 'target-git-creds'
        // 指定要复制的文件/目录(相对源仓库根目录的路径,多路径用空格分隔)
        FILES_TO_COPY = 'docs/ README.md'
        // 临时工作目录,避免污染Jenkins默认工作区
        WORK_DIR = "${env.WORKSPACE}/temp_work"
    }
    stages {
        stage('清理工作区') {
            steps {
                sh 'rm -rf ${WORK_DIR} || true'
                sh 'mkdir -p ${WORK_DIR}'
            }
        }
        stage('克隆源仓库') {
            steps {
                withCredentials([usernamePassword(
                    credentialsId: SRC_CRED_ID,
                    usernameVariable: 'SRC_USER',
                    passwordVariable: 'SRC_PWD'
                )]) {
                    sh """
                        cd ${WORK_DIR}
                        git clone https://${SRC_USER}:${SRC_PWD}@${SRC_REPO_URL.replace('https://', '')} source-repo
                    """
                }
            }
        }
        stage('复制文件到临时目录') {
            steps {
                sh """
                    mkdir -p ${WORK_DIR}/target-files
                    cd ${WORK_DIR}/source-repo
                    cp -r ${FILES_TO_COPY} ${WORK_DIR}/target-files/
                """
            }
        }
        stage('克隆/拉取目标仓库') {
            steps {
                withCredentials([usernamePassword(
                    credentialsId: TARGET_CRED_ID,
                    usernameVariable: 'TARGET_USER',
                    passwordVariable: 'TARGET_PWD'
                )]) {
                    sh """
                        cd ${WORK_DIR}
                        if [ -d target-repo ]; then
                            cd target-repo
                            git pull origin main
                        else
                            git clone https://${TARGET_USER}:${TARGET_PWD}@${TARGET_REPO_URL.replace('https://', '')} target-repo
                        fi
                    """
                }
            }
        }
        stage('复制文件并推送至目标仓库') {
            steps {
                withCredentials([usernamePassword(
                    credentialsId: TARGET_CRED_ID,
                    usernameVariable: 'TARGET_USER',
                    passwordVariable: 'TARGET_PWD'
                )]) {
                    sh """
                        cd ${WORK_DIR}/target-repo
                        # 复制文件到目标仓库根目录
                        cp -r ${WORK_DIR}/target-files/* .
                        # 配置Git用户信息(避免Jenkins节点无全局配置导致提交失败)
                        git config user.name "Jenkins CI"
                        git config user.email "jenkins@example.com"
                        # 提交并推送
                        git add .
                        git commit -m "Sync files from source repo: $(date '+%Y-%m-%d %H:%M:%S')"
                        git push https://${TARGET_USER}:${TARGET_PWD}@${TARGET_REPO_URL.replace('https://', '')} main
                    """
                }
            }
        }
        stage('清理临时文件') {
            steps {
                sh 'rm -rf ${WORK_DIR}'
            }
        }
    }
    post {
        always {
            echo '任务执行完成,临时工作区已清理'
        }
    }
}

关键细节说明:

  • 凭证安全:脚本使用Jenkins内置的usernamePassword凭证机制,避免硬编码账号密码,需提前在Jenkins「凭证管理」中添加对应仓库的凭证,并替换SRC_CRED_ID和TARGET_CRED_ID为你的凭证ID。
  • 分支适配:示例中默认使用main分支,若目标仓库使用master或其他分支,需替换脚本中所有main为对应分支名。
  • 容错处理:清理阶段添加|| true避免目录不存在时报错;目标仓库已存在时执行pull而非重复克隆,提升任务执行效率。
  • 路径灵活性:FILES_TO_COPY支持同时复制多个文件或目录,用空格分隔即可,适配不同的同步需求。

内容的提问来源于stack exchange,提问作者Hemanth Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 07:36:20