はじめに
GitLab
Gitリポジトリマネージャーです。とある界隈だと、GitHubの方が人気がありGitLabの陰が薄い感じもします。GitLabの大きな特徴は、Community版がOSSとして公開されており、オンプレにGitLabサーバーがたてられる点でしょうか。GitHub使いたいけど、インターネットを経由するので、セキュリティが心配…()と思っているエンタープライズ系の企業にはもってこいです。もちろん、SaaS版である GitLab.com を使うこともできます。
さらにGitLabには下記機能があり、「アイデアを共有して、コードを書き、CI/CDパイプラインを通して自動デプロイし、フィードバックを取得する」というDevOpsの中核を担い得るソフトウェアです。
- Issue管理
- Milestone管理
- Merge Request
- GitLab CI/CD
- コンテナイメージレジストリ
- Kubernetesとの連携
- Prometheus/Grafanaとの連携
詳しくは、以下の本がオススメです。
ちなみにGitHubが落ちているときに喜んでいる人がいたら、その人はGitLab信者とみて間違いありません。
TLが歓喜するGitLabユーザーと絶望するGitHubユーザーで二極化してる
— n i s h i p y (@iamnishipy) April 23, 2020
Ansible
オープンソースの構成管理ツールです。無償でも十分使えますが、サポート付きの有償版をRed Hatが提供しています。
Chef や Puppet などと同じ括りのソフトウェアですが、以下の点が特徴と言えます。
- エージェントレス
- SSH または WinRM で接続できればよい
- 管理対象のホストのOSは、Windows でも Linux でもよい
- Playbookがyaml形式で、可読性が高い
- ロゴがなんかかっこいい
Jupyter Notebook
主にPythonのコードとMarkdownを共存させたファイルが作成できるソフトウェアです。コードの部分は、GUIでボタンをぽちぽちすることで、実際に実行できます。データ分析でPythonを使うときに利用されています。
Ansible と Jupyter Notebook の組み合わせ
Jupyter Notebookでは、Pythonのコードの他に、シェルに対するコマンドも実行することもできます。したがって、Markdown部分にPlaybookの説明や前提条件を書き、コード部分にPlaybookの実行コマンドを書くことで、簡単に手順書が作成できます。
加えて、JupyterもAnsibleも、ともにPythonを前提としていることから、無駄なパッケージをインストールせずに済むので、Docker imageも軽量にできるはずです。
やってみる
以下で出てくるコードは、全てGitLabリポジトリに公開しています。
Dockerイメージの設定
JupyterとAnsibleをインストールしたDockerイメージは、以下のDockerfileからビルドできます。Dockerファイル作成にあたり、こちらのコードを参考にさせていただきました。
- Dockerfile
せっかくなので、Alpineベースでやりました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
FROM alpine:3.11 LABEL maintainer='nishipy.com' ENV LANG=ja_JP.UTF-8 JP_PORT=8888 JP_USER=jupyter EXPOSE ${JP_PORT} RUN apk update && apk upgrade && apk add \ curl \ python3 \ python3-dev \ git \ wget \ musl \ linux-headers \ gcc \ g++ \ make \ build-base \ libffi-dev \ libressl-dev && \ pip3 install --no-cache-dir --upgrade pip && \ pip3 install --no-cache-dir jupyter jupyterlab ansible && \ adduser ${JP_USER} --home /home/${JP_USER} --shell /bin/bash -D ADD entrypoint.sh /home/${JP_USER} RUN chown ${JP_USER} /home/${JP_USER}/entrypoint.sh && \ chmod a+x /home/${JP_USER}/entrypoint.sh USER ${JP_USER} WORKDIR /home/${JP_USER} ENTRYPOINT [ "./entrypoint.sh" ] |
ENTRYPOINT
では、以下のスクリプトを実行し、Jupyter Notebookサーバーを立ち上げています。
- entrypoint.sh
1 2 3 4 |
#!/bin/sh echo "Serving JupyterLab ..." cd /home/${JP_USER} jupyter notebook --NotebookApp.password="" --NotebookApp.token="" --no-browser --port=${JP_PORT} --ip=0.0.0.0 |
Dockerイメージをビルドして、実行するには、当然以下のようにします。
1 2 |
docker build -t ansible-jupyter . docker run --name test -p 8889:8888 ansible-jupyter |
ブラウザからアクセスして、Notebookを新規作成し、!ansible --version
と打ってみます。無事インストールできているようです。
GitLab CIの設定
ついでにGitLab CIの設定も行います。GitLab CIでは、パイプラインを.gitlab-ci.yml
に定義していきます。今回は、以下の2ステップを実装します。
- build
- Dockerイメージをビルド
- GitLabのコンテナレジストリにPush
- test
- buildしたイメージをpullして、実行
- 実行中のサーバに
curl
して、Jupyter Notebookが動いていることを確認 - レスポンスに、
"<title>Home Page - Select or create a notebook</title>"
が含まれていたら成功 - それ以外は失敗
実装してみたファイルがこちらです。
- .gitlab-ci.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
stages: - build - test image_build: stage: build image: docker:latest services: - docker:dind before_script: - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN registry.gitlab.com script: - docker build -t $CI_REGISTRY_IMAGE . - docker push $CI_REGISTRY_IMAGE:latest image_test: stage: test image: docker:latest services: - docker:dind before_script: - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN registry.gitlab.com - apk update - apk add --no-cache curl bash script: - docker run --name test -d -p 8889:8888 $CI_REGISTRY_IMAGE:latest - sleep 15 - chmod +x ./testfiles/serve_test.sh - bash ./testfiles/serve_test.sh |
ちなみにdind
は、docker in docker
の略です。
- testfiles/serve_test.sh
Jupyter Notebookが正常に動いているかどうかは、以下のスクリプトで確認しています。GitLab CIでは、exitコードが0のとき、ジョブが成功したと判断されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#!/bin/bash res=$(curl -X GET http://docker:8889/tree?) test="<title>Home Page - Select or create a notebook</title>" #get the response with cURL and judge if it is as we expected if [[ $res =~ $test ]] ; then echo "...[SUCCESS]Serving Test has been completed." exit 0 else echo "...[ERROR]Some Errors have occurred." exit 1 fi |
パイプラインを実行
GitLab CIの準備が整ったところで、実際にパイプラインをトリガーしてみます。masterブランチにコードをpushするのが簡単そうです。GitLabプロジェクトの画面から、[CI/CD]-[Pipelines]を見ると、パイプラインが実行されているのがわかります。
定義した通り、2つのステージが実行されています。
それぞれのログも見ることができます。
また、[Packages]-[Container Registry] を見ると、今回ビルドしたコンテナイメージが表示されます。
以上.
コメント