我想在我的开源项目中使用Travis CI 。Travis 没有提供任何方法来发布生成的工件的问题(尽管,他们在未来的计划中有这个)。
在某处发布/上传工件的解决方法是什么?我被允许在 CI 机器上执行任何脚本。
简单上传可以,但存在安全问题:任何人都可以上传内容,就像所有来源都是公开的一样。
我想在我的开源项目中使用Travis CI 。Travis 没有提供任何方法来发布生成的工件的问题(尽管,他们在未来的计划中有这个)。
在某处发布/上传工件的解决方法是什么?我被允许在 CI 机器上执行任何脚本。
简单上传可以,但存在安全问题:任何人都可以上传内容,就像所有来源都是公开的一样。
GitHub 分步发布
该方法在https://stackoverflow.com/a/24100779/895245中被提及,并且在https://docs.travis-ci.com/user/deployment/releases/中的记录很差,所以这里有更详细的说明一步步。
它将工件上传到https://github.com/<username>/<repo>/releases
您推送的每个 Git 标签都存在的 GitHub 版本。
在https://github.com/settings/tokens下获取个人访问令牌
仅对公共存储库启用“public_repo”访问,对私有存储库启用“repo”。
将令牌保存在某处,因为您只能看到一次。
安装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>"
记下大的加密令牌。
使用.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有一些过程截图。
替代方法:环境变量
除了加密字符串,我们还可以使用隐藏的环境变量。
在存储库的 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?
最近宣布了“github发布上传”功能。它正式支持所需的一切。请参阅http://docs.travis-ci.com/user/deployment/releases/
如果您的项目基于 GitHub(可能使用 Travis),那么最简单的方法是签入gh-pages
分支下生成的工件。在GitHub 上查看更多信息。
如何做到这一点在很大程度上取决于使用的构建系统。使用 Maven,您可以使用- 您可以在此处maven-scm-plugin
找到示例。
编辑:你可以在这里找到一个完整的例子:https ://github.com/tonnymadsen/ui-bindings/blob/master/com.rcpcompany.updatesite/pom.xml
所以首先你必须确保你尝试部署发布工件。所以先在 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:
更新:GitHub 现在禁用下载 API,所以下面的答案是想法。
我的解决方案是使用 travis-ci 提供的“安全环境变量”和带有相关脚本的“GitHub repo Download API”
GitHub 中的每个 repo 都有下载页面,也是发布你的工件的好地方,并且它有相关的“Repo 下载 API” http://developer.github.com/v3/repos/downloads/
github-upload.rb
使用来自https://github.com/wereHamster/ghup的 nice 脚本来管理 GitHub API。最后,在.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/
我意识到这是一个较老的问题,但我想添加另一个我认为比迄今为止讨论的更好的解决方案。
OP 有兴趣从 Travis-CI发布工件。我建议将https://bintray.com/与组织或您自己的个人帐户一起使用(两者都有效,但对于 github 组织,拥有与其匹配的组织并发布工件可能更有意义从那个 github org 转到它匹配的 bintray org)。
这样做的原因是因为 bintray 提供的内容以及它对开源项目的支持。我建议您在这里查看他们的概述:http ://www.jfrog.com/bintray/
您还可以链接到 JCenter,这使得您发布的内容更容易供其他人使用/下载/使用(通过 maven、gradle、SBT 等)。
一旦你设置了 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 deploy
after_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 在这个角色上更胜一筹,并且是使用正确的工具。
祝你好运!
我在https://github.com/vorburger/mvnDeployGitHubTravisCI整理了一个示例项目,说明了如何执行此操作(部分基于在 github 上托管 Maven 存储库)。如链接答案中所述,基本思想是使用maven-deploy-plugin 的 altDeploymentRepository准备本地存储库,然后使用github site-maven-plugin将您的工件推送到 GitHub。如上所述,将 Travis 连接到 GitHub 身份验证。
TravisCI 现在支持发布:https ://docs.travis-ci.com/user/deployment/releases/
GitHub 删除了下载 API,但将其替换为版本:https ://github.com/blog/1547-release-your-software
您应该问自己的第一个问题是,您是要从 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 存储桶中弹出。您可能想要调整正在扫描的路径等,如文档中所述。
希望对某人或其他人有所帮助。
集成 SBT-Travis-Sonatype 包括以下主要步骤:
我整理了一个关于如何将 SBT 与 Travis-CI 和 Sonatype 集成的简单说明,它可以在此处获得,其中包含从配置项目插件到加密文件和提供 Travis 配置的必要步骤。它主要基于 John Duffel 的开发人员博客和 sbt-pgp 参考文档。