Skip to content

GitLab CI Integration

Prerequisites

  • GitLab project with access to CI/CD pipelines
  • BrowserStack Code Quality instance running at public URL (e.g., https://bscq.example.com)
  • Repository Added to BrowserStack Code Quality (see Configure Your First Scan)
  • Access Token from BrowserStack Code Quality User Settings
  • CircleCI runner or GitLab-hosted runners with Docker support

Verify BrowserStack Code Quality URL is accessible:

bash
curl -I https://your-bscq-instance.com

Configuration

GitLab CI/CD Variables

Store BrowserStack Code Quality token as a protected CI/CD variable:

  1. Go to Settings > CI/CD > Variables
  2. Click Add variable
  3. Key: BSCQ_TOKEN
  4. Value: <your-access-token>
  5. Check Protect variable (optional)
  6. Click Add variable

.gitlab-ci.yml

Create .gitlab-ci.yml in repository root:

yaml
stages:
  - scan
  - gate

variables:
  BSCQ_SERVER_URL: "https://your-bscq-instance.com"
  BSCQ_PROJECT_ID: "12345"
  BSCQ_REPOSITORY_ID: "67890"
  DOCKER_IMAGE: "browserstack/embold:latest"

embold-scan:
  stage: scan
  image: docker:latest
  services:
    - docker:dind
  variables:
    DOCKER_HOST: "tcp://docker:2375"
    DOCKER_TLS_CERTDIR: ""
  before_script:
    - export CI_COMMIT_SHA=$CI_COMMIT_SHA
    - export CI_COMMIT_BRANCH=$CI_COMMIT_BRANCH
  script:
    - |
      docker run --rm \
        -v "$CI_PROJECT_DIR":/app \
        -e BSCQ_SERVER_URL="$BSCQ_SERVER_URL" \
        -e BSCQ_TOKEN="$BSCQ_TOKEN" \
        -e BSCQ_PROJECT_ID="$BSCQ_PROJECT_ID" \
        -e BSCQ_REPOSITORY_ID="$BSCQ_REPOSITORY_ID" \
        -e CI_COMMIT_SHA="$CI_COMMIT_SHA" \
        -e CI_BRANCH_NAME="$CI_COMMIT_BRANCH" \
        "$DOCKER_IMAGE" scan
  only:
    - merge_requests
    - main
    - develop

embold-gate:
  stage: gate
  image: docker:latest
  services:
    - docker:dind
  variables:
    DOCKER_HOST: "tcp://docker:2375"
    DOCKER_TLS_CERTDIR: ""
  script:
    - |
      docker run --rm \
        -v "$CI_PROJECT_DIR":/app \
        -e BSCQ_SERVER_URL="$BSCQ_SERVER_URL" \
        -e BSCQ_TOKEN="$BSCQ_TOKEN" \
        -e BSCQ_PROJECT_ID="$BSCQ_PROJECT_ID" \
        "$DOCKER_IMAGE" gate-check
  allow_failure: false
  only:
    - merge_requests
    - main
    - develop

Parameters

VariableDescriptionValue
BSCQ_SERVER_URLBrowserStack Code Quality instance URLhttps://bscq.example.com
BSCQ_TOKENAPI token (from CI/CD Variables)$BSCQ_TOKEN
BSCQ_PROJECT_IDProject ID from BrowserStack Code Qualitye.g., 12345
BSCQ_REPOSITORY_IDRepository ID from BrowserStack Code Qualitye.g., 67890
CI_COMMIT_SHAGit commit hash (auto-provided by GitLab)$CI_COMMIT_SHA
CI_COMMIT_BRANCHBranch name (auto-provided by GitLab)$CI_COMMIT_BRANCH

Find IDs in BrowserStack Code Quality:

  • Project Settings shows Project ID
  • Repository Settings shows Repository ID

Verification

View Pipeline

  1. Go to CI/CD > Pipelines
  2. Click pipeline run number
  3. View stages: scan and gate

Check Job Logs

Click embold-scan or embold-gate job to view output:

[INFO] Connecting to https://your-bscq-instance.com
[INFO] Scanning repository: main-app
[INFO] Analyzing 1,245 files
[INFO] Detected 23 issues
[INFO] Quality score: 3.2/5.0
[INFO] Critical issues: 0
[OK] Quality gate passed

Merge Request Status

On your Merge Request:

  • View Pipelines section
  • Passed pipelines indicate scan succeeded and gate was met
  • Failed pipelines show gate rejection with violation details

Troubleshooting

Docker Image Not Found

  • Verify GitLab runner has internet connectivity
  • Check Docker registry proxy settings in Admin > Runners

Token Error

  • Go to Settings > CI/CD > Variables
  • Verify BSCQ_TOKEN is set correctly
  • Regenerate token if older than 90 days

Quality Gate Failed

  • View embold-gate job output for threshold violations
  • Configure gates in BrowserStack Code Quality Project Settings > Quality Gates

Service Connection Timeout

  • Verify BSCQ_SERVER_URL is publicly accessible from runner
  • Check firewall rules if using on-premise runners

Advanced: Matrix Builds

Run scans against multiple project configurations:

yaml
embold-scan:
  stage: scan
  image: docker:latest
  parallel:
    matrix:
      - BSCQ_PROJECT_ID: ["12345", "12346"]
        LANGUAGE: ["python", "javascript"]
  script:
    - |
      docker run --rm \
        -v "$CI_PROJECT_DIR":/app \
        -e BSCQ_SERVER_URL="$BSCQ_SERVER_URL" \
        -e BSCQ_TOKEN="$BSCQ_TOKEN" \
        -e BSCQ_PROJECT_ID="$BSCQ_PROJECT_ID" \
        -e BSCQ_LANGUAGE="$LANGUAGE" \
        "$DOCKER_IMAGE" scan

See Also