我想在我的开源项目中使用 Travis CI。问题是Travis没有提供任何发布生成构件的方法(尽管他们在未来计划中有这个功能)。
有哪些方式可以解决发布/上传构件的问题?我被允许在CI机器上执行任何脚本。
简单的上传将起作用,但存在安全问题:任何人都能以相同的方式上传东西,因为所有资源都是公开的。
我想在我的开源项目中使用 Travis CI。问题是Travis没有提供任何发布生成构件的方法(尽管他们在未来计划中有这个功能)。
有哪些方式可以解决发布/上传构件的问题?我被允许在CI机器上执行任何脚本。
简单的上传将起作用,但存在安全问题:任何人都能以相同的方式上传东西,因为所有资源都是公开的。
逐步发布 GitHub 版本
该方法在 https://dev59.com/9Wct5IYBdhLWcg3wHJzF#24100779 中提到,但文档较差,详细的逐步说明可以在 https://docs.travis-ci.com/user/deployment/releases/ 中找到。
它会将文件上传到 GitHub 版本 https://github.com/<username>/<repo>/releases
,每次推送 Git 标签时都会存在一个版本。
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.
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.
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网页中有一些过程的截图。
替代方法: 环境变量
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?
gh-pages
分支下检入生成的工件。更多信息请参见GitHub。maven-scm-plugin
- 您可以在此处找到示例。首先,您必须确保尝试部署发布构件。因此,请先在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
on:
all_branches: true
tags: true
必须配置标签以进行部署。
不,您必须从GitHub获取api_key:
您也可以链接到JCenter, 这样发布的内容更容易被其他人消费/下载/使用(通过maven、gradle、SBT等)。
一旦您设置好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_TAG
、TRAVIS_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现在已经禁用了下载API,因此下面的答案仅供参考。
我的解决方案是使用travis-ci提供的"安全环境变量"和与之相关的脚本中的"GitHub repo Download API"
GitHub中的每个repo都有下载页面,这也是发布你的构件的好地方,并且它有相关的"Repo Download API" http://developer.github.com/v3/repos/downloads/
github-upload.rb
来管理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/
TravisCI现在支持发布:https://docs.travis-ci.com/user/deployment/releases/
Github取消了下载API,但用发布取而代之:https://github.com/blog/1547-release-your-software
2. 创建一个 AWS S3 存储桶,供 Travis 上传
这个很简单。唯一需要注意的是要避免使用仅支持 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