我正在使用Gitlab,Jenkins和 - 可能 - Nexus构建一个工作流程(我需要一个工件存储)。我想让GitLab存储发布/二进制文件 - 是否可以方便地进行存储?
我不希望有另一个服务,可以从中下载一个版本(和文档)但是以某种方式与存储库管理器集成,就像在例如GitHub上。有线索吗?
2015年11月更新:GitLab 8.2 now supports releases。
有了它的API,你现在可以create and update a relase associated to a tag。 目前,它只能将发行说明(降价文本和附件)添加到git标签(又称发行版)。
更新2019年5月:GitLab 1.11引入了一个有趣的“Guest access to Releases”:
您的项目的访客用户现在可以查看您在“版本”页面上发布的版本。 他们将能够下载您发布的工件,但不允许下载源代码,也不能查看存储库信息,如标记和提交。
原始答案2015年3月
这正在进行中,并在suggestions 4156755中提出:
我们接受Ciro最小提案的合并请求:
- 对于https://github.com/cirosantilli/test/releases/tag/3.0下的每个存储库标记,允许上载和下载文件列表。
- 上传和下载可以直接从标签列表视图完成。
- 如果标记被删除,则上传将被销毁。 (我们不接受最近评论中提到的标签消息编辑)
对该建议的评论包括:
更有趣的是下一步。 我真的想要一种方法让公共下载工件从“发布”而不能访问源代码(即除了维基,“发布”,问题跟踪器之外的任何其他东西,只为项目团队创建私有源)。
但是,这样的附加功能看起来更通用,我submitted a separate feature request for that。
不过,我在此重申我的观点: 虽然“发布”的简单版本仍然很好,但许多人可以轻松地在GitLab之外的此服务器中设置外部文件服务器并将发布/标记描述中的URL指向。 换句话说,如果没有未来的整合图景,“发布”可能看起来并不吸引人。
这个答案与VonC的答案基本相同,只是为经验较少的CI用户逐步描述。
所以,让我们说,你有一个非常酷的提交30728cab,你想让你的代码的这个版本成为一个新版本......
git tag -a MY_TAG_NAME 30728cab
在此命令之后,系统会要求您填写说明,就像您对代码进行新的更改一样。
标签不会随你的提交自动推送到那里!您需要手动将它们推送到遥控器。
git push REMOTE_REPO_NAME REMOTE_BRANCH_NAME MY_TAG_NAME
现在您可以a)将文件上传到GitLab存储库,b)将其上传到其他地方并在两种情况下保存链接。
虽然由于上述原因我不建议将二进制文件上传到存储库,但是你要求它,所以这是方法:
curl --request POST --header "Private-Token: YOUR_PRIVATE_TOKEN" --form "file=@/PATH/TO/THE/FILE/file.txt" "https://MY_GITLAB_HOSTING.COM/api/v4/projects/MY_PROJECT_ID/uploads"
可以在用户设置 - >访问令牌中创建private token。
此外,如果您确实需要删除该文件,您可以export the project,从您下载的存档中手动删除文件夹updates
,删除以前的远程存储库和create a new one by importing您下载和修改的存档。
现在我们终于可以使用Release将它们组合在一起了。
curl --request POST --header 'Content-Type: application/json' --header "Private-Token: YOUR_PRIVATE_TOKEN" --data '{"name": "MY_RELEASE_NAME", "tag_name": "MY_TAG_NAME", "description": "Release with the binary LINK_TO_YOUR_BINARY"}' "https://MY_GITLAB_HOSTING.COM/api/v4/projects/MY_PROJECT_ID/releases"
您可以看到,Release本质上与特定标记绑定,后者随后与特定提交绑定。然后,只需提供指向这些文件的链接即可执行与二进制文件的连接。
有趣的一点是,你的description
支持Markdown,但很难在如此繁琐的单行中写一些更大的*.md
文档。所以我写了一个简短的Bash脚本,它允许我们将Markdown文件放在一边,然后读取它并自动发送:
#!/bin/bash
RELEASE_NAME="$1"
TAG_NAME="$2"
PROJECT_ID="$3"
DESCRIPTION_FILE_PATH="$4"
PRIVATE_TOKEN="$5"
if [ "$5" == "" ]; then
echo "Missing parameter! Parameters are RELEASE_NAME, TAG_NAME, PROJECT_ID, DESCRIPTION_FILE_PATH and PRIVATE_TOKEN.";
exit 1;
fi
DESCRIPTION=''
# Load data from file
while read -r line; do
DESCRIPTION="${DESCRIPTION}${line}\n";
done < "${DESCRIPTION_FILE_PATH}"
curl --request POST\
--header 'Content-Type: application/json'\
--header "Private-Token: ${PRIVATE_TOKEN}"\
--data-binary "{\"name\": \"${RELEASE_NAME}\", \"tag_name\": \"${TAG_NAME}\", \"description\": \"${DESCRIPTION}\"}"\
"https://MY_GITLAB_HOSTING.com/api/v4/projects/${PROJECT_ID}/releases"
echo
所以你可以像使用它一样使用它
./upload_release.sh MY_RELEASE_NAME MY_TAG_NAME MY_PROJECT_ID MY_MARKDOWN_FILE_PATH MY_PRIVATE_TOKEN
直到你意识到,你在发布说明的标题中发了一个可怕的错字......
在这里,你很幸运!与上传的二进制文件不同,您也可以使用REST API删除您的版本!
curl --request DELETE --header "Private-Token: MY_PRIVATE_TOKEN" "https://MY_GITLAB_HOSTING.com/api/v4/projects/MY_PROJECT_ID/releases/MY_TAG_NAME"
因为连续几次输入这个仍然很烦人,我已经制作了另一个Bash脚本:
#!/bin/bash
PROJECT_ID=$1
TAG_NAME=$2
PRIVATE_TOKEN=$3
if [ "$3" == "" ]; then
echo "Missing parameter! Parameters are PROJECT_ID, TAG_NAME and PRIVATE_TOKEN.";
exit 1;
fi
curl --request DELETE --header "Private-Token: ${PRIVATE_TOKEN}" "https://MY_GITLAB_HOSTING.com/api/v4/projects/${PROJECT_ID}/releases/${TAG_NAME}"
echo
可以像./delete_release.sh MY_PROJECT_ID MY_TAG_NAME MY_PRIVATE_TOKEN
一样使用。
Gitlab(服务器)本身用于git存储库。你不应该在git中存储二进制文件。 Nexus会在这里走的路。您可以在存储库描述或自述文件中添加指向nexus的链接(就像您可以指向您的jenkins构建一样)。
您可能想要了解与Gitlab集成的GitLab持续集成。这似乎更像詹金斯。我不知道它是否带有像Nexus这样的数据存储。
我们使用scp
来复制在GitlabCI中生成的文件,例如二进制文件或报告。
# capture test exit code
set +e
bash build/ci/test.sh; TESTS_EXIT_CODE=$?
set -e
# copy reports
sshpass -p "$SFTP_PASS" ssh -o StrictHostKeyChecking=no [email protected] "mkdir -p ${CI_REPORTS_PATH}"
sshpass -p "$SFTP_PASS" scp -r ${CI_APP_VOLUME}/tests/_output/* [email protected]:${CI_REPORTS_PATH}
# return test exit-code
exit ${TESTS_EXIT_CODE}