Skip to content

Instantly share code, notes, and snippets.

@suzuki-shunsuke
Last active March 9, 2020 22:16
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save suzuki-shunsuke/df616713daf490f59d2cc0a039c552b1 to your computer and use it in GitHub Desktop.
commands:
apply:
description: |
Run `terraform apply` and add a comment to the pull request or Git commit.
parameters:
apply_options:
default: ""
description: |
The options of `terraform apply` command. The option `-auto-approve` is set automatically.
For example, `-refresh=false -parallelism=20`.
type: string
steps:
- run:
command: apk add ca-certificates bash curl
name: Install requirements
- attach_workspace:
at: .
- run:
command: |
root_dir=$PWD
for changed_file in $(find changed -name changed.txt); do
service_env_dir=$(dirname ${changed_file##changed/})
cd $root_dir/src/$service_env_dir
tfenv install
terraform init
set +o errexit
terraform apply -auto-approve << parameters.apply_options >> > /tmp/apply.txt
code="$?"
set -e
cd $root_dir/src
cat /tmp/apply.txt | tfnotify apply --title "Apply $service_env_dir"
exit $code
done
name: terraform apply
shell: /bin/bash -eu -o pipefail
check_changed:
description: |
Check the result of `terraform plan`.
This command assume that the repository is `monorepo`, and if no states are changed, add a comment to the pull request or Git commit.
steps:
- run:
command: apk add ca-certificates bash curl
name: Install requirements
- attach_workspace:
at: .
- run:
command: |
if [ $(find changed -name changed.txt | wc -l) -eq 0 ]; then
echo_green "No states are changed"
github-comment -template ":white_check_mark: No states are changed"
fi
name: Check changed
shell: /bin/bash -eu -o pipefail
fmt:
description: Run `terraform fmt -check` to test if the code is formatted.
parameters:
dir:
description: |
the relative path from the repository root directory to Terraform configuration root directory.
In the directory, `terraform fmt -check` is executed.
type: string
steps:
- run:
command: |
cd src/<< parameters.dir >>
if ! terraform fmt -check > /dev/null 2>&1; then
echo_error "Please run 'terraform fmt'"
terraform fmt -diff -write=false
if [ -n "${CIRCLE_PULL_REQUEST:-""}" ]; then
echo_command_result_template |
HEADER=":x: [Job Link]($CIRCLE_BUILD_URL) [<< parameters.dir >>] Please run 'terraform fmt'" \
COMMAND="terraform fmt -diff -write=false" \
OUTPUT=$(terraform fmt -diff -write=false -no-color) \
gomplate | github-comment
fi
exit 1
fi
name: terraform fmt -check
shell: /bin/bash -eu -o pipefail
install_bash:
description: Install Bash
steps:
- run:
command: apk add bash
name: Install Bash
plan:
description: |
Run `terraform plan` and add a comment to the pull request or Git commit.
parameters:
dir:
description: |
the relative path from the repository root directory to Terraform configuration root directory.
In the directory, `terraform plan` is executed.
type: string
plan_options:
default: ""
description: |
The options of `terraform plan` command. The option `-detailed-exitcode` is set automatically.
For example, `-refresh=false -parallelism=20`.
type: string
steps:
- run:
command: |
root_dir=$PWD
cd src/<< parameters.dir >>
set +o errexit
terraform plan -detailed-exitcode << parameters.plan_options >> > /tmp/plan.txt
code=$?
set -e
cd $root_dir/src
mkdir -p ../changed/<< parameters.dir >>
touch ../changed/<< parameters.dir >>/dummy.txt
if [ "$code" = "0" ]; then
# no changed
cat /tmp/plan.txt
exit 0
fi
cat /tmp/plan.txt | tfnotify plan --title "Plan << parameters.dir >>"
if [ "$code" = "2" ]; then
# changed
touch ../changed/<< parameters.dir >>/changed.txt
exit 0
fi
# failed
exit 1
name: terraform plan
shell: /bin/bash -eu -o pipefail
setup:
description: |
Checkout source code and install some tools such as tfenv and tfnotify.
parameters:
custom_setup:
default: []
description: |
Custom setup steps. If you want to use custom tools in custom tests, please install them in the custom steps.
type: steps
gomplate_version:
default: v3.6.0
description: |
The version of gomplate. gomplate is downloaded from the release page.
https://github.com/hairyhenderson/gomplate/releases/download/<< parameters.gomplate_version >>/gomplate_linux-amd64
type: string
tfnotify_version:
default: v0.5.2
description: |
The version of tfnotify. tfnotify is downloaded from the release page.
https://github.com/mercari/tfnotify/releases/download/<< parameters.tfnotify_version >>/tfnotify_linux_amd64.tar.gz
type: string
steps:
- run:
command: apk add git openssh bash curl
name: Install requirements
- checkout:
path: src
- run:
command: git clone --depth 1 https://github.com/tfutils/tfenv.git .tfenv
name: Install tfenv
- run:
command: '.tfenv/bin/tfenv install || :'
name: Install terraform
- run:
command: |
# requirement curl
curl -L https://github.com/mercari/tfnotify/releases/download/<< parameters.tfnotify_version >>/tfnotify_linux_amd64.tar.gz | tar xvzf - tfnotify
mkdir bin
mv tfnotify bin
chmod a+x bin/tfnotify
name: Install tfnotify
- run:
command: |
curl -L https://github.com/suzuki-shunsuke/github-comment-cli/releases/download/v0.1.0-2/github-comment-cli_0.1.0-2_linux_amd64.tar.gz | tar xvzf - github-comment
mv github-comment bin
chmod a+x bin/github-comment
name: Install github-comment-cli
- run:
command: |
curl -o bin/gomplate -sSL https://github.com/hairyhenderson/gomplate/releases/download/<< parameters.gomplate_version >>/gomplate_linux-amd64
chmod a+x bin/gomplate
name: Install gomplate
- steps: << parameters.custom_setup >>
setup_bash_env:
description: |
Append some shell functions and environment variables to BASH_ENV.
steps:
- run:
command: |
echo '
echo_green() {
echo "${COLOR_2}$*${COLOR_OFF}"
}
echo_error() {
echo -e "${COLOR_1}$*${COLOR_OFF}" >&2
}
echo_command_result_template() {
local tempfile; tempfile=$(mktemp)
echo "{{ .Env.HEADER }}" > $tempfile
echo "" >> $tempfile
echo "\`\`\`" >> $tempfile
echo "$ {{ .Env.COMMAND }}" >> $tempfile
echo "\`\`\`" >> $tempfile
echo "" >> $tempfile
echo "<details>" >> $tempfile
echo "<summary>Command Output</summary>" >> $tempfile
echo "" >> $tempfile
echo "\`\`\`" >> $tempfile
echo "{{ .Env.OUTPUT }}" >> $tempfile
echo "\`\`\`" >> $tempfile
echo "" >> $tempfile
echo "</details>" >> $tempfile
cat $tempfile
rm $tempfile
}
' >> $BASH_ENV
echo "export PATH=$PWD/.tfenv/bin:$PWD/bin:$PATH" >> $BASH_ENV
cat $BASH_ENV
name: Set up BASH_ENV
shell: /bin/bash -eu -o pipefail
test:
description: |
Run lints and tests and add a comment to the pull request or Git commit.
parameters:
custom_tests:
default: []
type: steps
dir:
description: |
the relative path from the repository root directory to Terraform configuration root directory.
In the directory, Terraform commands such as `terraform plan` are executed.
type: string
plan_options:
default: ""
description: |
The options of `terraform plan` command. The option `-detailed-exitcode` is set automatically.
For example, `-refresh=false -parallelism=20`.
type: string
skip_plan:
default: false
description: |
If this parameter is `true`, `terraform plan` isn't executed.
type: boolean
steps:
- run:
command: apk add ca-certificates bash curl
name: Install requirements
- attach_workspace:
at: .
- run:
command: |
cd src/<< parameters.dir >>
# requirement: curl
# requirement: tfenv
# requirement: bash
tfenv install
name: tfenv install
shell: /bin/bash -eu -o pipefail
- run:
command: |
cd src/<< parameters.dir >>
terraform init
name: terraform init
shell: /bin/bash -eu -o pipefail
- fmt:
dir: << parameters.dir >>
- validate:
dir: << parameters.dir >>
- steps: << parameters.custom_tests >>
- unless:
condition: << parameters.skip_plan >>
steps:
- plan:
dir: << parameters.dir >>
plan_options: << parameters.plan_options >>
- persist_to_workspace:
paths:
- changed/<< parameters.dir >>/*
root: .
validate:
description: Run `terraform validate` to test if the code is valid.
parameters:
dir:
description: |
the relative path from the repository root directory to Terraform configuration root directory.
In the directory, `terraform validate` is executed.
type: string
steps:
- run:
command: |
cd src/<< parameters.dir >>
vlog=$(mktemp)
if ! terraform validate -no-color > $vlog 2>&1; then
if [ -n "${CIRCLE_PULL_REQUEST:-""}" ]; then
echo_command_result_template |
HEADER=":x: [Job Link]($CIRCLE_BUILD_URL) [<< parameters.dir >>] terraform validate is failure" \
COMMAND="terraform validate" \
OUTPUT=$(cat $vlog) \
gomplate | github-comment
fi
rm $vlog
exit 1
fi
rm $vlog
name: terraform validate
shell: /bin/bash -eu -o pipefail
description: |
Lint and test and apply Terraform configuration.
We assume tfenv is used at the target project.
display:
source_url: https://github.com/suzuki-shunsuke/circleci-orb-tfenv
examples: {}
executors:
alpine:
docker:
- environment:
COLOR_1: "\e[31;1m"
COLOR_2: "\e[32;1m"
COLOR_OFF: "\e[m"
TF_CLI_ARGS_plan: -parallelism=30
image: alpine:3.11.3
jobs:
apply:
description: |
Run `terraform apply` and add a comment to the pull request or Git commit.
executor: << parameters.executor >>
parameters:
apply_options:
default: ""
description: |
The options of `terraform apply` command. The option `-auto-approve` is set automatically.
For example, `-refresh=false -parallelism=20`.
type: string
executor:
default: alpine
description: |
Custom executor. The executor must use an Alpine based Docker image.
type: executor
steps:
- install_bash
- setup_bash_env
- apply:
apply_options: << parameters.apply_options >>
check_changed:
description: |
Check the result of `terraform plan`.
If no states are changed, add a comment to the pull request or Git commit.
executor: << parameters.executor >>
parameters:
executor:
default: alpine
description: |
Custom executor. The executor must use an Alpine based Docker image.
type: executor
steps:
- install_bash
- setup_bash_env
- check_changed
plan:
docker:
- environment:
COLOR_1: "\e[31;1m"
COLOR_2: "\e[32;1m"
COLOR_OFF: "\e[m"
TF_CLI_ARGS_plan: -parallelism=30
image: alpine:3.11.3
parameters:
dir:
type: string
steps:
- run:
command: apk add ca-certificates bash curl
name: Install requirements
- attach_workspace:
at: .
- run:
command: |
export PATH=$PWD/.tfenv/bin:$PWD/bin:$PATH
cd src/<< parameters.dir >>
# requirement: curl
# requirement: tfenv
# requirement: bash
tfenv install
name: tfenv install
- run:
command: |
export PATH=$PWD/.tfenv/bin:$PWD/bin:$PATH
cd src/<< parameters.dir >>
terraform init
name: terraform init
- run:
command: |
comment() {
curl -H "Authorization: token $GITHUB_TOKEN" \
https://api.github.com/repos/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME/issues/$(basename ${CIRCLE_PULL_REQUEST})/comments \
-d "{\"body\": \"$1\"}"
}
export PATH=$PWD/.tfenv/bin:$PWD/bin:$PATH
cd src/<< parameters.dir >>
terraform fmt -diff -write=false
if ! terraform fmt -check; then
echo -e "${COLOR_1}Please run 'terraform fmt'${COLOR_OFF}" >&2
if [ -n "${CIRCLE_PULL_REQUEST:-""}" ]; then
comment ":x: [Job Link]($CIRCLE_BUILD_URL) [<< parameters.dir >>] Please run 'terraform fmt'"
fi
exit 1
fi
name: terraform fmt -check
shell: /bin/bash -eu -o pipefail
- run:
command: |
comment() {
curl -H "Authorization: token $GITHUB_TOKEN" \
https://api.github.com/repos/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME/issues/$(basename ${CIRCLE_PULL_REQUEST})/comments \
-d "{\"body\": \"$1\"}"
}
export PATH=$PWD/.tfenv/bin:$PWD/bin:$PATH
cd src/<< parameters.dir >>
if ! terraform validate; then
if [ -n "${CIRCLE_PULL_REQUEST:-""}" ]; then
comment ":x: [Job Link]($CIRCLE_BUILD_URL) [<< parameters.dir >>] terraform validate is failure"
fi
exit 1
fi
name: terraform validate
shell: /bin/bash -eu -o pipefail
- run:
command: |
export PATH=$PWD/.tfenv/bin:$PWD/bin:$PATH
root_dir=$PWD
cd src/<< parameters.dir >>
set +o pipefail
terraform plan -detailed-exitcode 2>&1 | tee /tmp/plan.txt
code="${PIPESTATUS[0]}"
set -o pipefail
cd $root_dir/src
mkdir -p ../changed/<< parameters.dir >>
touch ../changed/<< parameters.dir >>/dummy.txt
if [ "$code" = "0" ]; then
# no changed
exit 0
fi
cat /tmp/plan.txt | tfnotify plan --title "Plan << parameters.dir >>"
if [ "$code" = "2" ]; then
# changed
touch ../changed/<< parameters.dir >>/changed.txt
exit 0
fi
# failed
exit 1
name: terraform plan
shell: /bin/bash -eu -o pipefail
- persist_to_workspace:
paths:
- changed/<< parameters.dir >>/*
root: .
setup:
description: |
Checkout source code and install some tools such as tfenv and tfnotify and persist them to the workspace.
executor: << parameters.executor >>
parameters:
custom_setup:
default: []
description: |
Custom setup steps. If you want to use custom tools in custom tests, please install them in the custom steps.
type: steps
executor:
default: alpine
description: |
Custom executor. The executor must use an Alpine based Docker image.
type: executor
tfnotify_version:
default: v0.5.2
description: |
The version of tfnotify. tfnotify is downloaded from the release page.
https://github.com/mercari/tfnotify/releases/download/<< parameters.tfnotify_version >>/tfnotify_linux_amd64.tar.gz
type: string
steps:
- setup:
custom_setup: << parameters.custom_setup >>
tfnotify_version: << parameters.tfnotify_version >>
- persist_to_workspace:
paths:
- '*'
root: .
test:
description: |
Run lints and tests and add a comment to the pull request or Git commit.
executor: << parameters.executor >>
parameters:
custom_tests:
default: []
description: |
Custom test steps. You can add custom tests freely.
type: steps
dir:
description: |
the relative path from the repository root directory to Terraform configuration root directory.
In the directory, Terraform commands such as `terraform plan` are executed.
type: string
executor:
default: alpine
description: |
Custom executor. The executor must use an Alpine based Docker image.
type: executor
plan_options:
default: ""
description: |
The options of `terraform plan` command. The option `-detailed-exitcode` is set automatically.
For example, `-refresh=false -parallelism=20`.
type: string
skip_plan:
default: false
description: |
If this parameter is `true`, `terraform plan` isn't executed.
type: boolean
steps:
- install_bash
- setup_bash_env
- test:
custom_tests: << parameters.custom_tests >>
dir: << parameters.dir >>
plan_options: << parameters.plan_options >>
skip_plan: << parameters.skip_plan >>
version: 2.1
$ circleci config validate
Error: ERROR IN CONFIG FILE:
[#] 32 schema violations found
1. [#/executors/alpine] 0 subschemas matched instead of one
| 1. [#/executors/alpine] expected type: String, found: Mapping
| | Executor may be a string reference to another executor
| 2. [#/executors/alpine/docker/0/environment] 0 subschemas matched instead of one
| | 1. [#/executors/alpine/docker/0/environment] no subschema matched out of the total 2 subschemas
| | | Allow null to account for empty `environment:` declarations.
| | | 1. [#/executors/alpine/docker/0/environment] expected type: String, found: Mapping
| | | | Allow null to account for empty `environment:` declarations.
| | | | SCHEMA:
| | | | type:
| | | | - string
| | | | - 'null'
| | | | INPUT:
| | | | COLOR_1: !!binary |-
| | | | G1szMTsxbQ==
| | | | COLOR_2: !!binary |-
| | | | G1szMjsxbQ==
| | | | COLOR_OFF: !!binary |-
| | | | G1tt
| | | | TF_CLI_ARGS_plan: -parallelism=30
| | | 2. [#/executors/alpine/docker/0/environment] expected: null, found: Mapping
| | | | Allow null to account for empty `environment:` declarations.
| | | | SCHEMA:
| | | | type:
| | | | - string
| | | | - 'null'
| | | | INPUT:
| | | | COLOR_1: !!binary |-
| | | | G1szMTsxbQ==
| | | | COLOR_2: !!binary |-
| | | | G1szMjsxbQ==
| | | | COLOR_OFF: !!binary |-
| | | | G1tt
| | | | TF_CLI_ARGS_plan: -parallelism=30
| | 2. [#/executors/alpine/docker/0/environment] 12 schema violations found
| | | The value should be a string, but we allow null, boolean and numbers too. Examples: `FOO: true` and `BAR: 2` `BAZ:`
| | | 1. [#/executors/alpine/docker/0/environment/COLOR_1] no subschema matched out of the total 4 subschemas
| | | | 1. [#/executors/alpine/docker/0/environment/COLOR_1] expected type: Boolean, found: Sequence
| | | | | SCHEMA:
| | | | | type:
| | | | | - string
| | | | | - boolean
| | | | | - number
| | | | | - 'null'
| | | | | INPUT:
| | | | | !!binary |-
| | | | | G1szMTsxbQ==
| | | | 2. [#/executors/alpine/docker/0/environment/COLOR_1] expected type: Number, found: Sequence
| | | | | SCHEMA:
| | | | | type:
| | | | | - string
| | | | | - boolean
| | | | | - number
| | | | | - 'null'
| | | | | INPUT:
| | | | | !!binary |-
| | | | | G1szMTsxbQ==
| | | | 3. [#/executors/alpine/docker/0/environment/COLOR_1] expected type: String, found: Sequence
| | | | | SCHEMA:
| | | | | type:
| | | | | - string
| | | | | - boolean
| | | | | - number
| | | | | - 'null'
| | | | | INPUT:
| | | | | !!binary |-
| | | | | G1szMTsxbQ==
| | | | 4. [#/executors/alpine/docker/0/environment/COLOR_1] expected: null, found: Sequence
| | | | | SCHEMA:
| | | | | type:
| | | | | - string
| | | | | - boolean
| | | | | - number
| | | | | - 'null'
| | | | | INPUT:
| | | | | !!binary |-
| | | | | G1szMTsxbQ==
| | | 2. [#/executors/alpine/docker/0/environment/COLOR_2] no subschema matched out of the total 4 subschemas
| | | | 1. [#/executors/alpine/docker/0/environment/COLOR_2] expected type: Boolean, found: Sequence
| | | | | SCHEMA:
| | | | | type:
| | | | | - string
| | | | | - boolean
| | | | | - number
| | | | | - 'null'
| | | | | INPUT:
| | | | | !!binary |-
| | | | | G1szMjsxbQ==
| | | | 2. [#/executors/alpine/docker/0/environment/COLOR_2] expected type: Number, found: Sequence
| | | | | SCHEMA:
| | | | | type:
| | | | | - string
| | | | | - boolean
| | | | | - number
| | | | | - 'null'
| | | | | INPUT:
| | | | | !!binary |-
| | | | | G1szMjsxbQ==
| | | | 3. [#/executors/alpine/docker/0/environment/COLOR_2] expected type: String, found: Sequence
| | | | | SCHEMA:
| | | | | type:
| | | | | - string
| | | | | - boolean
| | | | | - number
| | | | | - 'null'
| | | | | INPUT:
| | | | | !!binary |-
| | | | | G1szMjsxbQ==
| | | | 4. [#/executors/alpine/docker/0/environment/COLOR_2] expected: null, found: Sequence
| | | | | SCHEMA:
| | | | | type:
| | | | | - string
| | | | | - boolean
| | | | | - number
| | | | | - 'null'
| | | | | INPUT:
| | | | | !!binary |-
| | | | | G1szMjsxbQ==
| | | 3. [#/executors/alpine/docker/0/environment/COLOR_OFF] no subschema matched out of the total 4 subschemas
| | | | 1. [#/executors/alpine/docker/0/environment/COLOR_OFF] expected type: Boolean, found: Sequence
| | | | | SCHEMA:
| | | | | type:
| | | | | - string
| | | | | - boolean
| | | | | - number
| | | | | - 'null'
| | | | | INPUT:
| | | | | !!binary |-
| | | | | G1tt
| | | | 2. [#/executors/alpine/docker/0/environment/COLOR_OFF] expected type: Number, found: Sequence
| | | | | SCHEMA:
| | | | | type:
| | | | | - string
| | | | | - boolean
| | | | | - number
| | | | | - 'null'
| | | | | INPUT:
| | | | | !!binary |-
| | | | | G1tt
| | | | 3. [#/executors/alpine/docker/0/environment/COLOR_OFF] expected type: String, found: Sequence
| | | | | SCHEMA:
| | | | | type:
| | | | | - string
| | | | | - boolean
| | | | | - number
| | | | | - 'null'
| | | | | INPUT:
| | | | | !!binary |-
| | | | | G1tt
| | | | 4. [#/executors/alpine/docker/0/environment/COLOR_OFF] expected: null, found: Sequence
| | | | | SCHEMA:
| | | | | type:
| | | | | - string
| | | | | - boolean
| | | | | - number
| | | | | - 'null'
| | | | | INPUT:
| | | | | !!binary |-
| | | | | G1tt
| | 3. [#/executors/alpine/docker/0/environment] expected type: Sequence, found: Mapping
| | | An array of strings in the form KEY=VALUE
| | | SCHEMA:
| | | type: array
| | | INPUT:
| | | COLOR_1: !!binary |-
| | | G1szMTsxbQ==
| | | COLOR_2: !!binary |-
| | | G1szMjsxbQ==
| | | COLOR_OFF: !!binary |-
| | | G1tt
| | | TF_CLI_ARGS_plan: -parallelism=30
2. [#/jobs/plan] 0 subschemas matched instead of one
| 1. [#/jobs/plan] only 1 subschema matches out of 2
| | 1. [#/jobs/plan/docker/0/environment] 0 subschemas matched instead of one
| | | 1. [#/jobs/plan/docker/0/environment] no subschema matched out of the total 2 subschemas
| | | | Allow null to account for empty `environment:` declarations.
| | | | 1. [#/jobs/plan/docker/0/environment] expected type: String, found: Mapping
| | | | | Allow null to account for empty `environment:` declarations.
| | | | | SCHEMA:
| | | | | type:
| | | | | - string
| | | | | - 'null'
| | | | | INPUT:
| | | | | COLOR_1: !!binary |-
| | | | | G1szMTsxbQ==
| | | | | COLOR_2: !!binary |-
| | | | | G1szMjsxbQ==
| | | | | COLOR_OFF: !!binary |-
| | | | | G1tt
| | | | | TF_CLI_ARGS_plan: -parallelism=30
| | | | 2. [#/jobs/plan/docker/0/environment] expected: null, found: Mapping
| | | | | Allow null to account for empty `environment:` declarations.
| | | | | SCHEMA:
| | | | | type:
| | | | | - string
| | | | | - 'null'
| | | | | INPUT:
| | | | | COLOR_1: !!binary |-
| | | | | G1szMTsxbQ==
| | | | | COLOR_2: !!binary |-
| | | | | G1szMjsxbQ==
| | | | | COLOR_OFF: !!binary |-
| | | | | G1tt
| | | | | TF_CLI_ARGS_plan: -parallelism=30
| | | 2. [#/jobs/plan/docker/0/environment] 12 schema violations found
| | | | The value should be a string, but we allow null, boolean and numbers too. Examples: `FOO: true` and `BAR: 2` `BAZ:`
| | | | 1. [#/jobs/plan/docker/0/environment/COLOR_1] no subschema matched out of the total 4 subschemas
| | | | | 1. [#/jobs/plan/docker/0/environment/COLOR_1] expected type: Boolean, found: Sequence
| | | | | | SCHEMA:
| | | | | | type:
| | | | | | - string
| | | | | | - boolean
| | | | | | - number
| | | | | | - 'null'
| | | | | | INPUT:
| | | | | | !!binary |-
| | | | | | G1szMTsxbQ==
| | | | | 2. [#/jobs/plan/docker/0/environment/COLOR_1] expected type: Number, found: Sequence
| | | | | | SCHEMA:
| | | | | | type:
| | | | | | - string
| | | | | | - boolean
| | | | | | - number
| | | | | | - 'null'
| | | | | | INPUT:
| | | | | | !!binary |-
| | | | | | G1szMTsxbQ==
| | | | | 3. [#/jobs/plan/docker/0/environment/COLOR_1] expected type: String, found: Sequence
| | | | | | SCHEMA:
| | | | | | type:
| | | | | | - string
| | | | | | - boolean
| | | | | | - number
| | | | | | - 'null'
| | | | | | INPUT:
| | | | | | !!binary |-
| | | | | | G1szMTsxbQ==
| | | | | 4. [#/jobs/plan/docker/0/environment/COLOR_1] expected: null, found: Sequence
| | | | | | SCHEMA:
| | | | | | type:
| | | | | | - string
| | | | | | - boolean
| | | | | | - number
| | | | | | - 'null'
| | | | | | INPUT:
| | | | | | !!binary |-
| | | | | | G1szMTsxbQ==
| | | | 2. [#/jobs/plan/docker/0/environment/COLOR_2] no subschema matched out of the total 4 subschemas
| | | | | 1. [#/jobs/plan/docker/0/environment/COLOR_2] expected type: Boolean, found: Sequence
| | | | | | SCHEMA:
| | | | | | type:
| | | | | | - string
| | | | | | - boolean
| | | | | | - number
| | | | | | - 'null'
| | | | | | INPUT:
| | | | | | !!binary |-
| | | | | | G1szMjsxbQ==
| | | | | 2. [#/jobs/plan/docker/0/environment/COLOR_2] expected type: Number, found: Sequence
| | | | | | SCHEMA:
| | | | | | type:
| | | | | | - string
| | | | | | - boolean
| | | | | | - number
| | | | | | - 'null'
| | | | | | INPUT:
| | | | | | !!binary |-
| | | | | | G1szMjsxbQ==
| | | | | 3. [#/jobs/plan/docker/0/environment/COLOR_2] expected type: String, found: Sequence
| | | | | | SCHEMA:
| | | | | | type:
| | | | | | - string
| | | | | | - boolean
| | | | | | - number
| | | | | | - 'null'
| | | | | | INPUT:
| | | | | | !!binary |-
| | | | | | G1szMjsxbQ==
| | | | | 4. [#/jobs/plan/docker/0/environment/COLOR_2] expected: null, found: Sequence
| | | | | | SCHEMA:
| | | | | | type:
| | | | | | - string
| | | | | | - boolean
| | | | | | - number
| | | | | | - 'null'
| | | | | | INPUT:
| | | | | | !!binary |-
| | | | | | G1szMjsxbQ==
| | | | 3. [#/jobs/plan/docker/0/environment/COLOR_OFF] no subschema matched out of the total 4 subschemas
| | | | | 1. [#/jobs/plan/docker/0/environment/COLOR_OFF] expected type: Boolean, found: Sequence
| | | | | | SCHEMA:
| | | | | | type:
| | | | | | - string
| | | | | | - boolean
| | | | | | - number
| | | | | | - 'null'
| | | | | | INPUT:
| | | | | | !!binary |-
| | | | | | G1tt
| | | | | 2. [#/jobs/plan/docker/0/environment/COLOR_OFF] expected type: Number, found: Sequence
| | | | | | SCHEMA:
| | | | | | type:
| | | | | | - string
| | | | | | - boolean
| | | | | | - number
| | | | | | - 'null'
| | | | | | INPUT:
| | | | | | !!binary |-
| | | | | | G1tt
| | | | | 3. [#/jobs/plan/docker/0/environment/COLOR_OFF] expected type: String, found: Sequence
| | | | | | SCHEMA:
| | | | | | type:
| | | | | | - string
| | | | | | - boolean
| | | | | | - number
| | | | | | - 'null'
| | | | | | INPUT:
| | | | | | !!binary |-
| | | | | | G1tt
| | | | | 4. [#/jobs/plan/docker/0/environment/COLOR_OFF] expected: null, found: Sequence
| | | | | | SCHEMA:
| | | | | | type:
| | | | | | - string
| | | | | | - boolean
| | | | | | - number
| | | | | | - 'null'
| | | | | | INPUT:
| | | | | | !!binary |-
| | | | | | G1tt
| | | 3. [#/jobs/plan/docker/0/environment] expected type: Sequence, found: Mapping
| | | | An array of strings in the form KEY=VALUE
| | | | SCHEMA:
| | | | type: array
| | | | INPUT:
| | | | COLOR_1: !!binary |-
| | | | G1szMTsxbQ==
| | | | COLOR_2: !!binary |-
| | | | G1szMjsxbQ==
| | | | COLOR_OFF: !!binary |-
| | | | G1tt
| | | | TF_CLI_ARGS_plan: -parallelism=30
| 2. [#/jobs/plan] expected type: String, found: Mapping
| | Job may be a string reference to another job
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment