Skip to content
Contact Us

CI/CD Setup

Automate your Mirth Connect or Open Integration Engine deployments with continuous integration and continuous deployment (CI/CD) pipelines. This guide covers complete setup for popular CI/CD platforms with real-world examples.

  • Automated Testing - Validate channels before deployment
  • Consistent Deployments - Same process every time
  • Fast Rollbacks - Quick revert if issues arise
  • Audit Trail - Complete deployment history
  • Reduced Downtime - Automated processes are faster and more reliable
  • Team Confidence - Deployments become routine, not stressful
CI/CD pipeline from triggers through validation to deployment

GitHub Actions is tightly integrated with GitHub repositories and offers generous free tier for open source and private repos.

Create .github/workflows/deploy-production.yml:

name: Deploy to Production
on:
push:
branches: [main]
workflow_dispatch: # Manual trigger
env:
MIRTHSYNC_VERSION: "3.5.0"
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Setup Java
uses: actions/setup-java@v3
with:
distribution: "temurin"
java-version: "11"
- name: Download MirthSync
run: |
curl -L -o mirthsync.zip https://github.com/SagaHealthcareIT/mirthsync/releases/download/v${MIRTHSYNC_VERSION}/mirthsync-${MIRTHSYNC_VERSION}.zip
unzip mirthsync.zip
chmod +x mirthsync-${MIRTHSYNC_VERSION}/mirthsync.sh
- name: Deploy to Production
run: ./mirthsync-${MIRTHSYNC_VERSION}/mirthsync.sh -s ${{ secrets.MIRTH_SERVER }} -u ${{ secrets.MIRTH_USERNAME }} -t . --deploy-all push
env:
MIRTHSYNC_PASSWORD: ${{ secrets.MIRTHSYNC_PASSWORD }}
name: Deploy to Multiple Environments
on:
push:
branches:
- develop # Auto-deploy dev
- staging # Auto-deploy staging
- main # Auto-deploy production
pull_request:
branches: [main, staging]
env:
MIRTHSYNC_VERSION: "3.5.0"
jobs:
# Download MirthSync once and cache it
setup:
runs-on: ubuntu-latest
steps:
- name: Download MirthSync
run: |
curl -L -o mirthsync.zip https://github.com/SagaHealthcareIT/mirthsync/releases/download/v${MIRTHSYNC_VERSION}/mirthsync-${MIRTHSYNC_VERSION}.zip
unzip mirthsync.zip
- name: Upload MirthSync artifact
uses: actions/upload-artifact@v3
with:
name: mirthsync
path: mirthsync-${{ env.MIRTHSYNC_VERSION }}
# Test deployment on PRs (dry run)
test-deploy:
needs: setup
if: github.event_name == 'pull_request'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-java@v3
with:
distribution: "temurin"
java-version: "11"
- uses: actions/download-artifact@v3
with:
name: mirthsync
path: mirthsync
- run: chmod +x mirthsync/mirthsync.sh
- name: Test deployment to dev
run: ./mirthsync/mirthsync.sh -s ${{ secrets.DEV_MIRTH_SERVER }} -u ${{ secrets.DEV_MIRTH_USERNAME }} -t . push
env:
MIRTHSYNC_PASSWORD: ${{ secrets.DEV_MIRTHSYNC_PASSWORD }}
# Deploy to dev
deploy-dev:
needs: setup
if: github.ref == 'refs/heads/develop'
runs-on: ubuntu-latest
environment: development
steps:
- uses: actions/checkout@v3
- uses: actions/setup-java@v3
with:
distribution: "temurin"
java-version: "11"
- uses: actions/download-artifact@v3
with:
name: mirthsync
path: mirthsync
- run: chmod +x mirthsync/mirthsync.sh
- name: Deploy to Dev
run: ./mirthsync/mirthsync.sh -s ${{ secrets.DEV_MIRTH_SERVER }} -u ${{ secrets.DEV_MIRTH_USERNAME }} -t . --deploy-all push
env:
MIRTHSYNC_PASSWORD: ${{ secrets.DEV_MIRTHSYNC_PASSWORD }}
# Deploy to staging
deploy-staging:
needs: setup
if: github.ref == 'refs/heads/staging'
runs-on: ubuntu-latest
environment: staging
steps:
- uses: actions/checkout@v3
- uses: actions/setup-java@v3
with:
distribution: "temurin"
java-version: "11"
- uses: actions/download-artifact@v3
with:
name: mirthsync
path: mirthsync
- run: chmod +x mirthsync/mirthsync.sh
- name: Deploy to Staging
run: ./mirthsync/mirthsync.sh -s ${{ secrets.STAGING_MIRTH_SERVER }} -u ${{ secrets.STAGING_MIRTH_USERNAME }} -t . --deploy-all push
env:
MIRTHSYNC_PASSWORD: ${{ secrets.STAGING_MIRTHSYNC_PASSWORD }}
# Deploy to production (with approval)
deploy-production:
needs: setup
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
environment:
name: production
url: https://mirth.example.com
steps:
- uses: actions/checkout@v3
- uses: actions/setup-java@v3
with:
distribution: "temurin"
java-version: "11"
- uses: actions/download-artifact@v3
with:
name: mirthsync
path: mirthsync
- run: chmod +x mirthsync/mirthsync.sh
- name: Backup Production
run: |
mkdir -p backup
./mirthsync/mirthsync.sh -s ${{ secrets.PROD_MIRTH_SERVER }} -u ${{ secrets.PROD_MIRTH_USERNAME }} -t ./backup pull
tar -czf backup-${{ github.sha }}.tar.gz -C backup .
env:
MIRTHSYNC_PASSWORD: ${{ secrets.PROD_MIRTHSYNC_PASSWORD }}
- name: Deploy to Production
run: ./mirthsync/mirthsync.sh -s ${{ secrets.PROD_MIRTH_SERVER }} -u ${{ secrets.PROD_MIRTH_USERNAME }} -t . --deploy-all push
env:
MIRTHSYNC_PASSWORD: ${{ secrets.PROD_MIRTHSYNC_PASSWORD }}
- name: Upload Backup
uses: actions/upload-artifact@v3
with:
name: production-backup
path: backup-${{ github.sha }}.tar.gz
retention-days: 30
  1. Go to your GitHub repository
  2. Navigate to SettingsSecrets and variablesActions
  3. Click New repository secret
  4. Add these secrets:
    • MIRTH_SERVER - Your Mirth Connect API URL (e.g., https://mirth.example.com:8443/api)
    • MIRTH_USERNAME - API username
    • MIRTHSYNC_PASSWORD - API password (note: only MIRTHSYNC_PASSWORD is supported as an environment variable)

For multiple environments, use environment-specific secrets:

  • DEV_MIRTH_SERVER, DEV_MIRTH_USERNAME, DEV_MIRTHSYNC_PASSWORD
  • STAGING_MIRTH_SERVER, STAGING_MIRTH_USERNAME, STAGING_MIRTHSYNC_PASSWORD
  • PROD_MIRTH_SERVER, PROD_MIRTH_USERNAME, PROD_MIRTHSYNC_PASSWORD

Require manual approval for production:

  1. Go to SettingsEnvironments
  2. Create environment: production
  3. Enable Required reviewers
  4. Add team members who can approve deployments

# GitHub Actions example
test:
runs-on: ubuntu-latest
env:
MIRTHSYNC_VERSION: "3.5.0"
steps:
- uses: actions/checkout@v3
- uses: actions/setup-java@v3
with:
distribution: "temurin"
java-version: "11"
- name: Download MirthSync
run: |
curl -L -o mirthsync.zip https://github.com/SagaHealthcareIT/mirthsync/releases/download/v${MIRTHSYNC_VERSION}/mirthsync-${MIRTHSYNC_VERSION}.zip
unzip mirthsync.zip
chmod +x mirthsync-${MIRTHSYNC_VERSION}/mirthsync.sh
# Run custom tests on transformer JavaScript
- name: Test transformers
run: npm test
# Lint JavaScript in transformers
- name: Lint code
run: npm run lint
Terminal window
# Deploy to "green" environment
./mirthsync.sh -s $GREEN_MIRTH_SERVER -u $MIRTH_USERNAME -t . --deploy-all push
# Run smoke tests on green
./run-smoke-tests.sh $GREEN_MIRTH_SERVER
# If tests pass, switch traffic to green
# (via load balancer configuration)
# Keep blue as rollback option for 24 hours
Terminal window
# Deploy to first production server (10%)
./mirthsync.sh -s $PROD_SERVER1 -u $MIRTH_USERNAME -t . --deploy-all push
# Monitor metrics for 1 hour
# If no issues, deploy to remaining servers (90%)
./mirthsync.sh -s $PROD_SERVER2 -u $MIRTH_USERNAME -t . --deploy-all push
./mirthsync.sh -s $PROD_SERVER3 -u $MIRTH_USERNAME -t . --deploy-all push

GitHub Actions - Deploy at specific time:

on:
schedule:
- cron: "0 2 * * 0" # 2 AM every Sunday
workflow_dispatch: # Also allow manual trigger

Jenkins - Scheduled builds:

pipeline {
triggers {
cron('H 2 * * 0') # 2 AM every Sunday
}
// ...
}

# GitHub Actions
- name: Deploy to Production
id: deploy
run: ./mirthsync/mirthsync.sh -s ${{ secrets.PROD_MIRTH_SERVER }} -u ${{ secrets.PROD_MIRTH_USERNAME }} -t . --deploy-all push
env:
MIRTHSYNC_PASSWORD: ${{ secrets.PROD_MIRTHSYNC_PASSWORD }}
continue-on-error: true
- name: Smoke Test
id: test
run: ./smoke-test.sh
continue-on-error: true
- name: Rollback on Failure
if: steps.deploy.outcome == 'failure' || steps.test.outcome == 'failure'
run: |
echo "Deployment or tests failed, rolling back..."
git checkout HEAD~1
./mirthsync/mirthsync.sh -s ${{ secrets.PROD_MIRTH_SERVER }} -u ${{ secrets.PROD_MIRTH_USERNAME }} -t . -f --deploy-all push
env:
MIRTHSYNC_PASSWORD: ${{ secrets.PROD_MIRTHSYNC_PASSWORD }}
name: Rollback Production
on:
workflow_dispatch:
inputs:
commit:
description: "Commit SHA to rollback to"
required: true
env:
MIRTHSYNC_VERSION: "3.5.0"
jobs:
rollback:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Checkout target commit
run: git checkout ${{ github.event.inputs.commit }}
- uses: actions/setup-java@v3
with:
distribution: "temurin"
java-version: "11"
- name: Download MirthSync
run: |
curl -L -o mirthsync.zip https://github.com/SagaHealthcareIT/mirthsync/releases/download/v${MIRTHSYNC_VERSION}/mirthsync-${MIRTHSYNC_VERSION}.zip
unzip mirthsync.zip
chmod +x mirthsync-${MIRTHSYNC_VERSION}/mirthsync.sh
- name: Rollback Production
run: ./mirthsync-${MIRTHSYNC_VERSION}/mirthsync.sh -s ${{ secrets.PROD_MIRTH_SERVER }} -u ${{ secrets.PROD_MIRTH_USERNAME }} -t . -f --deploy-all push
env:
MIRTHSYNC_PASSWORD: ${{ secrets.PROD_MIRTHSYNC_PASSWORD }}

GitHub Actions:

- name: Notify Slack on Success
if: success()
uses: slackapi/slack-github-action@v1
with:
payload: |
{
"text": "✅ Production deployment successful",
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "Deployed ${{ github.sha }} to production"
}
}
]
}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }}
- name: Notify Slack on Failure
if: failure()
uses: slackapi/slack-github-action@v1
with:
payload: |
{
"text": "❌ Production deployment failed"
}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }}

Jenkins:

post {
success {
emailext (
subject: "✅ Deployment Successful: ${env.JOB_NAME}",
body: "Build ${env.BUILD_NUMBER} deployed successfully",
to: "team@example.com"
)
}
failure {
emailext (
subject: "❌ Deployment Failed: ${env.JOB_NAME}",
body: "Build ${env.BUILD_NUMBER} failed. Check console output.",
to: "team@example.com"
)
}
}

  1. Never commit secrets to Git

    • Use CI/CD platform’s secret management
    • Rotate secrets regularly
    • Use different credentials per environment
  2. Principle of Least Privilege

    • CI/CD user should have minimal required permissions
    • Read-only in dev, write in staging/production
    • Separate credentials per environment
  3. Audit Logging

    • Enable audit logs in Mirth Connect
    • Log all CI/CD deployments
    • Review logs regularly
# Example: Deploy from specific IP ranges only
# Configure in your CI/CD platform or firewall
# GitHub Actions: Use self-hosted runners in your network
jobs:
deploy:
runs-on: [self-hosted, production]

”mirthsync.sh: command not found” or “java: not found"

Section titled “”mirthsync.sh: command not found” or “java: not found"”
# Ensure Java is installed
- uses: actions/setup-java@v3
with:
distribution: "temurin"
java-version: "11"
# Download and make executable
- run: |
curl -L -o mirthsync.zip https://github.com/SagaHealthcareIT/mirthsync/releases/download/v3.5.0/mirthsync-3.5.0.zip
unzip mirthsync.zip
chmod +x mirthsync-3.5.0/mirthsync.sh
  • Verify server URL includes /api path (e.g., https://mirth.example.com:8443/api)
  • Check firewall rules allow CI/CD server IP
  • Confirm Mirth Connect is running
  • Test connection manually first
  • Verify credentials are correct
  • Check if credentials expired or need rotation
  • Ensure CI/CD user has API access enabled in Mirth Connect
  • Remember: only MIRTHSYNC_PASSWORD is supported as an environment variable