bbaga/buildkite-php

用于消费 Buildkite API 的 PHP 客户端库

0.4.0 2020-06-11 16:38 UTC

This package is auto-updated.

Last update: 2024-09-25 03:27:29 UTC


README

安装

composer require bbaga/buildkite-php

使用方法

设置 API 对象

\Psr\Http\Client\ClientInterface 实现可在 bbaga/buildkite-php-guzzle-client 包中找到。

Rest API

use bbaga\BuildkiteApi\Api\RestApi;

/** @var \Psr\Http\Client\ClientInterface $client */
$client = new MyHttpClient(); 

$api = new RestApi($client, 'MY_BUILDKITE_API_TOKEN');

GraphQL API

use bbaga\BuildkiteApi\Api\GraphQLApi;

/** @var \Psr\Http\Client\ClientInterface $client */
$client = new MyHttpClient(); 

$api = new GraphQLApi($client, 'MY_BUILDKITE_API_TOKEN');

与 Buildkite 的 GraphQL API 交互

use bbaga\BuildkiteApi\Api\GraphQLApi;
use bbaga\BuildkiteApi\Api\GuzzleClient;

$query = '
    query example($slug: ID!, $first: Int){
        viewer { user { name } }
        
        organization(slug: $slug) {
            pipelines(first: $first) {
                edges {
                    node {
                        id
                        slug
                    }
                }
            }
        } 
    }';

$variables = json_encode(['slug' => 'my-org', 'first' => 5]);

$client = new GuzzleClient();
$api = new GraphQLApi($client, 'MY_BUILDKITE_API_TOKEN');

$api->getResponseBody($api->post($query, $variables));

与 Buildkite 的 REST API 交互

遍历资源的示例

use bbaga\BuildkiteApi\Api\GuzzleClient;
use bbaga\BuildkiteApi\Api\Rest\Fluent;
use bbaga\BuildkiteApi\Api\RestApi;

$client = new GuzzleClient();
$api = new RestApi($client, 'MY_BUILDKITE_API_TOKEN');

/** Getting all the organizations that are visible with the TOKEN */
/** @var Fluent\Organization[] $organizations */
$organizations = (new Fluent\Organizations($api))->get();

/** @var Fluent\Organization $organization */
$organization = $organizations[0];

/** @var Fluent\Pipeline $pipelines */
$pipelines = $organization->getPipelines();

/** @var Fluent\Pipeline $pipeline */
$pipeline = $pipelines[0];

/** @var Fluent\Build[] $builds */
$builds = $pipeline->getBuilds();

/** @var Fluent\Build $build */
$build = $builds[0];

/** @var Fluent\Job[] $jobs */
$jobs = $build->getJobs();

/** @var Fluent\Emoji[] $emojis */
$emojis = $organizations[0]->getEmojis();

/** @var Fluent\Agent[] $emojis */
$agents = $organizations[0]->getAgents();

不遍历访问资源

在不遍历层次结构的情况下获取特定构建的数据。

use bbaga\BuildkiteApi\Api\GuzzleClient;
use bbaga\BuildkiteApi\Api\Rest\Fluent;
use bbaga\BuildkiteApi\Api\RestApi;

$client = new GuzzleClient();
$api = new RestApi($client, 'MY_BUILDKITE_API_TOKEN');

/**
 * Builds are identified by the follwoing three values 
 */
$organizationSlug = 'my-org';
$pipelineSlug = 'my-pipeline';
$buildNumber = 23;

$organization = new Fluent\Organization($api, ['slug' => $organizationSlug]);
$pipeline = new Fluent\Pipeline($api, $organization, ['slug' => $pipelineSlug]);
$build = new Fluent\Build($api, $organization, ['number' => $buildNumber, 'pipeline' => $pipeline]);

$build->fetch()->getJobs();

创建新的管道

use bbaga\BuildkiteApi\Api\GuzzleClient;
use bbaga\BuildkiteApi\Api\Rest\Fluent;
use bbaga\BuildkiteApi\Api\RestApi;

