Template Rendering¶
Variable substitution and file transformations for distributed content.
Templates Over Copies
Use templates with variable substitution to generate target-specific configurations. One template serves many targets.
Simple Substitution¶
- name: Render template
run: |
sed "s/{{REPO_NAME}}/${{ matrix.target.name }}/g" template.txt > target/config.txt
Multi-Variable Substitution¶
Use envsubst for multiple variables:
- name: Render template
env:
REPO_NAME: ${{ matrix.target.name }}
ORG_NAME: my-org
TIMESTAMP: ${{ github.event.head_commit.timestamp }}
BRANCH: ${{ matrix.target.default_branch }}
run: |
envsubst < templates/config.template > target/config.yaml
Template file (templates/config.template):
# Auto-generated for ${REPO_NAME}
# Generated: ${TIMESTAMP}
repository:
name: ${REPO_NAME}
organization: ${ORG_NAME}
default_branch: ${BRANCH}
Complex Transformations¶
For complex rendering, use dedicated tools:
- name: Render with jq
run: |
jq --arg name "${{ matrix.target.name }}" \
--arg org "my-org" \
'.repository.name = $name | .repository.org = $org' \
template.json > target/config.json
- name: Render with yq
run: |
yq eval ".metadata.name = \"${{ matrix.target.name }}\"" \
template.yaml > target/config.yaml
File Transformations¶
Format Conversion¶
- name: Convert YAML to JSON
run: |
yq -o=json source/config.yaml > target/config.json
- name: Convert JSON to YAML
run: |
yq -P source/config.json > target/config.yaml
Minification¶
- name: Minify assets
run: |
# JavaScript
terser source/script.js -o target/script.min.js
# CSS
cssnano source/style.css target/style.min.css
# JSON (remove whitespace)
jq -c '.' source/data.json > target/data.json
Content Injection¶
- name: Inject content into existing file
run: |
# Add header to existing README
cat source/header.md target/README.md > target/README.tmp
mv target/README.tmp target/README.md
Related¶
- Matrix Distribution Overview - Core pattern
- Conditional Distribution - Type detection