Terraform不应用我分支的更改



我使用Google Cloud Platform和terraform的Cloud Function进行自动部署。我使用云源代码存储库来存储云函数的代码。我寻找的问题(谷歌函数源git push后不刷新),并得出结论,自动刷新是不可能的,当改变代码。当使用地形进行部署时,虽然没有更改我的存储库的分组,但地形不会使用不同的代码应用分组。

有人有同样的问题吗?你选择了什么解决方案?编辑1:

问题如下:

  1. 将我的代码部署到开发人员分支
  2. 我修改了我的分支(开发者)
  3. git push后Google函数源未刷新(git push后Google函数源未刷新)
  4. 使用地形,我"应用";再次对同一分支进行更改。Terraform不能识别对代码的更改,也不会"修改"。云功能(带有新的"部署")。

编辑2 .

source_repository in google_cloudfunctions_function resource:

source_repository {
url = "https://source.developers.google.com/projects/MY_PROJECT_NAME/repos/MY_REPOSITORY_NAME/moveable-aliases/develop/paths/"
}

非常感谢您的详细说明。

当terraform运行计划或应用程序时,它试图找到3个信息源之间的差异——"源代码"、"状态数据"one_answers"现实生活资源"。但是,"源代码"-是terraform代码,而不是python、go或node.js等代码。

在您的示例中,一个"可移动别名(分支)"在地形源代码的source_repository-url属性中使用。修改云功能源代码时,不改变该url属性的值。因此,从地形的角度来看,云功能没有改变,因此没有什么需要重新部署的。

可能有几种方法可以解决这个问题。其中之一如下所述。

不要使用"可移动别名(分支)",而是使用特定的"git提交哈希"。在这种情况下,url属性的值发生了变化,因此terrtransform看到需要重新部署云功能。

因此,url属性应该是:

url = https://source.developers.google.com/projects/MY_PROJECT_NAME/repos/MY_REPOSITORY_NAME/revisions/GIT_COMMIT_HASH/paths/RELATIVE_PATH

如果您从"本地根目录"部署,则可以省略RELATIVE_PATH。(云功能代码不在任何子目录中)。

现在有必要找出实际的(或最近的)GIT_COMMIT_HASH。当您从本地机器部署时,您可能可以在本地机器上找到提交散列并使用它,或者从远程git存储库中找到提交散列。

后一种情况更复杂(我猜),但更安全。前一种情况更简单,但是如果您忘记了git push,那么terraform plan/apply将以错误结束(因为在您部署云功能代码的远程存储库中找不到"提交散列")。让我们考虑更简单的(局部)情况。

如何找到最近的git提交哈希=>使用如下命令:git rev-list -1 HEAD ./git rev-list -1 HEAD ./some_path

因此该命令将被运行(在计划/应用期间),结果将被传播到一个地形文件中,以便地形可以显示差异。

为了实现这个,我们可以使用"外部"terraform provider(我猜目前最新的版本是2.0.0):

provider "external" {
version     =  "~> 1.2"
}
data "external" "git_commit_hash" {
program = ["sh", "get-commit-hash.sh"]
}

,我们需要一个名为"get-commit-hash.sh"的bash脚本。(在terraform运行的同一目录下):

#!/bin/sh
{
hash_value=`git rev-list -1 HEAD ./`
} &> /dev/null
echo {"hash":""$hash_value""}

记住应用正确的chmod,所以它是一个可执行文件。

最后一步-在terraform cloud函数中配置url属性,它应该是这样的:

...revisions/${data.external.git_commit_hash.result.hash}/paths...

对我来说,这是因为有人重命名了git项目名称中的一个字符。因此,它没有在我的Terraform git项目中拾取新提交。

然而,不知何故,它仍然知道选择之前的提交。不管怎样,我只是把它重命名回GitHub的旧名字(或者可以通过Terraform的Admin UI重新链接Terraform项目到git)。一旦我这样做了,我在Terraform中所做的最新提交就会被自动拾取。

最新更新