LEARNING PATHS & COURSES

Qlik Sense Deployment & Version Control: DEV/TEST/PROD Pipeline with Git

KlarMetrics

October 27, 2025 · 9 min read

This is Article 27 of the Qlik Sense Data Modeling Course.

📚 Qlik Sense Course – Article 27 of 28

Previous Article: Performance Tuning
Next Article: Data Governance

What is Deployment? Professional rollout of Qlik apps across environments (DEV/TEST/PROD) with version control, testing, and rollback-capable change management!

What Can You Learn About Deployment & Version Control?

After this guide you will be able to:

  1. Set up a multi-environment setup (DEV/TEST/PROD)
  2. Use Git for Qlik scripts
  3. Implement a deployment pipeline with testing

Time investment: 30 min reading + 4 hrs hands-on
Quick Win: In 1 hour you’ll have Git set up for your scripts

What Is the Principle of Controlled Change Management?

The Problem: Making script changes directly in production, no versioning, no rollback possible – production outages!

The Solution: Structured deployment pipeline – DEV → TEST → PROD with version control and automated tests!

The three-stage architecture provides the foundation that your deployment pipeline promotes through environments. Each stage — staging, transform, model — is validated before promotion.

What Are the Three Environments in Deployment & Version Control?

Environment Purpose Who uses it?
DEV Development, experiments, breaking changes OK Developers
TEST Integration testing, UAT, pre-production QA, business users
PROD Live system, stable, tested changes only End users

In Qlik Cloud, you can implement this separation using Qlik Cloud spaces for environment separation.

How Do You Configure Environment-Specific Settings?

How Is the Environment.qvs File (NOT in Git!) Used for Deployment & Version Control?

//============================================
// Environment.qvs
// Manually created on each server
// DO NOT commit to Git!
//============================================

SET vEnvironment = 'PROD';  // DEV, TEST or PROD

How Do I Manage Deployment & Version Control for the Config_DEV.qvs File?

//============================================
// DEV Configuration
//============================================

TRACE >>> Loading DEV Configuration;

// Paths
SET vDataPath = 'C:QlikDevData';
SET vQVDPath = 'C:QlikDevQVD';
SET vLogPath = 'C:QlikDevLogs';

// Database
SET vDBServer = 'DEV-SQL-01';
SET vDBName = 'SalesDB_Dev';
SET vDBUser = 'qlik_dev_user';

// Settings
SET vDebugMode = 1;
SET vRowLimit = 10000;  // Limit for faster DEV reloads
SET vLogLevel = 'DEBUG';  // Verbose logging

TRACE >>> DEV Configuration loaded;

How Do I Manage Deployment & Version Control for the Config_TEST.qvs File?

//============================================
// TEST Configuration
//============================================

TRACE >>> Loading TEST Configuration;

// Paths
SET vDataPath = 'test-nasQlikData';
SET vQVDPath = 'test-nasQlikQVD';
SET vLogPath = 'test-nasQlikLogs';

// Database
SET vDBServer = 'TEST-SQL-01';
SET vDBName = 'SalesDB_Test';
SET vDBUser = 'qlik_test_user';

// Settings
SET vDebugMode = 0;
SET vRowLimit = 0;  // Full data in TEST
SET vLogLevel = 'INFO';

TRACE >>> TEST Configuration loaded;

How Do I Manage Deployment and Version Control for the Config_PROD.qvs File?

//============================================
// PROD Configuration
//============================================

TRACE >>> Loading PROD Configuration;

// Paths
SET vDataPath = 'prod-nasQlikData';
SET vQVDPath = 'prod-nasQlikQVD';
SET vLogPath = 'prod-nasQlikLogs';

// Database
SET vDBServer = 'PROD-SQL-CLUSTER';
SET vDBName = 'SalesDB';
SET vDBUser = 'qlik_prod_user';

// Settings
SET vDebugMode = 0;
SET vRowLimit = 0;
SET vLogLevel = 'WARNING';  // Warnings and errors only

TRACE >>> PROD Configuration loaded;

How Does the Main Script with Environment Detection Work?

//============================================
// MAIN SCRIPT
//============================================

