silverstripe/environmentcheck

提供构建环境测试的API

安装量: 416 776

依赖: 12

建议者: 1

安全性: 0

星星: 32

关注者: 18

分支: 25

开放问题: 6

类型:silverstripe-vendormodule

3.0.2 2024-06-17 00:39 UTC

README

CI Silverstripe supported module

此模块向您的API添加了运行环境检查的API。

  • health/check - 一个公共URL,执行快速检查以确定该环境是否运行。例如,可以将其与负载均衡器相关联。
  • dev/check - 仅管理员可用的URL,执行更全面的检查。例如,可以将其与部署系统相关联。
  • dev/check/<suite> - 检查特定的套件(仅管理员)

这难道不就是单元测试吗?

几乎是这样,但并不完全相同。环境检查与单元测试在两个重要方面有所不同

  • 它们测试特定环境的设置。单元测试旨在使用虚拟数据和模拟的外部系统接口。环境检查检查给定环境实际连接到的真实系统和数据。
  • 它们不能修改数据。因为这些检查将使用生产数据库运行,所以不能修改其中的数据。这是我们没有使用与单元测试相同的基类来编写环境检查的主要原因——我们希望使其不可能意外地将单元测试插入环境检查器!

安装

composer require silverstripe/environmentcheck

直接激活

在您自己的_config.php中注册检查 - 请参阅此模块中的_config.php以获取一些默认值。不要忘记为EnvironmentCheckSuite使用完全限定的(命名空间)类名,或者首先使用use(导入)命名空间类。

EnvironmentCheckSuite::register('health', 'DatabaseCheck', 'Can we connect to the database?');
EnvironmentCheckSuite::register('check', 'URLCheck("")', 'Is the homepage accessible?');

通过配置激活

EnvironmentCheckSuite上注册您的检查。可以使用相同名称的检查多次。

SilverStripe\EnvironmentCheck\EnvironmentCheckSuite:
  registered_checks:
    db:
      definition: 'DatabaseCheck("Page")'
      title: 'Is the database accessible?'
    url:
      definition: 'URLCheck()'
      title: 'Is the homepage accessible?'
  registered_suites:
    check:
      - db
    health:
      - db
      - url

您还可以禁用以这种方式配置的检查。如果您想覆盖由某些其他模块对项目施加的检查,这会很有用。只需将检查的“状态”属性设置为“禁用”即可,如下所示

SilverStripe\EnvironmentCheck\EnvironmentCheckSuite:
  registered_checks:
    db:
      state: disabled

可用的检查

  • DatabaseCheck:检查数据库连接是否正常,通过确保表存在且包含一些记录。
  • URLCheck:检查给定的URL是否正常工作,默认情况下,是主页。
  • HasFunctionCheck:检查给定的函数是否存在。这可以用来检查PHP模块或功能是否已安装。
  • HasClassCheck:检查给定的类是否存在。这可以用来检查PHP模块或功能是否已安装。
  • FileWriteableCheck:检查给定的文件是否可写。
  • FileAccessibilityAndValidationCheck:检查给定的文件是否可访问,并且可选地与给定的格式匹配。
  • FileAgeCheck:检查一个或多个文件或文件夹的最大年龄。对于应经常自动生成的文件,例如静态缓存,以及备份文件和文件夹非常有用。
  • ExternalURLCheck:检查一个或多个URL是否可通过HTTP访问。
  • SMTPConnectCheck:检查通过PHP.ini配置的SMTP连接是否按预期工作。
  • SolrIndexCheck:检查给定类的Solr核心是否可用。
  • SessionCheck:检查给定的URL不会生成会话。
  • CacheHeadersCheck:检查响应中的缓存头指令,以确定是否必须包含或排除,并检查ETag的存在。
  • EnvTypeCheck:检查环境类型,dev和test不应在生产环境中使用。

监控检查

检查将返回适当的HTTP状态码,因此很容易集成到常见的在线监控解决方案,如pingdom.com。

您还可以使用以下配置让环境检查器通过电子邮件发送结果:

SilverStripe\EnvironmentCheck\EnvironmentChecker:
  email_results: true
  to_email_address: support@test.com
  from_email_address: admin@test.com

错误可以通过标准Silverstripe PSR-3兼容的日志记录。每次检查都会导致一条独立的日志条目。您可以选择分别启用警告和错误的日志记录,通过EnvironmentCheck->check()的结果来识别。

