Makefile Terraform和Github操作
我有一个Makefile来编译Terraform代码。当我在本地运行Makefile Terraform和Github操作,makefile,terraform,github-actions,Makefile,Terraform,Github Actions,我有一个Makefile来编译Terraform代码。当我在本地运行Makefile-up时,一切都正常工作 Makefile BACKEND_CONFIG = -backend-config=resource_group_name=${AZURE_TERRAFORM_RESOURCE_GROUP_NAME} \ -backend-config=storage_account_name=${AZURE_TERRAFORM_STORAGE_ACCOUN
Makefile-up
时,一切都正常工作
Makefile
BACKEND_CONFIG = -backend-config=resource_group_name=${AZURE_TERRAFORM_RESOURCE_GROUP_NAME} \
-backend-config=storage_account_name=${AZURE_TERRAFORM_STORAGE_ACCOUNT_NAME} \
-backend-config=container_name=${AZURE_TERRAFORM_STORAGE_CONTAINER_NAME} \
-backend-config=key=${AZURE_TERRAFORM_RESOURCE_GROUP_NAME}.tfstate \
VARIABLES = -var=path=${PWD}/config/resource-groups \
all:
up: init plan apply
down: init destroy
init:
terraform init -reconfigure ${BACKEND_CONFIG} src
plan:
terraform plan ${VARIABLES} -out="plan.out" src
apply:
terraform apply plan.out
destroy:
terraform destroy ${VARIABLES} src
.PHONY = all init plan apply destroy up down import az_up az_down
我现在要做的是在我发出推送请求时运行Makefile-up
。我在Github secrets中添加了我的所有机密,并创建了一个Github操作
terraform.yml
on:
push:
branches:
- dev
pull_request:
jobs:
terraform:
name: 'Terraform'
runs-on: ubuntu-latest
environment: production
defaults:
run:
shell: bash
steps:
- uses: actions/checkout@v2
- name: build application
run: make up
working-directory: ./infra_as_code
Makefile(新)
我在Github操作中遇到错误:
Run make up
make up
shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
terraform init -reconfigure -backend-config=resource_group_name=} -backend-config=storage_account_name=} -backend-config=container_name=} -backend-config=key=}.tfstate src
Too many command line arguments. Did you mean to use -chdir?
make: *** [Makefile:15: init] Error 1
Error: Process completed with exit code 2.
这绝对是错误的:
BACKEND_CONFIG = -backend-config=resource_group_name=${{ secrets.AZURE_TERRAFORM_RESOURCE_GROUP_NAME }} \
-backend-config=storage_account_name=${{ secrets.AZURE_TERRAFORM_STORAGE_ACCOUNT_NAME }} \
-backend-config=container_name=${{ secrets.AZURE_TERRAFORM_STORAGE_CONTAINER_NAME }} \
-backend-config=key=${{ secrets.AZURE_TERRAFORM_RESOURCE_GROUP_NAME }}.tfstate \
首先,如果要在makefile配方中放入显式的$
字符,则需要使用$$
对其进行转义。这就是为什么会出现这样的错误:make试图将这些变量扩展为make变量
第二,如果您想通过shell传递这些,您必须为shell引用它们。我假设您希望文本字符串${{…}}
出现,在这种情况下,您需要单引号:
BACKEND_CONFIG = -backend-config=resource_group_name='$${{ secrets.AZURE_TERRAFORM_RESOURCE_GROUP_NAME }}' \
-backend-config=storage_account_name='$${{ secrets.AZURE_TERRAFORM_STORAGE_ACCOUNT_NAME }}' \
-backend-config=container_name='$${{ secrets.AZURE_TERRAFORM_STORAGE_CONTAINER_NAME }}' \
-backend-config=key='$${{ secrets.AZURE_TERRAFORM_RESOURCE_GROUP_NAME }}.tfstate'
(您确定可以在{{
之后和}
之前添加此空格吗?)
我对terraform或github操作一无所知,因此我不知道该语法是否是它想要的,但它将正确地通过make和shell。这肯定是错误的:
BACKEND_CONFIG = -backend-config=resource_group_name=${{ secrets.AZURE_TERRAFORM_RESOURCE_GROUP_NAME }} \
-backend-config=storage_account_name=${{ secrets.AZURE_TERRAFORM_STORAGE_ACCOUNT_NAME }} \
-backend-config=container_name=${{ secrets.AZURE_TERRAFORM_STORAGE_CONTAINER_NAME }} \
-backend-config=key=${{ secrets.AZURE_TERRAFORM_RESOURCE_GROUP_NAME }}.tfstate \
首先,如果要在makefile配方中放入显式的$
字符,则需要使用$$
对其进行转义。这就是为什么会出现这样的错误:make试图将这些变量扩展为make变量
第二,如果您想通过shell传递这些,您必须为shell引用它们。我假设您希望文本字符串${{…}}
出现,在这种情况下,您需要单引号:
BACKEND_CONFIG = -backend-config=resource_group_name='$${{ secrets.AZURE_TERRAFORM_RESOURCE_GROUP_NAME }}' \
-backend-config=storage_account_name='$${{ secrets.AZURE_TERRAFORM_STORAGE_ACCOUNT_NAME }}' \
-backend-config=container_name='$${{ secrets.AZURE_TERRAFORM_STORAGE_CONTAINER_NAME }}' \
-backend-config=key='$${{ secrets.AZURE_TERRAFORM_RESOURCE_GROUP_NAME }}.tfstate'
(您确定可以在{{
之后和}
之前添加此空格吗?)
我对terraform或github操作一无所知,所以我不知道这个语法是否是它想要的,但它将正确地通过make和shell。${}在实际执行之前被github操作替换。因此,这在Makefile中不起作用。 最好的选择是在makefile中使用Make变量,并在调用Make时设置它们:
BACKEND_CONFIG = -backend-config=resource_group_name=$(AZURE_TERRAFORM_RESOURCE_GROUP_NAME) \
-backend-config=storage_account_name=$(AZURE_TERRAFORM_STORAGE_ACCOUNT_NAME) \
-backend-config=container_name=$(AZURE_TERRAFORM_STORAGE_CONTAINER_NAME) \
-backend-config=key=$(AZURE_TERRAFORM_RESOURCE_GROUP_NAME).tfstate \
然后在github操作中:
- name: build application
run: make AZURE_TERRAFORM_RESOURCE_GROUP_NAME=${{ secrets.AZURE_TERRAFORM_RESOURCE_GROUP_NAME }} \
AZURE_TERRAFORM_STORAGE_ACCOUNT_NAME=${{ secrets.AZURE_TERRAFORM_STORAGE_ACCOUNT_NAME }} \
AZURE_TERRAFORM_STORAGE_CONTAINER_NAME=${{ secrets.AZURE_TERRAFORM_STORAGE_CONTAINER_NAME }} \
AZURE_TERRAFORM_RESOURCE_GROUP_NAME=${{ secrets.AZURE_TERRAFORM_RESOURCE_GROUP_NAME }} \
up
working-directory: ./infra_as_code
我不是一个真正的Makefile专家,但据我所知,变量与$(VAR)一起使用,而不是与make中的“{”一起使用。但可能${}也在工作。${}在实际执行之前被github操作替换。因此,这在Makefile中不起作用。 最好的选择是在makefile中使用Make变量,并在调用Make时设置它们:
BACKEND_CONFIG = -backend-config=resource_group_name=$(AZURE_TERRAFORM_RESOURCE_GROUP_NAME) \
-backend-config=storage_account_name=$(AZURE_TERRAFORM_STORAGE_ACCOUNT_NAME) \
-backend-config=container_name=$(AZURE_TERRAFORM_STORAGE_CONTAINER_NAME) \
-backend-config=key=$(AZURE_TERRAFORM_RESOURCE_GROUP_NAME).tfstate \
然后在github操作中:
- name: build application
run: make AZURE_TERRAFORM_RESOURCE_GROUP_NAME=${{ secrets.AZURE_TERRAFORM_RESOURCE_GROUP_NAME }} \
AZURE_TERRAFORM_STORAGE_ACCOUNT_NAME=${{ secrets.AZURE_TERRAFORM_STORAGE_ACCOUNT_NAME }} \
AZURE_TERRAFORM_STORAGE_CONTAINER_NAME=${{ secrets.AZURE_TERRAFORM_STORAGE_CONTAINER_NAME }} \
AZURE_TERRAFORM_RESOURCE_GROUP_NAME=${{ secrets.AZURE_TERRAFORM_RESOURCE_GROUP_NAME }} \
up
working-directory: ./infra_as_code
我不是真正的Makefile专家,但据我所知,变量与$(VAR)一起使用,而不是与make中的“{”一起使用。但也许${}也在工作。makefiles可以同时使用
$(foo)
和${foo}
可互换。谢谢你的回答!我正在使用你的建议,但我得到的是“***没有规则将目标设置为”up“。Stop.`当目录中没有Makefile时,通常会显示此错误消息。现在我猜:你能用-C选项来代替工作目录调用makeup吗:make-C./infra\u as\u code upmakefiles可以同时使用$(foo)
和${foo}
可互换。谢谢你的回答!我正在使用你的建议,但我得到的是“***没有规则将目标设置为”up“。Stop.`当目录中没有Makefile时,通常会显示此错误消息。现在我猜:你能用-C选项来代替工作目录调用makeup吗:make-C./infra\u as\u code up