带有Terraform和第3方插件的Gitlab CI / CD

时间:2019-06-11 15:00:39

标签: gitlab terraform gitlab-ci

我正在通过定制提供程序在AWS以及第三方系统上配置资源。在我的本地环境中,它工作正常(因为我已经下载并编译了第三方提供商)。

下一步,我尝试使用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

enter image description here

我看到使用了一个名为“ hashicorp / terraform:light”的图像。我是否应该已在第3方提供程序的基础上基于该映像创建docker映像?

EDIT1

很明显,需要自定义图像。我使用了下面来自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"]

2 个答案:

答案 0 :(得分:0)

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

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

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

EDIT1(关于您的编辑):

我注意到,您没有在COPY --from=builder ...命令中指定提供程序版本。根据{{​​3}},您需要使用内置构建的提供程序包中的_v[VERSION]为提供程序指定版本。 尝试一下,然后告诉我是否可行;)

答案 1 :(得分:0)

解决方案是使用自定义提供程序创建映像。

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"]