如何在Travis CI中发布构件?

54

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

有哪些方式可以解决发布/上传构件的问题?我被允许在CI机器上执行任何脚本。

简单的上传将起作用,但存在安全问题:任何人都能以相同的方式上传东西,因为所有资源都是公开的。


3
几年后,我认为Travis已经实现了你想要的功能,不过目前仅限于上传到S3:https://docs.travis-ci.com/user/uploading-artifacts/ - Nick Chammas
3
与@NickChammas的链接结合使用:https://github.com/travis-ci/artifacts/blob/master/upload/options.go。他们的文档没有提到“artifacts”插件实际接受的一半参数。 - MechEthan
1
Travis现在也提供了一个非常容易设置的github-pages选项,请参见:https://dev59.com/z2Ag5IYBdhLWcg3wtMzD#42934887 - Yann TM
10个回答

43

逐步发布 GitHub 版本

该方法在 https://dev59.com/9Wct5IYBdhLWcg3wHJzF#24100779 中提到,但文档较差,详细的逐步说明可以在 https://docs.travis-ci.com/user/deployment/releases/ 中找到。

它会将文件上传到 GitHub 版本 https://github.com/<username>/<repo>/releases,每次推送 Git 标签时都会存在一个版本。

  1. Get a Personal Access Token under https://github.com/settings/tokens

    Only enable "public_repo" access for public repositories, "repo" for private.

    Save the token somewhere as you can only see it once.

  2. Install the travis gem:

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

    Then cd into your repository and:

    travis encrypt <api-token>
    

    but more recently people have reported that travis encrypt -r githubusername/repositoryname --org is needed instead, see: https://github.com/travis-ci/travis-ci/issues/8128

    This will produce an output like:

    secure: "<encrypted-token>"
    

    Note down the large encrypted token.

  3. Use a .travis.yml as follows:

    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
    

    What happens is that Travis replaces every something: secure: <encrypted-string> with just something: <decrypted-string> as explained at: http://docs.travis-ci.com/user/encryption-keys/

    This is safe because only authorized pushes by you can decrypt the string, so if a malicious user tries to make a pull request to get your string, it would should just show the encrypted string.

    Now whenever you push a commit with a tag, Travis will upload release.zip to the release:

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

    If you had already pushed the commit and the tag after, you might have to click the "Restart build" button on the Travis UI for it to upload.

https://dev59.com/9Wct5IYBdhLWcg3wHJzF#38037626网页中有一些过程的截图。

替代方法: 环境变量

  1. Instead of an encrypted string, we could also use a hidden environment variable.

    On the Travis settings for the repository https://travis-ci.org/<me>/<myrepo>/settings create an environment variable:

    GITHUB_API_KEY=<token>
    

    and make sure to mark "Display value in build log" as "Off", and use:

    api_key: '$GITHUB_API_KEY'
    

    While this will not show on logs for pull requests, this method is riskier, as you could my mistake list the environment of a build.

    The upside is that this method is simpler to understand.

我有一个简单的例子,将由Gnuplot生成的图像上传到GitHub发布:

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


经过长时间的搜索,我发现加密命令是错误的,更好的方法是 travis encrypt -r github用户名/仓库名 --org,请参考 travis issue - Lei Yang

30

