在日常开发测试中,开发同事会经常找你去创建git项目,每次新建项目都要重复搭建目录结构,初始化配置 统一代码规范  登录平台创建有些繁琐,不仅耗时还容易出现格式不统一问题  我们不妨自己去定义一下规则,让jenkins去实现 包括项目初始化 都让jenkins去完成 。通过 GitLab 脚手架模板项目,可以提前封装标准化的前端、后端项目基础架构,实现一键新建项目、统一团队代码规范、规避重复初始化工作

今天这篇实操干货,手把手教你在 GitLab 搭建通用前后端项目脚手架,团队所有新项目直接复用,统一项目架构!

一、什么是 GitLab 项目脚手架?

很多人会混淆 GitLab 脚手架与 CI/CD 自动部署,这里先明确核心定义:GitLab 项目脚手架(模板仓库):是提前搭建好的、包含完整标准化目录结构、配置文件、基础代码的模板项目,核心作用是快速初始化新项目,而非自动化构建部署。

核心价值:

  • 告别重复新建文件、配置环境、编写基础代码的低效操作

  • 统一团队所有前后端项目的目录结构、代码规范、配置规则

  • 新人上手直接使用标准化模板,降低学习和适配成本

  • 支持一键基于模板生成全新项目,保留模板配置,可快速迭代开发

二、前期准备工作

搭建 GitLab 脚手架前,需满足基础环境和权限要求,保证模板创建、复用功能正常使用:

1. 环境与权限

  • 可用的 GitLab 服务(自建 GitLab / 官方云端 GitLab)

  • 拥有 项目创建权限、仓库管理权限(管理员/团队负责人权限最佳)

  • 本地安装 Git 工具,用于初始化模板项目、提交代码

2. 技术栈适配规划

提前确定团队通用技术栈,搭建对应脚手架模板,本文适配主流版本:

  • 前端脚手架:Vue3 / React 通用模板

  • 后端脚手架:SpringBoot Java 通用模板

三、搭建GItlab 前端项目脚手架

图片

使用参数化构建过程(项目名称及项目组)

pipline模板如下

pipeline {
    agent any

    tools {
        nodejs 'node18'  // 'NodeJS'是你在系统设置中配置的Node.js环境名称
    }
    environment {
        GITLAB_API_URL = 'https://xxxxxxx.cn/api/v4'
    }

    parameters {
        string(name: 'gitlabAppName', defaultValue: 'my-app', description: 'The name of the application')
        string(name: 'gitlabGroupName', defaultValue: 'my-group', description: 'The name of the GitLab group')
    }

    stages {
        stage('Generate Project') {
            steps {
                script {
                    sh """
                        node -v
                        npm -v
                        npx --registry http://npmmirrors.devxxx.cn/ -y clx-vue-cli@latest create ${params.gitlabAppName}
                    """
                }
            }
        }
        stage('Create GitLab Project') {
            steps {
                script {
                    withCredentials([string(credentialsId: 'gitlab-token-id', variable: 'GITLAB_TOKEN')]) {
                        // 获取完整的 API 响应
                        def groupApiResponse = sh(script: "curl -s --header 'PRIVATE-TOKEN: ${GITLAB_TOKEN}' '${GITLAB_API_URL}/groups?search=${gitlabGroupName}'", returnStdout: true).trim()

                        // 打印完整响应
                        echo "GitLab API response: ${groupApiResponse}"

                        // 解析 groupId
                        def groupId = sh(script: "echo '${groupApiResponse}' | jq -r '.[0].id'", returnStdout: true).trim()

                        // 打印解析后的 groupId
                        echo "Retrieved GitLab group ID: ${groupId}"

                        // 判断群组是否存在
                        if (!groupId || groupId == 'null') {
                            error "GitLab group ${groupName} not found."
                        }

                        def createProjectResponse = sh(script: """
                            curl -s --request POST '${GITLAB_API_URL}/projects' \
                            --header 'PRIVATE-TOKEN: ${GITLAB_TOKEN}' \
                            --header 'Content-Type: application/json' \
                            --data '{
                                "name": "${params.gitlabAppName}",
                                "namespace_id": "${groupId}",
                                "initialize_with_readme": true
                            }'
                        """, returnStdout: true).trim()

                        echo "Create project response: ${createProjectResponse}"
                    }
                }
            }
        }
        stage('Initialize Git Repository') {
            steps {
                script {
                    withCredentials([usernamePassword(credentialsId: 'gitlab-credentials-id', usernameVariable: 'GIT_USERNAME', passwordVariable: 'GIT_PASSWORD')]) {
                        dir("${params.gitlabAppName}") {
                            sh """
                                ls -la
                                git init
                                git config user.name "xxxx"
                                git config user.email "xxxxxxx@xx.cn"
                                git remote add origin https://xxxxx.cn/${params.gitlabGroupName}/${params.gitlabAppName}.git
                                git add .
                                git commit -m "Initial commit"
                                git push -u https://${GIT_USERNAME}:${GIT_PASSWORD}@xxxxxx.cn/${params.gitlabGroupName}/${params.gitlabAppName}.git master
                            """
                        }
                    }
                }
            }
        }
        stage('Clean Workspace') {
            steps {
                deleteDir()
            }
        }
    }
}

这段pipline适配了我司内部一些规则比如需要私服镜像源配置团队私有脚手架模板 我就不做详细解释了 道友自行研习图片

