Как загрузить файл из черновика GitHub - PullRequest
1 голос
/ 21 марта 2020

Я использую AppVeyor для настройки CI для репозитория GitHub и загрузки артефактов сборки в черновик CI builds . Файл, например, находится в

https://github.com/an_organisation/a_project/releases/tag/untagged-1111aaaacccc0000dddd/filename.tar.gz

, и к нему можно получить доступ и загрузить из браузера.

Теперь я хотел бы получить доступ к этим загруженным артефактам из другого проекта AppVeyor (например, appveyor.yml скрипт). Я безуспешно пытался загрузить с помощью команды AppVeyor DownloadFile, curl и wget, используя следующие команды

  set DOWNLOAD_FILENAME=filename.tar.gz
  set DOWNLOAD_ADDRESS=https://github.com/an_organisation/a_project/releases/download/untagged-1111aaaacccc0000dddd/$DOWNLOAD_FILENAME

  wget --header "Authorization: token $GH_AUTH_TOKEN" --output-document=$DOWNLOAD_FILENAME $DOWNLOAD_ADDRESS

  wget --auth-no-challenge --header "Accept:application/octet-stream" --output-document=$DOWNLOAD_FILENAME "$DOWNLOAD_ADDRESS?access_token:$GH_AUTH_TOKEN"

  curl -fsSL -G --user "$APPVEYOR_ACCOUNT_NAME:$GH_AUTH_TOKEN" -o $DOWNLOAD_FILENAME $DOWNLOAD_ADDRESS

  curl -fsSL -G -H "Authorization: token $GH_AUTH_TOKEN" -H "Accept: application/octet-stream" -o $DOWNLOAD_FILENAME $DOWNLOAD_ADDRESS

  curl -fsSL -G -H "Authorization: token $GH_AUTH_TOKEN" -H "Accept: application/octet-stream" -o $DOWNLOAD_FILENAME https://api.github.com/repos/an_organisation/a_project/releases/download/untagged-1111aaaacccc0000dddd/

Медленно у меня возникает ощущение, что файл загружается из черновика через GitHub API или ссылка на скачивание невозможна.

Какая правильная команда для загрузки такого файла?

1 Ответ

1 голос
/ 22 марта 2020

TLDR Используйте API-ресурс Get Release с заголовком Accept: application/octet-stream:

curl -OJ -L -H "Accept: application/octet-stream" \
    -H "Authorization: Token $YOUR_TOKEN" \
    "https://api.github.com/repos/$REPO/releases/assets/$ASSET_ID"

Необходимо иметь идентификатор ресурса. Чтобы получить его, вам нужен releaseID, если у вас еще нет этой информации, используйте GET /repos/:user/:repo/releases:

curl -s -H "Authorization: Token $YOUR_TOKEN" \
   "https://api.github.com/repos/$REPO/releases" | jq '.[] | {(.name): .id}'

Затем получите идентификаторы активов, используя GET /repos/:user/:repo/releases/:release_id:

curl -s -H "Authorization: Token $YOUR_TOKEN" \
    "https://api.github.com/repos/$REPO/releases/$RELEASE_ID" | \
    jq -r '.assets[] | {(.id |tostring): .name}'

Затем, когда у вас есть идентификатор ресурса (может быть, он у вас уже есть), вы можете наконец использовать GET /repos/:user/:repo/releases/assets/:asset_id с заголовком Accept: application/octet-stream. Из документации :

Чтобы загрузить двоичный контент ресурса, установите заголовок Accept запроса в application / octet-stream. API будет перенаправлять клиента в определенное место или передавать его напрямую, если это возможно. Клиенты API должны обрабатывать оба ответа: 200 или 302.

Локальная загрузка следующего файла:

curl -OJ -L -H "Accept: application/octet-stream" \
    -H "Authorization: Token $YOUR_TOKEN" \
    "https://api.github.com/repos/$REPO/releases/assets/$ASSET_ID"
...