How to contribute - AWX (1)

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.sockOwner:Grouproot: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のダッシュボードにログインできます。

f:id:pyde:20191204202840p:plain
AWX Login

以降、ターミナルは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ユーザでログインしてみてください。

f:id:pyde:20191204203746p:plain
AWX Dashboard

次回は、実際にコードに変更を加えてテストする手順について紹介する予定です。さて、今日はもう帰るとするかな。

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。