Skip to content

Deployment Guide ​

Learn how to deploy your Salesforce application using the automated CI/CD pipeline.

Overview ​

This repository includes a GitHub Actions workflow that:

  • ✅ Validates code on every pull request
  • ✅ Runs automated tests (LWC Jest + Apex)
  • ✅ Creates and validates scratch orgs
  • ✅ Reports code coverage to CodeCov
  • ✅ Ensures code quality before merging

GitHub Actions Workflow ​

Workflow File ​

The CI/CD pipeline is defined in .github/workflows/ci.yml

Trigger Events ​

The workflow runs on:

yaml
on:
  push:
    branches: [main]
  pull_request:
    branches: [main]
  • Pull Requests: Validates changes before merging
  • Pushes to main: Ensures main branch is always healthy

Workflow Steps ​

  1. Checkout Code: Gets the latest code from repository
  2. Setup Node.js: Installs Node.js 20
  3. Install Dependencies: Runs npm ci
  4. Authenticate with Dev Hub: Uses SFDX_AUTH_URL_DEVHUB secret
  5. Create Scratch Org: Temporary org for testing
  6. Deploy Source: Pushes metadata to scratch org
  7. Run Apex Tests: Executes all Apex tests
  8. Run LWC Jest Tests: Runs component tests
  9. Upload Coverage: Sends coverage to CodeCov
  10. Cleanup: Deletes scratch org

Required Secrets ​

Setting Up Secrets ​

Navigate to your GitHub repository:

  1. Settings → Secrets and variables → Actions
  2. Click "New repository secret"
  3. Add the following secrets:

1. SFDX_AUTH_URL_DEVHUB ​

Purpose: Authenticates with your Dev Hub org

How to get it:

bash
# Authenticate with your Dev Hub
sf org login web -d -a DevHub

# Get the auth URL

sf org auth show-sfdx-auth-url -o DevHub

Copy the entire force:// URL and save it as a secret.

Alternative method (JSON, e.g. for scripting):

bash
# Output the auth URL as JSON
sf org auth show-sfdx-auth-url -o DevHub --no-prompt --json > auth.json

# Extract "sfdxAuthUrl" from the JSON file
# Copy the value and save as secret
# Delete auth.json after copying (contains sensitive data!)

2. CODECOV_TOKEN (Optional) ​

Purpose: Uploads code coverage to CodeCov

How to get it:

  1. Go to codecov.io
  2. Sign in with GitHub
  3. Add your repository
  4. Copy the upload token
  5. Add as secret in GitHub

Note: CodeCov is optional. Remove the upload step from workflow if not using.

Local Deployment ​

Deploy to Scratch Org ​

bash
# Create scratch org
sf org create scratch -f config/project-scratch-def.json -a dev -d 30

# Deploy source
sf project deploy start -o dev

# Run tests
sf apex run test --test-level RunLocalTests -o dev

# Open org
sf org open -o dev

Deploy to Sandbox ​

bash
# Authenticate with sandbox
sf org login web -a MySandbox

# Deploy source
sf project deploy start -o MySandbox

# Run tests
sf apex run test --test-level RunLocalTests -o MySandbox

# Validate deployment (without deploying)
sf project deploy validate -o MySandbox

Deploy to Production ​

bash
# Authenticate with production
sf org login web -a Production

# Validate deployment with all tests
sf project deploy validate --test-level RunLocalTests -o Production

# If validation succeeds, deploy
sf project deploy start --test-level RunLocalTests -o Production

Production Deployment Checklist:

  • ✅ All tests passing
  • ✅ Code coverage >75%
  • ✅ Validated in sandbox
  • ✅ Change set documented
  • ✅ Rollback plan ready

Continuous Integration Best Practices ​

Branch Protection Rules ​

Recommended settings for main branch:

  1. Navigate to: Settings → Branches → Add rule
  2. Branch name pattern: main
  3. Enable:
    • ✅ Require pull request before merging
    • ✅ Require approvals (1+)
    • ✅ Require status checks to pass
    • ✅ Require branches to be up to date
    • ✅ Include administrators

Pull Request Workflow ​

  1. Create feature branch

    bash
    git checkout -b feature/my-feature
  2. Make changes and commit

    bash
    git add .
    git commit -m "Add new feature"
  3. Push to GitHub

    bash
    git push origin feature/my-feature
  4. Create Pull Request

    • Go to GitHub repository
    • Click "Pull requests" → "New pull request"
    • Select your feature branch
    • Add description
    • Create pull request
  5. CI/CD runs automatically

    • GitHub Actions workflow starts
    • All checks must pass
    • Review code coverage report
  6. Review and Merge

    • Request code review
    • Address feedback
    • Merge when approved and checks pass

Customizing the Workflow ​

Modify Test Level ​

Edit .github/workflows/ci.yml:

yaml
# Current (runs local tests only)
- name: Run Apex Tests
  run: sf apex run test --test-level RunLocalTests

# Run all tests (including managed packages)
- name: Run Apex Tests
  run: sf apex run test --test-level RunAllTestsInOrg

Add Deployment Step ​

Add to workflow for automatic deployment:

yaml
- name: Deploy to Integration Org
  if: github.ref == 'refs/heads/main'
  run: |
    sf org login sfdx-url --sfdx-url-file=INTEGRATION_AUTH_URL
    sf project deploy start

Skip Tests for Documentation ​

yaml
on:
  push:
    branches: [main]
    paths-ignore:
      - "website/**"
      - "**.md"
      - "docs/**"

Monitoring and Debugging ​

View Workflow Runs ​

  1. Go to repository on GitHub
  2. Click "Actions" tab
  3. View all workflow runs
  4. Click specific run for details

Debugging Failed Workflows ​

  1. Check logs:

    • Click failed workflow
    • Expand failed step
    • Read error messages
  2. Common issues:

    • Authentication failure → Check SFDX_AUTH_URL_DEVHUB secret
    • Test failures → Run tests locally
    • Deployment errors → Check metadata format
  3. Re-run workflow:

    • Click "Re-run failed jobs"
    • Or push new commit with fixes

Code Coverage ​

View coverage reports:

  • CodeCov: Visit your repository on codecov.io
  • GitHub PR: Coverage comment appears on PRs
  • Locally: npm run test:unit:coverage

Advanced Configuration ​

Multiple Environments ​

Set up different environments:

yaml
jobs:
  deploy-dev:
    # Deploy to dev environment

  deploy-uat:
    needs: deploy-dev
    # Deploy to UAT after dev

  deploy-prod:
    needs: deploy-uat
    if: github.ref == 'refs/heads/main'
    # Deploy to prod after UAT

Scheduled Workflows ​

Run tests on schedule:

yaml
on:
  schedule:
    - cron: "0 0 * * *" # Daily at midnight

Manual Workflow Dispatch ​

Allow manual triggers:

yaml
on:
  workflow_dispatch:
    inputs:
      environment:
        description: "Environment to deploy to"
        required: true
        type: choice
        options:
          - dev
          - uat
          - prod

Deployment Checklist ​

Before deploying to production:

  • [ ] All tests passing locally
  • [ ] Code reviewed by team member
  • [ ] CI/CD pipeline green
  • [ ] Code coverage ≥75%
  • [ ] Tested in sandbox environment
  • [ ] Documentation updated
  • [ ] Release notes prepared
  • [ ] Stakeholders notified
  • [ ] Rollback plan documented
  • [ ] Production backup taken

Next Steps ​