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.ymldeploy 部分。

使用 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,则可以按照以下步骤手动设置令牌

  1. 在 Github 帐户上创建一个个人访问令牌。它必须具有 public_reporepo 范围才能上传资源。
  2. 使用 Travis CLI 加密令牌:travis encrypt [super_secret_token]。请注意,您不能在 encrypt 命令中为令牌命名,就像您对环境变量所做的那样。
  3. 将安全的加密令牌添加到 .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_reporepo 范围授予对用户(公共)存储库的所有写入访问权限。出于安全考虑,理想情况下,api_key 应仅对 Travis 部署到 GitHub 发布的存储库具有写入访问权限。建议的解决方法是创建一个 机器用户——一个虚拟的 GitHub 帐户,它在每个存储库的基础上被授予写入访问权限。

使用用户名和密码进行身份验证 #

您还可以使用 userpassword 选项使用您的 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_deployafter_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 命令。因此,务必将工作目录设置为将为其创建发布的目录,这通常不是问题,但如果您在构建过程中克隆了另一个存储库或使用了子模块,则值得仔细检查。