# Build step fails This scenario tests the controller API to simulate a build, when one build step fails. SCENARIO build step fails Set up the controller. GIVEN an RSA key pair for token signing AND controller config uses statedir at the state directory AND controller config uses https://blobs.example.com as blob service AND an access token for user with scopes ... uapi_pipelines_post ... uapi_projects_post ... uapi_projects_id_pipelines_id_put ... uapi_projects_id_pipelines_id_get ... uapi_projects_id_builds_get ... uapi_workers_id_get ... uapi_builds_get ... uapi_builds_id_get ... uapi_logs_id_get AND a running ick controller Add up a project and its pipelines. WHEN user makes request POST /pipelines with a valid token and body ... { ... "pipeline": "construct", ... "actions": [ ... { "shell": "day 1" }, ... { "shell": "day 2" } ... ] ... } THEN result has status code 201 WHEN user makes request POST /projects with a valid token and body ... { ... "project": "rome", ... "pipelines": ["construct"] ... } THEN result has status code 201 Register a worker. GIVEN an access token for worker-manager with scopes ... uapi_workers_post ... uapi_work_post ... uapi_work_id_get WHEN worker-manager makes request POST /workers with a valid token and body ... { ... "worker": "obelix" ... } THEN result has status code 201 Trigger build. First with an invalid status, then a real one. WHEN user makes request PUT /projects/rome/pipelines/construct ... with a valid token and body { "status": "triggered" } THEN result has status code 200 Worker wants work and gets the first step to run. WHEN worker-manager makes request GET /work/obelix THEN result has status code 200 AND body matches ... { ... "build_id": "rome/1", ... "log": "/logs/rome/1", ... "worker": "obelix", ... "project": "rome", ... "pipeline": "construct", ... "parameters": {}, ... "step": { ... "action": "create_workspace" ... } ... } Worker reports some build output. Note the exit code indicating failure. WHEN worker-manager makes request POST /work with a valid token and body ... { ... "build_id": "rome/1", ... "worker": "obelix", ... "project": "rome", ... "pipeline": "construct", ... "exit_code": 1, ... "stdout": "", ... "stderr": "eek!", ... "timestamp": "2017-10-27T17:08:49" ... } THEN result has status code 201 A build step failed, so now the build has ended, and there's no more work to do. WHEN worker-manager makes request GET /work/obelix THEN result has status code 200 AND body matches {} User sees changed status. WHEN user makes request GET /workers/obelix THEN result has status code 200 AND body matches ... { ... "worker": "obelix", ... "doing": {} ... } The pipeline status indicates it's idle. WHEN user makes request GET /projects/rome/pipelines/construct THEN result has status code 200 AND body matches { "status": "idle" } Also, there's a build with a log. WHEN user makes request GET /builds THEN result has status code 200 AND body matches ... { ... "builds": [ ... { ... "build_id": "rome/1", ... "build_number": 1, ... "log": "/logs/rome/1", ... "worker": "obelix", ... "project": "rome", ... "pipeline": "construct", ... "actions": [ ... { "action": "create_workspace" }, ... { "shell": "day 1" }, ... { "shell": "day 2" } ... ], ... "current_action": null, ... "parameters": {}, ... "status": 1 ... } ... ] ... } WHEN user makes request GET /builds/rome/1 THEN result has status code 200 AND body matches ... { ... "build_id": "rome/1", ... "build_number": 1, ... "log": "/logs/rome/1", ... "worker": "obelix", ... "project": "rome", ... "pipeline": "construct", ... "actions": [ ... { "action": "create_workspace" }, ... { "shell": "day 1" }, ... { "shell": "day 2" } ... ], ... "current_action": null, ... "parameters": {}, ... "status": 1 ... } WHEN user makes request GET /logs/rome/1 THEN result has status code 200 AND result has header Content-Type: text/plain AND body text is "eek!" FINALLY stop ick controller