やりたいこと
- AWSに立てたCIサーバ(EC2・jenkins)でterraformを叩いてインフラのコード化
- terraformはVMの環境に左右されないようコンテナ上で実行
- imageはECRに保存しておく
設計
以下二つのジョブをjenkins上で作成
1. ECRへのイメージ自動pushのジョブ
2. イメージからコンテナを立ててterraformを実行するジョブ
1に関して
ひとまずaws login
してからpushする
Jenkinsfile
#!groovy
pipeline {
agent any
triggers {
pollSCM('H/3 * * * 1-5')
}
//environment {}
stages {
stage('Master Branch <pushing>') {
when {
branch 'master'
}
steps {
ansiColor('xterm') {
echo '<<< start pushing >>>'
sh 'aws ecr get-login --no-include-email --region ap-northeast-1 > temp.sh'
sh '''
echo "***@***.co.jp" | sudo sh temp.sh
sudo docker build -t ***** .
sudo docker tag *****:latest *****.ap-northeast-1.amazonaws.com/*****:latest
sudo docker push *****.ap-northeast-1.amazonaws.com/*****:latest
'''
}
}
}
}
}
Dockerfile(コピペなのでいらないもの入っているかもしれません...)
FROM python:3.6
ARG TERRAFORM_VERSION=0.10.0
RUN apt-get clean && \
rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* && \
apt-get update && \
apt-get -y upgrade && \
apt-get install -y --no-install-recommends unzip zip jq ca-certificates curl lsb-release gawk
# install python modules
COPY requirements.txt .
RUN pip install -r requirements.txt
# install Terraform
RUN mkdir /tmp/terraform && \
cd /tmp/terraform && \
curl -O -sS -L https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_linux_amd64.zip && \
unzip terraform_${TERRAFORM_VERSION}_linux_amd64.zip && \
rm terraform_${TERRAFORM_VERSION}_linux_amd64.zip && \
mv terraform* /usr/local/bin && \
rm -rf /tmp/terraform
RUN apt-get clean && \
rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/*
2に関して
jenkinsfileのagentでコンテナを指定しようとするも失敗
- ECRからpullするには先にloginしておく必要がある
- localのイメージを使おうとしてもdocker pull
をしてしまう(alwaysPull falseも効果なし)
愚直にコンテナを起動して内部でterraformを叩く...
Jenkinsfile
#!groovy
pipeline {
agent any
triggers {
pollSCM('H/3 * * * 1-5')
}
stages {
stage('Pull Request <Plan>') {
when {
branch 'PR-*'
}
steps {
ansiColor('xterm') {
echo '<<< start planning >>>'
sh "docker run --name tmp-jenkins -id ***** | echo 'ignore failure'"
sh "docker start tmp-jenkins | echo 'ignore failure'"
sh "docker exec tmp-jenkins mkdir /tmp/terraform | echo 'ignore failure'"
sh "docker exec tmp-jenkins rm -rf /tmp/terraform/*"
sh "docker cp ./ tmp-jenkins:/tmp/terraform/"
sh "docker exec tmp-jenkins ls /tmp/terraform/"
sh "docker exec tmp-jenkins sh -c 'cd /tmp/terraform/ && terraform init -backend-config \"bucket=*****\"'"
sh "docker exec tmp-jenkins sh -c 'cd /tmp/terraform/ && terraform env select dev'"
sh "docker exec tmp-jenkins sh -c 'cd /tmp/terraform/ && terraform plan'"
sh "docker exec tmp-jenkins sh -c 'cd /tmp/terraform/ && terraform apply'"
sh "docker stop tmp-jenkins"
}
}
}
}
}
結果
- ひとまずterraformを動かすことができた
- ただ何かを作ろうとするとエラーが出る...
* provider.aws: dial unix /tmp/plugin392670482|netrpc: connect: no such file or directory
-
あとこれを解決すれば完成...=>terraformを 0.10.0 -> 0.10.8にすることで解決