1.4.7.1. 一致的流水线运行上下文
在治理大规模 Terraform Module 时,我们会在持续交付流水线中进行一系列的检查,例如代码格式、TFLint 等等。我们鼓励向模块提交代码变更的开发者在正式提交 Pull Request 前首先在本地运行这些检查,并提供一系列配套工具,帮助开发者轻松地自动完成代码格式化等各种任务。
我们有时会遇到持续集成流水线与本地开发环境的一致性问题,例如,一个测试在 Pull Request 检查中失败,但在本地却无法重现该错误,或者无论在本地如何使用工具进行修复,始终无法通过流水线的检查。
如何确保持续交付流水线与开发者本地环境中使用的各种工具版本一致呢?
1.4.7.1.1. 一致的容器化开发环境
一种方法是使用容器化的开发环境。通过提供一个预配置的 Docker 镜像,包含所有必要的工具(如 Terraform、TFLint、Pre-commit 等),可以确保开发者在本地使用的环境与 CI/CD 流水线完全一致。
Azure 的 tfmod-scaffold 项目提供了一个 Dockerfile 来构建这样的镜像。此外,还提供了一个名为 avm
的脚本,用于简化开发者在本地使用该容器的过程:
#!/usr/bin/env sh
usage () {
echo "Usage: avm <make target>"
}
CONTAINER_RUNTIME=${CONTAINER_RUNTIME:-docker}
if [ ! "$(command -v "$CONTAINER_RUNTIME")" ]; then
echo "Error: $CONTAINER_RUNTIME is not installed. Please install $CONTAINER_RUNTIME first."
exit 1
fi
if [ -z "$1" ]; then
echo "Error: Please provide a make target. See https://github.com/Azure/tfmod-scaffold/blob/main/avmmakefile for available targets."
echo
usage
exit 1
fi
# Check if AZURE_CONFIG_DIR is set, if not, set it to ~/.azure
if [ -z "$AZURE_CONFIG_DIR" ]; then
AZURE_CONFIG_DIR="$HOME/.azure"
fi
# Check if we are running in a container
# If we are then just run make directly
if [ -z "$AVM_IN_CONTAINER" ]; then
$CONTAINER_RUNTIME run --pull always --user "$(id -u):$(id -g)" --rm -v "$(pwd)":/src -w /src -v $AZURE_CONFIG_DIR:/azureconfig -e AZURE_CONFIG_DIR=/azureconfig -e GITHUB_TOKEN -e GITHUB_REPOSITORY -e ARM_SUBSCRIPTION_ID -e ARM_TENANT_ID -e ARM_CLIENT_ID -e GITHUB_REPOSITORY_OWNER mcr.microsoft.com/azterraform make "$1"
else
make "$1"
fi
使用容器化开发环境的优势包括:
- 环境一致性:避免了“在我机器上可以运行”的问题。
- 快速上手:新开发者可以快速搭建与团队一致的开发环境。
- 易于集成:容器可以无缝集成到现有的 CI/CD 流水线中。
在 AVM 的持续集成流水线中,各个环节的命令大多通过这个 Docker 容器执行,这样就确保了流水线中实际调用的工具,与开发者本地所使用的版本是一致的。
1.4.7.1.2. 实践建议
无论选择哪种方法,都需要定期更新容器镜像,确保包含最新的工具和最佳实践。
通过上述方法,可以有效地确保本地开发环境与 CI/CD 流水线之间的一致性,从而提高团队的协作效率和代码质量。