2016.07.04

開発作業効率化への取り組みⅢ


こんにちは。次世代システム研究室のS.Iです。
次世代システム研究室ではシステム開発を行う上で様々な取り組みを行っています。
前回前前回に引き続き、現在進行中のプロジェクトで開発を出来る限り効率的に進めるために導入している工夫について紹介したいと思います。今回はデプロイの効率化についてフォーカスした内容を紹介させて頂きます。

デプロイ作業の効率化

今回取り上げるプロジェクトでは、Ansible、Bamboo、Ansistranoを利用して構成管理やデプロイの自動化を行うことで開発者がより生産性の高い作業に集中できるように効率化を図っています。ここではAnsistranoとBambooの機能や実際の利用方法について触れていきたいと思います。

Ansistranoの設定例と解説ついて

概要ついて

AnsistranoはAnsibleでCapistranoと同様の機能を提供するデプロイツールで、以下のメリットから導入しています。

  1. Ansibleで構成管理をしている場合はサーバ設定などを別途用意する必要がなく、構成管理の設定を利用してデプロイができる
  2. シンプルなワークフローが提供されており、それぞれのタスクに処理をフックさせることで簡単にカスタマイズができる

ワークフローについて

「Setup phase、Code update phase、Symlink shared phase、Symlink phase、Cleanup phase」の5つのワークフローが提供されており、その前後に処理をフックすることでカスタマイズができます。

workflow

設定例と解説ついて

実際の「deploy.yml」の設定は以下です。下記にて個別で解説していきたいと思います。
hosts:
- dev_web
- staging_web
- prod_web
vars_prompt:
- name: "service"
prompt: "please input service"
private: no
confirm: yes
- name: "git_branch"
prompt: "please input branch (develop/master/etc..)"
private: no
confirm: yes
remote_user: XXXXX
vars:
ansistrano_deploy_to: "/XXXXX/{{ service }}"
ansistrano_version_dir: "releases" # Releases folder name
ansistrano_current_dir: "current" # Softlink name. You should rarely changed it.
ansistrano_shared_paths: []
ansistrano_keep_releases: 5
ansistrano_deploy_via: "git"
ansistrano_git_repo: ssh://XXXXX.git # Location of the git repository
ansistrano_git_branch: "{{ git_branch }}" # Branch to use when deploying
ansistrano_git_identity_key_path: "/XXXXX"
# our custom setting file call
ansistrano_after_update_code_tasks_file: "{{ playbook_dir }}/roles/app.ansistrano/tasks/after-update-code-tasks.yml"
ansistrano_after_symlink_tasks_file: "{{ playbook_dir }}/roles/app.ansistrano/tasks/after-symlink-tasks.yml"
ansistrano_before_cleanup_tasks_file: "{{ playbook_dir }}/roles/app.ansistrano/tasks/before-cleanup-tasks.yml"

5行目ではより柔軟にデプロイできるように「vars_prompt」を利用して入力を受け付けることで
任意のサービスやブランチをデプロイ可能なようにカスタマイズしています。
また、入力ミスを防ぐために「confirm」を利用して2回入力しなければ実行されないように設定しています。
vars_prompt:
- name: "service"
prompt: "please input service"
private: no
confirm: yes
- name: "git_branch"
prompt: "please input branch (develop/master/etc..)"
private: no
confirm: yes

14行目では実行ユーザーを間違えてデプロイするような人的なミスを回避するためにユーザーを指定しています。
remote_user: XXXXX

20行目ではサーバで世代を管理するための設定をしています。デプロイ時には以下のような日付のディレクトリでファイルが配置され、ここでは設定が「5」なので6回目のデプロイ後は古いrelease配下の日付ディレクトリが削除されます。
|– releases
  |– 20100512131539
  |– 20100509150741
  |– 20100509145325
ansistrano_keep_releases: 5

25行目では標準のワークフローに処理をフックすることでカスタマイズを行っています。フックする処理は自前で用意したrole内のtaskに記述しています。
# our custom setting file call
ansistrano_after_update_code_tasks_file: "{{ playbook_dir }}/roles/app.ansistrano/tasks/after-update-code-tasks.yml"
ansistrano_after_symlink_tasks_file: "{{ playbook_dir }}/roles/app.ansistrano/tasks/after-symlink-tasks.yml"
ansistrano_before_cleanup_tasks_file: "{{ playbook_dir }}/roles/app.ansistrano/tasks/before-cleanup-tasks.yml"

実際のデプロイ時のコマンドは以下のようになります。手動の場合は「-C」でDryRunを実施してから実行します。
ansible-playbook -i hosts.dev deploy.yml

Bambooの設定例と解説ついて

前回触れた内容ですが、StashのプルリクエストをトリガーにBambooでデプロイを実行するためにBambooの以下の「SSH TASK」の設定画面で直接Ansistranoのコマンドを記述します。

bamboo_3

コマンドは「SSH-COMMAND」に以下のように設定します。ここでは「vars_prompt」を利用しているのでBambooから実行する際は以下のように「–extra-vars」を利用して入力を受け付けさせずに実行します。

ansible-playbook -i hosts.dev deploy.yml --extra-vars "service=xxxxx git_branch=develop"

最後に

以上のような設定でプルリクエスト承認時にデプロイの自動化を行うことで、開発者がより生産性の高い作業に集中できるように工夫し効率化をしています。その他にもデザイナーと開発者が平行して作業できるように確認環境やマージのタイミングを自動で管理し作業の効率化も図る試みも継続実施中です。

次世代システム研究室では、アプリケーション開発や設計を行うアーキテクトを募集しています。アプリケーション開発者の方、次世代システム研究室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ 募集職種一覧 からご応募をお願いします。