Makefile Terraform和Github操作

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来编译Terraform代码。当我在本地运行
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