CI/CD Pipeline Monitoring
Monitor scheduled CI/CD jobs and pipelines to catch failures in automated builds, deployments, and maintenance tasks.
Use Cases
- Nightly builds: Catch build failures overnight
 - Scheduled deployments: Monitor production releases
 - Database migrations: Track long-running migration jobs
 - Security scans: Alert on failed vulnerability checks
 - Backup jobs: Ensure automated backups complete
 - Cache warming: Monitor cache rebuild tasks
 
GitHub Actions
Basic Setup
Add Saturn CLI to your workflow:
name: Nightly Build
on:
  schedule:
    - cron: '0 3 * * *'  # Daily at 3 AM UTC
  workflow_dispatch:
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - name: Install Saturn CLI
        run: |
          curl -fsSL https://get.saturn.example.com | sh
          echo "$HOME/.saturn/bin" >> $GITHUB_PATH
      
      - name: Run Build with Monitoring
        env:
          SATURN_TOKEN: ${{ secrets.SATURN_TOKEN }}
        run: |
          saturn run --monitor ${{ secrets.SATURN_MONITOR_ID }} -- make build
With Explicit Start/Fail Pings
For more control over when pings are sent:
name: Production Deploy
on:
  schedule:
    - cron: '0 0 * * 1'  # Weekly on Monday
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - name: Notify Saturn - Start
        run: |
          curl -X POST https://api.saturn.example.com/api/ping/${{ secrets.SATURN_MONITOR_ID }}/start \
            -H "Authorization: Bearer ${{ secrets.SATURN_TOKEN }}"
      
      - name: Deploy
        id: deploy
        run: ./deploy.sh
      
      - name: Notify Saturn - Success
        if: success()
        run: |
          curl -X POST https://api.saturn.example.com/api/ping/${{ secrets.SATURN_MONITOR_ID }}/success \
            -H "Authorization: Bearer ${{ secrets.SATURN_TOKEN }}" \
            -H "Content-Type: application/json" \
            -d "{\"durationMs\": ${{ github.event.workflow_run.run_duration_ms }}}"
      
      - name: Notify Saturn - Failure
        if: failure()
        run: |
          curl -X POST https://api.saturn.example.com/api/ping/${{ secrets.SATURN_MONITOR_ID }}/fail \
            -H "Authorization: Bearer ${{ secrets.SATURN_TOKEN }}" \
            -H "Content-Type: application/json" \
            -d "{\"exitCode\": 1}"
Setup Secrets
Add to your repository secrets:
- Go to Settings → Secrets → Actions
 - Add 
SATURN_TOKEN(your org or monitor token) - Add 
SATURN_MONITOR_ID(e.g.,mon_abc123) 
GitLab CI
Basic Setup
nightly-tests:
  stage: test
  only:
    - schedules
  before_script:
    - curl -fsSL https://get.saturn.example.com | sh
    - export PATH="$HOME/.saturn/bin:$PATH"
  script:
    - saturn run --monitor $SATURN_MONITOR_ID -- make test
  variables:
    SATURN_TOKEN: $SATURN_TOKEN  # Set in CI/CD settings
With Anchors for Reusability
.saturn_before: &saturn_before
  - curl -X POST https://api.saturn.example.com/api/ping/$SATURN_MONITOR_ID/start
    -H "Authorization: Bearer $SATURN_TOKEN"
.saturn_after_success: &saturn_after_success
  - curl -X POST https://api.saturn.example.com/api/ping/$SATURN_MONITOR_ID/success
    -H "Authorization: Bearer $SATURN_TOKEN"
.saturn_after_failure: &saturn_after_failure
  - curl -X POST https://api.saturn.example.com/api/ping/$SATURN_MONITOR_ID/fail
    -H "Authorization: Bearer $SATURN_TOKEN"
nightly-deploy:
  stage: deploy
  only:
    - schedules
  before_script:
    - *saturn_before
  script:
    - ./deploy.sh
  after_script:
    - if [ $CI_JOB_STATUS == 'success' ]; then *saturn_after_success; else *saturn_after_failure; fi
