From 801ae0bec6b7a2efcfbb7a5ae9b27fe2ec3d62c4 Mon Sep 17 00:00:00 2001 From: Kevin Rowlandson Date: Thu, 2 Jul 2020 22:31:16 +0100 Subject: [PATCH 01/11] Add arm-ttk Linter --- .automation/test/arm/README.md | 13 ++ .automation/test/arm/arm_bad_1.json | 10 ++ .automation/test/arm/arm_good_1.json | 9 ++ Dockerfile | 44 +++++- README.md | 2 + TEMPLATES/.arm-ttk.psd1 | 30 ++++ lib/buildFileList.sh | 10 +- lib/linter.sh | 211 +++++++++++++++++---------- lib/validation.sh | 21 +++ lib/worker.sh | 15 +- 10 files changed, 277 insertions(+), 88 deletions(-) create mode 100644 .automation/test/arm/README.md create mode 100644 .automation/test/arm/arm_bad_1.json create mode 100644 .automation/test/arm/arm_good_1.json create mode 100644 TEMPLATES/.arm-ttk.psd1 diff --git a/.automation/test/arm/README.md b/.automation/test/arm/README.md new file mode 100644 index 00000000..8c2acadd --- /dev/null +++ b/.automation/test/arm/README.md @@ -0,0 +1,13 @@ +# Json Test Cases +This folder holds the test cases for **Json**. + +## Additional Docs +No Additional information is needed for this test case. + +## Good Test Cases +The test cases denoted: `LANGUAGE_good_FILE.EXTENSION` are all valid, and should pass successfully when linted. +- **Note:** They are linted utilizing the default linter rules. + +## Bad Test Cases +The test cases denoted: `LANGUAGE_bad_FILE.EXTENSION` are **NOT** valid, and should trigger errors when linted. +- **Note:** They are linted utilizing the default linter rules. diff --git a/.automation/test/arm/arm_bad_1.json b/.automation/test/arm/arm_bad_1.json new file mode 100644 index 00000000..7bb272bd --- /dev/null +++ b/.automation/test/arm/arm_bad_1.json @@ -0,0 +1,10 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "", + "apiProfile": "", + "parameters": { }, + "variables": { }, + "functions": [ ], + "resources": [ ], + "outputs": { } +} diff --git a/.automation/test/arm/arm_good_1.json b/.automation/test/arm/arm_good_1.json new file mode 100644 index 00000000..cf3800de --- /dev/null +++ b/.automation/test/arm/arm_good_1.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "parameters": { }, + "variables": { }, + "functions": [ ], + "resources": [ ], + "outputs": { } +} diff --git a/Dockerfile b/Dockerfile index 56bc44a8..733712e6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,6 +18,31 @@ LABEL com.github.actions.name="GitHub Super-Linter" \ com.github.actions.color="red" \ maintainer="GitHub DevOps " +################################ +# Set ARG values used in Build # +################################ +# PowerShell & PSScriptAnalyzer +ARG PWSH_VERSION='latest' +ARG PWSH_DIRECTORY='/opt/microsoft/powershell' +ARG PSSA_VERSION='latest' +# arm-ttk +ARG ARM_TTK_URI='https://github.com/Azure/arm-ttk.git' +ARG ARM_TTK_DIRECTORY='/opt/microsoft/arm-ttk' +# ARG ARM_TTK_SH="${ARM_TTK_DIRECTORY}/arm-ttk/Test-AzTemplate.sh" +# clj-kondo +ARG CLJ_KONDO_VERSION='2020.06.21' +# Go Linter +ARG GO_VERSION='v1.27.0' + +# PWSH_VERSION='latest' +# PWSH_DIRECTORY='/opt/microsoft/powershell' +# PSSA_VERSION='latest' +# ARM_TTK_URI='https://github.com/Azure/arm-ttk.git' +# ARM_TTK_DIRECTORY='/opt/microsoft/arm-ttk' +# CLJ_KONDO_VERSION='2020.06.21' +# GO_VERSION='v1.27.0' +# ARM_TTK_PSD1="/opt/microsoft/arm-ttk/arm-ttk/arm-ttk.psd1" + #################### # Run APK installs # #################### @@ -40,9 +65,6 @@ RUN apk add --no-cache \ # Reference: https://docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell-core-on-linux?view=powershell-7 # Slightly modified to always retrieve latest stable Powershell version # If changing PWSH_VERSION='latest' to a specific version, use format PWSH_VERSION='tags/v7.0.2' -ARG PWSH_VERSION='latest' -ARG PWSH_DIRECTORY='/opt/microsoft/powershell' -ARG PSSA_VERSION='latest' RUN mkdir -p ${PWSH_DIRECTORY} \ && curl -s https://api.github.com/repos/powershell/powershell/releases/${PWSH_VERSION} \ | grep browser_download_url \ @@ -50,9 +72,19 @@ RUN mkdir -p ${PWSH_DIRECTORY} \ | cut -d '"' -f 4 \ | xargs -n 1 wget -O - \ | tar -xzC ${PWSH_DIRECTORY} \ - && ln -s ${PWSH_DIRECTORY}/pwsh /usr/bin/pwsh -f \ + && ln -sf ${PWSH_DIRECTORY}/pwsh /usr/bin/pwsh \ && pwsh -c 'Install-Module -Name PSScriptAnalyzer -RequiredVersion ${PSSA_VERSION} -Scope AllUsers -Force' +############################################################# +# Install Azure Resource Manager Template Toolkit (arm-ttk) # +############################################################# +# Depends on PowerShell +# Reference https://github.com/Azure/arm-ttk +# Reference https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/test-toolkit +ENV ARM_TTK_PSD1="${ARM_TTK_DIRECTORY}/arm-ttk/arm-ttk.psd1" +RUN git clone "${ARM_TTK_URI}" "${ARM_TTK_DIRECTORY}" \ + && ln -sTf "$ARM_TTK_PSD1" /usr/bin/arm-ttk + ##################### # Run Pip3 Installs # ##################### @@ -121,7 +153,6 @@ RUN wget -qO- "https://github.com/koalaman/shellcheck/releases/download/stable/s ##################### # Install Go Linter # ##################### -ARG GO_VERSION='v1.27.0' RUN wget -O- -nvq https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s "$GO_VERSION" ################## @@ -147,7 +178,6 @@ RUN wget "https://github.com/dotenv-linter/dotenv-linter/releases/latest/downloa ##################### # Install clj-kondo # ##################### -ARG CLJ_KONDO_VERSION='2020.06.21' RUN curl -sLO https://github.com/borkdude/clj-kondo/releases/download/v${CLJ_KONDO_VERSION}/clj-kondo-${CLJ_KONDO_VERSION}-linux-static-amd64.zip \ && unzip clj-kondo-${CLJ_KONDO_VERSION}-linux-static-amd64.zip \ && rm clj-kondo-${CLJ_KONDO_VERSION}-linux-static-amd64.zip \ @@ -191,6 +221,8 @@ ENV GITHUB_SHA=${GITHUB_SHA} \ VALIDATE_CLOJURE=${VALIDATE_CLOJURE} \ VALIDATE_KOTLIN=${VALIDATE_KOTLIN} \ VALIDATE_POWERSHELL=${VALIDATE_POWERSHELL} \ + VALIDATE_ARM=${VALIDATE_ARM} \ + ARM_TTK_VERSION=${ARM_TTK_VERSION} \ VALIDATE_OPENAPI=${VALIDATE_OPENAPI} \ VALIDATE_PROTOBUF=${VALIDATE_PROTOBUF} \ ANSIBLE_DIRECTORY=${ANSIBLE_DIRECTORY} \ diff --git a/README.md b/README.md index d3c7b8a6..b77f9e2a 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,7 @@ Developers on **GitHub** can call the **GitHub Action** to lint their code base | *Language* | *Linter* | | --- | --- | | **Ansible** | [ansible-lint](https://github.com/ansible/ansible-lint) | +| **Azure Resource Manager (ARM)** | [arm-ttk](https://github.com/azure/arm-ttk) | | **AWS CloudFormation templates** | [cfn-lint](https://github.com/aws-cloudformation/cfn-python-lint/) | | **CSS** | [stylelint](https://stylelint.io/) | | **Clojure** | [clj-kondo](https://github.com/borkdude/clj-kondo) | @@ -168,6 +169,7 @@ and won't run anything unexpected. | **VALIDATE_DOCKER** | `true` | Flag to enable or disable the linting process of the language. | | **VALIDATE_GO** | `true` | Flag to enable or disable the linting process of the language. | | **VALIDATE_POWERSHELL** | `true` | Flag to enable or disable the linting process of the language. | +| **VALIDATE_ARM** | `true` | Flag to enable or disable the linting process of the language. | | **VALIDATE_TERRAFORM** | `true` | Flag to enable or disable the linting process of the language. | | **VALIDATE_CSS** | `true` | Flag to enable or disable the linting process of the language. | | **VALIDATE_ENV** | `true` | Flag to enable or disable the linting process of the language. | diff --git a/TEMPLATES/.arm-ttk.psd1 b/TEMPLATES/.arm-ttk.psd1 new file mode 100644 index 00000000..fa4350be --- /dev/null +++ b/TEMPLATES/.arm-ttk.psd1 @@ -0,0 +1,30 @@ +# Documentation: +# - Test Parameters: https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/test-toolkit#test-parameters +# - Test Cases: https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/test-cases +@{ + Test = @( + 'Parameters Property Must Exist', + 'Parameters Must Be Referenced', + 'Secure String Parameters Cannot Have Default', + 'Location Should Not Be Hardcoded', + 'Resources Should Have Location', + 'VM Size Should Be A Parameter', + 'Min And Max Value Are Numbers', + 'artifacts-parameter', + 'Variables Must Be Referenced', + 'Dynamic Variable References Should Not Use Concat', + 'apiVersions Should Be Recent', + 'Providers apiVersions Is Not Permitted', + 'Template Should Not Contain Blanks', + 'IDs Should Be Derived From ResourceIDs', + 'ResourceIds should not contain', + 'DependsOn Must Not Be Conditional', + 'Deployment Resources Must Not Be Debug', + 'adminUsername Should Not Be A Literal', + 'VM Images Should Use Latest Version', + 'Virtual-Machines-Should-Not-Be-Preview', + 'ManagedIdentityExtension must not be used', + 'Outputs Must Not Contain Secrets' + ) + Skip = @() +} diff --git a/lib/buildFileList.sh b/lib/buildFileList.sh index c10284c8..550097f6 100755 --- a/lib/buildFileList.sh +++ b/lib/buildFileList.sh @@ -140,7 +140,15 @@ function BuildFileList() ################################ FILE_ARRAY_OPENAPI+=("$FILE") fi - + ############################ + # Check if file is ARM # + ############################ + if DetectARMFile "$FILE"; then + ################################ + # Append the file to the array # + ################################ + FILE_ARRAY_ARM+=("$FILE") + fi ##################################### # Check if the file is CFN template # ##################################### diff --git a/lib/linter.sh b/lib/linter.sh index 9b6d9dd6..97f00094 100755 --- a/lib/linter.sh +++ b/lib/linter.sh @@ -20,26 +20,26 @@ source /action/lib/worker.sh # Source the function script(s) # GLOBALS # ########### # Default Vars -DEFAULT_RULES_LOCATION='/action/lib/.automation' # Default rules files location -LINTER_RULES_PATH="${LINTER_RULES_PATH:-.github/linters}" # Linter Path Directory +DEFAULT_RULES_LOCATION='/action/lib/.automation' # Default rules files location +LINTER_RULES_PATH="${LINTER_RULES_PATH:-.github/linters}" # Linter Path Directory # YAML Vars -YAML_FILE_NAME='.yaml-lint.yml' # Name of the file -YAML_LINTER_RULES="$DEFAULT_RULES_LOCATION/$YAML_FILE_NAME" # Path to the yaml lint rules +YAML_FILE_NAME='.yaml-lint.yml' # Name of the file +YAML_LINTER_RULES="$DEFAULT_RULES_LOCATION/$YAML_FILE_NAME" # Path to the yaml lint rules # MD Vars -MD_FILE_NAME='.markdown-lint.yml' # Name of the file -MD_LINTER_RULES="$DEFAULT_RULES_LOCATION/$MD_FILE_NAME" # Path to the markdown lint rules +MD_FILE_NAME='.markdown-lint.yml' # Name of the file +MD_LINTER_RULES="$DEFAULT_RULES_LOCATION/$MD_FILE_NAME" # Path to the markdown lint rules # Python Vars -PYTHON_FILE_NAME='.python-lint' # Name of the file -PYTHON_LINTER_RULES="$DEFAULT_RULES_LOCATION/$PYTHON_FILE_NAME" # Path to the python lint rules +PYTHON_FILE_NAME='.python-lint' # Name of the file +PYTHON_LINTER_RULES="$DEFAULT_RULES_LOCATION/$PYTHON_FILE_NAME" # Path to the python lint rules # Cloudformation Vars -CFN_FILE_NAME='.cfnlintrc.yml' # Name of the file -CFN_LINTER_RULES="$DEFAULT_RULES_LOCATION/$CFN_FILE_NAME" # Path to the python lint rules +CFN_FILE_NAME='.cfnlintrc.yml' # Name of the file +CFN_LINTER_RULES="$DEFAULT_RULES_LOCATION/$CFN_FILE_NAME" # Path to the cloudformation lint rules # Ruby Vars -RUBY_FILE_NAME="${RUBY_CONFIG_FILE:-.ruby-lint.yml}" # Name of the file -RUBY_LINTER_RULES="$DEFAULT_RULES_LOCATION/$RUBY_FILE_NAME" # Path to the ruby lint rules +RUBY_FILE_NAME="${RUBY_CONFIG_FILE:-.ruby-lint.yml}" # Name of the file +RUBY_LINTER_RULES="$DEFAULT_RULES_LOCATION/$RUBY_FILE_NAME" # Path to the ruby lint rules # Coffee Vars -COFFEE_FILE_NAME='.coffee-lint.json' # Name of the file -COFFEESCRIPT_LINTER_RULES="$DEFAULT_RULES_LOCATION/$COFFEE_FILE_NAME" # Path to the coffeescript lint rules +COFFEE_FILE_NAME='.coffee-lint.json' # Name of the file +COFFEESCRIPT_LINTER_RULES="$DEFAULT_RULES_LOCATION/$COFFEE_FILE_NAME" # Path to the coffeescript lint rules # Javascript Vars JAVASCRIPT_FILE_NAME="${JAVASCRIPT_ES_CONFIG_FILE:-.eslintrc.yml}" # Name of the file JAVASCRIPT_LINTER_RULES="$DEFAULT_RULES_LOCATION/$JAVASCRIPT_FILE_NAME" # Path to the Javascript lint rules @@ -49,32 +49,35 @@ TYPESCRIPT_FILE_NAME="${TYPESCRIPT_ES_CONFIG_FILE:-.eslintrc.yml}" # Name o TYPESCRIPT_LINTER_RULES="$DEFAULT_RULES_LOCATION/$TYPESCRIPT_FILE_NAME" # Path to the Typescript lint rules TYPESCRIPT_STANDARD_LINTER_RULES='' # ENV string to pass when running js standard # Ansible Vars -ANSIBLE_FILE_NAME='.ansible-lint.yml' # Name of the file -ANSIBLE_LINTER_RULES="$DEFAULT_RULES_LOCATION/$ANSIBLE_FILE_NAME" # Path to the Ansible lint rules +ANSIBLE_FILE_NAME='.ansible-lint.yml' # Name of the file +ANSIBLE_LINTER_RULES="$DEFAULT_RULES_LOCATION/$ANSIBLE_FILE_NAME" # Path to the Ansible lint rules # Docker Vars -DOCKER_FILE_NAME='.dockerfilelintrc' # Name of the file -DOCKER_LINTER_RULES="$DEFAULT_RULES_LOCATION/$DOCKER_FILE_NAME" # Path to the Docker lint rules +DOCKER_FILE_NAME='.dockerfilelintrc' # Name of the file +DOCKER_LINTER_RULES="$DEFAULT_RULES_LOCATION/$DOCKER_FILE_NAME" # Path to the Docker lint rules # Golang Vars -GO_FILE_NAME='.golangci.yml' # Name of the file -GO_LINTER_RULES="$DEFAULT_RULES_LOCATION/$GO_FILE_NAME" # Path to the Go lint rules +GO_FILE_NAME='.golangci.yml' # Name of the file +GO_LINTER_RULES="$DEFAULT_RULES_LOCATION/$GO_FILE_NAME" # Path to the Go lint rules # Terraform Vars -TERRAFORM_FILE_NAME='.tflint.hcl' # Name of the file -TERRAFORM_LINTER_RULES="$DEFAULT_RULES_LOCATION/$TERRAFORM_FILE_NAME" # Path to the Terraform lint rules +TERRAFORM_FILE_NAME='.tflint.hcl' # Name of the file +TERRAFORM_LINTER_RULES="$DEFAULT_RULES_LOCATION/$TERRAFORM_FILE_NAME" # Path to the Terraform lint rules # Powershell Vars -POWERSHELL_FILE_NAME='.powershell-psscriptanalyzer.psd1' # Name of the file -POWERSHELL_LINTER_RULES="$DEFAULT_RULES_LOCATION/$POWERSHELL_FILE_NAME" # Path to the Powershell lint rules +POWERSHELL_FILE_NAME='.powershell-psscriptanalyzer.psd1' # Name of the file +POWERSHELL_LINTER_RULES="$DEFAULT_RULES_LOCATION/$POWERSHELL_FILE_NAME" # Path to the Powershell lint rules +# Azure Resource Manager Vars +ARM_FILE_NAME='.arm-ttk.psd1' # Name of the file +ARM_LINTER_RULES="$DEFAULT_RULES_LOCATION/$ARM_FILE_NAME" # Path to the ARM lint rules # CSS Vars -CSS_FILE_NAME='.stylelintrc.json' # Name of the file -CSS_LINTER_RULES="$DEFAULT_RULES_LOCATION/$CSS_FILE_NAME" # Path to the CSS lint rules +CSS_FILE_NAME='.stylelintrc.json' # Name of the file +CSS_LINTER_RULES="$DEFAULT_RULES_LOCATION/$CSS_FILE_NAME" # Path to the CSS lint rules # OpenAPI Vars -OPENAPI_FILE_NAME='.openapirc.yml' # Name of the file -OPENAPI_LINTER_RULES="$DEFAULT_RULES_LOCATION/$OPENAPI_FILE_NAME" # Path to the OpenAPI lint rules +OPENAPI_FILE_NAME='.openapirc.yml' # Name of the file +OPENAPI_LINTER_RULES="$DEFAULT_RULES_LOCATION/$OPENAPI_FILE_NAME" # Path to the OpenAPI lint rules # Protocol Buffers Vars PROTOBUF_FILE_NAME='.protolintrc.yml' # Name of the file -PROTOBUF_LINTER_RULES="$DEFAULT_RULES_LOCATION/$PROTOBUF_FILE_NAME" # Path to the Protocol Buffers lint rules +PROTOBUF_LINTER_RULES="$DEFAULT_RULES_LOCATION/$PROTOBUF_FILE_NAME" # Path to the Protocol Buffers lint rules # Clojure Vars -CLOJURE_FILE_NAME='.clj-kondo/config.edn' -CLOJURE_LINTER_RULES="$DEFAULT_RULES_LOCATION/$CLOJURE_FILE_NAME" +CLOJURE_FILE_NAME='.clj-kondo/config.edn' # Name of the file +CLOJURE_LINTER_RULES="$DEFAULT_RULES_LOCATION/$CLOJURE_FILE_NAME" # Path to the Clojure lint rules ####################################### # Linter array for information prints # @@ -82,7 +85,7 @@ CLOJURE_LINTER_RULES="$DEFAULT_RULES_LOCATION/$CLOJURE_FILE_NAME" LINTER_ARRAY=("jsonlint" "yamllint" "xmllint" "markdownlint" "shellcheck" "pylint" "perl" "rubocop" "coffeelint" "eslint" "standard" "ansible-lint" "/dockerfilelint/bin/dockerfilelint" "golangci-lint" "tflint" - "stylelint" "dotenv-linter" "pwsh" "ktlint" "protolint" "clj-kondo" + "stylelint" "dotenv-linter" "pwsh" "arm-ttk" "ktlint" "protolint" "clj-kondo" "spectral" "cfn-lint") ############################# @@ -91,44 +94,45 @@ LINTER_ARRAY=("jsonlint" "yamllint" "xmllint" "markdownlint" "shellcheck" LANGUAGE_ARRAY=('YML' 'JSON' 'XML' 'MARKDOWN' 'BASH' 'PERL' 'PHP' 'RUBY' 'PYTHON' 'COFFEESCRIPT' 'ANSIBLE' 'JAVASCRIPT_STANDARD' 'JAVASCRIPT_ES' 'TYPESCRIPT_STANDARD' 'TYPESCRIPT_ES' 'DOCKER' 'GO' 'TERRAFORM' - 'CSS' 'ENV' 'POWERSHELL' 'KOTLIN' 'PROTOBUF' 'CLOJURE' 'OPENAPI' 'CFN') + 'CSS' 'ENV' 'POWERSHELL' 'ARM' 'KOTLIN' 'PROTOBUF' 'CLOJURE' 'OPENAPI' 'CFN') ################### # GitHub ENV Vars # ################### -GITHUB_SHA="${GITHUB_SHA}" # GitHub sha from the commit -GITHUB_EVENT_PATH="${GITHUB_EVENT_PATH}" # Github Event Path -GITHUB_WORKSPACE="${GITHUB_WORKSPACE}" # Github Workspace -DEFAULT_BRANCH="${DEFAULT_BRANCH:-master}" # Default Git Branch to use (master by default) -ANSIBLE_DIRECTORY="${ANSIBLE_DIRECTORY}" # Ansible Directory -VALIDATE_ALL_CODEBASE="${VALIDATE_ALL_CODEBASE}" # Boolean to validate all files -VALIDATE_YAML="${VALIDATE_YAML}" # Boolean to validate language -VALIDATE_JSON="${VALIDATE_JSON}" # Boolean to validate language -VALIDATE_XML="${VALIDATE_XML}" # Boolean to validate language -VALIDATE_MD="${VALIDATE_MD}" # Boolean to validate language -VALIDATE_BASH="${VALIDATE_BASH}" # Boolean to validate language -VALIDATE_PERL="${VALIDATE_PERL}" # Boolean to validate language -VALIDATE_PHP="${VALIDATE_PHP}" # Boolean to validate language -VALIDATE_PYTHON="${VALIDATE_PYTHON}" # Boolean to validate language -VALIDATE_CLOUDFORMATION="${VALIDATE_CLOUDFORMATION}" # Boolean to validate language -VALIDATE_RUBY="${VALIDATE_RUBY}" # Boolean to validate language -VALIDATE_COFFEE="${VALIDATE_COFFEE}" # Boolean to validate language -VALIDATE_ANSIBLE="${VALIDATE_ANSIBLE}" # Boolean to validate language +GITHUB_SHA="${GITHUB_SHA}" # GitHub sha from the commit +GITHUB_EVENT_PATH="${GITHUB_EVENT_PATH}" # Github Event Path +GITHUB_WORKSPACE="${GITHUB_WORKSPACE}" # Github Workspace +DEFAULT_BRANCH="${DEFAULT_BRANCH:-master}" # Default Git Branch to use (master by default) +ANSIBLE_DIRECTORY="${ANSIBLE_DIRECTORY}" # Ansible Directory +VALIDATE_ALL_CODEBASE="${VALIDATE_ALL_CODEBASE}" # Boolean to validate all files +VALIDATE_YAML="${VALIDATE_YAML}" # Boolean to validate language +VALIDATE_JSON="${VALIDATE_JSON}" # Boolean to validate language +VALIDATE_XML="${VALIDATE_XML}" # Boolean to validate language +VALIDATE_MD="${VALIDATE_MD}" # Boolean to validate language +VALIDATE_BASH="${VALIDATE_BASH}" # Boolean to validate language +VALIDATE_PERL="${VALIDATE_PERL}" # Boolean to validate language +VALIDATE_PHP="${VALIDATE_PHP}" # Boolean to validate language +VALIDATE_PYTHON="${VALIDATE_PYTHON}" # Boolean to validate language +VALIDATE_CLOUDFORMATION="${VALIDATE_CLOUDFORMATION}" # Boolean to validate language +VALIDATE_RUBY="${VALIDATE_RUBY}" # Boolean to validate language +VALIDATE_COFFEE="${VALIDATE_COFFEE}" # Boolean to validate language +VALIDATE_ANSIBLE="${VALIDATE_ANSIBLE}" # Boolean to validate language VALIDATE_JAVASCRIPT_ES="${VALIDATE_JAVASCRIPT_ES}" # Boolean to validate language VALIDATE_JAVASCRIPT_STANDARD="${VALIDATE_JAVASCRIPT_STANDARD}" # Boolean to validate language VALIDATE_TYPESCRIPT_ES="${VALIDATE_TYPESCRIPT_ES}" # Boolean to validate language VALIDATE_TYPESCRIPT_STANDARD="${VALIDATE_TYPESCRIPT_STANDARD}" # Boolean to validate language -VALIDATE_DOCKER="${VALIDATE_DOCKER}" # Boolean to validate language -VALIDATE_GO="${VALIDATE_GO}" # Boolean to validate language -VALIDATE_CSS="${VALIDATE_CSS}" # Boolean to validate language -VALIDATE_ENV="${VALIDATE_ENV}" # Boolean to validate language -VALIDATE_CLOJURE="${VALIDATE_CLOJURE}" # Boolean to validate language -VALIDATE_TERRAFORM="${VALIDATE_TERRAFORM}" # Boolean to validate language -VALIDATE_POWERSHELL="${VALIDATE_POWERSHELL}" # Boolean to validate language -VALIDATE_KOTLIN="${VALIDATE_KOTLIN}" # Boolean to validate language -VALIDATE_OPENAPI="${VALIDATE_OPENAPI}" # Boolean to validate language -TEST_CASE_RUN="${TEST_CASE_RUN}" # Boolean to validate only test cases -DISABLE_ERRORS="${DISABLE_ERRORS}" # Boolean to enable warning-only output without throwing errors +VALIDATE_DOCKER="${VALIDATE_DOCKER}" # Boolean to validate language +VALIDATE_GO="${VALIDATE_GO}" # Boolean to validate language +VALIDATE_CSS="${VALIDATE_CSS}" # Boolean to validate language +VALIDATE_ENV="${VALIDATE_ENV}" # Boolean to validate language +VALIDATE_CLOJURE="${VALIDATE_CLOJURE}" # Boolean to validate language +VALIDATE_TERRAFORM="${VALIDATE_TERRAFORM}" # Boolean to validate language +VALIDATE_POWERSHELL="${VALIDATE_POWERSHELL}" # Boolean to validate language +VALIDATE_ARM="${VALIDATE_ARM}" # Boolean to validate language +VALIDATE_KOTLIN="${VALIDATE_KOTLIN}" # Boolean to validate language +VALIDATE_OPENAPI="${VALIDATE_OPENAPI}" # Boolean to validate language +TEST_CASE_RUN="${TEST_CASE_RUN}" # Boolean to validate only test cases +DISABLE_ERRORS="${DISABLE_ERRORS}" # Boolean to enable warning-only output without throwing errors ############## # Debug Vars # @@ -141,9 +145,9 @@ ACTIONS_RUNNER_DEBUG="${ACTIONS_RUNNER_DEBUG:-false}" # Boolean to see even mo ################ DEFAULT_VALIDATE_ALL_CODEBASE='true' # Default value for validate all files DEFAULT_WORKSPACE="${DEFAULT_WORKSPACE:-/tmp/lint}" # Default workspace if running locally -DEFAULT_RUN_LOCAL='false' # Default value for debugging locally -DEFAULT_TEST_CASE_RUN='false' # Flag to tell code to run only test cases -DEFAULT_IFS="$IFS" # Get the Default IFS for updating +DEFAULT_RUN_LOCAL='false' # Default value for debugging locally +DEFAULT_TEST_CASE_RUN='false' # Flag to tell code to run only test cases +DEFAULT_IFS="$IFS" # Get the Default IFS for updating ############################################################### # Default Vars that are called in Subs and need to be ignored # @@ -181,6 +185,7 @@ FILE_ARRAY_DOCKER=() # Array of files to check FILE_ARRAY_GO=() # Array of files to check FILE_ARRAY_TERRAFORM=() # Array of files to check FILE_ARRAY_POWERSHELL=() # Array of files to check +FILE_ARRAY_ARM=() # Array of files to check FILE_ARRAY_CSS=() # Array of files to check FILE_ARRAY_ENV=() # Array of files to check FILE_ARRAY_CLOJURE=() # Array of files to check @@ -211,6 +216,7 @@ ERRORS_FOUND_DOCKER=0 # Count of errors found ERRORS_FOUND_GO=0 # Count of errors found ERRORS_FOUND_TERRAFORM=0 # Count of errors found ERRORS_FOUND_POWERSHELL=0 # Count of errors found +ERRORS_FOUND_ARM=0 # Count of errors found ERRORS_FOUND_CSS=0 # Count of errors found ERRORS_FOUND_ENV=0 # Count of errors found ERRORS_FOUND_CLOJURE=0 # Count of errors found @@ -253,20 +259,24 @@ GetLinterVersions() echo "" echo "---------------------------------------------" echo "Linter Version Info:" - echo "---------------------------------------------" - echo "" ########################################################## # Go through the array of linters and print version info # ########################################################## for LINTER in "${LINTER_ARRAY[@]}" do - echo "---------------------------------------------" - echo "[$LINTER]:" ################### # Get the version # ################### - mapfile -t GET_VERSION_CMD < <("$LINTER" --version 2>&1) + if [[ "$LINTER" == "arm-ttk" ]]; then + mapfile -t GET_VERSION_CMD < <(cat $ARM_TTK_PSD1 | grep -i version | xargs 2>&1) + + elif [[ "$LINTER" == "protolint" ]]; then + mapfile -t GET_VERSION_CMD < <(echo "--version not supported") + + else + mapfile -t GET_VERSION_CMD < <("$LINTER" --version 2>&1) + fi ####################### # Load the error code # @@ -277,16 +287,19 @@ GetLinterVersions() # Check the shell for errors # ############################## if [ $ERROR_CODE -ne 0 ] || [ -z "${GET_VERSION_CMD[*]}" ]; then - echo "WARN! Failed to get version info for:[$LINTER]" - echo "---------------------------------------------" + echo "[$LINTER]: WARN! Failed to get version info for:[$LINTER]" else ########################## # Print the version info # ########################## - echo "${GET_VERSION_CMD[*]}" - echo "---------------------------------------------" + echo "[$LINTER]: ${GET_VERSION_CMD[*]}" fi done + ######################### + # Print version footers # + ######################### + echo "---------------------------------------------" + echo "" } ################################################################################ #### Function GetLinterRules ################################################### @@ -449,6 +462,40 @@ DetectOpenAPIFile() fi } ################################################################################ +#### Function DetectARMFile ################################################ +DetectARMFile() +{ + ################ + # Pull in vars # + ################ + FILE="$1" + + ############################### + # Check the file for keywords # + ############################### + grep -E 'schema.management.azure.com' "$GITHUB_WORKSPACE/$FILE" > /dev/null + + ####################### + # Load the error code # + ####################### + ERROR_CODE=$? + + ############################## + # Check the shell for errors # + ############################## + if [ $ERROR_CODE -eq 0 ]; then + ######################## + # Found string in file # + ######################## + return 0 + else + ################### + # No string match # + ################### + return 1 + fi +} +################################################################################ #### Function DetectCloudFormationFile ######################################### DetectCloudFormationFile() { @@ -740,6 +787,7 @@ Footer() [ "$ERRORS_FOUND_GO" -ne 0 ] || \ [ "$ERRORS_FOUND_TERRAFORM" -ne 0 ] || \ [ "$ERRORS_FOUND_POWERSHELL" -ne 0 ] || \ + [ "$ERRORS_FOUND_ARM" -ne 0 ] || \ [ "$ERRORS_FOUND_RUBY" -ne 0 ] || \ [ "$ERRORS_FOUND_CSS" -ne 0 ] || \ [ "$ERRORS_FOUND_CFN" -ne 0 ] || \ @@ -811,6 +859,8 @@ GetLinterRules "$DOCKER_FILE_NAME" "$DOCKER_LINTER_RULES" GetLinterRules "$TERRAFORM_FILE_NAME" "$TERRAFORM_LINTER_RULES" # Get PowerShell rules GetLinterRules "$POWERSHELL_FILE_NAME" "$POWERSHELL_LINTER_RULES" +# Get ARM rules +GetLinterRules "$ARM_FILE_NAME" "$ARM_LINTER_RULES" # Get CSS rules GetLinterRules "$CSS_FILE_NAME" "$CSS_LINTER_RULES" # Get CFN rules @@ -1133,7 +1183,7 @@ if [ "$VALIDATE_POWERSHELL" == "true" ]; then # For POWERSHELL, ensure PSScriptAnalyzer module is available # ############################################################### ValidatePowershellModules - + ############################# # Lint the powershell files # ############################# @@ -1141,6 +1191,17 @@ if [ "$VALIDATE_POWERSHELL" == "true" ]; then LintCodebase "POWERSHELL" "pwsh" "Invoke-ScriptAnalyzer -EnableExit -Settings $POWERSHELL_LINTER_RULES -Path" ".*\.\(ps1\|psm1\|psd1\|ps1xml\|pssc\|psrc\|cdxml\)\$" "${FILE_ARRAY_POWERSHELL[@]}" fi +######################## +# ARM Template LINTING # +######################## +if [ "$VALIDATE_ARM" == "true" ]; then + ############################### + # Lint the ARM Template files # + ############################### + # LintCodebase "FILE_TYPE" "LINTER_NAME" "LINTER_CMD" "FILE_TYPES_REGEX" "FILE_ARRAY" + LintCodebase "ARM" "arm-ttk" "Import-Module $ARM_TTK_PSD1 ; \$config = \$(Import-PowerShellDataFile -Path $ARM_LINTER_RULES) ; Test-AzTemplate @config -TemplatePath" ".*\.\(json\)\$" "${FILE_ARRAY_ARM[@]}" +fi + ################### # OPENAPI LINTING # ################### diff --git a/lib/validation.sh b/lib/validation.sh index cb938580..450e3790 100755 --- a/lib/validation.sh +++ b/lib/validation.sh @@ -66,6 +66,7 @@ function GetValidationInfo() VALIDATE_GO=$(echo "$VALIDATE_GO" | awk '{print tolower($0)}') VALIDATE_TERRAFORM=$(echo "$VALIDATE_TERRAFORM" | awk '{print tolower($0)}') VALIDATE_POWERSHELL=$(echo "$VALIDATE_POWERSHELL" | awk '{print tolower($0)}') + VALIDATE_ARM=$(echo "$VALIDATE_ARM" | awk '{print tolower($0)}') VALIDATE_CSS=$(echo "$VALIDATE_CSS" | awk '{print tolower($0)}') VALIDATE_ENV=$(echo "$VALIDATE_ENV" | awk '{print tolower($0)}') VALIDATE_CLOJURE=$(echo "$VALIDATE_CLOJURE" | awk '{print tolower($0)}') @@ -96,6 +97,7 @@ function GetValidationInfo() -n "$VALIDATE_GO" || \ -n "$VALIDATE_TERRAFORM" || \ -n "$VALIDATE_POWERSHELL" || \ + -n "$VALIDATE_ARM" || \ -n "$VALIDATE_CSS" || \ -n "$VALIDATE_ENV" || \ -n "$VALIDATE_CLOJURE" || \ @@ -371,6 +373,20 @@ function GetValidationInfo() VALIDATE_POWERSHELL="true" fi + ################################### + # Validate if we should check ARM # + ################################### + if [[ "$ANY_SET" == "true" ]]; then + # Some linter flags were set - only run those set to true + if [[ -z "$VALIDATE_ARM" ]]; then + # ARM flag was not set - default to false + VALIDATE_ARM="false" + fi + else + # No linter flags were set - default all to true + VALIDATE_ARM="true" + fi + ################################### # Validate if we should check CSS # ################################### @@ -553,6 +569,11 @@ function GetValidationInfo() else PRINT_ARRAY+=("- Excluding [POWERSHELL] files in code base...") fi + if [[ "$VALIDATE_ARM" == "true" ]]; then + PRINT_ARRAY+=("- Validating [ARM] files in code base...") + else + PRINT_ARRAY+=("- Excluding [ARM] files in code base...") + fi if [[ "$VALIDATE_CSS" == "true" ]]; then PRINT_ARRAY+=("- Validating [CSS] files in code base...") else diff --git a/lib/worker.sh b/lib/worker.sh index 82aac52b..4ee32141 100755 --- a/lib/worker.sh +++ b/lib/worker.sh @@ -159,15 +159,17 @@ function LintCodebase() #################### LINT_CMD='' - ####################################### - # Corner case for Powershell subshell # - ####################################### - if [[ "$FILE_TYPE" == "POWERSHELL" ]]; then + #################################### + # Corner case for pwsh subshell # + # - PowerShell (PSScriptAnalyzer) # + # - ARM (arm-ttk) # + #################################### + if [[ "$FILE_TYPE" == "POWERSHELL" ]] || [[ "$FILE_TYPE" == "ARM" ]]; then ################################ # Lint the file with the rules # ################################ # Need to run PowerShell commands using pwsh -c, also exit with exit code from inner subshell - LINT_CMD=$(cd "$GITHUB_WORKSPACE" || exit; pwsh -c "($LINTER_COMMAND $FILE)"; exit $? 2>&1) + LINT_CMD=$(cd "$GITHUB_WORKSPACE" || exit; pwsh -NoProfile -NoLogo -Command "$LINTER_COMMAND $FILE; if (\$Error.Count) { exit 1 }"; exit $? 2>&1) else ################################ # Lint the file with the rules # @@ -459,7 +461,8 @@ function RunTestCases() TestCodebase "ANSIBLE" "ansible-lint" "ansible-lint -v -c $ANSIBLE_LINTER_RULES" ".*\.\(yml\|yaml\)\$" "ansible" TestCodebase "TERRAFORM" "tflint" "tflint -c $TERRAFORM_LINTER_RULES" ".*\.\(tf\)\$" "terraform" TestCodebase "CFN" "cfn-lint" "cfn-lint --config-file $CFN_LINTER_RULES" ".*\.\(json\|yml\|yaml\)\$" "cfn" - TestCodebase "POWERSHELL" "pwsh" "pwsh -c Invoke-ScriptAnalyzer -EnableExit -Settings $POWERSHELL_LINTER_RULES -Path" ".*\.\(ps1\|psm1\|psd1\|ps1xml\|pssc\|psrc\|cdxml\)\$" "powershell" + TestCodebase "POWERSHELL" "pwsh" "Invoke-ScriptAnalyzer -EnableExit -Settings $POWERSHELL_LINTER_RULES -Path" ".*\.\(ps1\|psm1\|psd1\|ps1xml\|pssc\|psrc\|cdxml\)\$" "powershell" + TestCodebase "ARM" "arm-ttk" "Import-Module $ARM_TTK_PSD1 ; \$config = \$(Import-PowerShellDataFile -Path $ARM_LINTER_RULES) ; Test-AzTemplate @config -TemplatePath" ".*\.\(json\)\$" "arm" TestCodebase "CSS" "stylelint" "stylelint --config $CSS_LINTER_RULES" ".*\.\(css\)\$" "css" TestCodebase "ENV" "dotenv-linter" "dotenv-linter" ".*\.\(env\)\$" "env" TestCodebase "CLOJURE" "clj-kondo" "clj-kondo --config $CLOJURE_LINTER_RULES --lint" ".*\.\(clj\|cljs\|cljc\|edn\)\$" "clojure" From fb613ea6196cd2efced1733b5266653a4122b700 Mon Sep 17 00:00:00 2001 From: Kevin Rowlandson Date: Fri, 3 Jul 2020 12:23:40 +0100 Subject: [PATCH 02/11] Test case updates --- .automation/test/arm/arm_bad_1.json | 61 ++++++++++++++++++++++++---- .automation/test/arm/arm_good_1.json | 60 +++++++++++++++++++++++---- TEMPLATES/.arm-ttk.psd1 | 50 +++++++++++------------ lib/linter.sh | 2 +- 4 files changed, 130 insertions(+), 43 deletions(-) diff --git a/.automation/test/arm/arm_bad_1.json b/.automation/test/arm/arm_bad_1.json index 7bb272bd..d75ced62 100644 --- a/.automation/test/arm/arm_bad_1.json +++ b/.automation/test/arm/arm_bad_1.json @@ -1,10 +1,53 @@ { - "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", - "contentVersion": "", - "apiProfile": "", - "parameters": { }, - "variables": { }, - "functions": [ ], - "resources": [ ], - "outputs": { } -} + "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", + "contentVersion": "", + "parameters": { + "Network.Config": { + "type": "object", + "metadata": { + "description": "Properties object for the Virtual Network" + } + } + }, + "variables": { + "Network.Name": "[parameters('Network.Config').name]", + "Network.Location": "[parameters('Network.Config').location]", + "Network.Tags": "[parameters('Network.Config').tags]", + "Network.Properties.AddressSpace.AddressPrefixes": "[parameters('Network.Config').addressPrefixes]", + "Network.Properties.DhcpOptions.DnsServers": "[parameters('Network.Config').dnsServers]", + "copy": [ + { + "name": "Network.Properties.Subnets", + "count": "[length(parameters('Network.Config').subnetConfig)]", + "input": { + "name": "[concat(parameters('Network.Config').subnetConfig[copyIndex('Network.Properties.Subnets')].aksId,'-',parameters('Network.Config').locationId)]", + "properties": "[parameters('Network.Config').subnetConfig[copyIndex('Network.Properties.Subnets')].properties]" + } + } + ], + "Test.Blank.Variable": [] + }, + "resources": [ + { + "name": "[variables('Network.Name')]", + "type": "Microsoft.Network/virtualNetworks", + "apiVersion": "2019-12-01", + "tags": "[variables('Network.Tags')]", + "properties": { + "addressSpace": { + "addressPrefixes": "[variables('Network.Properties.AddressSpace.AddressPrefixes')]" + }, + "dhcpOptions": { + "dnsServers": "[variables('Network.Properties.DhcpOptions.DnsServers')]" + }, + "subnets": "[variables('Network.Properties.Subnets')]" + } + } + ], + "outputs": { + "state": { + "type": "object", + "value": "[reference(resourceId('Microsoft.Network/virtualNetworks',variables('Network.Name')), '2019-12-01', 'Full')]" + } + } +} \ No newline at end of file diff --git a/.automation/test/arm/arm_good_1.json b/.automation/test/arm/arm_good_1.json index cf3800de..df09afb7 100644 --- a/.automation/test/arm/arm_good_1.json +++ b/.automation/test/arm/arm_good_1.json @@ -1,9 +1,53 @@ { - "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", - "contentVersion": "1.0.0.0", - "parameters": { }, - "variables": { }, - "functions": [ ], - "resources": [ ], - "outputs": { } -} + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "parameters": { + "Network.Config": { + "type": "object", + "metadata": { + "description": "Properties object for the Virtual Network" + } + } + }, + "variables": { + "Network.Name": "[parameters('Network.Config').name]", + "Network.Location": "[parameters('Network.Config').location]", + "Network.Tags": "[parameters('Network.Config').tags]", + "Network.Properties.AddressSpace.AddressPrefixes": "[parameters('Network.Config').addressPrefixes]", + "Network.Properties.DhcpOptions.DnsServers": "[parameters('Network.Config').dnsServers]", + "copy": [ + { + "name": "Network.Properties.Subnets", + "count": "[length(parameters('Network.Config').subnetConfig)]", + "input": { + "name": "[concat(parameters('Network.Config').subnetConfig[copyIndex('Network.Properties.Subnets')].aksId,'-',parameters('Network.Config').locationId)]", + "properties": "[parameters('Network.Config').subnetConfig[copyIndex('Network.Properties.Subnets')].properties]" + } + } + ] + }, + "resources": [ + { + "name": "[variables('Network.Name')]", + "type": "Microsoft.Network/virtualNetworks", + "apiVersion": "2019-12-01", + "location": "[variables('Network.Location')]", + "tags": "[variables('Network.Tags')]", + "properties": { + "addressSpace": { + "addressPrefixes": "[variables('Network.Properties.AddressSpace.AddressPrefixes')]" + }, + "dhcpOptions": { + "dnsServers": "[variables('Network.Properties.DhcpOptions.DnsServers')]" + }, + "subnets": "[variables('Network.Properties.Subnets')]" + } + } + ], + "outputs": { + "state": { + "type": "object", + "value": "[reference(resourceId('Microsoft.Network/virtualNetworks',variables('Network.Name')), '2019-12-01', 'Full')]" + } + } +} \ No newline at end of file diff --git a/TEMPLATES/.arm-ttk.psd1 b/TEMPLATES/.arm-ttk.psd1 index fa4350be..bcddce85 100644 --- a/TEMPLATES/.arm-ttk.psd1 +++ b/TEMPLATES/.arm-ttk.psd1 @@ -2,29 +2,29 @@ # - Test Parameters: https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/test-toolkit#test-parameters # - Test Cases: https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/test-cases @{ - Test = @( - 'Parameters Property Must Exist', - 'Parameters Must Be Referenced', - 'Secure String Parameters Cannot Have Default', - 'Location Should Not Be Hardcoded', - 'Resources Should Have Location', - 'VM Size Should Be A Parameter', - 'Min And Max Value Are Numbers', - 'artifacts-parameter', - 'Variables Must Be Referenced', - 'Dynamic Variable References Should Not Use Concat', - 'apiVersions Should Be Recent', - 'Providers apiVersions Is Not Permitted', - 'Template Should Not Contain Blanks', - 'IDs Should Be Derived From ResourceIDs', - 'ResourceIds should not contain', - 'DependsOn Must Not Be Conditional', - 'Deployment Resources Must Not Be Debug', - 'adminUsername Should Not Be A Literal', - 'VM Images Should Use Latest Version', - 'Virtual-Machines-Should-Not-Be-Preview', - 'ManagedIdentityExtension must not be used', - 'Outputs Must Not Contain Secrets' - ) - Skip = @() + # Test = @( + # 'Parameters Property Must Exist', + # 'Parameters Must Be Referenced', + # 'Secure String Parameters Cannot Have Default', + # 'Location Should Not Be Hardcoded', + # 'Resources Should Have Location', + # 'VM Size Should Be A Parameter', + # 'Min And Max Value Are Numbers', + # 'artifacts-parameter', + # 'Variables Must Be Referenced', + # 'Dynamic Variable References Should Not Use Concat', + # 'apiVersions Should Be Recent', + # 'Providers apiVersions Is Not Permitted', + # 'Template Should Not Contain Blanks', + # 'IDs Should Be Derived From ResourceIDs', + # 'ResourceIds should not contain', + # 'DependsOn Must Not Be Conditional', + # 'Deployment Resources Must Not Be Debug', + # 'adminUsername Should Not Be A Literal', + # 'VM Images Should Use Latest Version', + # 'Virtual-Machines-Should-Not-Be-Preview', + # 'ManagedIdentityExtension must not be used', + # 'Outputs Must Not Contain Secrets' + # ) + # Skip = @() } diff --git a/lib/linter.sh b/lib/linter.sh index 97f00094..565dae30 100755 --- a/lib/linter.sh +++ b/lib/linter.sh @@ -269,7 +269,7 @@ GetLinterVersions() # Get the version # ################### if [[ "$LINTER" == "arm-ttk" ]]; then - mapfile -t GET_VERSION_CMD < <(cat $ARM_TTK_PSD1 | grep -i version | xargs 2>&1) + mapfile -t GET_VERSION_CMD < <(cat "$ARM_TTK_PSD1" | grep -i version | xargs 2>&1) elif [[ "$LINTER" == "protolint" ]]; then mapfile -t GET_VERSION_CMD < <(echo "--version not supported") From 93f24d5f8fe5fa55b83c5a1141a27b07fbbdd852 Mon Sep 17 00:00:00 2001 From: Kevin Rowlandson Date: Fri, 3 Jul 2020 12:40:44 +0100 Subject: [PATCH 03/11] Minor bugfixes --- lib/linter.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/linter.sh b/lib/linter.sh index 565dae30..a71ad512 100755 --- a/lib/linter.sh +++ b/lib/linter.sh @@ -269,7 +269,7 @@ GetLinterVersions() # Get the version # ################### if [[ "$LINTER" == "arm-ttk" ]]; then - mapfile -t GET_VERSION_CMD < <(cat "$ARM_TTK_PSD1" | grep -i version | xargs 2>&1) + mapfile -t GET_VERSION_CMD < <(grep -iE 'version' "$ARM_TTK_PSD1" | xargs 2>&1) elif [[ "$LINTER" == "protolint" ]]; then mapfile -t GET_VERSION_CMD < <(echo "--version not supported") @@ -473,7 +473,7 @@ DetectARMFile() ############################### # Check the file for keywords # ############################### - grep -E 'schema.management.azure.com' "$GITHUB_WORKSPACE/$FILE" > /dev/null + grep -E 'schema.management.azure.com' "$FILE" > /dev/null ####################### # Load the error code # From 39159188cd706c55e7aca3196043e8e29443b0d9 Mon Sep 17 00:00:00 2001 From: Kevin Rowlandson Date: Fri, 3 Jul 2020 13:51:00 +0100 Subject: [PATCH 04/11] Minor updates following merge from upstream/master --- lib/linter.sh | 5 ++--- lib/worker.sh | 6 ++---- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/lib/linter.sh b/lib/linter.sh index b575192a..660f44eb 100755 --- a/lib/linter.sh +++ b/lib/linter.sh @@ -264,7 +264,6 @@ GetLinterVersions() { # Go through the array of linters and print version info # ########################################################## for LINTER in "${LINTER_ARRAY[@]}"; do - echo "[$LINTER]:" ################### # Get the version # ################### @@ -287,12 +286,12 @@ GetLinterVersions() { # Check the shell for errors # ############################## if [ $ERROR_CODE -ne 0 ] || [ -z "${GET_VERSION_CMD[*]}" ]; then - echo -e "${NC}${F[Y]}WARN!${NC} Failed to get version info for:[$LINTER]${NC}" + echo -e "${NC}[$LINTER]: ${F[Y]}WARN!${NC} Failed to get version info for:${NC}" else ########################## # Print the version info # ########################## - echo "[$LINTER]: ${GET_VERSION_CMD[*]}" + echo -e "${NC}${F[B]}Successfully found version for ${F[W]}[$LINTER]${F[B]}: ${F[W]}${GET_VERSION_CMD[*]}${NC}" fi done ######################### diff --git a/lib/worker.sh b/lib/worker.sh index ae655250..4c5b1cd8 100755 --- a/lib/worker.sh +++ b/lib/worker.sh @@ -55,8 +55,7 @@ function LintCodebase() { else # Success if [[ $ACTIONS_RUNNER_DEBUG == "true" ]]; then - echo -e "${NC}${F[B]}Successfully found binary for ${F[W]}[$LINTER_NAME]${F[B]} in system${NC}" - echo "Location:[$VALIDATE_INSTALL_CMD]" + echo -e "${NC}${F[B]}Successfully found binary for ${F[W]}[$LINTER_NAME]${F[B]} in system location: ${F[W]}[$VALIDATE_INSTALL_CMD]${NC}" fi fi @@ -250,8 +249,7 @@ function TestCodebase() { exit 1 else # Success - echo -e "${NC}${F[B]}Successfully found binary in system${NC}" - echo "Location:[$VALIDATE_INSTALL_CMD]" + echo -e "${NC}${F[B]}Successfully found binary for ${F[W]}[$LINTER_NAME]${F[B]} in system location: ${F[W]}[$VALIDATE_INSTALL_CMD]${NC}" fi ########################## From 91908e446ef28559e167f6f16ddbfbd3ee968239 Mon Sep 17 00:00:00 2001 From: Kevin Rowlandson Date: Fri, 3 Jul 2020 14:22:23 +0100 Subject: [PATCH 05/11] Update ARM Test Cases readme --- .automation/test/arm/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.automation/test/arm/README.md b/.automation/test/arm/README.md index 8c2acadd..e2746d06 100644 --- a/.automation/test/arm/README.md +++ b/.automation/test/arm/README.md @@ -1,5 +1,5 @@ -# Json Test Cases -This folder holds the test cases for **Json**. +# ARM Test Cases +This folder holds the test cases for **Azure Resource Manager (ARM)**. ## Additional Docs No Additional information is needed for this test case. From adbb959358ac12c29a12ebaf1a5c5a972420d232 Mon Sep 17 00:00:00 2001 From: Kevin Rowlandson Date: Fri, 3 Jul 2020 14:30:32 +0100 Subject: [PATCH 06/11] Minor fix for TestCodebase [ARM] --- lib/worker.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/worker.sh b/lib/worker.sh index 4c5b1cd8..9f498d8a 100755 --- a/lib/worker.sh +++ b/lib/worker.sh @@ -334,7 +334,7 @@ function TestCodebase() { cd "$GITHUB_WORKSPACE/$TEST_CASE_FOLDER/$INDVIDUAL_TEST_FOLDER" || exit $LINTER_COMMAND "$FILE" 2>&1 ) - elif [[ $FILE_TYPE == "POWERSHELL" ]]; then + elif [[ $FILE_TYPE == "POWERSHELL" ]] || [[ $FILE_TYPE == "ARM" ]]; then ################################ # Lint the file with the rules # ################################ From d56d1b7346189ffd50f8a9f15f7d660c32b11b9e Mon Sep 17 00:00:00 2001 From: Kevin Rowlandson Date: Fri, 3 Jul 2020 14:46:15 +0100 Subject: [PATCH 07/11] Minor fix(1) for TestCodebase [ARM] --- lib/worker.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/worker.sh b/lib/worker.sh index 9f498d8a..bc0fe066 100755 --- a/lib/worker.sh +++ b/lib/worker.sh @@ -341,7 +341,7 @@ function TestCodebase() { # Need to run PowerShell commands using pwsh -c, also exit with exit code from inner subshell LINT_CMD=$( cd "$GITHUB_WORKSPACE/$TEST_CASE_FOLDER" || exit - pwsh -c "($LINTER_COMMAND $FILE)" + pwsh -NoProfile -NoLogo -Command "$LINTER_COMMAND $FILE; if (\$Error.Count) { exit 1 }" exit $? 2>&1 ) else From 3b827a24ffed26775c956a7136525c2e4e969e7d Mon Sep 17 00:00:00 2001 From: Kevin Rowlandson Date: Fri, 3 Jul 2020 15:00:45 +0100 Subject: [PATCH 08/11] Remove noise from ARG in Dockerfile --- Dockerfile | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/Dockerfile b/Dockerfile index 733712e6..482d0f25 100644 --- a/Dockerfile +++ b/Dockerfile @@ -28,21 +28,11 @@ ARG PSSA_VERSION='latest' # arm-ttk ARG ARM_TTK_URI='https://github.com/Azure/arm-ttk.git' ARG ARM_TTK_DIRECTORY='/opt/microsoft/arm-ttk' -# ARG ARM_TTK_SH="${ARM_TTK_DIRECTORY}/arm-ttk/Test-AzTemplate.sh" # clj-kondo ARG CLJ_KONDO_VERSION='2020.06.21' # Go Linter ARG GO_VERSION='v1.27.0' -# PWSH_VERSION='latest' -# PWSH_DIRECTORY='/opt/microsoft/powershell' -# PSSA_VERSION='latest' -# ARM_TTK_URI='https://github.com/Azure/arm-ttk.git' -# ARM_TTK_DIRECTORY='/opt/microsoft/arm-ttk' -# CLJ_KONDO_VERSION='2020.06.21' -# GO_VERSION='v1.27.0' -# ARM_TTK_PSD1="/opt/microsoft/arm-ttk/arm-ttk/arm-ttk.psd1" - #################### # Run APK installs # #################### From a2df874c1a714beda3a6f8d9ad3cb759dee9b2ca Mon Sep 17 00:00:00 2001 From: Kevin Rowlandson Date: Fri, 3 Jul 2020 15:02:01 +0100 Subject: [PATCH 09/11] Remove ARM_TTK_VERSION from ENV in Dockerfile --- Dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 482d0f25..c1ab2345 100644 --- a/Dockerfile +++ b/Dockerfile @@ -212,7 +212,6 @@ ENV GITHUB_SHA=${GITHUB_SHA} \ VALIDATE_KOTLIN=${VALIDATE_KOTLIN} \ VALIDATE_POWERSHELL=${VALIDATE_POWERSHELL} \ VALIDATE_ARM=${VALIDATE_ARM} \ - ARM_TTK_VERSION=${ARM_TTK_VERSION} \ VALIDATE_OPENAPI=${VALIDATE_OPENAPI} \ VALIDATE_PROTOBUF=${VALIDATE_PROTOBUF} \ ANSIBLE_DIRECTORY=${ANSIBLE_DIRECTORY} \ From ae7b7f0e53dc50be5eb37cb2eacdae9523858934 Mon Sep 17 00:00:00 2001 From: Lucas Gravley <29484535+admiralAwkbar@users.noreply.github.com> Date: Mon, 6 Jul 2020 08:18:09 -0500 Subject: [PATCH 10/11] adding some small cleanup --- lib/linter.sh | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/linter.sh b/lib/linter.sh index 660f44eb..43acd3ac 100755 --- a/lib/linter.sh +++ b/lib/linter.sh @@ -268,12 +268,13 @@ GetLinterVersions() { # Get the version # ################### if [[ "$LINTER" == "arm-ttk" ]]; then + # Need specific command for ARM mapfile -t GET_VERSION_CMD < <(grep -iE 'version' "$ARM_TTK_PSD1" | xargs 2>&1) - elif [[ "$LINTER" == "protolint" ]]; then + # Need specific command for Protolint mapfile -t GET_VERSION_CMD < <(echo "--version not supported") - else + # Standard version command mapfile -t GET_VERSION_CMD < <("$LINTER" --version 2>&1) fi @@ -294,6 +295,7 @@ GetLinterVersions() { echo -e "${NC}${F[B]}Successfully found version for ${F[W]}[$LINTER]${F[B]}: ${F[W]}${GET_VERSION_CMD[*]}${NC}" fi done + ######################### # Print version footers # ######################### @@ -448,13 +450,13 @@ DetectOpenAPIFile() { fi } ################################################################################ -#### Function DetectARMFile ################################################ +#### Function DetectARMFile #################################################### DetectARMFile() { ################ # Pull in vars # ################ - FILE="$1" + FILE="$1" # Name of the file/path we are validating ############################### # Check the file for keywords # @@ -473,12 +475,12 @@ DetectARMFile() ######################## # Found string in file # ######################## - return 0 + return 0 else ################### # No string match # ################### - return 1 + return 1 fi } ################################################################################ From bf045db30314a8fa75ee91dfc27fd13d46fb9f81 Mon Sep 17 00:00:00 2001 From: Lucas Gravley <29484535+admiralAwkbar@users.noreply.github.com> Date: Mon, 6 Jul 2020 08:29:36 -0500 Subject: [PATCH 11/11] hunting a bug --- lib/buildFileList.sh | 10 +++++----- lib/linter.sh | 3 +-- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/lib/buildFileList.sh b/lib/buildFileList.sh index 0bba876f..e856c341 100755 --- a/lib/buildFileList.sh +++ b/lib/buildFileList.sh @@ -81,11 +81,6 @@ function BuildFileList() { echo "----------------------------------------------" echo "Files that have been modified in the commit(s):" for FILE in "${RAW_FILE_ARRAY[@]}"; do - ############## - # Print file # - ############## - echo "File:[$FILE]" - ########################### # Get the files extension # ########################### @@ -93,6 +88,11 @@ function BuildFileList() { # reverse it back, substitute to lowercase FILE_TYPE=$(basename "$FILE" | rev | cut -f1 -d'.' | rev | awk '{print tolower($0)}') + ############## + # Print file # + ############## + echo "File:[$FILE], File_type:[$FILE_TYPE]" + ######### # DEBUG # ######### diff --git a/lib/linter.sh b/lib/linter.sh index 43acd3ac..96f8e6a0 100755 --- a/lib/linter.sh +++ b/lib/linter.sh @@ -451,8 +451,7 @@ DetectOpenAPIFile() { } ################################################################################ #### Function DetectARMFile #################################################### -DetectARMFile() -{ +DetectARMFile() { ################ # Pull in vars # ################