在 GitLab CI/CD 中执行打包操作通常涉及 依赖安装、编译代码、生成制品 等步骤。以下是针对不同技术栈的完整打包实现方案:
一、通用打包流程设计
1. 基础阶段划分
stages:
- install # 安装依赖
- build # 编译打包
- package # 生成最终制品
2. 关键配置项
配置项 | 作用说明 | 示例值 |
---|---|---|
artifacts | 保存打包结果供后续使用 | paths: [dist/] |
cache | 缓存依赖加速下次构建 | key: ${CI_COMMIT_REF_SLUG} |
image | 指定打包环境 | node:16 / maven:3.8 |
二、不同技术栈实现示例
1. 前端项目(Webpack/Vite)
build_frontend:
stage: build
image: node:16
cache:
key: frontend-${CI_COMMIT_REF_SLUG}
paths:
- node_modules/
script:
- npm install
- npm run build # 通常输出到 dist/ 目录
artifacts:
paths:
- dist/ # 归档打包结果
expire_in: 1 week
2. Java 项目(Maven)
package_java:
stage: package
image: maven:3.8-openjdk-11
variables:
MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"
cache:
paths:
- .m2/repository/
script:
- mvn package -DskipTests # 生成 target/*.jar
artifacts:
paths:
- target/*.jar
3. Python 项目(Docker 化打包)
build_python:
stage: build
image: python:3.9
script:
- pip install -r requirements.txt
- python setup.py bdist_wheel # 生成 dist/*.whl
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA .
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
artifacts:
paths:
- dist/*.whl
4. Go 项目(多平台打包)
build_go:
stage: build
image: golang:1.18
script:
- go build -o bin/
- tar czf release.tar.gz bin/ # 压缩打包
artifacts:
paths:
- release.tar.gz
三、高级打包技巧
1. 多环境差异化打包
build:
script:
- |
case $DEPLOY_ENV in
"prod") npm run build:prod ;;
"staging") npm run build:staging ;;
*) npm run build ;;
esac
rules:
- if: $CI_COMMIT_BRANCH == "main"
variables:
DEPLOY_ENV: "prod"
- variables:
DEPLOY_ENV: "staging"
2. 动态版本号
set_version:
stage: build
script:
- echo "APP_VERSION=$(date +%Y%m%d)-${CI_PIPELINE_IID}" > version.env
artifacts:
reports:
dotenv: version.env # 传递给后续Job
package:
needs: ["set_version"]
script:
- echo "Packaging v$APP_VERSION"
- tar czf app-$APP_VERSION.tar.gz dist/
3. 并行打包(多架构 Docker 镜像)
build_docker:
stage: package
parallel:
matrix:
- ARCH: ["amd64", "arm64"]
script:
- docker buildx build --platform linux/$ARCH -t app:$ARCH .
四、错误处理与优化
1. 依赖安装缓存
cache:
key: ${CI_COMMIT_REF_SLUG}-${CI_JOB_NAME}
paths:
- node_modules/ # 前端
- .m2/repository # Java
- venv/ # Python
2. 资源清理
after_script:
- rm -rf tmp/ # 清理临时文件
3. 超时控制
build_monolithic_app:
script: ./build_large_app.sh
timeout: 2 hours # 延长超时时间
五、完整 Pipeline 示例
stages:
- setup
- build
- package
install_deps:
stage: setup
image: node:16
cache:
key: npm-${CI_COMMIT_REF_SLUG}
paths:
- node_modules/
script:
- npm ci --prefer-offline # 精准安装依赖
build_app:
stage: build
needs: ["install_deps"]
script:
- npm run build
artifacts:
paths:
- dist/
package_prod:
stage: package
rules:
- if: $CI_COMMIT_BRANCH == "main"
script:
- tar czf app-${CI_COMMIT_SHORT_SHA}.tar.gz dist/
- aws s3 cp app-*.tar.gz s3://my-bucket/
artifacts:
paths:
- app-*.tar.gz
关键要点
- 隔离环境:使用 Docker 镜像确保环境一致性
- 增量构建:合理利用缓存加速重复流程
- 产物管理:通过
artifacts
传递打包结果 - 安全存储:敏感文件(如
.env
)应通过 CI/CD 变量传递
根据项目实际需求调整打包策略,可通过 gitlab-runner exec
命令在本地测试验证。