我正在使用Gitlab、Jenkins和-可能-Nexus(需要一个工件存储)构建工作流。我希望GitLab可以方便地存储发行版/二进制文件,这是否可行?
我不想再使用另一个服务来下载发布(和文档),而是希望将其与代码库管理器整合,就像在GitHub中处理发布一样。有什么线索吗?
我正在使用Gitlab、Jenkins和-可能-Nexus(需要一个工件存储)构建工作流。我希望GitLab可以方便地存储发行版/二进制文件,这是否可行?
我不想再使用另一个服务来下载发布(和文档),而是希望将其与代码库管理器整合,就像在GitHub中处理发布一样。有什么线索吗?
2020年10月更新:
GitLab 13.5 现在提供了:
将二进制文件附加到发行版
如果您因为无法将二进制文件附加到发布版而没有使用GitLab,那么您的工作流程就变得简单多了。
现在,您可以从
gitlab.ci-yml
将二进制文件附加到发布标签。这扩展了发布资产的支持,包括二进制文件,而不仅仅是资产链接或源代码。这使得您的开发团队更容易采用GitLab并使用它来自动化您的发布过程。
2015年11月更新: GitLab 8.2 现在支持发布版。
通过其API,您现在可以创建和更新与标签相关联的发布版。
目前,仅能够将发布说明(Markdown文本和附件)添加到git标签(也称为发布版)中。
2019年5月更新:GitLab 1.11 引入了一个有趣的 "访客可访问发布版" 功能:
现在,您项目的访客用户可以查看您在发布页面上发布的版本。
他们将能够下载您发布的工件,但不允许下载源代码,也无法查看仓库信息,例如标签和提交。
原始回答于2015年3月
这是一个正在进行的项目,建议采用Ciro的最小提案:更有趣的是下一步。
我真的很想让公共用户从“发布”中下载工件,而不必访问源代码(即使其他内容如维基百科、“发布”、问题跟踪器仅限于项目团队私人使用)。
然而,这种额外的功能看起来更加通用,我已经提交了一个单独的功能请求。
尽管如此,我在这里重申我的观点:
虽然“发布”的简化版本仍然不错,但许多人可以轻松地设置外部文件服务器,并将URL指向GitLab之外的此服务器在发布/标记说明中。
换句话说,“发布”可能现在看起来并不吸引人,需要一些未来的集成方案。
这个答案基本上与VonC的答案相同,只是为了不那么有经验的CI用户以逐步方式进行描述。
所以,假设你有一个非常酷的提交30728cab,并且你想将这个版本的代码作为新版本发布...
git tag -a MY_TAG_NAME 30728cab
输入此命令后,您将被要求填写描述,就像提交新代码更改时一样。
标签不会随着您的提交自动推送! 您需要手动将它们推送到远程存储库。
git push REMOTE_REPO_NAME REMOTE_BRANCH_NAME MY_TAG_NAME
现在您可以选择a)将文件上传到GitLab存储库,b)将其上传到其他任何地方并在两种情况下保存链接。
警告:上传到GitLab存储库的文件很难删除,并且稍后无法查看其链接!
虽然我不建议将二进制文件上传到存储库,因为上述原因,但您要求这样做,所以这是方法:
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"
私有令牌可以在用户设置->访问令牌中创建。
此外,如果您真的需要删除文件,您可以导出项目,手动从下载的存档中删除更新
文件夹,删除原来的远程存储库,并通过导入下载和修改的存档创建一个新的存储库。
现在我们可以使用发布将所有内容终于联系在一起。
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"
#!/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
。
sed -zE 's/\r\n|\n/\\n/g' < ${DESCRIPTION_FILE_PATH}
来读取文件,解决了我的问题。 - James Makimport 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()
import requests
secret_token = "<your secret token>"
project_id = "<your project id>"
api_root = "https://gitlab.com/api/v4"
desc = """
Your release description. **You can use markdown !**
Don't forget to add download link here.
"""
headers = {
'PRIVATE-TOKEN': secret_token,
}
data = {
"description": desc
}
r_new_release = requests.post(uri, data=data, headers=headers)
if(r_new_release.status_code != 201 and r_new_release.status_code != 200):
raise ValueError(f"Releases API responded with invalid status {r_new_release.status_code}")
new_release = r_new_release.json()
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}
Gitlab(服务器)本身是用于git存储库的。您不应该在git中存储二进制文件。Nexus将是正确的选择。您可以在存储库描述或readme文件中添加指向nexus的链接(就像您也可以将其指向jenkins构建一样)。
您可能想要查看与Gitlab集成的GitLab持续集成。那似乎更像Jenkins。我不知道它是否带有像Nexus这样的数据存储。