Skip to main content

CI/CD Integration

Integrate the PipeOps CLI into your CI/CD pipelines for monitoring infrastructure and viewing deployment status.

note

The CLI currently focuses on read operations for monitoring. For deploying applications, use the PipeOps Web UI or integrate with Git-based deployments. You can use the CLI to monitor project status and view logs during your CI/CD processes.

General Principles​

Authentication in CI/CD​

Use environment variables for authentication:

export PIPEOPS_AUTH_TOKEN="your-token-here"
pipeops status proj-123

Security Best Practices:

  • Store tokens in your CI/CD platform's secrets manager
  • Never commit tokens to version control
  • Use read-only tokens when possible
  • Rotate tokens regularly

JSON Output for Scripting​

Always use --json flag in CI/CD scripts:

STATUS=$(pipeops status proj-123 --json | jq -r '.status')
if [ "$STATUS" = "running" ]; then
echo "Project is running"
exit 0
else
echo "Project check failed"
exit 1
fi

GitHub Actions​

Monitor Project Status​

name: Monitor PipeOps Project

on:
schedule:
- cron: '0 */6 * * *' # Every 6 hours
workflow_dispatch:

jobs:
monitor:
runs-on: ubuntu-latest
steps:
- name: Install PipeOps CLI
run: |
curl -fsSL https://get.pipeops.dev/cli.sh | bash
echo "$HOME/.local/bin" >> $GITHUB_PATH

- name: Check project status
env:
PIPEOPS_AUTH_TOKEN: ${{ secrets.PIPEOPS_TOKEN }}
run: |
pipeops status proj-123 --json

List Projects and Check Health​

name: List PipeOps Resources

on:
workflow_dispatch:

jobs:
list-resources:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3

- name: Install PipeOps CLI
run: |
curl -fsSL https://get.pipeops.dev/cli.sh | bash
echo "$HOME/.local/bin" >> $GITHUB_PATH

- name: List projects
env:
PIPEOPS_AUTH_TOKEN: ${{ secrets.PIPEOPS_TOKEN }}
run: |
pipeops list --json

- name: Check project health
env:
PIPEOPS_AUTH_TOKEN: ${{ secrets.PIPEOPS_TOKEN }}
run: |
PROJECT_STATUS=$(pipeops status proj-123 --json | jq -r '.status')
echo "Project status: $PROJECT_STATUS"
if [ "$PROJECT_STATUS" != "running" ]; then
echo "::warning::Project is not running"
fi

View Logs During CI/CD​

name: View Application Logs

on:
workflow_dispatch:
inputs:
project_id:
description: 'Project ID'
required: true
default: 'proj-123'

jobs:
view-logs:
runs-on: ubuntu-latest
steps:
- name: Install PipeOps CLI
run: |
curl -fsSL https://get.pipeops.dev/cli.sh | bash
echo "$HOME/.local/bin" >> $GITHUB_PATH

- name: Fetch logs
env:
PIPEOPS_AUTH_TOKEN: ${{ secrets.PIPEOPS_TOKEN }}
run: |
pipeops logs ${{ github.event.inputs.project_id }} --lines 100

GitLab CI​

Monitor Projects​

stages:
- monitor

monitor-projects:
stage: monitor
image: alpine:latest
before_script:
- apk add --no-cache curl bash jq
- curl -fsSL https://get.pipeops.dev/cli.sh | bash
- export PATH=$PATH:/root/.local/bin
script:
- pipeops list --json
- pipeops status proj-123
variables:
PIPEOPS_AUTH_TOKEN: $PIPEOPS_TOKEN
only:
- schedules

check-logs:
stage: monitor
image: alpine:latest
before_script:
- apk add --no-cache curl bash
- curl -fsSL https://get.pipeops.dev/cli.sh | bash
- export PATH=$PATH:/root/.local/bin
script:
- pipeops logs proj-123 --lines 50
variables:
PIPEOPS_AUTH_TOKEN: $PIPEOPS_TOKEN
when: manual

Jenkins​

Declarative Pipeline​

pipeline {
agent any

environment {
PIPEOPS_AUTH_TOKEN = credentials('pipeops-token')
PROJECT_ID = 'proj-123'
}

stages {
stage('Install CLI') {
steps {
sh '''
curl -fsSL https://get.pipeops.dev/cli.sh | bash
export PATH=$PATH:$HOME/.local/bin
'''
}
}

stage('List Projects') {
steps {
sh '''
export PATH=$PATH:$HOME/.local/bin
pipeops list --json
'''
}
}

stage('Check Status') {
steps {
sh '''
export PATH=$PATH:$HOME/.local/bin
pipeops status $PROJECT_ID
'''
}
}

stage('View Logs') {
steps {
sh '''
export PATH=$PATH:$HOME/.local/bin
pipeops logs $PROJECT_ID --lines 100
'''
}
}
}

post {
always {
echo 'Monitoring complete'
}
}
}

CircleCI​

version: 2.1

