GitLab CIで、Ansible+Jupyter入りDocker imageのビルドとテストをする

Ansible
スポンサーリンク
Nishipy
Ansible の入ったDockerイメージを作るのに、Jupyter Notebookも入れてみた時のメモです。GitLab信者なので、ついでに簡単なCIパイプラインも添えました。
スポンサーリンク

はじめに

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信者とみて間違いありません。

Ansible

オープンソースの構成管理ツールです。無償でも十分使えますが、サポート付きの有償版をRed Hatが提供しています。

ansible/ansible
Ansible is a radically simple IT automation platform that makes your applications and systems easier to deploy. Avoid writing scripts or custom code to deploy a...

Chef や Puppet などと同じ括りのソフトウェアですが、以下の点が特徴と言えます。

  • エージェントレス
    • SSH または WinRM で接続できればよい
  • 管理対象のホストのOSは、Windows でも Linux でもよい
  • Playbookがyaml形式で、可読性が高い
  • ロゴがなんかかっこいい

Jupyter Notebook

主にPythonのコードとMarkdownを共存させたファイルが作成できるソフトウェアです。コードの部分は、GUIでボタンをぽちぽちすることで、実際に実行できます。データ分析でPythonを使うときに利用されています。

Project Jupyter
The Jupyter Notebook is a web-based interactive computing platform. The notebook combines live code, equations, narrative text, visualizations, interactive dash...

Ansible と Jupyter Notebook の組み合わせ

Jupyter Notebookでは、Pythonのコードの他に、シェルに対するコマンドも実行することもできます。したがって、Markdown部分にPlaybookの説明や前提条件を書き、コード部分にPlaybookの実行コマンドを書くことで、簡単に手順書が作成できます。

加えて、JupyterもAnsibleも、ともにPythonを前提としていることから、無駄なパッケージをインストールせずに済むので、Docker imageも軽量にできるはずです。



やってみる

以下で出てくるコードは、全てGitLabリポジトリに公開しています。

Nishipy / docker-ansible-jupyter
GitLab.com

Dockerイメージの設定

JupyterとAnsibleをインストールしたDockerイメージは、以下のDockerfileからビルドできます。Dockerファイル作成にあたり、こちらのコードを参考にさせていただきました。

jupyter/docker-stacks
Ready-to-run Docker images containing Jupyter applications - jupyter/docker-stacks
ymotongpoo/dockerfiles
Contribute to ymotongpoo/dockerfiles development by creating an account on GitHub.
  • Dockerfile
    せっかくなので、Alpineベースでやりました。

ENTRYPOINTでは、以下のスクリプトを実行し、Jupyter Notebookサーバーを立ち上げています。

  • entrypoint.sh

Dockerイメージをビルドして、実行するには、当然以下のようにします。

ブラウザからアクセスして、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

ちなみにdindは、docker in dockerの略です。

Building Docker images with GitLab CI/CD | GitLab
Documentation for GitLab Community Edition, GitLab Enterprise Edition, Omnibus GitLab, and GitLab Runner.
  • testfiles/serve_test.sh
    Jupyter Notebookが正常に動いているかどうかは、以下のスクリプトで確認しています。GitLab CIでは、exitコードが0のとき、ジョブが成功したと判断されます。

パイプラインを実行

GitLab CIの準備が整ったところで、実際にパイプラインをトリガーしてみます。masterブランチにコードをpushするのが簡単そうです。GitLabプロジェクトの画面から、[CI/CD]-[Pipelines]を見ると、パイプラインが実行されているのがわかります。

定義した通り、2つのステージが実行されています。

それぞれのログも見ることができます。

また、[Packages]-[Container Registry] を見ると、今回ビルドしたコンテナイメージが表示されます。

以上.



コメント