silverstripe/travis-support

为 SilverStripe 测试提供 Travis 支持

0.1.0 2016-07-19 10:25 UTC

This package is auto-updated.

Last update: 2024-09-14 14:56:32 UTC


README

Build Status Scrutinizer Code Quality Build Status codecov.io

codecov.io

简介

Travis 是一个开源的持续集成平台,主要意味着每次你向代码库提交时都会运行单元测试。该平台对开源项目免费,并且与 Github 集成良好。由于每个 SilverStripe 模块都需要在 SilverStripe 项目中进行测试,因此除了标准的 Composer 依赖项管理之外,还需要进行一些设置工作。

这些脚本允许你在多个分支上进行测试,并重写 composer.json 以匹配依赖项。脚本将测试你的模块与多个核心版本以及多个数据库(如果支持)进行兼容。

为什么要这么做?因为它表明你关心你的代码库的质量,并且向用户清晰地展示了其当前状态。这也有助于你管理针对多个数据库、SilverStripe 核心版本和其他依赖项的编码复杂性。

还没有编写单元测试?那么现在是时候开始使用 SilverStripe 测试指南 了。

Composer 设置

由于此脚本基于 Composer,你需要向你的模块添加一些元数据。将 composer.json 复制到你的模块根目录,并根据需要调整它。如果你有支持不同核心版本的模块分支,则将文件提交到每个分支。确保设置正确的 依赖项版本

没有分支?你应该有,这样你的用户就可以信任发布版本的稳定性,并且可以清楚地了解依赖项。有关版本号的详细信息,请参阅 semver.org

仅支持 SS 2.4 的分支的简化的 composer.json

{
  "name":"some-vendor-prefix/my-awesome-module",
  ...
  'require': {"silverstripe/framework": "2.4.*", "silverstripe/cms": "2.4.*"}
}

支持 SS 3.0 及更高版本的分支的简化的 composer.json

{
  "name":"some-vendor-prefix/my-awesome-module",
  ...
  'require': {"silverstripe/framework": "~3.0", "silverstripe/cms": "~3.0"}
}

现在将文件提交到各种模块分支,并在 Packagist 上注册它们,以便它们可以被 Composer 发现。

Travis 设置

免费的 Travis CI 服务通过在模块根目录中放置一个隐藏的 .travis.yml 文件进行配置(阅读有关 Travis YML 格式 的说明)。

以下是一个示例 .travis.yml

language: php 
php: 
- 5.3

env:
matrix:
 - DB=MYSQL CORE_RELEASE=3.0
 - DB=MYSQL CORE_RELEASE=3.1
 - DB=MYSQL CORE_RELEASE=master
 - DB=PGSQL CORE_RELEASE=master

matrix:
include:
  - php: 5.4
    env: DB=MYSQL CORE_RELEASE=master

before_script:
- phpenv rehash
- composer self-update
- git clone git://github.com/silverstripe-labs/silverstripe-travis-support.git ~/travis-support
- php ~/travis-support/travis_setup.php --source `pwd` --target ~/builds/ss
- cd ~/builds/ss

script: 
- vendor/bin/phpunit <yourmodule>/tests/

在设置过程中,为了避免反复推送以触发服务钩子,你应该通过 Travis WebLint 检查你的配置来节省时间。

现在调整 .travis.yml 中的 <yourmodule> 路径,在上述示例中,它将是 my-awesome-module。调整 .travis.yml 中的支持的 PHP 版本、SS 核心版本和数据库(阅读有关 Travis PHP 配置 的更多信息)。考虑 黑名单或白名单 构建,以将单个构建的数量保持在合理水平。

上面的示例文件将运行以下构建

  • DB=MYSQL CORE_RELEASE=3.0, php: 5.3
  • DB=MYSQL CORE_RELEASE=3.1, php: 5.3
  • 数据库=MYSQL 核心版本=master, php: 5.3
  • 数据库=PGSQL 核心版本=master, php: 5.3
  • 数据库=MYSQL 核心版本=master, php: 5.4

提交文件后,作为最后一步,您需要在travis-ci.org上启用您的模块。首次构建应在几分钟内开始。

作为额外奖励,您可以在README中包含构建状态图像,以宣传您的模块重视质量并持续集成。

添加额外模块

如果在设置过程中需要添加未在模块composer要求中明确包含的额外模块,可以使用--require参数。

例如:

php ~/travis-support/travis_setup.php --source `pwd` --target ~/builds/ss --require silverstripe/behat-extension

您也可以通过逗号分隔名称或添加多个--require标志来指定多个模块。每个名称也可以附加:<version>以添加版本依赖。

例如:

php ~/travis-support/travis_setup.php --source `pwd` --target ~/builds/ss --require silverstripe/behat-extension:dev-master --require silverstripe-cms:4.0.x-dev

或等价于:

php ~/travis-support/travis_setup.php --source `pwd` --target ~/builds/ss --require silverstripe/behat-extension:dev-master,silverstripe-cms:4.0.x-dev

PDO 数据库连接器

许多数据库连接器支持通过PDO进行连接。如果您想包括PDO支持,也可以添加PDO=1环境变量。

请注意,此功能仅在SilverStripe 3.2或更高版本中受支持,在3.1或以下版本中将被忽略。

env:
  matrix:
    - DB=MYSQL CORE_RELEASE=3.2 PDO=1
    - DB=MYSQL CORE_RELEASE=3.2

处理拉取请求