4
如何逐步完成此过程的详细步骤:https://dev59.com/9Wct5IYBdhLWcg3wHJzF#33109519 - Ciro Santilli OurBigBook.com
除了能够仅将某物上传到标签而不将其发布之外,没有其他选择... :( - jaques-sam

10

1
这需要将Git身份验证数据公开存储在仓库中,是吗? - eigenein
2
各种排序...请查看<a href="http://about.travis-ci.org/docs/user/build-configuration/">this Travis page</a>上的"安全环境变量"部分。 - Tonny Madsen
安全环境变量似乎是我不知道的新功能。谢谢! - eigenein
更新链接:http://about.travis-ci.org/docs/user/build-configuration/#Secure-environment-variables - Prasanna
本文详细解释了如何自动推送到 gh-pages: https://gist.github.com/domenic/ec8b0fc8ab45f39403dd - Suzanne Soy

8

首先,您必须确保尝试部署发布构件。因此,请先在Github中创建标签。手动完成的步骤如下:

enter image description here

然后在.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。 文件是从构建中生成的构建工件。 我们希望将其部署到GitHub
on:
    all_branches: true
    tags: true

必须配置标签以进行部署。

不,您必须从GitHub获取api_key:

  1. 转到个人访问令牌

enter image description here

  1. 选择生成新令牌

enter image description here

  1. api_key选择适当的作用域enter image description here
  2. 复制生成的api_keyenter image description here
  3. 前往Travis Ci并添加环境变量。为此,请选择设置enter image description here
    1. 粘贴生成的api_keyenter image description here
当您触发新构建时,工件将被部署。 在此输入图像描述

2
我已经在https://dev59.com/9Wct5IYBdhLWcg3wHJzF#33109519解释了这种方法,但你有截屏,所以值得点赞(+1)。 - Ciro Santilli OurBigBook.com

6
我知道这是一个老问题,但我想添加另一个解决方案,我认为比迄今讨论的更好。
使用Bintray:
OP有兴趣从Travis-CI发布工件。我建议使用https://bintray.com/,并使用组织或您自己的个人帐户(两者都可以,但在github org的情况下,拥有与之匹配的组织,并发布来自该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部署以将发布推送到bintray。 在maven的settings.xml文件中,您只需引用通过travis加密的环境变量作为用户名/密码,例如:

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

接下来,您需要在项目的pom.xml文件中添加distributionManagement部分,类似于以下内容:

<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 release plugin的前半部分:mvn release:prepare(忽略第二部分--release:preform)从您的本地开发框中。这将创建一个标记,在您的代表处在pom中增加版本等。您最终获得的是github上版本的标记(而不是-SNAPSHOT)。这个标记的提交会流向下游到travis,其中您的.travis.yml将配置Travis进行构建和发布。

在你的.travis.yml文件中,配置测试TRAVIS_TAGTRAVIS_PULL_REQUEST其他检查,在调用mvn deploy之前进行。你需要在after_success中这样做。这样,travis可以一直构建,但只有在满足特定条件(例如JDK8构建)时才运行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=

这里的"secure's"只是一个虚构的例子。当你使用Travis对bintray用户和bintray api key进行加密后,你会在yaml文件中看到类似的东西。

这将为你提供一个完整的端到端系统,用于发布工件,让任何人都可以使用和消费。你正在使用一个从头开始就被设计为工件存储库(bintray)的服务,并且以聪明的方式使用Travis来检查maven release:prepare生成的标签。总之,你可以决定何时发布版本(从本地开发环境中运行"mvn release:prepare"),然后Travis会将它们传送到bintray。

其他

请注意,Github上已经存在一个travis-ci/dpl pull request,用于构建Travis和bintray之间更紧密的集成(travis提供程序)。这使得Travis将工件发送到bintray(发布)变得更加容易;bintray并不打算用来保存SNAPSHOTs,请使用Artifactory。尽管Github对发布有一些支持,但在我撰写本文时,我认为bintray在这个角色中更为优秀,是正确的工具。

祝好运!


6

更新: GitHub现在已经禁用了下载API,因此下面的答案仅供参考。

我的解决方案是使用travis-ci提供的"安全环境变量"和与之相关的脚本中的"GitHub repo Download API"

GitHub中的每个repo都有下载页面,这也是发布你的构件的好地方,并且它有相关的"Repo Download 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/


Github已禁用上传/下载功能:请阅读此新帖子:https://github.com/blog/1302-goodbye-uploads - Huluvu424242
如果您注意到了这一点,那么任何解决方案都不可能实现,您可以直接回答这个问题。 - Larry Cai
我不确定是否将我的评论作为答案给出,因为有些人通过签入将构件部署到gh-pages分支中(请参见已接受的答案)。在我看来,这不是很好,但这是一种解决方案。 - Huluvu424242

2

1
@kleopatra 谢谢;现在好一点了吗?;-) 我还是 SO 的新手.. 对这样的建议做出反应会得到积分吗? - vorburger
1
虚拟声望,当然 :-) 实际上,情况可能反过来:仅包含链接的帖子有被删除的风险(如果有人认为它们不够有用)。 - kleopatra

2

这个答案是否对以下链接提供了新的信息:https://dev59.com/9Wct5IYBdhLWcg3wHJzF#24100779 + https://dev59.com/9Wct5IYBdhLWcg3wHJzF#13067390? :-) - Ciro Santilli OurBigBook.com

0
集成SBT-Travis-Sonatype包括以下主要步骤:
  1. 添加sbt-pgp插件;
  2. 生成用于签署您的构件并将其发布到公共密钥服务器的密钥对;
  3. 加密密钥对和Sonatype凭据文件,并将它们添加到您的项目中;
  4. 创建Travis配置并添加用于解压缩您的秘密文件的加密密钥。
我编写了一个简单的说明,介绍如何将SBT与Travis-CI和Sonatype集成,可在此处获得,其中包含从配置项目插件到加密文件和提供Travis配置所需的步骤。它主要基于John Duffel的开发者博客以及sbt-pgp参考文档。

0
你应该首先问自己的问题是,你想要从CI构建中发布工件还是部署发布(即到GitHub)。
由于这里有很多关于上传发布到GitHub的答案,我不会进一步讨论这个话题。
如果你想获取快照/CI构建工件,最简单的方法是将它们上传到AWS S3。不幸的是,特别是当你对AWS没有经验时,文档有点粗糙。所以这是你需要做的:
1. 为Travis创建一个AWS IAM用户
要这样做,请转到https://console.aws.amazon.com/iam/home?#/users并创建一个新的用户帐户,类型为编程访问。在权限选项卡上应用现有策略AmazonS3FullAccess,授予它访问S3的权限。
创建用户后,请确保复制该用户的Access Key ID和Secret Access Key!

2. 创建一个 AWS S3 存储桶,供 Travis 上传

这个很简单。唯一需要注意的是要避免使用仅支持 Signature v4 的区域,例如us-east-2eu-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 存储桶中。您可能需要调整被扫描的路径等设置,如 文档 中所述。
希望这能对某个人有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接