Terraform module 库
引入于 14.0 版本。
在项目的基础设施库中发布 Terraform module,然后使用极狐GitLab 作为 Terraform module 库引用它们。
Terraform module 库身份验证
要对 Terraform module 库进行身份验证,您需要:
- 至少具有
read_api
权限的个人访问令牌。 - CI/CD 作业令牌。
发布 Terraform Module
当您发布 Terraform Module 时,如果它不存在,则会创建它。
先决条件:
- 顶级命名空间中必须不存在具有相同名称和版本的包。
- 您的项目和组名称不得包含点 (
.
)。例如,source = "gitlab.example.com/my.group/project.name"
。 - 您必须使用 API 进行身份验证。如果使用部署令牌进行身份验证,则必须使用
write_package_registry
范围进行配置。
PUT /projects/:id/packages/terraform/modules/:module-name/:module-system/:module-version/file
属性 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id
| integer/string | yes | ID 或项目的 URL 编码路径。 |
module-name
| string | yes | 包名称。支持的语法:1 到 64 个 ASCII 字符,包括小写字母 (a-z)、数字 (0-9) 和连字符 (- )。
|
module-system
| string | yes | 包系统。支持的语法:1 到 64 个 ASCII 字符,包括小写字母 (a-z)、数字 (0-9) 和连字符 (- )。查看更多信息:Terraform Module Registry Protocol documentation。
|
module-version
| string | yes | 包版本。根据语义版本规范,它必须是有效的。 |
在请求正文中提供文件内容。
请注意,在以下示例中,请求必须以 /file
结尾。
如果您发送以其他内容结尾的请求,则会导致 404 错误 {"error":"404 Not Found"}
。
使用个人访问令牌的示例请求:
curl --header "PRIVATE-TOKEN: <your_access_token>" \
--upload-file path/to/file.tgz \
"https://gitlab.example.com/api/v4/projects/<your_project_id>/packages/terraform/modules/my-module/my-system/0.0.1/file"
示例响应:
{
"message":"201 Created"
}
使用部署令牌的示例请求:
curl --header "DEPLOY-TOKEN: <deploy_token>" \
--upload-file path/to/file.tgz \
"https://gitlab.example.com/api/v4/projects/<your_project_id>/packages/terraform/modules/my-module/my-system/0.0.1/file"
示例响应:
{
"message":"201 Created"
}
引用 Terraform Module
先决条件:
- 您需要使用 API 进行身份验证。如果使用个人访问令牌进行身份验证,则必须使用
read_api
范围进行配置。
可以在您的 ~/.terraformrc
文件中为 terraform
提供身份验证令牌(作业令牌或个人访问令牌):
credentials "jihulab.com" {
token = "<TOKEN>"
}
其中 jihulab.com
可以替换为您的自助管理实例的主机名。
然后,您可以从下游 Terraform 项目中引用您的 Terraform module:
module "<module>" {
source = "gitlab.com/<namespace>/<module-name>/<module-system>"
}
其中 <namespace>
是 Terraform module 库的命名空间。
使用 CI/CD 发布 Terraform module
要使用 GitLab CI/CD 中的 Terraform module,您可以使用 CI_JOB_TOKEN
代替命令中的个人访问令牌。
例如:
stages:
- upload
upload:
stage: upload
image: curlimages/curl:latest
variables:
TERRAFORM_MODULE_DIR: ${CI_PROJECT_DIR} # The path to your Terraform module
TERRAFORM_MODULE_NAME: ${CI_PROJECT_NAME} # The name of your Terraform module
TERRAFORM_MODULE_SYSTEM: local # The system or provider your Terraform module targets (ex. local, aws, google)
TERRAFORM_MODULE_VERSION: ${CI_COMMIT_TAG} # Tag commits with SemVer for the version of your Terraform module to be published
script:
- TERRAFORM_MODULE_NAME=$(echo "${TERRAFORM_MODULE_NAME}" | tr " _" -) # module-name must not have spaces or underscores, so translate them to hyphens
- tar -vczf ${TERRAFORM_MODULE_NAME}-${TERRAFORM_MODULE_SYSTEM}-${TERRAFORM_MODULE_VERSION}.tgz -C ${TERRAFORM_MODULE_DIR} --exclude=./.git .
- 'curl --location --header "JOB-TOKEN: ${CI_JOB_TOKEN}"
--upload-file ${TERRAFORM_MODULE_NAME}-${TERRAFORM_MODULE_SYSTEM}-${TERRAFORM_MODULE_VERSION}.tgz
${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/terraform/modules/${TERRAFORM_MODULE_NAME}/${TERRAFORM_MODULE_SYSTEM}/${TERRAFORM_MODULE_VERSION}/file'
rules:
- if: $CI_COMMIT_TAG
要触发此上传作业,请将 Git 标签添加到您的提交中。rules:if: $CI_COMMIT_TAG
定义这一点,因此不是每次提交到您的仓库都会触发上传。
有关在 CI/CD 流水线中控制作业的其他方法,请参阅 .gitlab-ci.yml
关键字参考。