CI/CD 中的制品管理 Artifactory

FreeGuideOnline 最新 2026-07-11

text ┌───────────────┐ ┌─────────────────┐ │ 开发者/CI │ ──→ │ 虚拟仓库 │ │ │ │ 聚合: │ └───────────────┘ │ - 本地 libs-release│ │ - 远程 maven-remote│ └─────────┬───────────┘ │ 顺序查找 ↓ 本地仓库 远程仓库(带缓存)


### 制品的唯一坐标

每个制品都有一个可由 GAV 坐标(GroupId、ArtifactId、Version)等元数据唯一标识的路径。Artifactory 按照常见的包布局存储,并自动维护元数据索引。

### 构建集成

Artifactory 不仅仅是存储,它还记录 **构建信息**。利用 JFrog CLI 或插件,你可以将某次 CI 构建产生的所有制品、依赖信息、环境变量、构建参数等一并上传,形成一个完整的 **构建信息结构**。这让你可以:

- 追溯某个 Docker 镜像究竟来自哪一次代码提交、哪个 CI 任务。
- 一键升级到环境中的全部制品为特定构建号的版本(通过构建号进行统一升级)。
- 查看所有项目依赖是否包含安全漏洞或违反许可证。

## 在 CI/CD 流水线中使用 Artifactory

下面以常见的 Jenkins / GitHub Actions / 自研流水线为例,梳理典型集成步骤。

### 1. 安装与基础配置

- **下载 Artifactory**:可选择自托管(OSS 或商业版)或使用 JFrog 提供的云实例(免费额度)。自托管可以用 Docker Compose 快速运行:

```bash
docker run -d --name artifactory -p 8081:8081 -p 8082:8082 \
  releases-docker.jfrog.io/jfrog/artifactory-oss:latest
  • 初始化后创建所需的仓库结构,例如:
    • docker-local(本地 Docker 仓库)
    • maven-remote(远程 Maven)
    • gradle-virtual(聚合本地和远程)

2. 配置 CI 工具认证

在 CI 环境变量中设置 Artifactory 的连接信息(URL、用户名、密码或 API Key)。使用 JFrog CLI 可以简化交互:

# 下载安装 JFrog CLI
curl -fL https://getcli.jfrog.io | sh

# 配置连接(交互式或通过环境变量)
jf config add my-server --url $ARTIFACTORY_URL --user $ARTIFACTORY_USER --password $ARTIFACTORY_PASSWORD

# 或直接使用 API Key
jf config add my-server --url $ARTIFACTORY_URL --access-token $ARTIFACTORY_TOKEN

3. 构建流程与制品上传

以 Maven 项目为例,典型的 CI 步骤(在 Jenkinsfile 或脚本中)如下:

# 克隆代码...
cd my-java-app

# 构建并直接部署到 Artifactory 的本地仓库
jf mvn clean install
jf mvnd deploy --server-id my-server --repo-resolve-releases my-maven-virtual --repo-resolve-snapshots my-maven-virtual --repo-deploy-releases my-maven-local

JFrog CLI 会自动解析 Maven 的输出并上传构建产生的 pomjar 等制品,同时生成构建信息。

对于 Docker 镜像:

# 构建镜像并标记
docker build -t my-docker-virtual/my-app:1.0.0 .

# 使用 JFrog CLI 推送(自动处理登陆)
jf docker push my-docker-virtual/my-app:1.0.0 --build-name=my-build --build-number=$CI_BUILD_NUMBER

--build-name--build-number 参数用于将不同工具产生的制品关联到同一个构建之下。

4. 收集并发布构建信息

所有制品上传完成后,发布构建信息,将本次构建的所有细节持久化到 Artifactory 中:

# 收集环境变量(可选,如 Git 提交、CI 变量)
jf rt build-collect-env my-build $CI_BUILD_NUMBER

# 将聚合的构建信息上传
jf rt build-publish my-build $CI_BUILD_NUMBER

现在你就可以在 Artifactory UI 的 “Builds” 部分看到这次构建,包括发布的模块列表、环境变量等。

5. 依赖缓存加速

要充分利用远程仓库的缓存机制,只需在虚拟仓库中配置远程仓库指向官方 Registry,并让 CI 或本地开发通过虚拟仓库解析依赖。初次拉取后,后续构建将直接从 Artifactory 缓存获取,大幅提升速度并减少对公网依赖。

示例:配置 npm 虚拟仓库

# 创建远程仓库
jf rt rc npm-remote --url https://registry.npmjs.org

# 创建本地仓库(用于发布私有包)
jf rt rc npm-local

# 创建虚拟仓库
jf rt rc npm-virtual --repo-type virtual --repositories npm-local,npm-remote --default-deploy-repo npm-local

然后在项目中使用虚拟仓库的 URL 作为 registry:

npm config set registry http://your-artifactory:8081/artifactory/api/npm/npm-virtual/
npm install

高级实践与优化

制品的版本管理与清理

制定清理策略可避免存储无限膨胀:

  • 快照版本自动清理:为本地快照仓库设置 “Max Unique Snapshots” 策略,保留最近 N 个快照版本。
  • 基于构建历史的保留:利用 Artifact Cleanup 插件,根据构建保留天数或构建数,自动删除不再需要的制品。
  • Docker 分层缓存:Artifactory 会自动识别 Docker 镜像相同的层,不会重复存储,节省空间。

安全扫描与许可合规

Artifactory 内置 Xray 集成(商业版功能),可以持续扫描制品漏洞(CVE)和许可证问题:

  • 在制品上传时自动触发扫描,设置安全规则阻止部署带有高风险漏洞的包。
  • 生成许可证合规报告,确保使用的开源组件符合公司政策。
  • 对于 Docker 镜像,可扫描基础镜像和所有层,识别深层依赖风险。

若只使用开源版,也可通过 JFrog CLI 配合外部安全扫描工具实现基本的漏洞检查流程。

推广流程与制品晋升

在多环境部署(Dev → Staging → Production)中,不应重复构建,而应当将同一个制品从一个仓库“晋升”到另一个更严格的仓库,并记录这次晋升操作。

例如:

# 将 my-app 1.0.0 从 dev-local 仓库提升到 prod-local 仓库
jf rt cp my-dev-local/path/to/my-app/1.0.0/ my-prod-local/path/to/my-app/1.0.0/