要約
- Kubernetesへ、Jenkins(not Jenkins X)でデプロイするときのお話
- 何も気にせずに、シェル実行のjobを並列して実行すると
Kubernetesのcontextがjobをまたいで切り替わって、誤デプロイしちゃう時がある - シェル実行で、dockerをそれぞれ起動すれば、解決したよ。
目的・背景
- JenkinsでKubernetesにシェルスクリプトでデプロイしたい
- 1つのJenkinsサーバーから、環境別のKubernetesへデプロイしたい
- Jenkinsのjob毎に、Kuberenetesのcontextを分けたい
- Jenkinsの実行環境自体も管理したい
- Jobを並列実行して、効率的にデプロイしたい
やったこと
dockerfile
# google-cloud-sdkだと、デフォルトpython3.5だったので、3.7がほしかった。(※1)
FROM python:3.7
# timezone
RUN cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# google-cloud-sdk
RUN pip install google-api-python-client google-auth-httplib2 google-auth-oauthlib pandas \
&& curl https://dl.google.com/dl/cloudsdk/release/google-cloud-sdk.tar.gz > /tmp/google-cloud-sdk.tar.gz \
&& mkdir -p /usr/local/gcloud \
&& tar -C /usr/local/gcloud -xvf /tmp/google-cloud-sdk.tar.gz \
&& /usr/local/gcloud/google-cloud-sdk/install.sh
# gcloudのコマンドのPATHを通す
ENV PATH $PATH:/usr/local/gcloud/google-cloud-sdk/bin
# helmもほしい。
RUN curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get | bash
RUN helm init -c
# kubectlももちろんほしい。
RUN curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl \
&& chmod +x ./kubectl \
&& mv ./kubectl /usr/local/bin/kubectl
CMD ["/bin/sh"]
docker build -t jkkitakita/gcloud-sdk-python37-helm:latest .
docker push jkkitakita/gcloud-sdk-python37-helm:latest
jenkins
- ビルド並列設定の変更
- 「Manage Jenkins」->「Configure System」->「Maven Project Configuration」->「# of executors」
- 1を2以上に変更
- フリースタイルプロジェクトのjobを作成
- シェルスクリプトを追加(※2)
-
GCLOUD_SERVICE_KEYは、外から適切なcredentialsのkeyを渡してあげる -
ENVはJenkinsのJobの引数で渡してあげる
-
# !/bin/bash
export IMAGE="jkkitakita/gcloud-sdk-python37-helm:latest"
docker run \
-v $WORKSPACE:/workspace \
-w /workspace \
-e GCLOUD_SERVICE_KEY=${GCLOUD_SERVICE_KEY} \
$IMAGE /bin/bash -ex ./deploy.sh -e ${ENV}
もちろんこれでpipelineを設定してもokだと思います。
さいごに
あまり
- Kubernetes
- Jenkins(not Jenkins X)
- シェル実行(not Jenkins pipeline(※3))
の例がないので書いてみました。
Jenkins x Kubernetesが簡単だと思ったら大変だった話みたいにあるように
あまりGood Practiceとは言い難いですが
個人的にはまだまだ
- やっぱりJenkinsに慣れている
- Jenkinsfileとか書かずに、さくっとシェルで実行したい
みたいなニーズもあるような気がしました。
以上です。
参考
※1 Python 3.7とgoogle cloud sdkが入ったDockerコンテナ
※2 Dockerを使ってJenkinsのジョブごとにテスト実行環境を分離する
※3 JenkinsのビルドをDockerコンテナで実行する