54

我想在我的开源项目中使用Travis CI 。Travis 没有提供任何方法来发布生成的工件的问题(尽管,他们在未来的计划中有这个)。

在某处发布/上传工件的解决方法是什么?我被允许在 CI 机器上执行任何脚本。

简单上传可以,但存在安全问题:任何人都可以上传内容,就像所有来源都是公开的一样。

4

10 回答 10

44

GitHub 分步发布

该方法在https://stackoverflow.com/a/24100779/895245中被提及,并且在https://docs.travis-ci.com/user/deployment/releases/中的记录很差,所以这里有更详细的说明一步步。

它将工件上传到https://github.com/<username>/<repo>/releases您推送的每个 Git 标签都存在的 GitHub 版本。

  1. 在https://github.com/settings/tokens下获取个人访问令牌

    仅对公共存储库启用“public_repo”访问,对私有存储库启用“repo”。

    将令牌保存在某处,因为您只能看到一次。

  2. 安装travis宝石:

    gem install travis
    # See: https://stackoverflow.com/a/33119804/895245
    gem update --system
    

    然后cd进入您的存储库并:

    travis encrypt <api-token>
    

    但最近人们报告说travis encrypt -r githubusername/repositoryname --org需要这样做,请参阅:https ://github.com/travis-ci/travis-ci/issues/8128

    这将产生如下输出:

    secure: "<encrypted-token>"
    

    记下大的加密令牌。

  3. 使用.travis.yml如下:

    script:
      # This command generates a release.zip file.
      - make dist
    deploy:
      provider: releases
      api_key:
        secure: "<encrypted-token>"
      file: 'release.zip'
      skip_cleanup: true
      on:
        tags
    

    发生的情况是,Travis 替换了 every something: secure: <encrypted-string>,正如something: <decrypted-string>在以下位置所解释的那样:http: //docs.travis-ci.com/user/encryption-keys/

    这是安全的,因为只有您授权的推送才能解密字符串,因此如果恶意用户试图发出拉取请求以获取您的字符串,它应该只显示加密的字符串。

    现在,每当您推送带有标签的提交时,Travis 都会上传release.zip到发布版:

    git commit -m 1.0
    git tag -m 1.0 1.0
    git push --tags
    

    如果您之后已经推送了提交和标签,您可能需要单击 Travis UI 上的“重新启动构建”按钮才能上传。

https://stackoverflow.com/a/38037626/895245有一些过程截图。

替代方法:环境变量

  1. 除了加密字符串,我们还可以使用隐藏的环境变量。

    在存储库的 Travis 设置上https://travis-ci.org/<me>/<myrepo>/settings创建一个环境变量:

    GITHUB_API_KEY=<token>
    

    并确保将“在构建日志中显示值”标记为“关闭”,并使用:

    api_key: '$GITHUB_API_KEY'
    

    虽然这不会显示在拉取请求的日志中,但这种方法风险更大,因为您可能会错误地列出构建的环境。

    好处是这种方法更容易理解。

我的一个简单示例,它将 Gnuplot 生成的图像上传到 GitHub 版本:

关于 GitHub Pages 部署的问题:如何从 Travis CI 发布到 Github Pages?

于 2015-10-13T18:00:52.517 回答
30

最近宣布了“github发布上传”功能。它正式支持所需的一切。请参阅http://docs.travis-ci.com/user/deployment/releases/

于 2014-06-07T19:22:46.530 回答
10

如果您的项目基于 GitHub(可能使用 Travis),那么最简单的方法是签入gh-pages分支下生成的工件。在GitHub 上查看更多信息。

如何做到这一点在很大程度上取决于使用的构建系统。使用 Maven,您可以使用- 您可以在此处maven-scm-plugin找到示例。

编辑:你可以在这里找到一个完整的例子:https ://github.com/tonnymadsen/ui-bindings/blob/master/com.rcpcompany.updatesite/pom.xml

于 2012-09-17T18:16:03.160 回答
8

所以首先你必须确保你尝试部署发布工件。所以先在 Github 上做标签。要手动执行:

在此处输入图像描述

然后在.travis.yml文件中添加以下配置。对于 gradle 用户

language: java
jdk:
  - oraclejdk7

sudo: required

before_install:
 - chmod +x gradlew

script:
  - ./gradlew clean build -i --continue