Jenkins
Pipeline Script
pipeline {
    agent any
    
    triggers {
        cron('0 3 * * *')
    }
    
    environment {
        SATURN_MONITOR_ID = credentials('saturn-monitor-id')
        SATURN_TOKEN = credentials('saturn-token')
    }
    
    stages {
        stage('Notify Start') {
            steps {
                sh '''
                    curl -X POST https://api.saturn.example.com/api/ping/${SATURN_MONITOR_ID}/start \
                        -H "Authorization: Bearer ${SATURN_TOKEN}"
                '''
            }
        }
        
        stage('Build') {
            steps {
                sh 'make build'
            }
        }
        
        stage('Test') {
            steps {
                sh 'make test'
            }
        }
    }
    
    post {
        success {
            sh '''
                curl -X POST https://api.saturn.example.com/api/ping/${SATURN_MONITOR_ID}/success \
                    -H "Authorization: Bearer ${SATURN_TOKEN}" \
                    -H "Content-Type: application/json" \
                    -d "{\\"durationMs\\": $(($(date +%s) - ${BUILD_TIMESTAMP}/1000) * 1000)}"
            '''
        }
        failure {
            sh '''
                curl -X POST https://api.saturn.example.com/api/ping/${SATURN_MONITOR_ID}/fail \
                    -H "Authorization: Bearer ${SATURN_TOKEN}" \
                    -H "Content-Type: application/json" \
                    -d "{\\"exitCode\\": 1}"
            '''
        }
    }
}
CircleCI
version: 2.1
workflows:
  nightly:
    triggers:
      - schedule:
          cron: "0 3 * * *"
          filters:
            branches:
              only:
                - main
    jobs:
      - build-and-test
jobs:
  build-and-test:
    docker:
      - image: cimg/node:20.0
    steps:
      - checkout
      
      - run:
          name: Install Saturn CLI
          command: curl -fsSL https://get.saturn.example.com | sh
      
      - run:
          name: Run Tests with Monitoring
          command: |
            export PATH="$HOME/.saturn/bin:$PATH"
            saturn run --monitor $SATURN_MONITOR_ID -- npm test
Azure Pipelines
schedules:
  - cron: "0 3 * * *"
    displayName: Nightly Build
    branches:
      include:
        - main
pool:
  vmImage: 'ubuntu-latest'
steps:
  - script: curl -fsSL https://get.saturn.example.com | sh
    displayName: 'Install Saturn CLI'
  
  - script: |
      export PATH="$HOME/.saturn/bin:$PATH"
      saturn run --monitor $(SATURN_MONITOR_ID) -- make build
    displayName: 'Build with Monitoring'
    env:
      SATURN_TOKEN: $(SATURN_TOKEN)
Best Practices
1. Use Organization Tokens
For CI/CD, use org-wide tokens instead of monitor-specific tokens:
saturn run --monitor YOUR_MONITOR_ID --token YOUR_ORG_TOKEN -- command
This allows rotation without updating every pipeline.
2. Separate Monitors per Environment
Create different monitors for different environments:
nightly-build-stagingnightly-build-productiondeploy-proddeploy-staging
3. Tag Monitors
Use tags for filtering and organization:
# In dashboard, tag monitors with:
# - pipeline:github-actions
# - env:production
# - team:backend
4. Set Appropriate Grace Periods
CI jobs can vary in duration. Set grace periods generously:
- Short builds (< 5 min): 2-3 min grace
 - Medium builds (5-20 min): 5-10 min grace
 - Long builds (> 20 min): 15-30 min grace
 
Validation
Test your setup before relying on scheduled runs:
GitHub Actions
# Trigger manually
gh workflow run nightly-build.yml
GitLab CI
Use the CI/CD → Schedules page to trigger a test run.
Jenkins
Click Build Now on the job to test.
Troubleshooting
Secrets Not Available
GitHub Actions: Ensure secrets are set at the right level (repo vs. organization)
GitLab: Check Settings → CI/CD → Variables and ensure they're not protected if running on branches
Jenkins: Verify credentials are bound correctly in the pipeline
Network Restrictions
If your CI environment blocks external requests:
- Whitelist 
api.saturn.example.com - Or use a self-hosted Saturn instance within your network
 
Duration Not Tracked
Some CI systems don't expose workflow duration easily. Use manual timing:
START=$(date +%s)
# ... your job ...
END=$(date +%s)
DURATION=$(( (END - START) * 1000 ))
curl -X POST ... -d "{\"durationMs\": $DURATION}"
Next Steps
You should now see your first healthy monitor within 10 minutes.
Learn more:
- Monitor Types for scheduling options
 - Anomaly Detection to catch slow builds
 - Webhooks to trigger actions on failures
 - CLI Reference for advanced CLI options