0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Jenkinsで複数GKEに並列でシェル実行する時にdockerで実行しないと危ない

0
Posted at

要約

  1. Kubernetesへ、Jenkins(not Jenkins X)でデプロイするときのお話
  2. 何も気にせずに、シェル実行のjobを並列して実行すると
    Kubernetesのcontextがjobをまたいで切り替わって、誤デプロイしちゃう時がある
  3. シェル実行で、dockerをそれぞれ起動すれば、解決したよ。

目的・背景

  1. JenkinsでKubernetesにシェルスクリプトでデプロイしたい
  2. 1つのJenkinsサーバーから、環境別のKubernetesへデプロイしたい
  3. Jenkinsのjob毎に、Kuberenetesのcontextを分けたい
  4. Jenkinsの実行環境自体も管理したい
  5. 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

  1. ビルド並列設定の変更
    • 「Manage Jenkins」->「Configure System」->「Maven Project Configuration」->「# of executors」
    • 1を2以上に変更
  2. フリースタイルプロジェクトのjobを作成
  3. シェルスクリプトを追加(※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コンテナで実行する

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?