deploy:
  provider: releases
  api_key: ${api_key}
  file: "build/libs/Project.jar"
  skip_cleanup: true
  on:
    all_branches: true
    tags: true

这里的 api_key值是Travis Ci环境变量。其中指向 Github api_key。

file是从构建生成的构建工件。我们希望将其部署到gitHub

on:
    all_branches: true
    tags: true

是要部署的标签的强制配置。

不,您必须从 github 获取 api_key:

  1. 转到个人访问令牌

在此处输入图像描述

  1. 选择生成新令牌

在此处输入图像描述

  1. 为api_key选择适当的范围 在此处输入图像描述
  2. 复制生成的 api_key 在此处输入图像描述
  3. 转到 Travis Ci 并添加环境变量。为此,选择设置 在此处输入图像描述
    1. 粘贴生成的api_key 在此处输入图像描述

当您触发新构建时,将部署工件。 在此处输入图像描述

于 2016-06-26T10:37:45.347 回答
6

更新:GitHub 现在禁用下载 API,所以下面的答案是想法。

我的解决方案是使用 travis-ci 提供的“安全环境变量”和带有相关脚本的“GitHub repo Download API”

GitHub 中的每个 repo 都有下载页面,也是发布你的工件的好地方,并且它有相关的“Repo 下载 API” http://developer.github.com/v3/repos/downloads/

最后,在.travis-ci.yml它看起来像下面

env:
  global:
    - secure: "qkE5/TVKQV/+xBEW5M7ayWMMtFwhu44rQb9zh3n0LH4CkVb+b748lOuW3htc\nXfnXU8aGzOsQBeCJZQstfzsHFPkll+xfhk38cFqNQp7tpMo/AOZIkqd2AIUL\n0bgaFD+1kFAxKTu02m11xzkDNw6FuHMVvoMEQu/fo115i2YmWHo="  

after_script:
  - ./github-upload.rb sdcamp.zh.pdf larrycai/sdcamp --description "generated by travis-ci, $TRAVIS_JOB_ID" --force --name sdcamp.zh.snapshot.pdf --skip-ssl-verification -t $GITHUB_TOKEN

查看我的详细博客: http: //larrycaiyu.com/blog/2012/10/25/publish-the-artifacts-inside-travis-ci-to-github/

于 2012-10-25T11:16:25.663 回答
6

我意识到这是一个较老的问题,但我想添加另一个我认为比迄今为止讨论的更好的解决方案。

使用二进制托盘:

OP 有兴趣从 Travis-CI发布工件。我建议将https://bintray.com/组织或您自己的个人帐户一起使用(两者都有效,但对于 github 组织,拥有与其匹配的组织并发布工件可能更有意义从那个 github org 转到它匹配的 bintray org)。

这样做的原因是因为 bintray 提供的内容以及它对开源项目的支持。我建议您在这里查看他们的概述:http ://www.jfrog.com/bintray/

您还可以链接到 JCenter,这使得您发布的内容更容易供其他人使用/下载/使用(通过 maven、gradle、SBT 等)。

对于 Java + Maven:

一旦你设置了 bintray(你的帐户或组织),你可以轻松地将它与 travis 集成。对于 java 和 maven 构建,您可以使用travis-ci 的加密变量选项来加密${BINTRAY_USER}${BINTRAY_API_KEY}. 然后,您可以设置 maven deploy 以将发布推送到 bintray。在 mavensettings.xml文件中,您只需引用使用 travis 作为用户/密码加密的环境变量,即:

  <servers>
    <server>
      <id>my-bintray-id</id>
      <username>${env.BINTRAY_USER}</username>
      <password>${env.BINTRAY_API_KEY}</password>
    </server>
  </servers>

接下来,您将该distributionManagement部分添加到您的项目中pom.xml,如下所示:

<distributionManagement>
    <repository>
        <id>my-bintray-id</id>
        <url>https://api.bintray.com/maven/myUserName/myRepoName/my_awesome_project;publish=1</url>
    </repository>
</distributionManagement>

然后,您将设置.travis.yml文件以“检测”何时发布。我使用了本地开发盒中的maven 发布插件的前半部分:(mvn release:prepare忽略后半部分 -- release:preform)。这将代表您制作一个标签,在 pom 中修改版本等。你最终得到的是 github 中一个版本的标签(不是 -SNAPSHOT)。这个带标签的提交会在下游到达 travis,您.travis.yml将在其中配置 Travis 以构建和发布。