$client = new GuzzleClient();
$api = new RestApi($client, 'MY_BUILDKITE_API_TOKEN');

$organization = new Fluent\Organization($api, ['slug' => 'my-org']);
$pipeline = $organization->createPipeline(
    [
        'name' => 'my-pipeline',
        'repository' => 'git@github.com:some/repo.git',
        'steps' => [
            [
                'type' => 'script',
                'name' => 'upload artifact',
                'command' => 'echo "Hello" > artifact.txt \
                 && buildkite-agent artifact upload artifact.txt \
                 && cat artifact.txt | buildkite-agent annotate --style "success" --context "junit"',
            ],
            [
                'type' => 'manual',
                'name' => 'Needs to be unblocked',
                'command' => 'echo "Unblocked!"',
            ],
        ]
    ]
);

/**
 * Pipeline is ready, we can kick off the first build
 */
$buildSettings = [
    'commit' => 'HEAD',
    'branch' => 'master',
    'message' => 'Testing all the things :rocket:',
];

$pipeline->createBuild($buildSettings);

直接 API 调用

组织 API

通过 $api->organization() 暴露与组织相关的方

组织 API 的详细文档可在 此处 找到。

列出组织

$api->organization()->list();

获取特定组织

$api->organization()->get('my-organization');

管道 API

通过 $api->pipeline() 暴露与管道相关的方

管道 API 的详细文档可在 此处 找到。

列出组织中的管道

$api->pipeline()->list('my-organizations');

获取特定管道

$api->pipeline()->get('my-organization', 'my-pipeline');

创建管道

$pipelineData = [
    'name' => 'My Pipeline',
    'repository' => 'git@github.com:acme-inc/my-pipeline.git',
    'steps' => [
        [
            'type' => 'script',
            'name' => 'Build :package:',
            'command' => 'script/release.sh',
        ],
    ],
];

$api->pipeline()->create('my-organization', $pipelineData);

更新管道

$pipelineData = [
    'repository' => 'git@github.com:acme-inc/new-repo.git',
];

$api->pipeline()->update('my-organization', 'my-pipelines', $pipelineData);

删除管道

$api->pipeline()->delete('my-organization', 'my-pipeline');

构建 API

通过 $api->build() 暴露与构建相关的方

构建 API 的详细文档可在 此处 找到。

列出所有组织中的所有构建

$api->build()->listAll($queryParameters);

获取特定构建

$buildNumber = 1;
$api->build()->get('my-organization', 'my-pipeline', $buildNumber);

获取组织中的构建

$api->build()->getByOrganization('my-organization', $queryParameters);

获取管道中的构建

$api->build()->getByPipeline('my-organization', 'my-pipeline', $queryParameters);

创建新的构建

$buildSettings = [
    'commit' => 'abcd0b72a1e580e90712cdd9eb26d3fb41cd09c8',
    'branch' => 'master',
    'message' => 'Testing all the things :rocket:',
    'author' => [
        'name' => 'Keith Pitt',
        'email' => 'me@keithpitt.com',
    ],
    'env' => [
        'MY_ENV_VAR' => 'some_value',
    ],
    'meta_data' => [
        'some build data' => 'value',
        'other build data' => true,
    ],
];

$api->build()->create('my-organization', 'my-pipeline', $buildSettings);

取消正在运行的构建

$buildNumber = 12;
$api->build()->cancel('my-organization', 'my-pipeline', $buildNumber);

重启构建

$buildNumber = 12;
$api->build()->rebuild('my-organization', 'my-pipeline', $buildNumber);

作业 API

通过 $api->job() 暴露与作业相关的方

作业 API 的详细文档可在 此处 找到。

重试作业

$buildNumber = 12;
$jobId = '0738da5f-0372-4b02-a1cb-f07a12fbcdcd';

$api->job()->retry('my-organization', 'my-pipeline', $buildNumber, $jobId);

取消作业锁定

$buildNumber = 12;
$jobId = '0738da5f-0372-4b02-a1cb-f07a12fbcdcd';

