如何在Travis CI中发布文物?

我想用Travis CI来开源项目。 Travis没有提供任何方法发布产生的文物(尽pipe他们在未来的计划中有这个问题)。

什么是解决方法发布/上传文物的地方? 我可以在CI机器上执行任何脚本。

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

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

GitHub逐步发布

该方法在https://stackoverflow.com/a/24100779/895245中提到,并且在https://docs.travis-ci.com/user/deployment/releases/中的logging很差,所以在这里更详细一步步。;

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

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

    只有启用“public_repo”访问公共仓库,“回购”为私人。

    将标记保存在某个地方,因为您只能看到一次。

  2. 安装travisgem:

     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>" 

    记下大的encryption标记。

  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 

    会发生什么事呢,特拉维斯用下面的something: secure: <encrypted-string>来replace每一样something: secure: <encrypted-string> something: <decrypted-string> : http : //docs.travis-ci.com/user/encryption-keys/

    这是安全的,因为只有授权推送你可以解密string,所以如果恶意用户试图提出请求来获取你的string,它应该只显示encryption的string。

    现在,无论何时使用标签推送提交,Travis都会将release.zip上传到版本:

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

    如果您之前已经推送了提交和标签,则可能需要单击Travis UI上的“重新构build”button才能上传。

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

替代方法:环境variables

  1. 我们也可以使用隐藏的环境variables来代替encryption的string。

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

     GITHUB_API_KEY=<token> 

    并确保将“显示生成日志中的值”标记为“关”,并使用:

     api_key: '$GITHUB_API_KEY' 

    虽然这不会在日志中显示pull请求,但这种方法风险更高,因为您可能会列出构build的环境。

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

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

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

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

如何做到这一点取决于使用的构build系统。 有了maven,你可以使用maven-scm-plugin – 你可以在这里find一个例子。

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

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

我的解决scheme是使用由travis-ci提供的“安全环境variables”和“Github repo下载API”以及相关的脚本

Github中的每个回购站都有下载页面,这也是发布你的工件的好地方,它有相关的“回购下载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首先制作标签。 手动执行:

在这里输入图像说明

然后在.travis.yml文件中添加以下configuration。 对于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的环境variables。 哪些指向Github api_key。

文件是从构build产生的构build神器。 我们想要部署到gitHub

 on: all_branches: true tags: true 

是要部署的标记的强制configuration。

不,你必须从github获取api_key:

  1. 转到个人访问令牌

在这里输入图像说明

  1. select生成新的令牌

在这里输入图像说明

  1. api_keyselect适当的作用域 在这里输入图像说明
  2. 复制生成的api_key 在这里输入图像说明
  3. 转到Travis Ci并添加环境variables。 为此目的select设置 在这里输入图像说明
    1. 粘贴生成的api_key 在这里输入图像说明

当你触发新的构build时,工件将被部署。 在这里输入图像说明

我意识到这是一个较老的问题,但是我想为这个组合增加另一个解决scheme,我认为它比迄今为止讨论的更好。

使用Bintray:

OP有兴趣发布 Travis-CI的工件。 我build议使用https://bintray.com/与一个组织或者你自己的个人帐户(两者都可以工作,但是对于github组织来说,让一个组织匹配它可能会更有意义,而且发布的工件从那个github org去匹配bintray组织)。

这是因为bintray提供了什么,它支持开源项目。 我build议你看看他们的概述: http : //www.jfrog.com/bintray/

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

对于Java + Maven:

一旦你有bintray设置(你的帐户创build或一个组织),你可以很容易地集成它与travis。 对于java&maven构build,可以使用travis-ci的encryptionvariables选项来encryption${BINTRAY_USER}${BINTRAY_API_KEY} 。 然后你可以设置Maven部署推送发布到bintray。 在maven settings.xml文件中,你只需要引用你用travisencryption的环境variables作为用户/密码,即:

  <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 release插件的前半部分: mvn release:prepare从本地开发盒mvn release:prepare (忽略后半部分 – 发布:预制件)。 这将代表你的标签,在pom中碰撞版本等。 你最终得到的是github中一个版本的标签(不是-SNAPSHOT)。 这个标记的提交使其下游到travis,您的.travis.yml将configurationTravis构build和发布。

.travis.yml ,configuration它以调用mvn deploy 之前testingTRAVIS_TAGTRAVIS_PULL_REQUEST以及任何其他想要做的检查 。 你会在after_success上做到这after_success 。 这样,travis就可以随时build立,但是只有当它是一个标签,并且满足你想要的其他条件(比如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= 

(安全的只是一个制造的例子,你encryption你的bintray用户和特拉维斯bintray api键 ,你会看到你的yaml类似的东西)

这为您提供了一个完整的端到端系统,可以将任何人都可以消费和使用的工件发布到“野外”。 您使用的是从底层devise的服务,作为工件库(bintray),并且您正在聪明地使用Travis来检查maven发布的标签:prepare生产。 一起,你决定什么时候发布( mvn release:prepare从你的本地开发盒),和特拉维斯让他们bintray。

其他

请注意,在github中有一个现有的travis-ci / dpl pull请求 ,用于在Travis和bintray之间build立更紧密的集成(travis providers)。 这使得更容易让Travis发送文物到bintray( 版本 ; bintray不是为了保存SNAPSHOT,而是使用Artifactory代替)。 尽pipegithub对发布有一些支持,但是在撰写本文的时候,我认为bintray在这个angular色上更胜一筹,也是正确的工具。

祝你好运!

我在https://github.com/vorburger/mvnDeployGitHubTravisCI上列举了一个示例项目,演示了如何做到这一点(部分基于在github上托pipeMaven仓库; )。 正如链接的答案中所解释的,基本思想是使用maven-deploy-plugin的altDeploymentRepository准备本地存储库,然后使用github site-maven-plugin将工件推送到GitHub。 如上所述将Travis连接到GitHubauthentication。

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

GitHub删除了下载API,但用发行版replace: https : //github.com/blog/1547-release-your-software

整合SBT-Travis-Sonatype包含以下主要步骤:

  1. 添加sbt-pgp插件;
  2. 生成密钥对,用于对工件进行签名并将其发布到公钥服务器上;
  3. encryption密钥对和sonatype凭证文件并将其添加到项目中;
  4. 创buildTravisconfiguration并添加Travis使用的encryption密钥来解密您的秘密文件。

我整理了一个关于如何将SBT与Travis-CI和Sonatype集成在一起的简单指令,它在这里可用,包含configuration项目插件到encryption文件和提供Travisconfiguration的必要步骤。 它主要基于John Duffel的开发人员博客和sbt-pgp参考文档。