Ci Integration
Hackorda connects to your CI pipeline so every test failure becomes a tracked, triageable bug automatically.
Status: requires an API key with
cycles:read + issues:write + runs:write. The MCP server is optional — the REST API works directly from CI scripts.
GitHub Actions example
# .github/workflows/test.yml
- name: Run tests
id: tests
run: npm test
continue-on-error: true
- name: File bug in Hackorda (on failure)
if: steps.tests.outcome == 'failure'
env:
HACKORDA_API_KEY: ${{ secrets.HACKORDA_API_KEY }}
HACKORDA_CYCLE_ID: ${{ vars.HACKORDA_CYCLE_ID }}
run: |
# Start a run
RUN_ID=$(curl -s -X POST "https://hackorda.kz/api/test-cycles/$HACKORDA_CYCLE_ID/runs" \
-H "Authorization: Bearer $HACKORDA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"notes": "CI automated run"}' | jq -r .id)
# File the issue
curl -s -X POST "https://hackorda.kz/api/test-cycles/$HACKORDA_CYCLE_ID/issues" \
-H "Authorization: Bearer $HACKORDA_API_KEY" \
-H "Content-Type: application/json" \
-d "{
\"title\": \"CI failure: ${{ github.workflow }} on ${{ github.ref }}\",
\"description\": \"Automated test failure in CI. Run: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}\",
\"severity\": \"high\",
\"type\": \"bug\",
\"url\": \"${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}\"
}"
# Complete the run
curl -s -X PATCH "https://hackorda.kz/api/test-cycles/$HACKORDA_CYCLE_ID/runs/$RUN_ID" \
-H "Authorization: Bearer $HACKORDA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"status": "completed"}'Required secrets
| Secret/variable | Value |
|---|---|
HACKORDA_API_KEY | Your hk_live_... key with cycles:read + issues:write + runs:write |
HACKORDA_CYCLE_ID | UUID of the active test cycle (find in the cycle URL) |
Scope for the API key
cycles:read, issues:write, runs:write — and optionally restrict to just
cycleIds: [HACKORDA_CYCLE_ID] for least-privilege.
Agent quickstart
Previous Page
List test cycles in the key's organization
Returns **all** test cycles owned by the key's organization (newest first). Unlike the browser feed, this does not apply the "exclude cycles I've already joined" filter — an agent needs to discover every cycle ID it can act on. If the key is cycle-restricted, only the listed cycles are returned. **Required scope:** `cycles:read`