SilverStripe\EnvironmentCheck\EnvironmentChecker:
  log_results_warning: true
  log_results_error: true

身份验证

默认情况下,在CLI和开发环境中访问dev/check URL不需要身份验证,但如果您尝试在实时或测试环境中访问它,除非您以网站管理员身份登录,否则它将以403 HTTP状态响应。

您可能希望定期自动检查dev/check,但又不想向公众开放。您可以通过在您的环境(.env文件)中定义以下内容来启用基本身份验证:

ENVCHECK_BASICAUTH_USERNAME="test"
ENVCHECK_BASICAUTH_PASSWORD="password"

现在如果您在浏览器中访问dev/check,它将弹出基本身份验证窗口,并且如果提交的用户名和密码与环境中定义的用户名和密码匹配,则可以访问该页面。

添加更多检查

要添加更多检查,您应该在您的_config.php文件中放入额外的EnvironmentCheckSuite::register调用。请参阅此模块的_config.php文件以获取示例。

EnvironmentCheckSuite::register('check', 'HasFunctionCheck("curl_init")', "Does PHP have CURL support?");
EnvironmentCheckSuite::register('check', 'HasFunctionCheck("imagecreatetruecolor")', "Does PHP have GD2 support?");

第一个参数是检查套件名称。有两个内置检查套件,“健康”和“检查”,分别对应于health/checkdev/check URL。如果您愿意,您可以创建自己的检查套件并在其他URL上执行它们。您还可以通过将第一个参数作为数组传递将检查添加到多个套件中。

要测试您自己的应用程序,您可能需要编写自定义检查

  • 实现SilverStripe\EnvironmentCheck\EnvironmentCheck接口
  • 定义check()函数,它返回一个包含两个元素的数组
    • 第一个元素是EnvironmentCheck::OKEnvironmentCheck::WARNINGEnvironmentCheck::ERROR之一,具体取决于检查的状态
    • 第二个元素是描述响应的字符串。

以下是一个如何创建用于测试您自己的代码的检查的简单示例。在这个例子中,我们检查当在MyGateway类的实例上调用call()时,它将返回“foo”。使用自定义环境检查来测试与第三方系统的接口是一个常见用例。

use SilverStripe\EnvironmentCheck\EnvironmentCheck;

class MyGatewayCheck implements EnvironmentCheck
{
    protected $checkTable;

    function check()
    {
        $g = new \MyGateway;

        $response = $g->call();
        $expectedResponse = 'foo';

        if($response == null) {
            return array(EnvironmentCheck::ERROR, "MyGateway didn't return a response");
        } else if($response != $expectedResponse) {
            return array(EnvironmentCheck::WARNING, "MyGateway returned unexpected response $response");
        }
        return array(EnvironmentCheck::OK, '');
    }
}

一旦您创建了自定义检查类,不要忘记在检查套件中注册它

EnvironmentCheckSuite::register('check', 'MyGatewayCheck', 'Can I connect to the gateway?');

使用其他环境检查套件

如果您想使用与health/checkdev/check相同的UI,您可以创建一个EnvironmentChecker对象。这个类是一个RequestHandler,因此可以从操作处理程序返回。构造函数的第一个参数是套件名称。例如

use SilverStripe\Control\Controller;

class DevHealth extends Controller
{
    function index()
    {
        $e = new EnvironmentChecker('health', 'Site health');
        return $e;
    }
}

如果您想将一个环境检查套件嵌入到另一个中,您可以使用以下调用

$result = EnvironmentCheckSuite::inst('health')->run();

$result将包含一个EnvironmentCheckSuiteResult对象

  • $result->ShouldPass():返回一个布尔值,表示测试是否通过。
  • $result->Status():字符串“OK”、“WARNING”或“ERROR”,具体取决于最严重的失败。
  • $result->Details():每个检查套件中每个检查结果详情的DataObjectSet

请参阅EnvironmentChecker.ss以了解如何使用这些来构建UI。

版本控制

此库遵循Semver。根据Semver,您将能够升级到此库的任何次要或修补版本,而无需对公共API进行任何破坏性更改。Semver还要求我们明确定义此库的公共API。

所有具有 public 可见性的方法都是公共API的一部分。所有其他方法都不是公共API的一部分。在可能的情况下,我们将尝试保持 protected 方法的向后兼容性,在较小的/修补版本中,但如果您正在重写方法,请在升级之前测试您的作品。

报告问题

请为任何您发现的错误或缺少的功能 创建一个问题