You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gitlab CI/CD动态创建并保存SSH密钥对为项目变量的方案问询

问题2:Terraform方案的高效工作流与循环避免

高效工作流步骤

  1. 生成SSH密钥:在CI job的脚本阶段生成密钥对:
    ssh-keygen -b 4096 -N '' -q -f ~/.ssh/id_rsa <<< y
    
  2. 动态生成Terraform配置:根据服务器名称生成gitlab_ssh_keys.tf文件,写入gitlab_project_variable资源定义,关联生成的密钥:
    cat <<EOF > ${serverName}/gitlab_ssh_keys.tf
    resource "gitlab_project_variable" "${serverName}_ssh_private_key" {
      project   = "${CI_PROJECT_ID}"
      key       = "${serverName}_private_ssh_key"
      value     = chomp(file("~/.ssh/id_rsa"))
      protected = true
      type      = "file"
    }
    
    resource "gitlab_project_variable" "${serverName}_ssh_public_key" {
      project   = "${CI_PROJECT_ID}"
      key       = "${serverName}_ssh_public_key"
      value     = chomp(file("~/.ssh/id_rsa.pub"))
      protected = true
    }
    EOF
    
  3. 初始化Terraform:配置GitLab Provider并初始化,使用项目访问令牌作为认证凭据:
    cat <<EOF > provider.tf
    provider "gitlab" {
      token = "${PROJECT_ACCESS_TOKEN}"
    }
    EOF
    terraform init
    
  4. 应用配置并提交文件:执行terraform apply创建CI/CD变量,随后将生成的Terraform配置文件提交到仓库:
    terraform apply -auto-approve
    git config user.name "CI Pipeline Bot"
    git config user.email "ci-bot@example.com"
    git add ${serverName}/gitlab_ssh_keys.tf
    git commit -m "Add SSH key config for ${serverName} [skip ci]"
    git push https://oauth2:${PROJECT_ACCESS_TOKEN}@${CI_REPOSITORY_URL#*@} HEAD:${CI_COMMIT_BRANCH}
    
    销毁基础设施时,Terraform会自动删除对应的gitlab_project_variable资源,同步清理CI变量,无需额外脚本处理。

避免管道循环的方案

  1. [skip ci]提交标记:这是最直接且仍有效的方案,GitLab会自动跳过包含该标记的提交触发的管道,从根源避免循环。
  2. CI工作流规则过滤:在.gitlab-ci.yml中配置规则,排除动态生成的Terraform文件变更触发管道:
    workflow:
      rules:
        - if: '$CI_COMMIT_MESSAGE =~ /\[skip ci\]/'
          when: never
        - if: '$CI_PIPELINE_SOURCE == "push"'
          changes:
            - 'iac/**/*.tf'
            - '!.gitlab-ci.yml'
            - '!iac/server*/gitlab_ssh_keys.tf'
    
  3. 独立分支管理:将动态生成的配置提交到专门的辅助分支(如ci-configs),而非主分支,主分支仅在手动触发或核心配置变更时运行管道,避免自动循环。

内容的提问来源于stack exchange,提问作者user658182

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:54:51