CI integration
Nijam is built to run in CI. You don’t pass commit, branch, PR, or author by hand - the pytest plugin
detects them automatically from your CI provider, so each pytest run lands in history with full
context.
What’s detected
Section titled “What’s detected”Commit, branch, PR number, CI run id, CI run URL, and the git author (email + name). Resolution order, per field:
- CI-specific environment variables (see below)
- Generic
GIT_*/BRANCH/COMMIT_SHAvariables - A
git log/git rev-parseshell-out - Empty (branch is left unset → the dashboard shows “No Branch Info”)
Supported providers
Section titled “Supported providers”Detected from GITHUB_SHA, GITHUB_REF_NAME, GITHUB_HEAD_REF, GITHUB_RUN_ID,
GITHUB_REPOSITORY, GITHUB_SERVER_URL.
name: testson: [push, pull_request]jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: { python-version: "3.12" } - run: pip install -r requirements.txt - run: pytest env: NIJAM_API_KEY: ${{ secrets.NIJAM_API_KEY }} NIJAM_PROJECT_ID: ${{ vars.NIJAM_PROJECT_ID }}Detected from CI_COMMIT_SHA, CI_COMMIT_REF_NAME, CI_PIPELINE_ID, CI_MERGE_REQUEST_IID,
GITLAB_USER_EMAIL, GITLAB_USER_NAME, CI_COMMIT_AUTHOR.
tests: image: python:3.12 script: - pip install -r requirements.txt - pytest variables: NIJAM_API_KEY: $NIJAM_API_KEY NIJAM_PROJECT_ID: $NIJAM_PROJECT_IDDetected from CIRCLE_SHA1, CIRCLE_BRANCH, CIRCLE_BUILD_NUM, CIRCLE_PULL_REQUEST,
CIRCLE_BUILD_URL.
jobs: test: docker: [{ image: cimg/python:3.12 }] steps: - checkout - run: pip install -r requirements.txt - run: pytest environment: NIJAM_API_KEY: $NIJAM_API_KEY NIJAM_PROJECT_ID: $NIJAM_PROJECT_IDDetected from BITBUCKET_COMMIT, BITBUCKET_BRANCH, BITBUCKET_PR_ID, BITBUCKET_BUILD_NUMBER,
BITBUCKET_REPO_FULL_NAME, BITBUCKET_GIT_HTTP_ORIGIN.
pipelines: default: - step: image: python:3.12 script: - pip install -r requirements.txt - pytestSplitting across jobs
Section titled “Splitting across jobs”If you split your suite across several CI jobs (for example with pytest-xdist distribution or a job
matrix), they all club into one Nijam run when they share the CI run id, and a failure in any job flips
that run to Failing right away. The dashboard shows running / failing live until the run completes.
When each job runs a different subset of tests, there’s no known total, so each job must not finalize
on its own. Set nijam_auto_complete = false (or the NIJAM_AUTO_COMPLETE=false env var), then
add one post-matrix step that calls POST /v1/runs/complete to mark the run done - passing the CI
run id the jobs shared (GITHUB_RUN_ID, CI_PIPELINE_ID, …) so it targets the right run.
pytest has no native --shard (unlike the Playwright and Vitest reporters), so there’s no
NIJAM_SHARD_INDEX / NIJAM_SHARD_TOTAL shortcut: this matrix plus the completion step is how you fan a
pytest suite out across jobs.
jobs: test: runs-on: ubuntu-latest strategy: fail-fast: false matrix: suite: [unit, integration, api, web] # one subset per job steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: { python-version: "3.12" } - run: pip install -r requirements.txt - run: pytest tests/${{ matrix.suite }} env: NIJAM_API_KEY: ${{ secrets.NIJAM_API_KEY }} NIJAM_PROJECT_ID: ${{ vars.NIJAM_PROJECT_ID }} NIJAM_AUTO_COMPLETE: "false" # don't finalize per job
summary: needs: [test] # after every suite job if: always() # complete even if some failed runs-on: ubuntu-latest steps: - run: | curl -sf -X POST "https://api.nijam.dev/v1/runs/complete" \ -H "Authorization: Bearer ${{ secrets.NIJAM_API_KEY }}" \ -H "Content-Type: application/json" \ -d "{\"projectId\":\"<your-project-id>\",\"ciRunId\":\"$GITHUB_RUN_ID\",\"ciRunAttempt\":\"$GITHUB_RUN_ATTEMPT\"}"A single pytest run needs none of this - it completes on its own.
Other CI systems
Section titled “Other CI systems”On a provider not listed above, set the generic variables and the plugin picks them up:
| Variable | Maps to |
|---|---|
COMMIT_SHA | commit |
BRANCH | branch |
CI_RUN_ID | CI run id |
CI_URL | CI run URL |
If none are set, the plugin still falls back to git, so local runs are attributed too. The full variable
list lives in the CI variables reference.
What you need to push runs
Section titled “What you need to push runs”To send runs and reports to Nijam, the plugin needs two things:
nijam_project_id- which project to push to. Not a secret; it just identifies the project. Usually set inpytest.ini(or viaNIJAM_PROJECT_ID).- API key - the only secret. Store it as
NIJAM_API_KEYin your CI secrets and reference it via the environment.
Everything else - commit, branch, PR, CI link, author - is detected automatically.