// Load environment (not in Git!)
$(Must_Include=lib://Scripts/Environment.qvs)

// Load environment-specific config
$(Must_Include=lib://Scripts/Config_$(vEnvironment).qvs)

TRACE ======================================;
TRACE Running in: $(vEnvironment);
TRACE Data Path: $(vDataPath);
TRACE DB Server: $(vDBServer);
TRACE ======================================;

// ... Rest of script uses config variables

Important: Environment.qvs is the ONLY file that does not go into Git – it is created manually on each server!

How Do I Set Up Git Version Control?

If you are new to Git, the official Git documentation provides an excellent starting point for understanding version control fundamentals.

What Is the Repository Structure for Deployment & Version Control?

qlik-sales-analytics/
├── .git/
├── .gitignore
├── README.md
├── CHANGELOG.md
├── scripts/
│   ├── 01_Config_DEV.qvs
│   ├── 01_Config_TEST.qvs
│   ├── 01_Config_PROD.qvs
│   ├── 02_Functions.qvs
│   ├── 03_Subroutines.qvs
│   ├── 10_Load_Staging.qvs
│   ├── 20_Transform.qvs
│   └── 30_Model.qvs
├── docs/
│   ├── Architecture.md
│   └── DataDictionary.xlsx
└── tests/
    └── validation_tests.qvs

What Is a .gitignore File?

# Environment-specific (not in Git!)
Environment.qvs
**/Environment.qvs

# Credentials
**/credentials.txt
**/passwords.txt

# QVD Files (binary, too large)
*.qvd

# Logs
*.log
logs/

# Temp files
*.tmp
*.bak
~$*

# OS files
.DS_Store
Thumbs.db

What Is the Branch Strategy in Deployment & Version Control?

# Branch structure
main           # Production-ready code
  ├── dev      # Integration branch
  │   ├── feature/new-customer-dimension
  │   ├── feature/sales-forecast
  │   └── bugfix/null-handling

# Workflow:
# 1. Develop feature
git checkout -b feature/new-dimension dev

# 2. Commit
git add scripts/20_Transform.qvs
git commit -m "feat: Add customer segmentation dimension"

# 3. Push
git push origin feature/new-dimension

# 4. Merge to dev
git checkout dev
git merge feature/new-dimension

# 5. Test in TEST environment

# 6. Deploy to PROD
git checkout main
git merge dev
git tag v1.2.0
git push origin main --tags

What Is the Commit Message Convention?

# Format: :
# Types:
feat:     # New functionality
fix:      # Bug fix
refactor: # Code restructuring
docs:     # Documentation change
test:     # Test additions
perf:     # Performance improvement

# Examples:
git commit -m "feat: Add incremental loading for sales data"
git commit -m "fix: Correct date parsing for German locale"
git commit -m "perf: Optimize QVD loads with WHERE EXISTS"
git commit -m "docs: Update README with deployment instructions"

How Does Pre-Deployment Validation Work?

What Are Validation Subroutines in Deployment & Version Control?

//============================================
// File: 99_Validation.qvs
//============================================

SUB ValidateDeployment
    TRACE ======================================;
    TRACE PRE-DEPLOYMENT VALIDATION;
    TRACE ======================================;

    // 1. Row Count Validation
    CALL CheckMinRows('Facts_Sales', 1000);
    CALL CheckMinRows('Dim_Customer', 100);

    // 2. Data Quality Validation
    LET vQualityScore = GetQualityScore('TRF_Sales');
    IF $(vQualityScore) < 0.95 THEN
        TRACE [ERROR] Quality score too low: $(vQualityScore);
        EXIT SCRIPT;
    END IF

    // 3. Model Validation
    CALL CheckSyntheticKeys();
    CALL CheckCircularReferences();

    // 4. Date Range Validation
    LET vMaxDate = Date(Max(OrderDate), 'DD/MM/YYYY');
    LET vToday = Date(Today(), 'DD/MM/YYYY');

    IF $(vMaxDate) < $(vToday) - 7 THEN
        TRACE [WARNING] Data is older than 7 days!;
    END IF

    TRACE ======================================;
    TRACE VALIDATION PASSED;
    TRACE ======================================;
END SUB

// Execute validation
CALL ValidateDeployment;

How Do I Check the Row Count?

SUB CheckMinRows(pTable, pMinRows)
    LET vActualRows = NoOfRows('$(pTable)');

    TRACE [CHECK] $(pTable): $(vActualRows) rows (min: $(pMinRows));

    IF $(vActualRows) < $(pMinRows) THEN
        TRACE [ERROR] Table $(pTable) has too few rows!;
        EXIT SCRIPT;
    END IF
END SUB

What Is the Deployment Checklist?

✓ Pre-Deployment (1-2 days before deployment):

  • [ ] Code review completed
  • [ ] All tests passed in DEV
  • [ ] Merged to dev branch
  • [ ] Deployed to TEST environment
  • [ ] UAT (User Acceptance Testing) successful
  • [ ] Performance tests OK
  • [ ] Documentation updated
  • [ ] CHANGELOG.md updated

✓ Deployment Day:

  • [ ] Create backup of PROD app
  • [ ] Communicate downtime (if necessary)
  • [ ] Merge to main branch
  • [ ] Create tag (v1.2.0)
  • [ ] Copy scripts to PROD
  • [ ] Run test reload in PROD
  • [ ] Execute validation tests
  • [ ] Smoke tests (critical charts)

✓ Post-Deployment:

  • [ ] Check monitoring (no errors?)
  • [ ] Compare performance metrics
  • [ ] Collect user feedback (first few hours)
  • [ ] Notify team (deployment successful)

For Qlik Cloud deployments, refer to the Qlik Cloud tenant administration documentation for environment-specific configuration guidance.

What Is a Rollback Strategy in Deployment & Version Control?

How Do I Create a Backup Before Deployment?

# 1. Create backup
# QMC → Apps → Sales Analytics → More Actions → Export
# Save as: SalesAnalytics_v1.1.0_backup_20250107.qvf

# 2. Back up scripts
cd /qlik/scripts/SalesAnalytics
cp -r . ../SalesAnalytics_backup_20250107/

# 3. Git tag for rollback
git tag v1.1.0-pre-deployment

How Do I Perform a Rollback?

# Option 1: Git Revert
git revert
git push origin main

# Option 2: Git Reset (if not yet pushed)
git reset --hard v1.1.0
git push origin main --force

# Option 3: Restore backup app
# QMC → Apps → Import → SalesAnalytics_backup.qvf

Important: Define and test your rollback plan BEFOREHAND! In an emergency there is no time for troubleshooting.

How Does Automated Testing Work in Deployment & Version Control?

What Is a Test Suite File?

//============================================
// File: tests/ValidationTests.qvs
//============================================

// Test 1: Data Completeness
SUB TestDataCompleteness
    TRACE [TEST] Data Completeness;

    LET vExpectedTables = 5;
    LET vActualTables = NoOfTables();

    IF $(vActualTables) <> $(vExpectedTables) THEN
        TRACE [FAIL] Expected $(vExpectedTables) tables, got $(vActualTables);
        LET vTestsFailed = $(vTestsFailed) + 1;
    ELSE
        TRACE [PASS] All tables loaded;
    END IF
END SUB

// Test 2: Date Ranges
SUB TestDateRanges
    TRACE [TEST] Date Ranges;

    LET vMinDate = Num(Min(OrderDate));
    LET vMaxDate = Num(Max(OrderDate));
    LET vExpectedMin = Num(MakeDate(2020, 1, 1));

    IF $(vMinDate) < $(vExpectedMin) THEN
        TRACE [FAIL] Data too old: $(vMinDate);
        LET vTestsFailed = $(vTestsFailed) + 1;
    ELSE
        TRACE [PASS] Date ranges valid;
    END IF
END SUB

// Test 3: No Synthetic Keys
SUB TestNoSyntheticKeys
    TRACE [TEST] No Synthetic Keys;

    FOR i = 0 TO NoOfTables() - 1
        LET vTableName = TableName($(i));
        IF Left('$(vTableName)', 4) = '$Syn' THEN
            TRACE [FAIL] Synthetic key found: $(vTableName);
            LET vTestsFailed = $(vTestsFailed) + 1;
        END IF
    NEXT i

    TRACE [PASS] No synthetic keys;
END SUB

// Execute all tests
LET vTestsFailed = 0;

CALL TestDataCompleteness;
CALL TestDateRanges;
CALL TestNoSyntheticKeys;

IF $(vTestsFailed) > 0 THEN
    TRACE ======================================;
    TRACE [ERROR] $(vTestsFailed) tests failed!;
    TRACE ======================================;
    EXIT SCRIPT;
ELSE
    TRACE ======================================;
    TRACE [SUCCESS] All tests passed!;
    TRACE ======================================;
END IF

What Documentation Requirements Exist for Deployment & Version Control?

Documentation is a key part of governance standards — establishing consistent templates and requirements ensures that deployments are reproducible and auditable.

How Do I Create a README.md Template for Deployment & Version Control?

# Sales Analytics Qlik App

## Overview
Sales analytics application with incremental loading and customer segmentation.

## Architecture
- **Staging Layer**: Raw extracts from source systems
- **Transform Layer**: Business logic and data quality
- **Model Layer**: Star schema with Facts_Sales + Dimensions

## Environments
- **DEV**: Development server (qlik-dev-01)
- **TEST**: Testing server (qlik-test-01)
- **PROD**: Production server (qlik-prod-cluster)

## Deployment
See [Deployment Guide](docs/Deployment.md)

## Configuration
Environment-specific configs in `scripts/Config_[ENV].qvs`

## Data Sources
- SQL Server: Sales transactions (daily)
- Excel: Product catalog (weekly)
- REST API: Customer data (hourly)

## Reload Schedule
- Staging: Every hour
- Transform + Model: Every 4 hours

## Contacts
- Owner: John Doe (john.doe@company.com)
- Team: BI Team

## Version
Current: v1.2.0

What Goes in the CHANGELOG.md for Deployment & Version Control?

# Changelog

## [1.2.0] - 2025-01-10
### Added
- Customer segmentation dimension (RFM analysis)
- Incremental loading for sales data
- Data quality dashboard

### Changed
- Optimized QVD loads (+50% faster)
- Updated customer hierarchy

### Fixed
- Date parsing for international formats
- NULL handling in product mapping

## [1.1.0] - 2024-12-15
### Added
- Initial version with basic star schema

What Are the Best Practices for Deployment & Version Control?

✓ Version Control:

  • [ ] Git for all scripts
  • [ ] .gitignore configured
  • [ ] Branch strategy defined (main/dev/feature)
  • [ ] Commit conventions established

✓ Environments:

  • [ ] DEV/TEST/PROD separated
  • [ ] Environment-specific configs
  • [ ] Environment.qvs on each server

✓ Deployment:

  • [ ] Deployment checklist
  • [ ] Pre-deployment validation
  • [ ] Backup before deployment
  • [ ] Rollback plan
  • [ ] Post-deployment monitoring

✓ Documentation:

  • [ ] README.md
  • [ ] CHANGELOG.md
  • [ ] Architecture diagram
  • [ ] Deployment guide

How Can I Troubleshoot Deployment & Version Control Problems?

⚠️ Problem: Script does not work after deployment to TEST

Cause: Environment.qvs not created or wrong config loaded

Solution:

// 1. Check: Does Environment.qvs exist?
// lib://Scripts/Environment.qvs with SET vEnvironment = 'TEST'

// 2. Check: Which config is being loaded?
TRACE Environment: $(vEnvironment);
TRACE Data Path: $(vDataPath);

// 3. Check: Does the config file exist?
// Config_TEST.qvs must exist
⚠️ Problem: Git Merge Conflicts in Scripts

Solution: Resolve conflicts manually

# 1. Attempt merge
git merge dev

# 2. View conflicts
git status
# Conflicts in: scripts/20_Transform.qvs

# 3. Open file, look for conflicts
# <<<<<<< HEAD
# ... your code
# =======
# ... other code
# >>>>>>> dev

# 4. Resolve manually, remove markers

# 5. Commit
git add scripts/20_Transform.qvs
git commit -m "fix: Resolve merge conflicts in transform layer"
⚠️ Problem: Rollback after failed deployment

Immediate actions:

  1. Import backup app from QMC
  2. Copy old scripts back from backup folder
  3. Run test reload
  4. Reset Git to previous state

Post-mortem:

  • What went wrong?
  • Why did tests not catch it?
  • How do we prevent this?

What Are the Next Steps for Deployment & Version Control?

You can now carry out professional deployments! What comes next:

1. Data Governance: Establish standards and processes. Data Governance shows you how.

2. Monitoring: Set up post-deployment monitoring.

What Related Topics Are Covered in the Course on Deployment & Version Control?

What would help you most right now?

Thanks!