CI on Boat VMs
Get CI overview
Setup steps, jobs boat did not run, linked GitHub accounts and repositories, 7-day stats and jobs.
GET
/
ci
Get CI overview
curl --request GET \
--url https://boat.dev/api/v1/ci \
--header 'Authorization: Bearer <token>'import requests
url = "https://boat.dev/api/v1/ci"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://boat.dev/api/v1/ci', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://boat.dev/api/v1/ci",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://boat.dev/api/v1/ci"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://boat.dev/api/v1/ci")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://boat.dev/api/v1/ci")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"ok": true,
"type": "ci.overview",
"setup": {
"complete": true,
"next": "install",
"steps": [
{
"id": "<string>",
"title": "<string>",
"done": true,
"detail": "<string>"
}
],
"problems": [
{
"jobId": "<string>",
"repo": "<string>",
"message": "<string>",
"at": "2023-11-07T05:31:56Z",
"count": 123
}
]
},
"installations": [
{
"id": "<string>",
"accountLogin": "acme",
"accountType": "Organization",
"manageUrl": "<string>",
"repositories": [
{
"fullName": "acme/api",
"private": true,
"htmlUrl": "<string>",
"status": "ok",
"jobs7d": 123,
"lastState": "queued",
"lastAt": "2023-11-07T05:31:56Z",
"lastError": "<string>"
}
],
"teamId": "<string>",
"allowPublicRepos": true
}
],
"counts": {
"all": 123,
"active": 123,
"failed": 123
},
"stats": {
"jobs": 123,
"running": 123,
"successRate": 123,
"medianWaitSeconds": 123,
"medianRunSeconds": 123,
"costDollars": 123,
"perDay": [
{
"day": "2023-12-25",
"success": 123,
"failure": 123,
"other": 123
}
]
},
"jobs": [
{
"id": "122395651084",
"repo": "acme/api",
"jobName": "test",
"label": "boat-large/debug",
"machineClass": "small",
"state": "queued",
"queuedAt": "2023-11-07T05:31:56Z",
"runId": "<string>",
"workflowName": "ci",
"headBranch": "main",
"headSha": "<string>",
"htmlUrl": "<string>",
"error": "<string>",
"sandboxId": "<string>",
"sandboxState": "live",
"runStartedAt": "2023-11-07T05:31:56Z",
"finishedAt": "2023-11-07T05:31:56Z",
"waitSeconds": 123,
"runSeconds": 123,
"costDollars": 123
}
],
"filter": {
"account": "<string>",
"repo": "<string>",
"state": "all"
}
}{
"ok": false,
"type": "sandbox.error",
"status": 400,
"code": "invalid_json",
"message": "Request body must be valid JSON.",
"error": {
"code": "invalid_json",
"message": "Request body must be valid JSON.",
"status": 400
},
"requestId": "req_01HX..."
}{
"ok": false,
"type": "sandbox.error",
"status": 401,
"code": "unauthorized",
"message": "Unauthorized",
"error": {
"code": "unauthorized",
"message": "Unauthorized",
"status": 401
},
"requestId": "req_01HX..."
}Authorizations
Boat bearer token in the form boat_.... Service API keys authenticate sandbox operations.
Query Parameters
Only this GitHub account (organization or user login).
Only this repository, as owner/name.
active = queued or running. failed = failed, never started, or refused.
Available options:
all, active, failed Required range:
1 <= x <= 500Response
The overview.
Example:
true
Stable success envelope discriminator added by v1.
Allowed value:
"ci.overview"The four setup steps, the next one to do, and jobs boat did not run (grouped by repository and reason).
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Jobs in the last 7 days in the account and repo scope, per state tab.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
⌘I
Get CI overview
curl --request GET \
--url https://boat.dev/api/v1/ci \
--header 'Authorization: Bearer <token>'import requests
url = "https://boat.dev/api/v1/ci"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://boat.dev/api/v1/ci', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://boat.dev/api/v1/ci",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://boat.dev/api/v1/ci"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://boat.dev/api/v1/ci")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://boat.dev/api/v1/ci")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"ok": true,
"type": "ci.overview",
"setup": {
"complete": true,
"next": "install",
"steps": [
{
"id": "<string>",
"title": "<string>",
"done": true,
"detail": "<string>"
}
],
"problems": [
{
"jobId": "<string>",
"repo": "<string>",
"message": "<string>",
"at": "2023-11-07T05:31:56Z",
"count": 123
}
]
},
"installations": [
{
"id": "<string>",
"accountLogin": "acme",
"accountType": "Organization",
"manageUrl": "<string>",
"repositories": [
{
"fullName": "acme/api",
"private": true,
"htmlUrl": "<string>",
"status": "ok",
"jobs7d": 123,
"lastState": "queued",
"lastAt": "2023-11-07T05:31:56Z",
"lastError": "<string>"
}
],
"teamId": "<string>",
"allowPublicRepos": true
}
],
"counts": {
"all": 123,
"active": 123,
"failed": 123
},
"stats": {
"jobs": 123,
"running": 123,
"successRate": 123,
"medianWaitSeconds": 123,
"medianRunSeconds": 123,
"costDollars": 123,
"perDay": [
{
"day": "2023-12-25",
"success": 123,
"failure": 123,
"other": 123
}
]
},
"jobs": [
{
"id": "122395651084",
"repo": "acme/api",
"jobName": "test",
"label": "boat-large/debug",
"machineClass": "small",
"state": "queued",
"queuedAt": "2023-11-07T05:31:56Z",
"runId": "<string>",
"workflowName": "ci",
"headBranch": "main",
"headSha": "<string>",
"htmlUrl": "<string>",
"error": "<string>",
"sandboxId": "<string>",
"sandboxState": "live",
"runStartedAt": "2023-11-07T05:31:56Z",
"finishedAt": "2023-11-07T05:31:56Z",
"waitSeconds": 123,
"runSeconds": 123,
"costDollars": 123
}
],
"filter": {
"account": "<string>",
"repo": "<string>",
"state": "all"
}
}{
"ok": false,
"type": "sandbox.error",
"status": 400,
"code": "invalid_json",
"message": "Request body must be valid JSON.",
"error": {
"code": "invalid_json",
"message": "Request body must be valid JSON.",
"status": 400
},
"requestId": "req_01HX..."
}{
"ok": false,
"type": "sandbox.error",
"status": 401,
"code": "unauthorized",
"message": "Unauthorized",
"error": {
"code": "unauthorized",
"message": "Unauthorized",
"status": 401
},
"requestId": "req_01HX..."
}