在您的.travis.yml中,将其配置为在调用之前TRAVIS_TAG测试,TRAVIS_PULL_REQUEST以及您想要进行的任何其他检查。你会在. 这样,travis一直在构建,但在它是一个标签并满足您想要的其他条件时运行(例如,JDK8 构建)。这是一个例子:mvn deployafter_success mvn deploy.travis.yml

language: java

jdk:
  - oraclejdk7
  - oraclejdk8

after_success:
  - mvn clean cobertura:cobertura coveralls:report javadoc:jar
  - test "${TRAVIS_PULL_REQUEST}" == "false" && test "${TRAVIS_TAG}" != "" && mvn deploy --settings travis-settings.xml

branches:
  only:
    - master
      # Build tags that match this regex in addition to building the master branch.
    - /^my_awesome_project-[0-9]+\.[0-9]+\.[0-9]+/

env:
  global:
    - secure: cfHTvABEszX79Dhj+u8/3EahMKKpAA2cqh7s3JACtVt5HMEXkkPbeAFlnywO+g4p2kVENcQGbZCiuz2FYBtN3KrIwFQabJE8FtpF57nswPRrmpRL+tWcYtipVC2Mnb4D7o6UR2PiC7g20/9EEWV7OeddXU3fzNBBW+LXkKAL20Ishg/jTDj+DIMFeVU8a6gd+6G2r8rf2jr2PMUeq1lO+eSkm3cjQLjRJN3CNY5GQToV/l1hef732y//6K9prP+H9vbkx+c7KF6W6OsQuXha9hy038J4ZXFWiNZdLUZLytrTcsOdbL2d8qEBv38ycs71kw0eHINMcPbNWYaxWHKeQRIievSPbTqOmm5BSh/keBRQe+aBzKrzw680QcRcnDMFePb1uu9VhpCabu0fBTer/7MENhR/QDoW8g4ydZNqXSWqiJBaYomENhjUF3v/4KzvX5P8bPlVBvgyAAcAzY8+MwLVeZKsJIUAHuS5v6kHSb0F17pvAb1XM+jet92PT/tRh75kVHtwtiPffhCd2/LzjmCLH31CC4WUZDG4OGw/8SbMiGX1Kww1Y9hSp09rQ9ytLaQa1kDa2Nv4syjJRVKWQf3/TS1VLqXBYVZXufY/XtyA0gDV0ZumwNo8ukT5Cnc7hC9oFkRvPkJxvNTzgDWkd6TVUDligxgLQHS/2fZpNo=
    - secure: cfHTvABEszX79Dhj+u8/3EahMKKpAA2cqh7s3JACtVt5HMEXkkPbeAFlnywO+g4p2kVENcQGbZCiuz2FYBtN3KrIwFQabJE8FtpF57nswPRrmpRL+tWcYtipVC2Mnb4D7o6UR2PiC7g20/9EEWV7OeddXU3fzNBBW+LXkKAL20Ishg/jTDj+DIMFeVU8a6gd+6G2r8rf2jr2PMUeq1lO+eSkm3cjQLjRJN3CNY5GQToV/l1hef732y//6K9prP+H9vbkx+c7KF6W6OsQuXha9hy038J4ZXFWiNZdLUZLytrTcsOdbL2d8qEBv38ycs71kw0eHINMcPbNWYaxWHKeQRIievSPbTqOmm5BSh/keBRQe+aBzKrzw680QcRcnDMFePb1uu9VhpCabu0fBTer/7MENhR/QDoW8g4ydZNqXSWqiJBaYomENhjUF3v/4KzvX5P8bPlVBvgyAAcAzY8+MwLVeZKsJIUAHuS5v6kHSb0F17pvAb1XM+jet92PT/tRh75kVHtwtiPffhCd2/LzjmCLH31CC4WUZDG4OGw/8SbMiGX1Kww1Y9hSp09rQ9ytLaQa1kDa2Nv4syjJRVKWQf3/TS1VLqXBYVZXufY/XtyA0gDV0ZumwNo8ukT5Cnc7hC9oFkRvPkJxvNTzgDWkd6TVUDligxgLQHS/2fZpNo=

(安全只是一个虚构的例子,在你用 travis 加密你的 bintray 用户和bintray api 密钥后,你会在你的 yaml 中看到类似的东西)

