Red Hatのさいとうです。この記事はAnsible 2 Advent Calendarの12月4日のエントリです。
今回(12/4)と次回(12/25)の2回の予定で How to contribute - AWX と題して、Ansible TowerのアップストリームプロジェクトであるAWXにコードをコントリビュートする方法について、開発環境の構築、アップストリームプロジェクトのfork、開発用コンテナのビルド、コードの修正とテストの一連の流れを紹介します。
AWXの開発環境の準備する
ここでは、CentOS 7(Minimal Install)の上に開発環境を準備していきます。まずは開発環境に必要なパッケージ群をインストールしましょう。
※AWXの開発環境では、docker-composeを利用してdockerコンテナとしてAWXサービスをビルド・起動させます。このビルド・起動の部分が、RHEL8/CentOS 8のpodmanにはまだ対応していない状況です(みんなRHEL8/CentOS 8の上でどうやってAWXの開発してるんだろう...ちなみに僕はFedora31 & moby-engineを開発環境として利用しています)。
$ sudo yum install epel-release $ sudo yum install git make python36 $ sudo yum install docker $ sudo systemctl enable docker $ sudo systemctl start docker
今回は、あくまでも外部から隔絶されたローカルな開発環境を構築するのを目的としているため、利便性を優先して、以下の設定を実施しておきます。みなさんの環境の /var/run/docker.sock は Owner:Group を root:docker にして、dockerグループに開発に利用しているユーザIDを所属させるなどの適切な設定を行ってください。
$ sudo ls -l /var/run/docker.sock srw-rw----. 1 root root 0 Dec 4 19:11 /var/run/docker.sock $ sudo chmod 666 /var/run/docker.sock
続いて、AWXのダッシュボードをビルドするために必要なNodeJS(13.x)をインストールします。
$ curl -sL https://rpm.nodesource.com/setup_13.x | sudo bash - $ sudo yum install nodejs
最後に、AWXコンテナのビルドに必要なdocker-composeをインストールします。
$ pip3 install docker-compose --user
UpstreamからAWXリポジトリをforkしてクローンする
UpstreamのAWXプロジェクトのリポジトリを、みなさんのGithubアカウントでforkします。そして、そのforkしたプロジェクトを git clone してください。
$ git clone git@github.com:<みなさんのアカウント>/awx.git
つぎに、Upstreamのリポジトリをリモートリポジトリとして登録します(ここではupstreamという名前で登録しています)。ついでにforkいたリポジトリをUpstreamに追随(fetch & merge)させておきます。※このあたりのGitオペレーションは、みなさんの流儀にあわせて行ってください。
$ cd awx $ git remote add upstream https://github.com/ansible/awx.git $ git remote -v origin git@github.com:<みなさんのアカウント>/awx.git (fetch) origin git@github.com:<みなさんのアカウント>/awx.git (push) upstream https://github.com/ansible/awx.git (fetch) upstream https://github.com/ansible/awx.git (push) $ git fetch upstream $ git merge upstream/devel
これで、ソースコードの準備もおわりました。
トピックブランチを切って開発する
UpstreamへのPull Requestを行うために、トピックブランチを切って作業します。僕は、すでにオープンされているIssueに対する修正を投げるときには Issue/NNNNN というトピックブランチを切るようにしています。いきなりPull Requestを投げるときには PR/それっぽい名前 という感じでブランチ名をつけていますが、ひとそれぞれですから、みなさんの都合でわかりやすい名前を 英語 でつけてください。
$ git checkout -b PR/adc20191204
以降は、AWXのContributing guideにしたがって進めます。以降の作業で注意しなければならないのは、開発環境上(ここでは[host])で実施する作業と、その環境上に起動させた開発用のコンテナ上(ここでは[container])で作業する必要がある点です。
※以降の作業例では開発環境で行う作業には [host] 、開発用のコンテナ上で行う作業には [container] と明記しておきます。
1. サンプルの local_settings.py をコピーします
サンプルから変更する箇所は特にありません。そのままコピーして利用しましょう。
[host]$ cp awx/settings/local_settings.py.docker_compose awx/settings/local_settings.py
2. AWXコンテナをビルドします
Contributing guideでは指定されていませんが、トピックブランチで作業している関係で、ビルド時に COMPOSE_TAG=devel を設定してやる必要があります。ビルドには、それなりに時間がかかります。ビールでも飲みつつまちましょう。
[host]$ COMPOSE_TAG=devel make docker-compose-build
ビルドが完了すると、以下のようなイメージ群が開発環境に存在しているはずです。
[host]$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE ansible/awx_devel latest ef0d34a9281d 10 seconds ago 2.45 GB gcr.io/ansible-tower-engineering/awx_devel devel ef0d34a9281d 10 seconds ago 2.45 GB docker.io/centos 8 0f3e07c0138f 2 months ago 220 MB
3. UIをビルドします
公式のドキュメントにしたがうと、多国語対応していない状態(英語のみ)でAWXのダッシュボードが起動してきます。日本語のUIの不具合は、われわれが修正するしかないですよね?そこで、多国語対応した状態でUIをビルドします。
[host]$ make clean [host]$ make languages [host]$ make ui-devel
AWXのダッシュボードのフロントエンド(JavaScript)部分に手を加えた場合は、上記の作業を修正の都度実施する必要があります。
4. AWXコンテナを起動します
以下のコマンドで開発用のコンテナが起動してきます。ログイン画面のアイコンは開発者だけが見ることのできる Angry Potato です :)
[host]$ COMPOSE_TAG=devel make docker-compose
コンテナの初期化と起動には、それなりの時間がかかります。DBのマイグレーション処理など、一連の初期化処理が完了すると、HTTPSで開発環境のPort:8043にアクセスすることで、AWXのダッシュボードにログインできます。
以降、ターミナルはAWXコンテナからの出力用に保持して、別のターミナルから開発環境にSSHして以降の作業を進めます。
5. 仕上げとして初期データを投入する
まずはAWXの管理者(awx)ユーザを作成します。作業後は、このawxアカウントでダッシュボードにログインすることができるようになります。
[host]$ docker exec -it tools_awx_1 bash [container]$ awx-manage createsuperuser Username (leave blank to use 'awx'): awx Email address: Password: <パスワード> Password (again): <パスワード再入力> Superuser created successfully.
続いて、Demo用のProject/Inventory/Credential/Job Templateを作成して終了です。
[container]$ awx-manage create_preload_data (changed: True) [container]$ exit
実際にブラウザからawxユーザでログインしてみてください。
次回は、実際にコードに変更を加えてテストする手順について紹介する予定です。さて、今日はもう帰るとするかな。