Я создаю рабочий процесс с помощью Gitlab , Jenkins и, возможно, Nexus (мне нужно хранилище артефактов). Я хотел бы иметь GitLab для хранения релизов / двоичных файлов - возможно ли это удобным способом?
Я не хотел бы иметь другую службу, из которой можно было бы загрузить релиз (и документацию), но чтобы он каким-то образом был интегрирован с менеджером репозитория, точно так же, как выпуски обрабатываются, например GitHub. Какие-нибудь подсказки?
5 ответов
Обновление октября 2020 г .:
GitLab 13.5 теперь предлагает:
Прикрепите бинарные активы к выпускам
Если вы в настоящее время не используете GitLab для своих выпусков, потому что вы не можете прикреплять двоичные файлы к выпускам, ваш рабочий процесс стал намного проще.
Теперь у вас есть возможность прикреплять двоичные файлы к тегу выпуска из
gitlab.ci-yml
. Это расширяет поддержку Release Assets за счет включения двоичных файлов, а не только ссылок на ресурсы или исходного кода. Это упрощает вашим командам разработчиков внедрение GitLab и его использование для автоматизации процесса выпуска.См. документацию и Проблема.
Обновление, ноябрь 2015 г .: GitLab 8.2 теперь поддерживает выпуски .
С его API теперь вы можете создать и обновить релиз, связанный с тегом.
На данный момент это только возможность добавлять примечания к выпуску (текст с разметкой и вложения) в теги git (также известные как Releases).
- сначала загрузите двоичный файл выпуска
- создайте новый выпуск и разместите ссылку к загруженному двоичному файлу в описании
Обновление, май 2019 г .: GitLab 1.11 представляет интересный " Гостевой доступ к выпускам ":
Теперь гостевые пользователи ваших проектов могут просматривать опубликованные вами выпуски на странице «Выпуски».
Они смогут загружать ваши опубликованные артефакты, но им не разрешено загружать исходный код или просматривать информацию репозитория, такую как теги и коммиты .
Оригинальный ответ март 2015 г.
Это выполняется и предлагается в предложения 4156755:
Мы принимаем запросы на слияние для минимального предложения Ciro:
- Для каждого тега репозитория в разделе https://github.com/cirosantilli/test/ Release / tag / 3.0, позволяют загружать и скачивать список файлов. 2. Выгрузку и скачивание можно выполнить прямо из представления списка тегов. 3. Если тег удален, загрузки уничтожаются. (мы не принимаем изменение сообщения тега, упомянутое в недавних комментариях)
Комментарии к этому предложению включают:
Что делает его более интересным, так это следующий шаг.
Мне действительно нужен способ разрешить публичную загрузку артефактов из «выпусков» без доступа к исходному коду (т.е. сделать источники закрытыми только для команды проекта, кроме всего остального, например вики, «выпусков», системы отслеживания проблем).
Однако такая дополнительная функция выглядит более общей, и я отправил отдельный запрос функции для этого.
Тем не менее, я повторяю здесь свою точку зрения:
Хотя упрощенная версия «релизов» по-прежнему хороша, многие люди могут легко настроить внешний файловый сервер и указать URL-адреса в описании релиза / тега на этот сервер вне GitLab.
Другими словами, «релизы» могут не выглядеть привлекательно сейчас без некоторой будущей картины интеграции.
Сам Gitlab (сервер) предназначен для репозиториев git. Вы не должны хранить двоичные файлы в git. Nexus будет здесь подходящим вариантом. Вы можете добавить ссылку на нексус в описание репозитория или в файл readme (например, вы можете указать туда и свою сборку jenkins).
Возможно, вы захотите взглянуть на GitLab Continuous Integration, которая интегрируется с Gitlab. Это больше похоже на Дженкинса. Не знаю, идет ли он с хранилищем данных вроде Nexus.
Я использую инструмент командной строки, который я написал на 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 и внесите необходимые изменения. Все они очень похожи.
Мы используем 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}
Этот ответ будет в основном таким же, как и ответ от 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, б) загрузить его в любое другое место и сохранить ссылку в обоих случаях.
Хотя я НЕ рекомендую загружать двоичные файлы в репозиторий по указанной выше причине, вы просили об этом, поэтому вот способ:
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
.
Похожие вопросы
Связанные вопросы
Новые вопросы
git
Git — это распределенная система контроля версий с открытым исходным кодом (DVCS). Используйте этот тег для вопросов об использовании Git и рабочих процессах. Не используйте этот тег для общих вопросов по программированию, связанных с репозиторием Git. Не используйте этот тег для вопросов GitHub/GitHub Actions, не связанных с использованием git; вместо этого используйте [github] или [github-actions]. Не используйте тег [github] для проблем, связанных с Git, только потому, что репозиторий размещен на GitHub.