Я создаю рабочий процесс с помощью Gitlab , Jenkins и, возможно, Nexus (мне нужно хранилище артефактов). Я хотел бы иметь GitLab для хранения релизов / двоичных файлов - возможно ли это удобным способом?

Я не хотел бы иметь другую службу, из которой можно было бы загрузить релиз (и документацию), но чтобы он каким-то образом был интегрирован с менеджером репозитория, точно так же, как выпуски обрабатываются, например GitHub. Какие-нибудь подсказки?

75
Kasia Gauza 12 Мар 2015 в 18:11

5 ответов

Лучший ответ

Обновление октября 2020 г .:

GitLab 13.5 теперь предлагает:

Прикрепите бинарные активы к выпускам

Если вы в настоящее время не используете GitLab для своих выпусков, потому что вы не можете прикреплять двоичные файлы к выпускам, ваш рабочий процесс стал намного проще.

Теперь у вас есть возможность прикреплять двоичные файлы к тегу выпуска из gitlab.ci-yml. Это расширяет поддержку Release Assets за счет включения двоичных файлов, а не только ссылок на ресурсы или исходного кода. Это упрощает вашим командам разработчиков внедрение GitLab и его использование для автоматизации процесса выпуска.

https://about.gitlab.com/images/13_5/release_assets.png - прикрепить бинарные ресурсы к выпускам

См. документацию и Проблема.


Обновление, ноябрь 2015 г .: GitLab 8.2 теперь поддерживает выпуски .

С его API теперь вы можете создать и обновить релиз, связанный с тегом.
На данный момент это только возможность добавлять примечания к выпуску (текст с разметкой и вложения) в теги git (также известные как Releases).

Обновление, май 2019 г .: GitLab 1.11 представляет интересный " Гостевой доступ к выпускам ":

Теперь гостевые пользователи ваших проектов могут просматривать опубликованные вами выпуски на странице «Выпуски».
Они смогут загружать ваши опубликованные артефакты, но им не разрешено загружать исходный код или просматривать информацию репозитория, такую ​​как теги и коммиты .


Оригинальный ответ март 2015 г.

Это выполняется и предлагается в предложения 4156755:

Мы принимаем запросы на слияние для минимального предложения Ciro:

  1. Для каждого тега репозитория в разделе https://github.com/cirosantilli/test/ Release / tag / 3.0, позволяют загружать и скачивать список файлов. 2. Выгрузку и скачивание можно выполнить прямо из представления списка тегов. 3. Если тег удален, загрузки уничтожаются. (мы не принимаем изменение сообщения тега, упомянутое в недавних комментариях)

Комментарии к этому предложению включают:

Что делает его более интересным, так это следующий шаг.
Мне действительно нужен способ разрешить публичную загрузку артефактов из «выпусков» без доступа к исходному коду (т.е. сделать источники закрытыми только для команды проекта, кроме всего остального, например вики, «выпусков», системы отслеживания проблем).

Однако такая дополнительная функция выглядит более общей, и я отправил отдельный запрос функции для этого.

Тем не менее, я повторяю здесь свою точку зрения:
Хотя упрощенная версия «релизов» по-прежнему хороша, многие люди могут легко настроить внешний файловый сервер и указать URL-адреса в описании релиза / тега на этот сервер вне GitLab.
Другими словами, «релизы» могут не выглядеть привлекательно сейчас без некоторой будущей картины интеграции.

55
VonC 24 Окт 2020 в 20:36

Сам Gitlab (сервер) предназначен для репозиториев git. Вы не должны хранить двоичные файлы в git. Nexus будет здесь подходящим вариантом. Вы можете добавить ссылку на нексус в описание репозитория или в файл readme (например, вы можете указать туда и свою сборку jenkins).

Возможно, вы захотите взглянуть на GitLab Continuous Integration, которая интегрируется с Gitlab. Это больше похоже на Дженкинса. Не знаю, идет ли он с хранилищем данных вроде Nexus.

0
volker 12 Мар 2015 в 18:56

Я использую инструмент командной строки, который я написал на python в качестве ярлыка. Выполняет некоторые шаги методов 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()

Загрузка возвращает json со ссылкой и ссылку в формате уценки. Я нашел ссылку в формате markdown очень полезной для описания выпуска . Так как ссылку в описание нужно добавить самостоятельно.

Для создания релиза

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 - это выпуск.

Для других шагов в основном следуйте рекомендациям по API и внесите необходимые изменения. Все они очень похожи.

1
Fikret Anıl Haksever 14 Сен 2019 в 12:04

Мы используем 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}
1
schmunk 26 Ноя 2015 в 22:29

Этот ответ будет в основном таким же, как и ответ от VonC, только что описанный пошагово для менее опытных пользователей CI.

Итак, допустим, у вас есть действительно крутой коммит 30728cab, и вы хотите сделать эту версию своего кода новым выпуском ...

1) Создайте тег для своего коммита

git tag -a MY_TAG_NAME 30728cab

После этой команды вам будет предложено ввести описание, как когда вы вносите новые изменения в свой код.

2) Отправьте тег в удаленный репозиторий

Теги НЕ будут помещаться туда автоматически вместе с вашими коммитами! Вам нужно вручную отправить их на свой пульт.

git push REMOTE_REPO_NAME REMOTE_BRANCH_NAME MY_TAG_NAME

3) Загрузите файл

Теперь вы можете а) загрузить файл в репозиторий GitLab, б) загрузить его в любое другое место и сохранить ссылку в обоих случаях.

ВНИМАНИЕ! Файлы, загруженные в репозиторий 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"

Вы можете видеть, что 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

Вот и все! У вас есть первая полная версия!

Пока вы не поймете, что допустили ужасную опечатку в заголовке описания релиза ...

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.

22
Eenoku 29 Мар 2019 в 10:28