这为您提供了一个完整的端到端系统,用于将工件“发布到野外”,任何人都可以在其中消费和使用。您正在使用从头开始设计为工件存储库(bintray)的服务,并且您正在以一种智能的方式使用 Travis来检查 maven release:prepare 生成的标签。总之,你决定什么时候发布(mvn release:prepare从你本地的开发箱),然后 travis 把它们送到 bintray。

其他

请注意,github 中有一个现有的travis-ci/dpl 拉取请求,以在 Travis 和构建的 bintray 之间获得更紧密的集成(travis 提供程序)。这使得 travis 将工件发送到 bintray 变得更加容易(发布;bintray 不打算保存 SNAPSHOT,而是使用Artifactory)。尽管 github 对发布有一些支持,但在撰写本文时,我相信 bintray 在这个角色上更胜一筹,并且是使用正确的工具。

祝你好运!

于 2015-06-03T04:28:32.600 回答
2

我在https://github.com/vorburger/mvnDeployGitHubTravisCI整理了一个示例项目,说明了如何执行此操作(部分基于在 github 上托管 Maven 存储库)。如链接答案中所述,基本思想是使用maven-deploy-plugin 的 altDeploymentRepository准备本地存储库,然后使用github site-maven-plugin将您的工件推送到 GitHub。如上所述,将 Travis 连接到 GitHub 身份验证。

于 2013-08-08T07:07:59.030 回答
2

TravisCI 现在支持发布:https ://docs.travis-ci.com/user/deployment/releases/

GitHub 删除了下载 API,但将其替换为版本:https ://github.com/blog/1547-release-your-software

于 2016-04-14T07:28:55.327 回答
0

您应该问自己的第一个问题是,您是要从 CI 构建发布工件还是要部署版本(即到 GitHub)。

因为这里有很多关于将版本上传到 GitHub 的答案,所以我不会进一步讨论这个话题。

如果您想获取快照/CI 构建工件,最简单的方法是将它们上传到 AWS S3。不幸的是,这方面的文档有点粗糙,尤其是当您不熟悉 AWS 时。所以这是你必须做的:

1. 为 Travis 创建 AWS IAM 用户

为此,请转到https://console.aws.amazon.com/iam/home?#/users并为 Travis 创建一个具有编程访问类型的新用户帐户。通过在权限选项卡上应用现有策略AmazonS3FullAccess授予它对 S3 的访问权限。

创建用户后,请确保复制访问密钥 ID以及该用户的秘密访问密钥

2. 为 Travis 创建一个 AWS S3 存储桶以上传到

那个很简单。唯一需要注意的是避免仅使用 Signature v4 的区域,例如us-east-2,eu-central-1等(因为https://github.com/travis-ci/artifacts/issues/57)。一个可靠的选择是us-east-1,这也恰好是 Travis 期望的默认值,因此可以为您节省一些额外的配置。当然,您也可以使用满足此要求的现有存储桶。

3. 将环境变量添加到 Travis CI 存储库设置

接下来,转到 Travis 中存储库的设置。创建以下新环境变量:

ARTIFACTS_KEY=(AWS access key id from step 1)
ARTIFACTS_SECRET=(AWS secret access key from step 1)
ARTIFACTS_BUCKET=(S3 bucket name from step 2)

4.启用工件插件

最后,在您的存储库中添加以下行.travis.yml以激活工件插件

addons:
  artifacts: true

如果一切顺利,您应该会看到您的构建工件在 S3 存储桶中弹出。您可能想要调整正在扫描的路径等,如文档中所述

希望对某人或其他人有所帮助。

于 2019-12-05T05:57:48.977 回答
0

集成 SBT-Travis-Sonatype 包括以下主要步骤:

  1. 添加 sbt-pgp 插件;
  2. 生成用于签署工件的密钥对并将其发布到公钥服务器上;
  3. 加密密钥对和 sonatype 凭证文件并将它们添加到您的项目中;
  4. 创建 travis 配置并添加 Travis 用于解压缩您的秘密文件的加密密钥。

我整理了一个关于如何将 SBT 与 Travis-CI 和 Sonatype 集成的简单说明,它可以在此处获得,其中包含从配置项目插件到加密文件和提供 Travis 配置的必要步骤。它主要基于 John Duffel 的开发人员博客和 sbt-pgp 参考文档。

于 2016-04-05T22:33:22.877 回答