如何在GitLab中存储版本/二进制文件?

问题描述 投票:46回答:4

我正在使用Gitlab,Jenkins和 - 可能 - Nexus构建一个工作流程(我需要一个工件存储)。我想让GitLab存储发布/二进制文件 - 是否可以方便地进行存储?

我不希望有另一个服务,可以从中下载一个版本(和文档)但是以某种方式与存储库管理器集成,就像在例如GitHub上。有线索吗?

git jenkins gitlab nexus
4个回答
43
投票

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最小提案的合并请求:

  1. 对于https://github.com/cirosantilli/test/releases/tag/3.0下的每个存储库标记,允许上载和下载文件列表。
  2. 上传和下载可以直接从标签列表视图完成。
  3. 如果标记被删除,则上传将被销毁。 (我们不接受最近评论中提到的标签消息编辑)

对该建议的评论包括:

更有趣的是下一步。 我真的想要一种方法让公共下载工件从“发布”而不能访问源代码(即除了维基,“发布”,问题跟踪器之外的任何其他东西,只为项目团队创建私有源)。

但是,这样的附加功能看起来更通用,我submitted a separate feature request for that

不过,我在此重申我的观点: 虽然“发布”的简单版本仍然很好,但许多人可以轻松地在GitLab之外的此服务器中设置外部文件服务器并将发布/标记描述中的URL指向。 换句话说,如果没有未来的整合图景,“发布”可能看起来并不吸引人。


11
投票

这个答案与VonC的答案基本相同,只是为经验较少的CI用户逐步描述。

所以,让我们说,你有一个非常酷的提交30728cab,你想让你的代码的这个版本成为一个新版本......

1) Create a tag for your commit

git tag -a MY_TAG_NAME 30728cab

在此命令之后,系统会要求您填写说明,就像您对代码进行新的更改一样。

2) Push the tag to your remote repository

标签不会随你的提交自动推送到那里!您需要手动将它们推送到遥控器。

git push REMOTE_REPO_NAME REMOTE_BRANCH_NAME MY_TAG_NAME

3) Upload a file

现在您可以a)将文件上传到GitLab存储库,b)将其上传到其他地方并在两种情况下保存链接。

警告:Files uploaded to the GitLab repository can't be easily deleted then and you can't see their link later!

虽然由于上述原因我不建议将二进制文件上传到存储库,但是你要求它,所以这是方法:

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您下载和修改的存档。

4) Create a release

现在我们终于可以使用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

And now that's it! You have your first complete release!

直到你意识到,你在发布说明的标题中发了一个可怕的错字......

5) Delete a release (if needed)

在这里,你很幸运!与上传的二进制文件不同,您也可以使用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一样使用。


1
投票

Gitlab(服务器)本身用于git存储库。你不应该在git中存储二进制文件。 Nexus会在这里走的路。您可以在存储库描述或自述文件中添加指向nexus的链接(就像您可以指向您的jenkins构建一样)。

您可能想要了解与Gitlab集成的GitLab持续集成。这似乎更像詹金斯。我不知道它是否带有像Nexus这样的数据存储。


1
投票

我们使用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}
© www.soinside.com 2019 - 2024. All rights reserved.