Как выпустить сборку артефактного актива на GitHub со сценарием?
Я пытаюсь выяснить процесс с одной командой для создания сборки на GitHub.
То, что я ожидаю, это запустить какой-то command- выпуск, скажем, и сценарий make release создает артефакт выпуска, а затем загружает его в GitHub каким-то образом.
Тем не менее, я довольно смущен тем, как на самом деле получить артефакт релиза на GitHub. Исходный код потрясающий, но не каждый хочет делать свои собственные сборки. :-)
Ответы
Ответ 1
Обновить сентябрь 2013 г., вы можете автоматизировать выпуск (API в режиме предварительного просмотра)
Обновление января 2014 года, есть неофициальное приложение командной строки, называемое github-release Nicolas Hillegeer (aktau
), для создания релизов и загрузки (двоичных) артефактов.
Он использует новый API выпусков github, упомянутый выше. Посмотрите Makefile проекта, чтобы узнать, как его автоматизировать еще больше.
Пример:
# create a formal release
$ github-release release \
--user aktau \
--repo gofinance \
--tag v0.1.0 \
--name "the wolf of source street" \
--description "Not a movie, contrary to popular opinion. Still, my first release!" \
--pre-release
Этот API немного отличается из-за двоичных активов. Мы используем заголовок Accept для согласования содержимого при запросе актива релиза.
Для получения представления API выполните стандартный тип API-интерфейса API:
$ curl -i -H "Authorization: token TOKEN" \
-H "Accept: application/vnd.github.manifold-preview" \
"https://uploads.github.com/repos/hubot/singularity/releases/assets/123"
HTTP/1.1 200 OK
{
"id": 123,
...
}
Передайте "application/octet-stream" для загрузки двоичного содержимого.
$ curl -i -H "Authorization: token TOKEN" \
-H "Accept: application/octet-stream" \
"https://uploads.github.com/repos/hubot/singularity/releases/assets/123"
HTTP/1.1 302 Found
Загрузки обрабатываются одним запросом сопутствующей услуге "uploads.github.com
".
$ curl -H "Authorization: token TOKEN" \
-H "Accept: application/vnd.github.manifold-preview" \
-H "Content-Type: application/zip" \
--data-binary @build/mac/package.zip \
"https://uploads.github.com/repos/hubot/singularity/releases/123/assets?name=1.0.0-mac.zip"
Обновление 2d июля 2013 г. теперь вы можете определить выпуск.
![release]()
- Релизы сопровождаются примечаниями к выпуску и ссылками для загрузки программного обеспечения или исходного кода.
- Следуя соглашениям многих проектов Git, релизы привязаны к тегам Git. Вы можете использовать существующий тег или позволить релизам создавать тег при его публикации.
- Вы также можете присоединить двоичные активы (например, скомпилированные исполняемые файлы, миниатюрные скрипты, документацию) к выпуску. После публикации сведения о выпуске и активы доступны для всех, кто может просматривать репозиторий.
Это то, что заменяет старую службу загрузки , которая была удалена в декабре 2012 года!
make release script создает артефакт выпуска, а затем загружает его в github каким-то образом.
Это означало бы добавление его ( "он" - это доставка из одного или нескольких файлов, в том числе двоичных файлов) в обычное локальное репо, а затем перетаскивание этого репо на его соответствие репозиторию GitHub.
При этом причина, по которой GitHub не упоминается ни в одной задаче "выпуска", состоит в том, что Git является системой управления исходным кодом и не подходит для двоичных файлов.
Он может иметь эти файлы (двоичные файлы), конечно, но не создан для их регулярного использования из-за раздутого размера репо через некоторое время: каждое клонирование будет занимать больше времени и дольше.
См. Каковы ограничения Git, а также "git - если исходные файлы и хранилище находятся на одной машине?".
Ответ 2
Приготовление:
1) Загрузите github-релизы и поместите его исполняемый файл в свой PATH.
2) Создайте токен в https://github.com/settings/applications#personal-access-tokens, скажем, abc123
Загрузка артефакта:
1) Скажем, вы только что скомпилировали то, что вы решили назвать версией 3.1, и хотите загрузить его.
2) Убедитесь, что вы совершили все.
3) Запустите эти пять команд:
git tag v3.1
git push
git push --tags
github-release release --security-token abc123 --user <you> --repo <yourrepo> \
--tag v3.1
github-release upload --security-token abc123 --user <you> --repo <yourrepo> \
--tag v3.1 --name <thefile> --file <thefile>
Вы можете загрузить несколько файлов, например, для разных операционных систем.
(На основе ответа VonC, который, к сожалению, не описывает, как загрузить артефакт)
Ответ 3
Функция загрузки github объясняется здесь:
Добавить бинарный дистрибутив в ссылку загрузки github
Вы можете, конечно, добавить загрузку (двоичный файл, созданный с использованием процесса сборки) с использованием API, описанного здесь: http://developer.github.com/v3/repos/downloads/
Ответ 4
Если вы используете Maven, вы можете добавить GitHub Downloads Maven Plugin (https://github.com/github/maven-plugins/#downloads-plugin) и просто выполните:
$ mvn clean install ghDownloads:upload
Ответ 5
Github имеет API для доступа к своей собственной системе загрузки файлов.
Репо загрузки позволяет вам предоставлять двоичные файлы для пользователей - хотя может быть ограничение на размер и число. API обеспечивает доступ к автоматическим агентам.
Взгляни на:
http://developer.github.com/v3/repos/downloads/ для информации об использовании.
Функция не используется много, но определенно работает. Вы можете перейти к любому репозиторию github, щелкнуть вкладку "Загрузки", чтобы увидеть их.
Пример загружаемых файлов:
http://github.com/dannystaple/emacs_cheat_sheets/downloads - HTML файл, предлагаемый там, фактически является встроенным артефактом, а не источником. Я пытаюсь шорохивать лучший (двоичный) пример, но нет причин, по которым невозможно было бы использовать исполняемые файлы, zips/tarballs и другие типы файлов.
Эти загрузки НЕ совпадают с исходными tarball для репо или его тегов. Любой произвольный файл может быть загружен таким образом.
Ответ 6
У меня была та же проблема, взломал маленький питон, чтобы сделать это для меня. Должна сказать, что это была боль, s3 - это полное freakshow.
https://raw.github.com/reklis/utilityscripts/master/github-upload
#!/opt/local/bin/python2.7
import json
import requests
import sys
import argparse
import os
import mimetypes
import pycurl
import cStringIO
from xml.dom import minidom
github_api_root = "https://api.github.com/"
def parse_args():
parser = argparse.ArgumentParser(description='post a file to github as a download')
parser.add_argument('--user', dest='user', help='github username', required=True)
parser.add_argument('--pass', dest='password', help='github password', required=True)
parser.add_argument('--repo', dest='repo', help='the name of the github repo', required=True)
parser.add_argument('--file', dest='filepath', help='path of the local file to upload', required=True)
parser.add_argument('--desc', dest='description', help='descriptive text about this file', required=True)
parser.add_argument('--owner', dest='owner', help='owner of the github repository', required=True)
args = parser.parse_args()
# print args
return args
def make_dl_post_url(owner, repo):
url = "%srepos/%s/%s/downloads" % (str(github_api_root), str(owner), str(repo))
# print url
return url
def make_dl_delete_url(owner, repo, dlid):
url = "%srepos/%s/%s/downloads/%s" % (str(github_api_root), str(owner), str(repo), str(dlid))
# print url
return url
def add_github_reference(args):
dl_post_url = make_dl_post_url(args.owner, args.repo)
fp = args.filepath
filename = os.path.basename(fp)
filesize = os.path.getsize(fp)
mtype, mdetails = mimetypes.guess_type(fp)
file_description = {
'name': filename,
'size': filesize,
'description': args.description,
'content_type': mtype
}
# print json.dumps(file_description, indent=2)
github = requests.post(dl_post_url, auth=(args.user, args.password), data=json.dumps(file_description))
resp = github.json
# print json.dumps(resp, indent=2)
return resp
def remove_github_reference(args, dlid):
dl_delete_url = make_dl_delete_url(args.owner, args.repo, dlid)
github = requests.delete(dl_delete_url, auth=(args.user, args.password))
delete_ok = (204 == github.status_code)
return delete_ok
def post_file_to_s3(file_path, gh):
# s3 is very particular with field ordering
# curl \
# -F "key=downloads/octocat/Hello-World/new_file.jpg" \
# -F "acl=public-read" \
# -F "success_action_status=201" \
# -F "Filename=new_file.jpg" \
# -F "AWSAccessKeyId=1ABCDEF..." \
# -F "Policy=ewogIC..." \
# -F "Signature=mwnF..." \
# -F "Content-Type=image/jpeg" \
# -F "[email protected]_file.jpg" \
# https://github.s3.amazonaws.com/
s3_ok = 201
xml_buffer = cStringIO.StringIO()
try:
post_fields = [
('key', str(gh['path'])),
('acl', str(gh['acl'])),
('success_action_status', str(s3_ok)),
('Filename', str(gh['name'])),
('AWSAccessKeyId', str(gh['accesskeyid'])),
('Policy', str(gh['policy'])),
('Signature', str(gh['signature'])),
('Content-Type', str(gh['mime_type'])),
('file', (pycurl.FORM_FILE, file_path))
]
# print post_fields
s3 = pycurl.Curl()
s3.setopt(pycurl.SSL_VERIFYPEER, 0)
s3.setopt(pycurl.SSL_VERIFYHOST, 0)
s3.setopt(pycurl.POST, 1)
s3.setopt(pycurl.URL, str(gh['s3_url']))
s3.setopt(pycurl.HTTPPOST, post_fields)
# s3.setopt(pycurl.VERBOSE, 1)
# accumulate string response
s3.setopt(pycurl.WRITEFUNCTION, xml_buffer.write)
s3.perform()
file_upload_success = (s3_ok == s3.getinfo(pycurl.HTTP_CODE))
xml_payload = minidom.parseString(xml_buffer.getvalue())
if (file_upload_success):
location_element = xml_payload.getElementsByTagName('Location')
print location_element[0].firstChild.nodeValue
else:
print xml_payload.toprettyxml()
except Exception, e:
print e
file_upload_success = False
finally:
s3.close()
return file_upload_success
def main():
mimetypes.init()
args = parse_args()
# step 1: tell github about the file
gh = add_github_reference(args)
# step 2: upload file to s3
if ('errors' in gh):
print json.dumps(gh, indent=2)
else:
file_upload_success = post_file_to_s3(args.filepath, gh)
# cleanup if upload failed
if (False == file_upload_success):
removed_ok = remove_github_reference(args, gh['id'])
if (removed_ok):
print "removed github reference"
else:
print "failed to remove github reference"
if __name__ == '__main__':
main()
Ответ 7
hub
официальный инструмент GitHub CLI для Go-based
https://github.com/github/hub
Сначала установите Go. На Ubuntu: https://askubuntu.com/questions/959932/installation-instructions-for-golang-1-9-into-ubuntu-16-04/1075726#1075726
Затем установите hub
:
go get github.com/github/hub
Нет пакета Ubuntu: https://github.com/github/hub/issues/718
Затем изнутри вашего репо:
hub release create -a prebuilt.zip -m 'release title' tag-name
Эта:
- запрашивает пароль в первый раз, а затем автоматически создает и сохраняет токен API локально
- создает аннотированный тег на удаленном имени
tag-name
- создает выпуск, связанный с этим тегом
- загружает
prebuilt.zip
в качестве вложения
Вы также можете предоставить свой существующий токен API с переменной среды GITHUB_TOKEN
.
Для других операций release
см.
hub release --help
Протестировано на hub
de684cb613c47572cc9ec90d4fd73eef80aef09c.
Пример загрузки Python APIv3 без каких-либо внешних зависимостей
Применение:
GITHUB_TOKEN=<token> ./create-release username/reponame <tag-name> <path-to-upload>
Автор сценария:
#!/usr/bin/env python3
import json
import os
import sys
from urllib.parse import urlencode
from urllib.request import Request, urlopen
repo = sys.argv[1]
tag = sys.argv[2]
upload_file = sys.argv[3]
token = os.environ['GITHUB_TOKEN']
url_template = 'https://{}.github.com/repos/' + repo + '/releases'
# Create.
_json = json.loads(urlopen(Request(
url_template.format('api'),
json.dumps({
'tag_name': tag,
'name': tag,
'prerelease': True,
}).encode(),
headers={
'Accept': 'application/vnd.github.v3+json',
'Authorization': 'token ' + token,
},
)).read().decode())
# This is not the tag, but rather some database integer identifier.
release_id = _json['id']
# Upload.
with open(upload_file, 'br') as myfile:
content = myfile.read()
_json = json.loads(urlopen(Request(
url_template.format('uploads') + '/' + str(release_id) + '/assets?' \
+ urlencode({'name': os.path.split(upload_file)[1]}),
content,
headers={
'Accept': 'application/vnd.github.v3+json',
'Authorization': 'token ' + token,
'Content-Type': 'application/zip',
},
)).read().decode())
И релиз, и создание актива не сработают с 422, если они уже существуют. Обходите это, сначала удалив релиз или актив. Вот пример.
Ответ 8
Я бы предложил использовать сопутствующий сайт с открытым исходным кодом и разместить там файлы.
Мне это нравится - http://www.cloudbees.com/foss/foss-dev.cb - вы получаете настройку jenkins для создания своего проекта, тестирования вашего проекта, а затем архивных артефактов могут быть распределены.
Таким образом, все сообщения об ошибках/обсуждение/вики могут храниться в github.
Ответ 9
Для тех, кто использует gradle, плагин gradle-github-plugin также позволяет создавать релизы и прикреплять файлов к ним.
- Добавьте плагин к
gradle.build
:
plugins {
id "co.riiid.gradle" version "X.Y.Z"
}
- Настройте загрузку. Пример:
github {
owner = 'riiid'
repo = 'gradle-github-plugin'
token = 'XXXXXXXXXXXXXXXXXXXXX'
tagName = '0.1.0'
targetCommitish = 'master'
name = 'v0.1.0'
body = """# Project Name
Write `release note` here.
"""
assets = [
'app/build/outputs/apk/app-release.apk',
'app/build/outputs/mapping/release/mapping.txt',
'app/build/outputs',
...
]
}