jobs:
monitor:
docker:
- image: cimg/base:stable
steps:
- checkout

- run:
name: Install PipeOps CLI
command: |
curl -fsSL https://get.pipeops.dev/cli.sh | bash
echo 'export PATH=$PATH:$HOME/.local/bin' >> $BASH_ENV

- run:
name: List projects
command: pipeops list --json

- run:
name: Check project status
command: pipeops status proj-123

workflows:
version: 2
scheduled-monitoring:
triggers:
- schedule:
cron: "0 * * * *"
filters:
branches:
only: main
jobs:
- monitor

Azure Pipelines​

trigger:
- main

schedules:
- cron: "0 */6 * * *"
displayName: Monitor projects every 6 hours
branches:
include:
- main

pool:
vmImage: 'ubuntu-latest'

steps:
- script: |
curl -fsSL https://get.pipeops.dev/cli.sh | bash
export PATH=$PATH:$HOME/.local/bin
displayName: 'Install PipeOps CLI'

- script: |
export PATH=$PATH:$HOME/.local/bin
pipeops list --json
displayName: 'List projects'
env:
PIPEOPS_AUTH_TOKEN: $(PIPEOPS_TOKEN)

- script: |
export PATH=$PATH:$HOME/.local/bin
pipeops status proj-123
displayName: 'Check project status'
env:
PIPEOPS_AUTH_TOKEN: $(PIPEOPS_TOKEN)

- script: |
export PATH=$PATH:$HOME/.local/bin
pipeops logs proj-123 --lines 50
displayName: 'View recent logs'
env:
PIPEOPS_AUTH_TOKEN: $(PIPEOPS_TOKEN)

Bitbucket Pipelines​

pipelines:
custom:
monitor-projects:
- step:
name: Monitor PipeOps Projects
image: alpine:latest
script:
- apk add --no-cache curl bash jq
- curl -fsSL https://get.pipeops.dev/cli.sh | bash
- export PATH=$PATH:/root/.local/bin
- pipeops list --json
- pipeops status proj-123
- pipeops logs proj-123 --lines 50

schedules:
hourly-monitor:
- step:
name: Scheduled Monitor
image: alpine:latest
script:
- apk add --no-cache curl bash
- curl -fsSL https://get.pipeops.dev/cli.sh | bash
- export PATH=$PATH:/root/.local/bin
- pipeops status proj-123

Best Practices​

Error Handling​

Always handle errors gracefully:

#!/bin/bash
set -e

# Check authentication
if ! pipeops status > /dev/null 2>&1; then
echo "Authentication failed"
exit 1
fi

# List projects with error handling
if ! pipeops list --json > projects.json; then
echo "Failed to list projects"
exit 1
fi

# Parse and check project status
PROJECT_COUNT=$(jq 'length' projects.json)
echo "Found $PROJECT_COUNT projects"

Logging and Notifications​

Send notifications based on status:

STATUS=$(pipeops status proj-123 --json | jq -r '.status')

if [ "$STATUS" != "running" ]; then
# Send notification (example with Slack)
curl -X POST -H 'Content-type: application/json' \
--data "{\"text\":\"⚠️ Project status: $STATUS\"}" \
$SLACK_WEBHOOK_URL
fi

Caching CLI Installation​

Cache the CLI installation to speed up builds:

# GitHub Actions example
- name: Cache PipeOps CLI
uses: actions/cache@v3
with:
path: ~/.local/bin
key: ${{ runner.os }}-pipeops-cli

- name: Install PipeOps CLI
if: steps.cache.outputs.cache-hit != 'true'
run: |
curl -fsSL https://get.pipeops.dev/cli.sh | bash

Monitoring Patterns​

Health Check Script​

Create a reusable health check script:

#!/bin/bash
# healthcheck.sh

PROJECT_ID=$1

if [ -z "$PROJECT_ID" ]; then
echo "Usage: $0 <project-id>"
exit 1
fi

echo "Checking health of project: $PROJECT_ID"

# Get project status
STATUS=$(pipeops status "$PROJECT_ID" --json | jq -r '.status')

case "$STATUS" in
"running")
echo "✓ Project is healthy"
exit 0
;;
"stopped")
echo "⚠ Project is stopped"
exit 1
;;
*)
echo "✗ Project status unknown: $STATUS"
exit 2
;;
esac

Use in CI:

chmod +x healthcheck.sh
./healthcheck.sh proj-123

Troubleshooting CI/CD​

Common Issues​

CLI Not Found​

# Ensure PATH is updated
export PATH=$PATH:$HOME/.local/bin
pipeops --version

Authentication Failed​

# Verify token is set
echo $PIPEOPS_AUTH_TOKEN | wc -c

# Test authentication
pipeops status

JSON Parsing Errors​

# Validate JSON output
pipeops list --json | jq .

# Handle missing jq
if ! command -v jq &> /dev/null; then
apt-get install -y jq # Debian/Ubuntu
# or
apk add jq # Alpine
fi

Next Steps​