❓ Frequently Asked Questions
GitHub repository: https://github.com/logchange/valhalla
This FAQ covers common questions about Valhalla, troubleshooting tips, and clarifications about features and limitations.
Table of Contents
- General Questions
- Setup and Configuration
- Release Process
- Variables and Templating
- CI/CD Integration
- Troubleshooting
- Advanced Usage
- Limitations and Known Issues
General Questions
What is Valhalla and what problem does it solve?
Valhalla is an automated release management tool designed to eliminate the complexity and error-prone nature of manual software releases. It solves several key problems:
- Manual release complexity: Automates the multi-step release process
- Human errors: Reduces mistakes through automation and standardization
- Time inefficiency: Eliminates waiting for manual interventions
- Compliance issues: Ensures consistent adherence to release standards
- Multi-repository management: Supports configuration inheritance for managing many projects
Which platforms does Valhalla support?
Currently, Valhalla supports: - ✅ GitLab (self-hosted and GitLab.com) - ❌ GitHub (not supported yet) - ❌ Bitbucket (not supported yet) - ❌ Azure DevOps (not supported yet)
Is Valhalla free to use?
Yes! Valhalla is open-source software available under an open-source license. You can use it freely for both personal and commercial projects.
Can I use Valhalla with private repositories?
Yes, Valhalla works with both public and private repositories. You just need to provide a GitLab access token with appropriate permissions.
Setup and Configuration
What permissions does the GitLab token need?
Your GitLab access token requires these scopes:
- api - Full API access for creating releases and merge requests
- write_repository - Write access for committing and pushing changes
Where should I store the GitLab token?
Never store tokens in your code or configuration files! Instead: - Use GitLab CI/CD variables (recommended) - Use environment variables in your deployment environment - Use secure secret management systems
Can I test Valhalla without making actual releases?
Yes! There are several ways to test:
- Use a test repository with dummy releases
- Implement dry-run logic in your configuration:
- Test locally with the Python version before deploying to CI/CD
How do I handle multiple environments (dev, staging, prod)?
You can create different configuration files for different environments:
# valhalla-staging.yml
extends:
- https://raw.githubusercontent.com/company/configs/main/valhalla-base.yml
variables:
ENVIRONMENT: "staging"
DEPLOY_TARGET: "staging.company.com"
# Use with: release-staging-1.2.3
What if my repository doesn't have a valhalla.yml file?
Valhalla requires a configuration file. If missing, you'll get an error. Create a minimal configuration:
Release Process
How does Valhalla detect what version to release?
Valhalla uses two methods (in order of priority):
- Environment variable:
VALHALLA_RELEASE_CMD=release-1.2.3 - Branch name: Create branches like
release-1.2.3
The version is extracted from the string after release-.
Can I use custom version formats?
Yes! Valhalla supports various version formats:
- release-1.2.3 → 1.2.3
- release-2.0.0-RC1 → 2.0.0-RC1
- release-1.2.3-beta.1 → 1.2.3-beta.1
- release-hotfix-1.2.4 → 1.2.4 (uses hotfix config)
What happens if the release process fails?
If Valhalla fails: 1. Check the logs for error details 2. Fix the issue (configuration, permissions, etc.) 3. Re-trigger the release (push to branch again or retrigger pipeline) 4. Clean up any partial changes if necessary
The process is idempotent, so you can safely retry failed releases.
Can I skip certain steps in the release process?
Yes! You can disable individual steps:
commit_before_release:
enabled: false # Skip pre-release commits
commit_after_release:
enabled: false # Skip post-release commits
merge_request:
enabled: false # Skip merge request creation
How do I handle release rollbacks?
Valhalla doesn't provide automatic rollbacks, but you can:
- Create a rollback release:
release-1.2.2-rollback - Use GitLab's release management to mark releases as deprecated
- Implement rollback scripts in your configuration:
Variables and Templating
What variables are available in Valhalla?
Valhalla provides several types of variables:
Predefined variables (highest priority):
- {VERSION} - Full version (e.g., "1.2.3")
- {VERSION_MAJOR} - Major version (e.g., "1")
- {VERSION_MINOR} - Minor version (e.g., "2")
- {VERSION_PATCH} - Patch version (e.g., "3")
- {VERSION_SLUG} - URL-safe version (e.g., "1-2-3")
- {VALHALLA_TOKEN} - Your GitLab token
Environment variables (from CI/CD or system) Custom variables (defined in your configuration)
Can I override predefined variables?
No, predefined variables cannot be overridden. This is by design to prevent errors and ensure consistency.
How do I use GitLab CI/CD variables in Valhalla?
Just reference them with curly braces:
commit_before_release:
before:
- echo "Pipeline: {CI_PIPELINE_ID}"
- echo "Commit: {CI_COMMIT_SHA}"
- echo "Project: {CI_PROJECT_NAME}"
All GitLab CI/CD predefined variables are available.
What happens if a variable is undefined?
If a variable is undefined, Valhalla will:
1. Keep the placeholder as-is (e.g., {UNDEFINED_VAR})
2. Continue execution (may cause issues in commands)
3. Log a warning (if debug mode is enabled)
Always define required variables to avoid issues.
CI/CD Integration
Why do I need dependencies: [] in GitLab CI?
The dependencies: [] prevents GitLab from downloading build artifacts, which can cause issues when Valhalla commits files:
How do I prevent infinite pipeline loops?
Valhalla automatically adds [VALHALLA SKIP] to commit messages to prevent re-triggering pipelines. Ensure your workflow rules exclude these commits:
Can I use Valhalla with GitLab merge request pipelines?
Yes, but exclude merge request events in your job rules:
valhalla_release:
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
when: never
- if: $CI_COMMIT_BRANCH =~ /^release-*/
How do I handle different GitLab instances?
Valhalla automatically detects your GitLab instance from the git remote URL. It works with: - GitLab.com - Self-hosted GitLab instances - GitLab Enterprise Edition
Troubleshooting
"No version to release found" error
Causes and solutions:
-
Branch name doesn't match pattern:
-
Environment variable not set:
-
No release configuration files:
"Authentication failed" error
Causes and solutions:
-
Token not set:
-
Token has insufficient permissions:
-
Regenerate token with
apiandwrite_repositoryscopes -
Token expired:
- Check token expiration in GitLab settings
- Generate a new token
"Permission denied" during git operations
Causes and solutions:
- Repository is protected:
- Check branch protection rules
-
Ensure token has push permissions
-
Git configuration missing:
"Command failed" in before/after scripts
Debugging steps:
-
Check command syntax:
-
Verify environment:
-
Handle errors gracefully:
"Configuration file inheritance failed"
Causes and solutions:
-
URL not accessible:
-
Invalid YAML syntax:
- Validate your YAML with an online validator
-
Check for indentation issues
-
Circular dependencies:
Advanced Usage
Can I use Valhalla with monorepos?
Yes! You can create different configurations for different components:
# valhalla-frontend.yml
variables:
COMPONENT: "frontend"
BUILD_PATH: "./frontend"
commit_before_release:
before:
- cd {BUILD_PATH} && npm run build
# valhalla-backend.yml
variables:
COMPONENT: "backend"
BUILD_PATH: "./backend"
commit_before_release:
before:
- cd {BUILD_PATH} && mvn clean package
# Use with: release-frontend-1.2.3, release-backend-2.1.0
How do I integrate with external systems?
Use webhook calls and API integrations:
commit_before_release:
before:
# Slack notification
- curl -X POST "{SLACK_WEBHOOK}" -d '{"text":"Starting release {VERSION}"}'
# Jira version creation
- |
curl -X POST "{JIRA_URL}/rest/api/3/version" \
-H "Authorization: Bearer {JIRA_TOKEN}" \
-d '{"name":"{VERSION}","projectId":"{JIRA_PROJECT_ID}"}'
# Custom deployment system
- curl -X POST "{DEPLOY_API}/prepare" -d '{"version":"{VERSION}"}'
Can I use conditional logic in commands?
Yes! Use shell scripting:
commit_before_release:
before:
- |
if [ "{VERSION}" == *"RC"* ]; then
echo "Release candidate - deploying to staging"
kubectl apply -f staging-deployment.yml
else
echo "Production release - deploying to production"
kubectl apply -f prod-deployment.yml
fi
How do I handle secrets in commands?
Use environment variables, not configuration files:
# ❌ Never do this - hardcoded secrets
commit_before_release:
before:
- curl -H "Authorization: Bearer my-secret-token" api.example.com
# ✅ Do this instead - use environment variables
commit_before_release:
before:
- curl -H "Authorization: Bearer {SECRET_TOKEN}" api.example.com
Limitations and Known Issues
What are Valhalla's current limitations?
- Platform support: Only GitLab is currently supported
- Single inheritance: Configuration can only extend from one URL
- List merging: Lists are replaced, not merged during inheritance
- No rollback automation: Manual rollback process required
- Sequential execution: Commands run sequentially, not in parallel
Known issues and workarounds
- Large file commits may timeout:
- Use
.gitignoreto exclude large generated files -
Implement file cleanup in your scripts
-
Docker layer caching issues:
- Use
dependencies: []in GitLab CI -
Clear Docker cache if needed:
docker system prune -f -
Variable resolution in multi-line commands:
# ✅ Better approach
commit_before_release:
before:
- echo "Version: {VERSION}"
- echo "Date: $(date)"
Future features and roadmap
Planned features include: - GitHub support - Parallel command execution - Enhanced rollback capabilities - Configuration validation - Multi-inheritance support
How can I contribute or report issues?
- 🐛 Report bugs: GitHub Issues
- 💡 Feature requests: GitHub Discussions
- 🔧 Contribute code: GitHub Pull Requests
- ⭐ Support the project: Give us a star on GitHub!
Still have questions? Check the Usage Guide for more examples or Reference for detailed configuration options.