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

时间:2015-03-12 15:11:17

标签: git jenkins gitlab nexus

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

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

5 个答案:

答案 0 :(得分:40)

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. 可以直接从标签列表视图中完成上传和下载。
  4.   
  5. 如果标记被删除,则上传将被销毁。   (我们不接受最近评论中提到的标签消息编辑)
  6.   

对该建议的评论包括:

  

下一步是什么使它更有趣   我真的想要一种方法让公共下载文件来自"发布"无法访问源代码(例如,除了维基,"发布"发布跟踪器之外的任何其他内容,只为项目团队创建私有源代码)。

     

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

     

尽管如此,我在此重申我的观点:
  简单版本的"发布"很高兴有很多人可以轻松地在GitLab外面的服务器上设置外部文件服务器并将发布/标签描述中的URL指向。   换句话说,"发布"如果没有未来的整合图片,现在看起来可能并不吸引人。

答案 1 :(得分:8)

这个答案将与VonC的答案基本相同,只是针对经验不足的CI用户以逐步的方式进行了描述。

因此,假设您有一个非常酷的commit 30728cab,并且您希望将此代码版本重新发行...

1)为您的提交创建标签

git tag -a MY_TAG_NAME 30728cab

执行此命令后,将要求您填写描述,就像对代码进行新更改时一样。

2)将标签推送到您的远程存储库

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

git push REMOTE_REPO_NAME REMOTE_BRANCH_NAME MY_TAG_NAME

3)上传文件

现在您可以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,删除以前的远程存储库,然后{ {3}}您已下载和修改的存档。

4)创建发行版

现在我们终于可以使用create a new one by importing将它们绑在一起。

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支持Release,但是很难用这种繁琐的单行代码编写更大的*.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

现在就这样!您已经有了第一个完整版本!

直到您意识到,您在发行说明的标题中输入了错误的文字...

5)删除发行版(如果需要)

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

答案 2 :(得分:1)

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

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

答案 3 :(得分: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 sftp@192.168.1.60 "mkdir -p ${CI_REPORTS_PATH}"
sshpass -p "$SFTP_PASS" scp -r ${CI_APP_VOLUME}/tests/_output/* sftp@192.168.23.17:${CI_REPORTS_PATH}

# return test exit-code
exit ${TESTS_EXIT_CODE}

答案 4 :(得分:1)

我使用的是用Python编写的command line tool作为快捷方式。请执行先前答案中描述的API方法的某些步骤(上传,发布,删除发布)。

您可以选中source code,也可以自己使用。

对于更简单的版本,如果有人对使用python和request.py做到这一点感兴趣;这很琐碎。

用于上传

Process

上传返回带有{strong>链接和降价格式的链接的json。我发现降价格式的链接对于发行说明非常有用。因为您必须自己将链接添加到描述中。

用于创建发行版

import requests
secret_token = "<your secret token>"
project_id = "<your project id>"
file_path = "your_file.txt"
api_root = "https://gitlab.com/api/v4"

headers = {
    'PRIVATE-TOKEN': secret_token,
}

uri = '{}/projects/{}/uploads'.format(api_root, project_id)

files = {
    'file': open(file_path, 'rb')
}


r_upload = requests.post(uri, headers=headers, files=files)
if(r_upload.status_code != 201 and r_upload.status_code != 200):
    raise ValueError(f"Upload API responded with unvalid status {r_upload.status_code}")  # noqa: E501

upload = r_upload.json()

JSON响应是release

对于其他步骤,基本上遵循API guidelines并进行调整。它们都很相似。