$api->job()->unblock('my-organization', 'my-pipeline', $buildNumber, $jobId);

获取作业日志

$buildNumber = 12;
$jobId = '0738da5f-0372-4b02-a1cb-f07a12fbcdcd';

$api->job()->getLogOutput('my-organization', 'my-pipeline', $buildNumber, $jobId);

删除作业日志

$buildNumber = 12;
$jobId = '0738da5f-0372-4b02-a1cb-f07a12fbcdcd';

$api->job()->deleteLogOutput('my-organization', 'my-pipeline', $buildNumber, $jobId);

获取作业的环境变量

$buildNumber = 12;
$jobId = '0738da5f-0372-4b02-a1cb-f07a12fbcdcd';

$api->job()->getEnvironmentVariables('my-organization', 'my-pipeline', $buildNumber, $jobId);

工件 API

通过 $api->artifact() 暴露与工件相关的方

工件 API 的详细文档可在 此处 找到。

获取构建上传的工件

$buildNumber = 12;
$api->artifact()->getByBuild('my-organization', 'my-pipeline', $buildNumber);

获取作业上传的工件

$buildNumber = 12;
$jobId = '0738da5f-0372-4b02-a1cb-f07a12fbcdcd';

$api->artifact()->getByJob('my-organization', 'my-pipeline', $buildNumber, $jobId);

获取特定工件

$buildNumber = 12;
$jobId = '0738da5f-0372-4b02-a1cb-f07a12fbcdcd';
$artifactId = '567038da5f03724b02a1cbf07a12fbcedfg';

$api->artifact()->get(
    'my-organization',
    'my-pipeline',
    $buildNumber,
    $jobId,
    $artifactId
);

删除特定工件

$buildNumber = 12;
$jobId = '0738da5f-0372-4b02-a1cb-f07a12fbcdcd';
$artifactId = '567038da5f03724b02a1cbf07a12fbcedfg';

$api->artifact()->delete(
    'my-organization',
    'my-pipeline',
    $buildNumber,
    $jobId,
    $artifactId
);

代理 API

通过 $api->agent() 暴露与代理相关的方

代理 API 的详细文档可在 此处 找到。

列出组织的代理

$api->agent()->list('my-organization');

获取特定代理

$agentId = '1d633306-de28-4944-ad84-fde0d50a6c9e';
$api->agent()->list('my-organization', $agentId);

停止代理

$agentId = '1d633306-de28-4944-ad84-fde0d50a6c9e';
$api->agent()->list('my-organization', $agentId);

注释 API

通过 $api->annotation() 暴露与注释相关的方

注释 API 的详细文档可在 此处 找到。

获取构建上传的注释

$buildNumber = 12;
$api->annotation()->list('my-organization', 'my-pipeline', $buildNumber);

用户 API

通过 $api->user() 暴露与用户相关的方

用户 API 的详细文档可在 此处 找到。

获取当前用户

$api->user()->whoami();

表情符号 API

通过$api->emoji()公开与表情符号相关的函数。

有关用户API的详细文档,请参阅此处

列出可用的表情符号

$api->emoji()->list('my-organization');

贡献

测试

make test

集成测试

进行集成测试需要一个Buildkite账户和一个正在运行的代理,以下环境变量必须设置。

  • BK_TEST_TOKEN
  • BK_TEST_ORG
  • BK_TEST_PREFIX
  • GITHUB_REF
  • GITHUB_REPOSITORY

这些可以在复制phpunit.xml.dist并使用以下片段进行扩展的phpunit.xml中设置

    <php>
        <env name="BK_TEST_TOKEN" value="my-buildkite-api-token"/>
        <env name="BK_TEST_ORG" value="my-organization-slug"/>
        <env name="BK_TEST_PREFIX" value="something-uniqe"/>
        <env name="GITHUB_REF" value="refs/heads/master"/>
        <env name="GITHUB_REPOSITORY" value="your-name/buildkite-php"/>
    </php>

一旦设置了环境变量,就可以启动测试套件。

make integration