【问题标题】:Gitlab CI/CD with Terraform and 3rd party plugin带有 Terraform 和 3rd 方插件的 Gitlab CI/CD
【发布时间】:2019-10-26 01:07:43
【问题描述】:

我正在通过自定义提供商在 AWS 和第 3 方系统上预置资源。在我的本地环境中,它运行良好(因为我已经下载并编译了第 3 方提供程序)。

下一步,我正在尝试使用 Terraform 运行 Gitlab 管道。AWS 部分可以工作,因为它是 Terrafrom 注册的提供商,但是第 3 方部分失败(因为它不是注册的 Terraform 提供商)。

当我尝试运行 Gitlab 管道时,它会报错并提示以下内容

在后一种情况下,必须通过定位来手动安装插件 并下载合适的分发包并放置 插件的可执行文件在以下目录中: terraform.d/plugins/linux_amd64

我拥有的 .gitlab-ci.yml 文件如下:

image:
  name: hashicorp/terraform:light
  entrypoint:
    - '/usr/bin/env'
    - 'PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'

before_script:
  - rm -rf .terraform
  - terraform --version
  - export AWS_ACCESS_KEY
  - export AWS_SECRET_KEY
  - terraform init

stages:
  - validate
  - plan
  - apply

validate:
  stage: validate
  script:
    - terraform validate

plan:
  stage: plan
  script:
    - terraform plan -out "planfile"
  dependencies:
    - validate
  artifacts:
    paths:
      - planfile

apply:
  stage: apply
  script:
    - terraform apply -input=false "planfile"
  dependencies:
    - plan
  when: manual

我看到使用了名为“hashicorp/terraform:light”的图像。我是否应该基于此映像创建一个 docker 映像,并且已经有 3rd 方提供商?

编辑1

显然需要自定义图像。我使用了下面 rflume 的想法,并使用了下面的 Dockerfile 来构建镜像。

# Multi-Stage builds require Docker Engine 17.05 or higher

# Build ACI provider
FROM ubuntu:bionic-20190515 as builder

ENV HOME /root
ENV GOPATH $HOME/go
ENV GOBIN $GOPATH/bin

RUN apt update &&\
    apt install -yqq software-properties-common \
    git \
    wget \
    unzip \
    gcc \
    perl \
    go-dep \
    make \
    build-essential &&\
    add-apt-repository ppa:longsleep/golang-backports &&\
    apt-get update &&\
    apt-get install -y golang-go &&\
    mkdir -p $GOPATH/src/github.com/terraform-providers &&\
    wget -O $HOME/terraform-provider-aci.zip https://github.com/ciscoecosystem/terraform-provider-aci/archive/master.zip &&\
    cd $GOPATH/src/github.com/terraform-providers/ &&\
    unzip $HOME/terraform-provider-aci.zip -d . &&\
    mv terraform-provider-aci-master \
    terraform-provider-aci-v1.0.0

WORKDIR $GOPATH/src/github.com/terraform-providers/terraform-provider-aci-v1.0.0

RUN dep ensure
RUN make build


# Build the actual image
FROM hashicorp/terraform:0.11.14


ENV GOBIN /root/go/bin
ENV PATH $GOBIN:$PATH

RUN mkdir -p /root/.terraform.d/plugins

COPY --from=builder /root/go/bin/terraform-provider-aci-v1.0.0 $GOBIN/terraform-provider-aci-v1.0.0

ENTRYPOINT ["/bin/sh", "-c"]

【问题讨论】:

    标签: gitlab terraform gitlab-ci


    【解决方案1】:

    解决方案是创建一个包含自定义提供程序的图像。

    FROM hashicorp/terraform:full
    
    ENV GOPATH /go
    
    RUN mkdir -p $GOPATH/src/github.com/ciscoecosystem
    WORKDIR $GOPATH/src/github.com/ciscoecosystem
    RUN git clone https://github.com/ciscoecosystem/terraform-provider-aci.git $GOPATH/src/github.com/ciscoecosystem/terraform-provider-aci
    RUN git clone https://github.com/ciscoecosystem/aci-go-client.git $GOPATH/src/github.com/ciscoecosystem/aci-go-client
    RUN apk add --no-cache build-base
    
    WORKDIR $GOPATH/src/github.com/ciscoecosystem/terraform-provider-aci
    
    RUN make build
    
    WORKDIR $GOPATH
    
    ENTRYPOINT ["terraform"]
    

    【讨论】:

      【解决方案2】:

      terraform:light 图像不包含第 3 方提供商。您可以尝试使用terraform:full 图像,但您也可能没有运气。

      在这种情况下,您必须根据上述图像之一构建自己的图像(最好是light,图像越小越好...)。

      我遇到了同样的问题,并基于 light 与 AWS 提供商和第 3 方 Ansible 供应商 Terraform-with-AWS-Provisioner-and-Ansible-Provider-for-Gitlab-CI 构建了一个映像,如果您愿意,可以将其用作参考。

      EDIT1(关于您的编辑):

      我注意到您没有在 COPY --from=builder ... 命令中指定提供程序版本。根据Plugin Names and Versions,您需要使用_v[VERSION] 为您构建的提供程序包指定提供程序的版本。 试试看,然后让我知道它是否有效;)

      【讨论】:

      • 感谢您的建议。我确实需要建立一个形象。为什么不简单地这样做: FROM hashcorp/terraform:light RUN mkdir -p /root/.terraform.d/plugins ADD terraform-provider-aci /root/.terraform.d/plugins
      • 我使用多阶段构建来保持图像尽可能小(在最终图像中,不再包含构建依赖项等)。我还需要一些文件来存储秘密,例如 Ansible 的 SSH 密钥。如果这足以满足您的用例,您也可以按照您的建议进行操作。
      • 只是为了确保我理解。第一阶段是您的自定义提供程序的编译,第二阶段创建可以在 Gitlab 管道中使用的 Terraform 图像?
      • 没错。 COPY --from=builder /root/go/bin/terraform-provider-aws $GOBIN/terraform-provider-aws_v$AWS_PROVIDER_VERSION 将编译后的提供程序从构建阶段复制到最终映像中。在最终图像所需的其他设置命令中。当您针对此 Dockerfile 运行 docker build 时,保留第二阶段的映像(并推送到注册表)。
      • 太棒了。将尝试。谢谢!!
      猜你喜欢
      • 2021-07-22
      • 2020-08-12
      • 2021-08-17
      • 2020-07-03
      • 2021-04-16
      • 2019-09-02
      • 1970-01-01
      • 1970-01-01
      • 2022-08-10
      相关资源
      最近更新 更多