programing

GitLab에 릴리스 / 바이너리를 저장하는 방법은 무엇입니까?

copyandpastes 2021. 1. 15. 20:15
반응형

GitLab에 릴리스 / 바이너리를 저장하는 방법은 무엇입니까?


내가 가진 워크 플로우 건물입니다 Gitlab , 젠킨스 아마 - - 그리고 넥서스 (나는 이슈 스토리지를 필요). GitLab에서 릴리스 / 바이너리 를 저장하고 싶습니다 . 편리한 방법으로 가능합니까?

릴리스 (및 문서)를 다운로드 할 수있는 다른 서비스를 갖고 싶지 않지만, 예를 들어 GitHub에서 릴리스가 처리되는 것처럼 리포지토리 관리자와 어떻게 든 통합되도록하고 싶습니다. 단서가 있습니까?


2015 년 11 월 업데이트 : GitLab 8.2는 이제 릴리스를 지원합니다 .

이제 API 를 사용하여 태그와 관련된 릴리스를 만들고 업데이트 할 수 있습니다 .
현재로서는 릴리스 노트 (마크 다운 텍스트 및 첨부 파일)를 git 태그 (일명 릴리스)에 추가하는 기능뿐입니다.

2019 년 5 월 업데이트 : GitLab 1.11은 흥미로운 " 릴리스에 대한 게스트 액세스 "를 도입합니다 .

이제 프로젝트의 게스트 사용자가 릴리스 페이지에 게시 한 릴리스를 볼 수 있습니다.
게시 된 아티팩트를 다운로드 할 수 있지만 소스 코드를 다운로드하거나 태그 및 커밋과 같은 저장소 정보를 볼 수는 없습니다 .


원래 답변 2015 년 3 월

이것은 진행 중이며 제안 4156755 에서 제안되었습니다 .

Ciro의 최소 제안에 대한 병합 요청을 수락합니다.

  1. https://github.com/cirosantilli/test/releases/tag/3.0 아래의 각 저장소 태그에 대해 파일 목록을 업로드 및 다운로드 할 수 있습니다.
  2. 업로드 및 다운로드는 태그 목록보기에서 직접 수행 할 수 있습니다.
  3. 태그가 제거되면 업로드가 삭제됩니다. (최근 댓글에 언급 된 태그 메시지 수정은 허용되지 않습니다.)

그 제안에 대한 의견은 다음과 같습니다.

더 흥미롭게 만드는 것은 다음 단계입니다.
소스 코드에 액세스 할 수없는 상태에서 "릴리스"에서 아티팩트를 공개적으로 다운로드 할 수있는 방법을 원합니다 (예 : 위키, "릴리스", 이슈 트래커와 같은 다른 것을 제외하고는 프로젝트 팀 전용 소스를 비공개로 설정).

그러나 이러한 추가 기능은 더 일반적으로 보이며 이에 대한 별도의 기능 요청을 제출했습니다 .

그럼에도 불구하고 여기에서 내 요점을 반복합니다.
"릴리스"의 단순한 버전은 여전히 ​​가지고있는 것이 좋지만, 많은 사람들이 쉽게 외부 파일 서버를 설정하고 릴리스 / 태그 설명의 URL을 GitLab 외부의이 서버에 지정할 수 있습니다.
즉, "릴리스"는 미래의 통합 그림 없이는 매력적으로 보이지 않을 수 있습니다.


이 답변은 VonC의 답변과 기본적으로 동일하며 경험이 적은 CI 사용자를 위해 단계별 방식으로 설명합니다.

그래서, 정말 멋진 커밋 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) 다른 곳에 업로드하고 두 경우 모두 링크를 저장할 수 있습니다.

경고 : 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"

개인 토큰을 만들 수 있습니다 사용자 설정 -> 액세스 토큰 .

또한, 당신이 정말로 파일을 삭제 필요한 경우 , 당신은 수있는 프로젝트를 내보낼 폴더를 수동으로 삭제 updates, 다운로드 한 아카이브에서 이전 원격 저장소를 삭제하고 가져 와서 새로 만들 다운로드 한 수정 아카이브를.

4) 릴리스 생성

이제 마침내 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"

릴리스는 본질적으로 특정 태그와 연결되어 있으며 이후 특정 커밋에 연결되어 있음을 알 수 있습니다. 바이너리와의 연결은 단순히 해당 파일에 대한 링크를 제공하여 수행됩니다.

재미있는 점은 당신 descriptionMarkdown을 지원 한다는 것입니다 .하지만 그렇게 *.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.


우리는 scpGitlabCI에서 생성 된 바이너리 또는 보고서와 같은 파일을 복사 하는 데 사용 하고 있습니다.

# 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}

내가 사용하고 명령 줄 도구 내가 바로 가기로 파이썬으로 작성된 것입니다. 이전 답변 (업로드, 릴리스, 릴리스 삭제)에 설명 된 API 메서드의 일부 단계를 수행합니다.

소스 코드를 확인 하거나 직접 사용할 수 있습니다.

더 간단한 버전의 경우 python 및 requests.py로 이러한 작업에 관심이 있다면; 그것은 매우 사소합니다.

업로드 용

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()

Upload returns a json with the link and the markdown formatted link. I found markdown formatted link pretty useful for the release description. Since you have to add the link to the description yourself.

For Creating a Release

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()

JSON Response is the release.

For the other steps basically follow API guidelines and make the adjustments. All of them are pretty similar.


Gitlab (server) itself is for git repositories. You are not supposed to store binaries in git. Nexus would here the way to go. You might add a link to nexus in your repositories description or readme file (like you can point there to your jenkins build, too).

You might want to take a look into GitLab Continuous Integration which integrates with Gitlab. That seems to be more something like Jenkins. I do not know if it comes with a data storage like Nexus.

ReferenceURL : https://stackoverflow.com/questions/29013457/how-to-store-releases-binaries-in-gitlab

반응형