逻辑依赖于根据CORE_RELEASE常量拉取不同的核心版本。这可能导致不一致,例如,当拉取请求依赖于其他分支时,例如当cms模块的拉取请求依赖于framework模块的等效分支。虽然无法干净利落地告诉Travis使用哪些分支,但临时修改travis.yml可以帮助证明构建在正确的依赖项下通过。

  • 将自定义fork repositories添加到模块的composer.json中。它们将自动拉取到根composer.json中。
  • CORE_RELEASE环境变量设置为fork上的分支名称。
  • cmsframework模块上创建具有相同名称的分支。
  • installer上创建分支或设置不同的CORE_INSTALLER_RELEASE环境变量。
  • 设置CORE_ALIAS环境变量以满足约束(例如4.0.x-dev)。

请注意,这些fork中的.travis.yml更改是临时的,在拉取请求合并之前需要撤销。不幸的是,Travis CI不支持版本控制之外的构建配置设置。

Github速率限制

Composer严重依赖于GitHub的API来检索存储库信息和下载存档。GitHub对未认证请求的速率限制很低。这意味着根据您的构建运行频率(以及每个构建中执行的API请求数量),构建可能会因为这些副作用而失败。

此脚本支持GITHUB_API_TOKEN值。如果设置,它将将其写入全局composer配置(详情请见此处)。它可以通过Travis的安全环境变量加密。

为了激活配置,请在.travis.yml中的env.global添加一个条目。

env:
  global:
    - GITHUB_API_TOKEN=<token>
  matrix:
    - ...

或者,您可以通过Travis CI的仓库“设置”区域添加Token。

Behat和Selenium

这些脚本还允许通过Behat进行行为测试。启动此功能的最简单方法是使用本地运行的Selenium服务器和PHP内置的web服务器。以下是一个示例设置:

language: php 

matrix:
  include:
    - php: 5.3
      env: DB=MYSQL CORE_RELEASE=3.1
    - php: 5.4
      env: DB=MYSQL CORE_RELEASE=3.1 BEHAT_TEST=1

before_script:
 - composer self-update
 - phpenv rehash
 - git clone -b tmp/travis-artifacts git://github.com/silverstripe-labs/silverstripe-travis-support.git ~/travis-support
 - "if [ \"$BEHAT_TEST\" = \"\" ]; then php ~/travis-support/travis_setup.php --source `pwd` --target ~/builds/ss; fi"
 - "if [ \"$BEHAT_TEST\" = \"1\" ]; then php ~/travis-support/travis_setup.php --source `pwd` --target ~/builds/ss --require silverstripe/behat-extension; fi"
 - cd ~/builds/ss
 - php ~/travis-support/travis_setup_selenium.php --if-env BEHAT_TEST
 - php ~/travis-support/travis_setup_php54_webserver.php --if-env BEHAT_TEST

script: 
 - "if [ \"$BEHAT_TEST\" = \"\" ]; then vendor/bin/phpunit framework/tests; fi"
 - "if [ \"$BEHAT_TEST\" = \"1\" ]; then vendor/bin/behat @framework; fi"

工件上传

由于Travis构建是无状态的,因此构建完成后,您无法检查除实际构建日志之外的内容。这对于服务器日志等大文件以及图像来说是一个问题。

您可以使用 https://github.com/travis-ci/artifacts 来实现此目的,允许上传到Amazon S3。由于Behat已经创建任何失败测试步骤的截图,这对任何Behat脚本来说都是一个有用的补充。通过 travis_setup_selenium.php 创建的 behat.yml 已经设置为将截图保存到 artifacts/screenshots/

language: php 

env:
  global:
    - ARTIFACTS_REGION=us-east-1
    - ARTIFACTS_BUCKET=silverstripe-travis-artifacts
    - secure: "..." # Encrypted ARTIFACTS_KEY
    - secure: "..." # Encrypted ARTIFACTS_SECRET

matrix:
  include:
    - ...

before_script:
 - ...

script: 
 - ...

after_script:
 - php ~/travis-support/travis_upload_artifacts.php --if-env BEHAT_TEST,ARTIFACTS_BUCKET,ARTIFACTS_KEY,ARTIFACTS_SECRET --target-path artifacts/$TRAVIS_REPO_SLUG/$TRAVIS_BUILD_ID/$TRAVIS_JOB_ID --artifacts-base-url https://s3.amazonaws.com/$ARTIFACTS_BUCKET/

故障排除

在本地测试travis_setup.php

虽然不是100%准确,但您可以在自己的环境中相当接近地重现Travis的行为。只需查看之前的Travis构建的CLI输出即可开始。以下是一个在 translatable 模块的 1.0 分支上构建特定提交的示例

export TRAVIS_BRANCH=1.0
export TRAVIS_COMMIT=dd792af2fba119cfa22423203dd9f2e70676e651
export TRAVIS_REPO_SLUG=silverstripe/silverstripe-translatable
export DB=MYSQL
export CORE_RELEASE=3.0
git clone --depth=50 --branch=1.0 git://github.com/silverstripe/silverstripe-translatable.git silverstripe/silverstripe-translatable
cd silverstripe/silverstripe-translatable
git checkout -qf dd792af2fba119cfa22423203dd9f2e70676e651
git clone git://github.com/silverstripe-labs/silverstripe-travis-support.git ~/travis-support
php ~/travis-support/travis_setup.php --source `pwd` --target ~/builds/ss
cd ~/builds/ss
phpunit translatable/tests

注意:每个SilverStripe模块都只能在SilverStripe项目的子文件夹上下文中工作,并且至少需要SilverStripe框架。因此,我们需要确保Travis默认执行的普通模块检出被重写为这一点。