四、手把手搭建Gitlab后端项目脚手架

以企业主流 SpringBoot 后端模板 为例,搭建标准化后端脚手架,统一Java项目架构。

图片

图片

同样配置参数化构建参数

图片

piplene 配置如下

pipeline {
    agent any
    environment {
        GITLAB_API_URL = 'https://xxxxxx/api/v4'
    }

    parameters {
        string(name: 'groupId', defaultValue: 'com.example', description: 'The groupId for the new project')
        string(name: 'artifactId', defaultValue: 'my-app', description: 'The artifactId for the new project')
        string(name: 'package', defaultValue: 'com.example.myapp', description: 'The base package for the new project')
        string(name: 'gitlabAppName', defaultValue: 'my-app', description: 'The name of the application')
        string(name: 'gitlabGroupName', defaultValue: 'my-group', description: 'The name of the GitLab group')
    }

   #调用团队自定义Maven脚手架骨架(archetype-web-archetype),
   #内置统一的SpringBoot分层架构、配置文件、工具类、
   #代码规范指定固定脚手架版本0.0.2,保证所有新项目架构完全统一-DinteractiveMode=false:
   #非交互式执行,适配流水线自动化场景根据传入参数,自动生成完整、可直接开发的后端标准化项目结构
    stages {
        stage('Generate Project') {
            steps {
                script {
                    sh """
                          /var/lib/jenkins/maven/maven-3.6.2/bin/mvn archetype:generate \
                          -DarchetypeGroupId=com.msl.archetype \
                          -DarchetypeArtifactId=archetype-web-archetype \
                          -DarchetypeVersion=0.0.2 \
                          -DgroupId=${params.groupId} \
                          -DartifactId=${params.artifactId} \
                          -Dpackage=${params.package} \
                          -DinteractiveMode=false
                    """
                }
            }
        }

#读取Jenkins加密存储的GitLab私人令牌,安全鉴权,无硬编码密钥风险
#通过分组名称动态查询分组ID,适配多团队、多分组场景
#内置异常拦截,分组不存在直接报错终止,避免无效执行
#自动调用GitLab API创建同名仓库,自动初始化README文件
                stage('Create GitLab Project') {
            steps {
                script {
                    withCredentials([string(credentialsId: 'gitlab-token-id', variable: 'GITLAB_TOKEN')]) {
                        // 获取完整的 API 响应
                        def groupApiResponse = sh(script: "curl -s --header 'PRIVATE-TOKEN: ${GITLAB_TOKEN}' '${GITLAB_API_URL}/groups?search=${gitlabGroupName}'", returnStdout: true).trim()

                        // 打印完整响应
                        echo "GitLab API response: ${groupApiResponse}"

                        // 解析 groupId
                        def groupId = sh(script: "echo '${groupApiResponse}' | jq -r '.[0].id'", returnStdout: true).trim()

                        // 打印解析后的 groupId
                        echo "Retrieved GitLab group ID: ${groupId}"

                        // 判断群组是否存在
                        if (!groupId || groupId == 'null') {
                            error "GitLab group ${groupName} not found."
                        }

                        def createProjectResponse = sh(script: """
                            curl -s --request POST '${GITLAB_API_URL}/projects' \
                            --header 'PRIVATE-TOKEN: ${GITLAB_TOKEN}' \
                            --header 'Content-Type: application/json' \
                            --data '{
                                "name": "${params.gitlabAppName}",
                                "namespace_id": "${groupId}",
                                "initialize_with_readme": true
                            }'
                        """, returnStdout: true).trim()

                        echo "Create project response: ${createProjectResponse}"
                    }
                }
            }
        }

#进入本地生成的脚手架目录,初始化Git仓库、统一提交用户信息、绑定远程企业GitLab仓库,最后将标准化脚手架代码自动推送至远程仓库,直接完成项目初始化。
                stage('Initialize Git Repository') {
            steps {
                script {
                    withCredentials([usernamePassword(credentialsId: 'gitlab-credentials-id', usernameVariable: 'GIT_USERNAME', passwordVariable: 'GIT_PASSWORD')]) {
                        dir("${params.artifactId}") {
                            sh """
                                git init
                                git config user.name "xxxx"
                                git config user.email "xxxxxxxxx"
                                git remote add origin https://xxxxxx.cn/${params.gitlabGroupName}/${params.gitlabAppName}.git
                                git add .
                                git commit -m "Initial commit"
                                git push -u https://${GIT_USERNAME}:${GIT_PASSWORD}@xxxxx.cn/${params.gitlabGroupName}/${params.gitlabAppName}.git master
                            """
                        }
                    }
                }
            }
        }
        stage('Clean Workspace') {
            steps {
                deleteDir()
            }
        }
    }
}

五、总结

GitLab + Jenkins 脚手架方案,完美适配团队前后端项目标准化建设:

前端采用手动模板复用,轻量化、易维护;后端采用Maven Archetype流水线自动化生成,规范化、高效率。统一团队开发标准、解放重复劳动力。

区别于 CI/CD 自动化部署,脚手架聚焦项目初始化与架构标准化,一次搭建、全员复用,彻底解决团队项目目录混乱、代码规范不一、初始化低效的问题,是团队规范化开发的基础必备配置

整套方案彻底告别重复新建项目、手动配置架构的低效工作,统一团队代码规范与项目架构,是企业研发规范化的核心基础配置。

更多推荐