如何在Travis CI中发布工件?

eig*_*ein 50 artifacts travis-ci

我想将Travis CI用于我的开源项目.特拉维斯没有提供任何方式来发布制作的文物(但是,他们在未来的计划中有这个问题).

在某处发布/上传工件有哪些变通方法?我被允许在CI机器上执行任何脚本.

简单上传将起作用,但存在安全问题:任何人都可以以与所有来源公开相同的方式上传内容.

Cir*_*四事件 40

GitHub逐步发布

该方法在/sf/answers/1687054561/中提到,并且记录在以下网址:https://docs.travis-ci.com/user/deployment/releases/,所以这里更详细一步步.

它将工件上传到GitHub版本https://github.com/<username>/<repo>/releases,这些版本存在于您推送的每个Git标记.

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

    仅对公共存储库启用"public_repo"访问,对私有启用"repo".

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

  2. 安装travisgem:

    gem install travis
    # See: https://stackoverflow.com/a/33119804/895245
    gem update --system
    
    Run Code Online (Sandbox Code Playgroud)

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

    travis encrypt <api-token>
    
    Run Code Online (Sandbox Code Playgroud)

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

    这将产生如下输出:

    secure: "<encrypted-token>"
    
    Run Code Online (Sandbox Code Playgroud)

    记下大型加密令牌.

  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
    
    Run Code Online (Sandbox Code Playgroud)

    发生的事情是特拉维斯取代每个人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
    
    Run Code Online (Sandbox Code Playgroud)

    如果您之后已经推送了提交和标记,则可能必须单击Travis UI上的"重新构建"按钮才能上载.

/sf/answers/2662633851/有一些流程的截图.

替代方法:环境变量

  1. 我们也可以使用隐藏的环境变量,而不是加密的字符串.

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

    GITHUB_API_KEY=<token>
    
    Run Code Online (Sandbox Code Playgroud)

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

    api_key: '$GITHUB_API_KEY'
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

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


min*_*hua 28

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

  • 有关如何执行此操作的详细步骤:http://stackoverflow.com/a/33109519/895245 (3认同)

Ton*_*sen 8

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

如何做到这一点很大程度上取决于使用的构建系统.有了maven,你可以使用maven-scm-plugin- 你可以在这里找到一个例子.

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

  • 各种...请参阅<a rel="nofollow noreferrer" href="http://about.travis-ci.org/docs/user/build-configuration/">此Travis页面</a>上的"安全环境变量"部分. (2认同)

Xel*_*ian 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
Run Code Online (Sandbox Code Playgroud)

这里api_key值是Travis Ci环境变量.哪个指向Github api_key.

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

on:
    all_branches: true
    tags: true
Run Code Online (Sandbox Code Playgroud)

是要部署的标记的强制配置.

不,你必须从github获取api_key:

  1. 转到个人访问令牌

在此输入图像描述

  1. 选择生成新令牌

在此输入图像描述

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

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

  • 我在http://stackoverflow.com/a/33109519/895245解释了这个方法,但你有截图,所以得到+1. (2认同)

Jac*_*ack 6

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

使用 Bintray:

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

这样做的原因是因为 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>
Run Code Online (Sandbox Code Playgroud)

接下来,您将该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>
Run Code Online (Sandbox Code Playgroud)

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

在你的.travis.yml,它配置来测试TRAVIS_TAGTRAVIS_PULL_REQUEST以及任何其他检查你想之前调用mvn deploy。你会在after_success. 这样,travis一直在构建,但 mvn deploy在它是标签并满足您想要的其他条件时才运行(例如,JDK8 构建)。这是一个例子.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=
Run Code Online (Sandbox Code Playgroud)

(安全只是一个虚构的例子,在你用 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 不打算保存快照,而是使用Artifactory)。尽管 github 对发布有一些支持,但在撰写本文时,我相信 bintray 在这个角色上更胜一筹,并且是使用的正确工具。

祝你好运!


Lar*_*Cai 5

更新: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
Run Code Online (Sandbox Code Playgroud)

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