Version Number Structure
Business Central app version numbers consist of four segments:Major
Major version number, read from
app.json or repoVersion setting.Increment for breaking changes.Minor
Minor version number, read from
app.json or repoVersion setting.Increment for new features.Build
Build number, calculated based on versioning strategy.Automatically incremented.
Revision
Revision number, calculated based on versioning strategy.Tracks rebuild attempts.
Versioning Strategies
AL-Go supports multiple versioning strategies configured via theversioningStrategy setting.
Strategy 0: GitHub Run Number (Default)
- Major.Minor: Read from
app.json - Build: GitHub workflow
run_number+runNumberOffset - Revision: GitHub workflow
run_attempt- 1
Best for: Most projects. Provides ever-increasing build numbers tied to CI/CD workflow runs.
- Simple and predictable
- Build numbers never conflict
- Easy to trace back to workflow run
- Build numbers reset if you migrate to a new repository
- Use
runNumberOffsetto continue numbering or reset when incrementing major/minor
Strategy 2: Date-Based Versioning
- Major.Minor: Read from
app.json - Build: Current date as
yyyyMMdd(UTC) - Revision: Current time as
hhmmss(UTC)
- Version number indicates when it was built
- Intuitive for time-based releases
- Daily builds
- Nightly releases
- Projects with infrequent builds
Strategy 3: Explicit Build Number
- Major.Minor.Build: All read from
app.json - Revision: GitHub workflow
run_number
Full Control: You manually control Major, Minor, and Build numbers. Only Revision auto-increments.
- Complete control over version numbers
- Useful for semantic versioning with specific build numbers
- Good for coordinated releases across multiple apps
- Manual updates to
app.jsonwhen incrementing build number - Discipline to keep version numbers consistent
Strategy 15: Maximum Build Number
- Major.Minor: Read from
app.json - Build: Maximum possible value (32767 or 65535 depending on platform)
- Revision: GitHub workflow
run_number
- Pull request builds (temporary artifacts)
- Developer test builds
- Experimental workflows
- Ensuring test builds sort after production builds
Strategy +16: Repo Version Override
Add 16 to any strategy to userepoVersion instead of individual app.json versions.
- All apps use
repoVersionfor Major.Minor instead of theirapp.jsonvalues - For strategy 19 (3+16), Build is also taken from
repoVersion - Build and Revision follow the base strategy rules
Multi-App Projects: Use +16 strategies when you have multiple apps that should share the same Major.Minor version number.
Repo Version Setting
TherepoVersion setting defines the project-level version number.
- Build artifacts are named:
<project>-Apps-<repoVersion>.<build>.<revision> - Used as Major.Minor when
versioningStrategyis +16 - For strategy 19, can include Build:
"repoVersion": "1.0.5"
- After each release (to prepare for next version)
- When incrementing major or minor version
- To align with marketing version numbers
Run Number Offset
TherunNumberOffset setting adjusts the build number for strategy 0 and 16.
Reset Build Number
When incrementing major/minor version, reset build number:Continue Numbering After Migration
When migrating to a new repository:Choosing a Versioning Strategy
Consider your release cadence
Frequent releases: Strategy 0 or 2Controlled releases: Strategy 3Mixed releases: Strategy 0 with periodic repoVersion updates
Evaluate app count
Single app: Any strategy worksMultiple apps with independent versions: Strategy 0, 2, or 3Multiple apps with shared versions: Strategy 16 or 19
Practical Examples
Example 1: Standard Per-Tenant Extension
- Run 1:
1.0.1.0 - Run 2:
1.0.2.0 - Run 50:
1.0.50.0
- Run 51:
1.1.51.0
- Run 51:
1.1.1.0
Example 2: AppSource App with Date Versions
- March 6, 2026 at 09:15:30:
3.0.20260306.91530 - March 6, 2026 at 18:45:00:
3.0.20260306.184500 - March 7, 2026 at 08:00:00:
3.0.20260307.80000
Example 3: Multi-App Project with Shared Version
- Run 100:
2.5.100.0 - Run 101:
2.5.101.0
Example 4: Semantic Versioning with Control
- Run 10:
2.3.0.10 - Run 11:
2.3.0.11
- Run 12:
2.3.1.12(Release)
- Run 13:
2.3.2.13
Release Workflow
Create release
Use the Create Release workflow to tag and publish a release.Specify:
- Release name (e.g.,
v1.0) - Tag (e.g.,
1.0.0) - Next version increment (e.g.,
+0.1to increment minor version)
AL-Go creates artifacts
The workflow:
- Builds apps with current version
- Creates GitHub release with artifacts
- Tags the commit
Version increment PR
AL-Go automatically creates a pull request to increment the version number.This ensures:
- Future builds don’t conflict with the release
- Hotfixes can target the release tag
- Main branch moves forward
Why increment after release?: This allows you to create hotfixes for the release version without version conflicts with ongoing development in the main branch.
Best Practices
Version Number Consistency
- Keep
repoVersionupdated after releases - Use consistent strategies across related projects
- Document your versioning approach in README
- Don’t change strategies mid-project without good reason
Semantic Versioning
Follow semantic versioning principles:- Major: Breaking changes, incompatible API changes
- Minor: New features, backward-compatible
- Patch: Bug fixes, backward-compatible
Build Artifact Naming
Build artifacts include version in the name:- Enables easy identification
- Facilitates deployment automation
- Supports parallel versions
Hotfix Management
Fix and build
Make fixes and run CI/CD on the hotfix branch.The version strategy continues from the release point.
Troubleshooting
Build Number Conflicts
Problem: Two builds have the same version number Solutions:- Don’t use strategy 2 with frequent builds
- Ensure
runNumberOffsetis set correctly - Check that workflow runs aren’t being reset
Version Mismatch in app.json
Problem: Built app has different version than expected Solutions:- Verify
versioningStrategysetting - Check if using +16 strategy (uses
repoVersion) - Ensure
app.jsonis committed and pushed
Can’t Install App Due to Version
Problem: Newer version required by dependencies Solutions:- Increment major/minor version in
app.jsonorrepoVersion - Adjust
runNumberOffsetif using strategy 0 - Check dependency version requirements
Next Steps
Create Releases
Learn how to create and manage releases in AL-Go for GitHub
App Dependencies
Configure dependencies with proper version constraints