GitHub 发布上传
此页面记录了使用 dpl v1 进行部署,该版本目前是默认版本。下一个主要版本 dpl v2 将很快发布,我们建议您开始使用它。请参阅 我们的博文 以获取详细信息。dpl v2 文档可在此处找到。
Travis CI 可以自动将资源上传到 GitHub 存储库上的 Git 标签。
对于最小配置,请将以下内容添加到您的 .travis.yml
中
deploy:
provider: releases
api_key: "GITHUB OAUTH TOKEN"
file: "FILE TO UPLOAD"
skip_cleanup: true
on:
tags: true
此配置将使用“GITHUB OAUTH TOKEN”在标记的构建上上传“FILE TO UPLOAD”(相对于工作目录)。
确保您已将
skip_cleanup
设置为true
,否则 Travis CI 将删除构建期间创建的所有文件,这可能会删除您尝试上传的文件。
GitHub Releases 使用 Git 标签,因此了解标签如何影响 GitHub Releases 非常重要。
仅在标记的构建上部署 #
使用 on.tags: true
,您的 Releases 部署将仅在构建是标记构建时触发。
常规发布 #
当 draft
选项未设置为 true
(下面将详细介绍)时,将创建常规发布。常规发布需要标签。如果您设置了 on.tags: true
(如本文档中的初始示例),则满足此要求。
使用 draft: true
创建草稿发布 #
使用
deploy:
provider: releases
api_key: "GITHUB OAUTH TOKEN"
file: "FILE TO UPLOAD"
skip_cleanup: true
draft: true
生成的部署是一个草稿发布,只有存储库协作者才能看到。这使您有机会检查和编辑草稿发布。
在部署时设置标签 #
GitHub Releases 需要在部署时标记当前提交。如果您设置了 on.tags: true
,则保证提交具有标签。
但是,根据工作流,这并不理想。
在这种情况下,可以将设置标签推迟到您拥有所有必要信息为止。一个自然的地方是在 before_deploy
中进行。例如
before_deploy:
# Set up git user name and tag this commit
- git config --local user.name "YOUR GIT USER NAME"
- git config --local user.email "YOUR GIT USER EMAIL"
- export TRAVIS_TAG=${TRAVIS_TAG:-$(date +'%Y%m%d%H%M%S')-$(git log --format=%h -1)}
- git tag $TRAVIS_TAG
deploy:
provider: releases
api_key: "GITHUB OAUTH TOKEN"
file: "FILE TO UPLOAD"
skip_cleanup: true
在部署时未设置标签时 #
如果在部署时仍未设置标签,则部署提供程序会尝试将当前提交与远程的标签匹配,如果找到匹配项,则使用该标签。
如果多个标签分配给当前提交,并且您想要的标签未匹配,则可能会出现问题。在这种情况下,将您需要的标签(方法取决于您的用例)分配给 $TRAVIS_TAG
以解决此问题。
如果构建提交在部署时与任何标签都不匹配,则 GitHub 会在创建发布时创建一个标签。GitHub 生成的标签格式为 untagged-*
,其中 *
是一个随机的十六进制字符串。请注意,此标签会立即在 GitHub 上可用,因此会触发新的 Travis CI 构建,除非通过其他方式阻止;例如,通过 阻止列表 /^untagged/
。
覆盖发布上的现有文件 #
如果您需要覆盖现有文件,请将 overwrite: true
添加到 .travis.yml
的 deploy
部分。
使用 Travis CI 客户端填充初始部署配置 #
您还可以使用 Travis CI 命令行客户端 配置您的 .travis.yml
travis setup releases
或者,如果您使用的是私有存储库或 GitHub Apps 集成
travis setup releases --com
使用 OAuth 令牌进行身份验证 #
建议的身份验证方法是使用 GitHub OAuth 令牌。强烈建议您不要手动设置它,而是使用 travis setup releases
,它会自动创建并加密具有正确范围的 GitHub OAuth 令牌。
如果您无法使用 travis setup releases
,则可以按照以下步骤手动设置令牌
- 在 Github 帐户上创建一个个人访问令牌。它必须具有
public_repo
或repo
范围才能上传资源。 - 使用 Travis CLI 加密令牌:
travis encrypt [super_secret_token]
。请注意,您不能在 encrypt 命令中为令牌命名,就像您对环境变量所做的那样。 - 将安全的加密令牌添加到
.travis.yml
的 deploy 部分,位于api_key
下。
这将产生类似于以下内容的结果
deploy:
provider: releases
api_key:
secure: YOUR_API_KEY_ENCRYPTED
file: "FILE TO UPLOAD"
skip_cleanup: true
on:
tags: true
警告:GitHub OAuth 令牌的 public_repo
和 repo
范围授予对用户(公共)存储库的所有写入访问权限。出于安全考虑,理想情况下,api_key
应仅对 Travis 部署到 GitHub 发布的存储库具有写入访问权限。建议的解决方法是创建一个 机器用户——一个虚拟的 GitHub 帐户,它在每个存储库的基础上被授予写入访问权限。
使用用户名和密码进行身份验证 #
您还可以使用 user
和 password
选项使用您的 GitHub 用户名和密码进行身份验证。不建议这样做,因为它允许完全访问您的 GitHub 帐户,但设置最简单。建议使用 travis encrypt "GITHUB PASSWORD" --add deploy.password
加密您的密码。此示例使用用户名和密码进行身份验证。
deploy:
provider: releases
user: "GITHUB USERNAME"
password: "GITHUB PASSWORD"
file: "FILE TO UPLOAD"
skip_cleanup: true
on:
tags: true
部署到 GitHub Enterprise #
如果您希望将资源上传到 GitHub Enterprise 存储库,则必须使用您的 GitHub Enterprise API 端点覆盖 $OCTOKIT_API_ENDPOINT
环境变量
http(s)://"GITHUB ENTERPRISE HOSTNAME"/api/v3/
您可以在 存储库设置 或通过您的 .travis.yml
中配置此项。
env:
global:
- OCTOKIT_API_ENDPOINT="GITHUB ENTERPRISE API ENDPOINT"
上传多个文件 #
您可以使用 yml 数组表示法上传多个文件。此示例上传两个文件。
deploy:
provider: releases
api_key:
secure: YOUR_API_KEY_ENCRYPTED
file:
- "FILE 1"
- "FILE 2"
skip_cleanup: true
on:
tags: true
您还可以通过将 file_glob
设置为 true
来启用通配符。此示例包含给定目录中的所有文件。
deploy:
provider: releases
api_key: "GITHUB OAUTH TOKEN"
file_glob: true
file: directory/*
skip_cleanup: true
on:
tags: true
您可以使用 glob 模式递归查找文件
deploy:
provider: releases
api_key: "GITHUB OAUTH TOKEN"
file_glob: true
file: directory/**/*
skip_cleanup: true
on:
tags: true
请注意,file
中的所有路径都相对于当前工作目录,而不是相对于 $TRAVIS_BUILD_DIR
。
条件发布 #
您只能在满足特定条件时进行部署。请参阅 使用 on:
进行条件发布。
在发布之前或之后运行命令 #
有时您希望在发布 gem 之前或之后运行命令。您可以为此使用 before_deploy
和 after_deploy
阶段。只有在 Travis CI 实际推送发布时才会触发这些阶段。
before_deploy: "echo 'ready?'"
deploy:
..
after_deploy:
- ./after_deploy_1.sh
- ./after_deploy_2.sh
高级选项 #
来自 .travis.yml
的以下选项将传递到 Octokit API 的 #create_release 和 #update_release 方法。
tag_name
target_commitish
name
body
draft
(布尔值)prerelease
(布尔值)
请注意,body
中的格式 不会保留。
Git 子模块故障排除 #
GitHub Releases 在部署过程中执行许多 git 命令。因此,务必将工作目录设置为将为其创建发布的目录,这通常不是问题,但如果您在构建过程中克隆了另一个存储库或使用了子模块,则值得仔细检查。