我正在寻找一种简单、干净的方法来将使用 GitLab CI 构建的工件发布到 Artifactory。
我能够发现https://gitlab.com/gitlab-org/omnibus/blob/af8af9552966348a15dc1bf488efb29a8ca27111/lib/omnibus/publishers/artifactory_publisher.rb但我无法找到任何有关我应该如何配置的文档让它发挥作用。
注意:我正在寻找 gitlab_ci.yaml 方法,而不是在外部实现它。
在基本层面上,这可以使用 JFrog CLI 工具来完成。除非您想将配置嵌入到您的
.gitlab-ci.yml
中(我不想),否则您首先需要运行(在您的运行器上):
jfrog rt c
默认情况下,这将提示您输入 Artifactory URL 和 API 密钥。输入这些项目后,您会发现
~/.jfrog/jfrog-cli.conf
包含 JSON,如下所示:
{
"artifactory": {
"url": "http://artifactory.localdomain:8081/artifactory/",
"apiKey": "AKCp2V77EgrbwK8NB8z3LdvCkeBPq2axeF3MeVK1GFYhbeN5cfaWf8xJXLKkuqTCs5obpzxzu"
}
}
您可以将此文件复制到 GitLab 运行程序的主目录 - 在我的例子中,
/home/gitlab-runner/.jfrog/jfrog-cli.conf
完成后,运行程序将使用该配置向 Artifactory 进行身份验证。如果您不想使用 API 密钥,还有许多其他身份验证的可能性 - 请查看 JFrog CLI 文档。
在继续之前,请确保“jfrog”可执行文件位于已知位置,并且具有 gitlab-runner 用户的执行权限。从这里,您可以在
.gitlab-ci.yml
中调用该实用程序 - 这是 node.js
应用程序的一个最小示例,它将传递 Git 标签作为工件版本:
stages:
- build-package
build-package:
stage: build-package
script:
- npm install
- tar -czf test-project.tar.gz *
- /usr/local/bin/jfrog rt u --build-name="Test Project" --build-number="${CI_BUILD_TAG}" test-project.tar.gz test-repo
如果您使用 Maven 进行构建,这就是我的做法:
注意:您需要准备好您的人工凭证(用户和通行证)。
创建主密码并从中生成加密密码。有关如何创建主密码的过程可以在here
在 gitlab 的管道设置中,创建 2 个秘密变量,一个用于用户名,另一个用于加密密码。
在
settings.xml
目录中更新或创建 .m2
文件以进行 Maven 构建。您的 settings.xml
应如下所示:
<settings xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.1.0 http://maven.apache.org/xsd/settings-1.1.0.xsd" xmlns="http://maven.apache.org/SETTINGS/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<servers>
<server>
<id>central</id>
<username>${env.ARTIFACTORY_USER}</username>
<password>${env.ENCRYPTED_PASS}</password>
</server>
</servers>
</settings>
在您的
.gitlab-ci.yml
文件中,您需要像这样使用这个settings.xml
:
image: maven:latest
variables:
MAVEN_CLI_OPTS: "-s .m2/settings.xml --batch-mode"
MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"
cache:
paths:
- .m2/repository/
- target/
build:
stage: build
script:
- mvn $MAVEN_CLI_OPTS compile
就是这样。这应该有效。您可以访问这里了解有关如何通过maven使用artifactory的更多信息
我知道这并不能完全回答你的问题,但我从相关搜索中得到了这个问题,所以我认为它也可能与其他人相关:
我最终使用了一个
mvn deploy
工作,该工作绑定到 gitlab 的 deploy
阶段。
以下是相关工作部分:
deploy:jdk8:
stage: test
script:
- 'mvn $MAVEN_CLI_OPTS deploy site site:stage'
only:
- master
# Archive up the built documentation site.
artifacts:
paths:
- target/staging
image: maven:3.3.9-jdk-8
JFrog 文档建议这样做:
image: gradle:latest
before_script:
# Download JFrog CLI
- curl -fL https://install-cli.jfrog.io | sh
# configure artifactory server
- jf config add $JFROG_PLATFORM_SERVER_ID--url=$JFROG_PLATFORM_URL --user=$JFROG_PLATFORM_USER --password=$JFROG_PLATFORM_PASS
- jf config show
# configure gradle, set upload and download repos
- jf gradlec --repo-resolve $JFROG_PLATFORM_REPO --repo-deploy $JFROG_PLATFORM_REPO
gitlab-ci-gradle-build: #This job name will be used as the build info repository name in artifactory
stage: build
script:
# upload the built artifact to artifactory
- jf gradle clean artifactoryPublish --build-name=$CI_JOB_NAME --build-number=$CI_JOB_ID
# Collect environment variables for the build
- jf rt bce $CI_JOB_NAME $CI_JOB_ID
# Collect VCS details from git and add them to the build
- jf rt bag $CI_JOB_NAME $CI_JOB_ID
# Publish build info
- jf rt bp $CI_JOB_NAME $CI_JOB_ID
# Scan with xray
- jf bs $CI_JOB_NAME $CI_JOB_ID
变量
JFROG_*
需要在Gitlab存储库的CI/CD部分定义。
如果要在一组项目之间共享,我会使用 JFrog 默认值烘焙一个容器映像,并只保留每个项目设置的 API 密钥。