我正在使用 Gitlab , Jenkins 和 - 可能 - Nexus 构建工作流程(我需要工件存储)。我想让GitLab存储版本/二进制文件 - 是否可以方便地使用?
我不希望有另一个服务可以从中下载发行版(和文档)但是以某种方式与存储库管理器集成,就像在例如GitHub上。有线索吗?
答案 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提出的最小提案的合并请求:
- 对于https://github.com/cirosantilli/test/releases/tag/3.0下的每个存储库标记,允许上传和下载文件列表。
- 可以直接从标签列表视图中完成上传和下载。
- 如果标记被删除,则上传将被销毁。 (我们不接受最近评论中提到的标签消息编辑)
醇>
对该建议的评论包括:
下一步是什么使它更有趣 我真的想要一种方法让公共下载文件来自"发布"无法访问源代码(例如,除了维基,"发布"发布跟踪器之外的任何其他内容,只为项目团队创建私有源代码)。
但是,这样的附加功能看起来更通用,我submitted a separate feature request for that。
尽管如此,我在此重申我的观点:
简单版本的"发布"很高兴有很多人可以轻松地在GitLab外面的服务器上设置外部文件服务器并将发布/标签描述中的URL指向。 换句话说,"发布"如果没有未来的整合图片,现在看起来可能并不吸引人。
答案 1 :(得分:8)
这个答案将与VonC的答案基本相同,只是针对经验不足的CI用户以逐步的方式进行了描述。
因此,假设您有一个非常酷的commit 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
,删除以前的远程存储库,然后{ {3}}您已下载和修改的存档。
现在我们终于可以使用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
直到您意识到,您在发行说明的标题中输入了错误的文字...
您真幸运!与上传的二进制文件不同,您也可以使用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并进行调整。它们都很相似。