This is a simple yet useful Azure DevOps set of tasks that allow to install and run Microsoft Bicep CLI commands in Azure Pipelines (cross-platform).
- 🚀 Node 20 Runtime: Tasks now run on Node 20 (with Node 16 fallback), eliminating the end-of-life Node 6 warning
- 📦 Updated Dependencies: All dependencies updated to their latest versions for improved security and performance
- 🤖 Automated Publishing: New GitHub Actions workflow for automated releases to the Marketplace
This task downloads and installs in the agent any version of the Bicep CLI available (adding it to the PATH environment variable). After running the task, the Run Bicep CLI build command task can be used. Alternatively, bicep command could be used in a script directly.
The tool is cached in the agent after download, so subsequent runs will be faster.
This task takes only one version parameter input (semantic versioning) which is the version of Bicep to download.
steps:
- task: BicepInstall@0
inputs:
version: 0.10.13This tasks runs the bicep build command with an input path containing .bicep file(s) (glob is supported). After running the task, the resulting .json files are left in the same folder as the .bicep file resides.
This task takes only one sourceDirectory or sourceFile parameter input which is the path where the bicep file/files reside (can be a glob, directory, or a single file).
Note: When using a directory as sourceDirectory, all .bicep files in the directory will be processed (including files in subfolders), and non-.bicep files will be automatically ignored. Example: ./bicep_files would be interpreted as ./bicep_files/**/*.bicep.
Tip: You can use glob patterns to have more control over which files to process. For example:
./templates/**/*.bicep- Process all .bicep files recursively./templates/*.bicep- Process only .bicep files in the root of templates folder./templates/{main,modules}/*.bicep- Process .bicep files in specific subdirectories
steps:
- task: BicepBuild@0
inputs:
process: 'multiple'
sourceDirectory: '.\bicep_files\*.bicep'
stdout: false # Note if stdout is true 'outputDirectory' will not be interpreted
outputDirectory: '.\bicep_files\out' # Only when 'stdout' is false or not definedsteps:
- task: BicepBuild@0
inputs:
process: 'single'
sourceFile: '.\bicep_files\sample1.bicep'
stdout: false # Note if stdout is true 'outputDirectory' will not be interpreted
outputFile: '.\bicep_files\sample1.out.json' # Only when 'stdout' is false or not defined and 'outputDirectory' is empty or not definedThis tasks runs the bicep decompile command with an input path containing .json file(s) (glob is supported). After running the task, the resulting .bicep files are left in the same folder as the .json file resides.
This task takes only one sourceDirectory or sourceFile parameter input which is the path where the bicep file/files reside (can be a glob, directory, or a single file).
Note: When using a directory as sourceDirectory, all .json files in the directory will be processed (including files in subfolders), and non-.json files will be automatically ignored. Example: ./arm_templates would be interpreted as ./arm_templates/**/*.json.
Tip: You can use glob patterns to have more control over which files to process. For example:
./templates/**/*.json- Process all .json files recursively./templates/*.json- Process only .json files in the root of templates folder
steps:
- task: BicepDecompile@0
inputs:
process: 'multiple'
sourceDirectory: '.\arm_templates\*.json'
stdout: false # Note if stdout is true 'outputDirectory' will not be interpreted
outputDirectory: '.\arm_templates\out' # Only when 'stdout' is false or not definedsteps:
- task: BicepDecompile@0
inputs:
process: 'single'
sourceFile: '.\arm_templates\arm_storage_account.json'
stdout: false # Note if stdout is true 'outputDirectory' will not be interpreted
outputFile: '.\arm_templates\sample1.out.bicep' # Only when 'stdout' is false or not defined and 'outputDirectory' is empty or not definedStarting on version 0.3 of the tasks, the user can specify an outputProcess input to choose the output option. The available options are:
default: Default (same name and directory as input files).outDir: Selecting an output directory with the inputoutputDirectory.outFile: Selecting an output file with the inputoutputFile.stdout: Standard output (stdout).
Nevertheless, this option can be skipped and only specify the inputs outputDirectory, outputFile, stdout accordingly. Note that the inputs are exclusive. Do not specify multiple output options at once.
The order of preference of the inputs if outputProcess is not defined is the following:
stdout: if set to true.outputFile: if set.outputDirectory: if set.
If no input regarding output options is set, it will default to the source directory and source filename as output (only changing the extension).
Starting with the patch 0.3.4, warnings in the build or decompilation processes will report a SucceededWithIssues status, showing all warnings in the pipeline execution.
Please consider using the latest version of the Bicep CLI, this extension does not ensure a correct execution with versions prior to 0.4.x.
Starting on version 0.3.7 of this extension, the decompile command will overwrite the destination file if it exists.
Requirements:
- Node.js 20.x or higher (recommended to match the production runtime)
- Bicep installed locally
- TypeScript installed globally (
npm i typescript -g)
- Run
npm installin the root directory. - Run
npm run buildin the root directory. - Define the needed agent environment parameters:
# For PowerShell:
$env:AGENT_TEMPDIRECTORY = "C:\TEMP" # Or any other existing directory
$env:AGENT_TOOLSDIRECTORY = "C:\tools" # Or any other existing directory# For bash:
export AGENT_TEMPDIRECTORY="/temp" # Or any other existing directory
export AGENT_TOOLSDIRECTORY="/tools" # Or any other existing directory- (Optional) Set variables for the tasks (as you want to test):
# For PowerShell:
$env:INPUT_VERSION = "0.10.13" # Or any other valid Bicep version
$env:INPUT_PROCESS = "multiple" # Selection between 'multiple' or 'single' file(s) processing
$env:INPUT_SOURCEDIRECTORY = "C:\bicep_files\*.bicep" # Or any other existing directory with bicep file(s)
$env:INPUT_SOURCEFILE = "C:\bicep_files\sample1.bicep" # Or any other existing bicep file
$env:INPUT_STDOUT = $false # To print the output to standard output (stdout) or not
$env:INPUT_OUTPUTDIRECTORY = "C:\bicep_files\out" # Or any other existing directory to store the json generated file(s)
$env:INPUT_OUTPUTFILE = "C:\bicep_files\sample1.out.json" # Or any other path/filename to store the generated file# For bash:
export INPUT_VERSION="0.10.13" # Or any other valid Bicep version
export INPUT_PROCESS = "multiple" # Selection between 'multiple' or 'single' file(s) processing
export INPUT_SOURCEDIRECTORY="C:\bicep_files\*.bicep" # Or any other existing directory with bicep file(s)
export INPUT_SOURCEFILE = "C:\bicep_files\sample1.bicep" # Or any other existing bicep file
export INPUT_STDOUT = false # To print the output to standard output (stdout) or not
export INPUT_OUTPUTDIRECTORY = "C:\bicep_files\out" # Or any other existing directory to store the json generated file(s)
export INPUT_OUTPUTFILE = "C:\bicep_files\sample1.out.json" # Or any other path/filename to store the generated file- Run
node src/install/index.jsandnode src/run/index.jsto execute the two tasks.
Note: the bicep_files and the arm_templates directories containing .bicep and .json files are only for development and testing purposes.
Feel free to open an issue or a PR if you want to without any problem :)
This project is licensed under the MIT License.
See the LICENSE file in the root of this repository.
The base logo for the tasks and the extension is property of the Microsoft Bicep project, used without any commercial purpose.
