「DevOps」を全く知らない人のために「DevOps」の魅力を伝えるための「DevOps」入門

2018年現在において、「DevOps」という言葉を耳にしたことがない人は少ないかもしれませんが、本稿では以前に書き記したメモをベースとして「DevOps」の概要を紹介したいと思います。

* 「DevOps」とは
* 「DevOpsがあるとき、DevOpsがないとき」にみるDevOps導入のメリット
* DevOpsを実現するためには

## 「DevOps」とは

「DevOps（デブオプス）」とは、 **開発手法やツールを使って** 開発者（Development）と運用者（Operations）が密接に連携することで、 **より柔軟かつスピーディーに** システムを開発することです。

### DevOpsが登場したのは2009年

「DevOps」という言葉は2009年に行われたFlickrのエンジニアによるセッション、「[10+ Deploys Per Day: Dev and Ops Cooperation at Flickr](http://www.slideshare.net/jallspaw/10-deploys-per-day-dev-and-ops-cooperation-at-flickr)」（オライリー主催「Velocity 2009」）の中で初めて登場し、注目されるようになりました。

驚くべきことに、2009年時点で彼らは既にDevOpsによって **1日に10回以上のリリース** を実現していました。


## 「DevOpsがあるとき、DevOpsがないとき」にみるDevOps導入のメリット

なぜ、システム開発にDevOpsが必要とされているのでしょうか。本章では DevOpsがあるとき、DevOpsがないときを比較することによって、DevOps導入のメリットをお伝えしたいと思います。

### 1. 信頼性

#### DevOpsがないとき

開発者のミッションは「システムに新しい機能を追加すること」ですが、一方で運用者のミッションは 「システムを安定稼働させること」です。安定稼働しているシステムは変更を加えなければ問題なく動き続けるため、運用者はシステムの変更を嫌います。

#### DevOpsがあるとき

テスト、ビルド、デプロイといった今まで人間が行なっていた作業を自動化することで **ヒューマンエラーを防ぐことができます。** 信頼性を高めることで運用者もシステムの変更を承認しやすくなります。

### 2. 生産性

#### DevOpsがないとき

DevOpsでないプロジェクトは以下のように様々な問題を抱えています。

- 他メンバーの修正を上書きして消してしまう
- 本番環境では動かない
- リリースが複雑で手順書が必要となる
- 別名フォルダでブランチを管理している
- ステータス管理ができない
- 管理台帳の一覧性、検索性が弱い

#### DevOpsがあるとき

後述する多様なツールを使うことで、今まで煩雑であった作業の生産性を飛躍的に向上させることができます。 **何でもかんでもExcelで管理する煩わしい作業から脱却できます。** Excelは「表計算」ソフトです。

### 3. アジリティ（俊敏性）

#### DevOpsがないとき

ウォーターフォールモデルはプロジェクトが終わるまでリリースされない 「ビッグバンリリース形態」であるため、システムを構築すること自体が目的になり、 要求変更に弱いシステムになりがちです。

#### DevOpsがあるとき

アジャイル開発を代表とする非ウォーターフォールモデルの開発手法を採用することにより、 **より柔軟に、よりスピーディーに** 開発することができます。

## DevOpsを実現するためには

DevOpsを実現するためには、開発手法の刷新やツールの導入・連携が必要となります。本章ではそれらの中から代表的なものをご紹介します。

### DevOpsを実現する開発手法

#### アジャイル（Agile）

偏に「アジャイル」と言っても、様々な開発手法があります。

- スクラム（Scrum）
- エクストリームプログラミング（Extreme Programming, XP）
- 機能駆動型開発（Feature Driven Development, FDD）
- リーンソフトウェア開発

アジャイル開発手法の一つである「スクラム」はプロジェクトマネジメントに焦点を当てたものです。スプリントと呼ばれる定期的なリリースを繰り返し、柔軟なシステム開発を実現します。

#### 継続的インテグレーション（Continuous Integration, CI）

継続的インテグレーションとは、バージョン管理システムにソースコードをコミットしたタイミングで **自動的にソースコードのビルドとテストを実行する** ことで、バグを早期に検出する手法です。

継続的インテグレーションはアジャイル開発手法の一つである「XP」のプラクティスとして提唱されました。

#### 継続的デリバリー（Continuous Delivery, CD）

継続的デリバリーとは、  **全ての変更に対していつでも本番リリースが可能な状態を保証している** ことを意味します。

自動化されたフローによってソースコードがコミットされるたびに、更新のビルド、テスト、 **ステージング** を行います。実際の運用環境へのデプロイを最終的に決定するのは人間です。

#### 継続的デプロイメント（Continuous Deployment, CD）

継続的デプロイメントの場合、リビジョンは **人間による明示的な承認なしで自動的に本番環境にデプロイされる** ため、ソフトウェアリリースのプロセス全体が自動化されます。

CI/CDが自動化でカバーする範囲については、『[継続的インテグレーションとは?– アマゾン ウェブ サービス](https://aws.amazon.com/jp/devops/continuous-integration/)』に掲載されている画像が大変分かりやすいので、是非ご覧ください。

### DevOpsを実現するツール

以下はDevOpsを実現する代表的なツールです。

#### バージョン管理システム

-  **Git**
- **GitHub**
- **GitLab** :  GitHubなどのGitリポジトリホスティングサービスと異なり、自前のサーバーにGitリポジトリを置いてWebブラウザ上でソースコードを管理することができるツール。

ブランチ管理のプラクティスとしては以下のようなものがあります。

- **Git Flow** :  Vincent Driessen氏が提唱した「A successful Git branching model」に基づくプラクティス。 5つのブランチによってバージョンを管理する。
- **Git Hub Flow** :  masterブランチと作業用のブランチの2つのブランチのみ利用するプラクティス。 「マージリクエスト」と呼ばれる機能を利用したソースコード・レビューによってmasterブランチを常にリリース判断可能なものにする。

#### チケット管理システム

-  **Redmine** : バージョン管理システムと連携することができ、チケットとリポジトリのリビジョンの関連づけを行うことができる。
 
#### CIツール

* **Jenkins** : gitやビルド自動化システム「Gradle（グレイドル）」などと連携し、ブランチへプッシュされるとビルドやテストを自動で実行する。
* **GitLab CI**
* **Circle CI**

#### CDツール

* **Docker**  : Linux上で独立した別のLinuxシステムを起動することができるコンテナ型仮想化ソフトウェア。開発環境が簡単に用意でき、かつ本番環境と共通化できる。
* **Vagrant** VirtualBox、VMware、Amazon EC2などのクラウド上の仮想マシンを操作し、OSのインストールや起動・停止などの制御を行うことができるツール。
- **Ansible** : 多数のサーバーや複数のクラウドインフラを統一的に制御できるエージェントレスな構成管理ツール。サーバー上に任意のファイルをデプロイしたり、パッケージのインストールを行わせたりすることができる。
- **Selenium** : 自動でブラウザを操作することでWebサイトの動作のテストを行うことができるツール。

## 最後に

「DevOps」に正解はありません。上記で紹介した以外にも様々な開発手法やツールがあります。DevOpsは一つのツールを導入するだけでももちろん効果はありますが、様々なツールを連携させることによって真価を発揮します。開発手法やツールの特性を理解し、個々のプロジェクトに合わせてうまく活用しましょう。

## 参考書籍

*「[チーム開発実践入門](https://www.amazon.co.jp/dp/4774164283/ref=cm_sw_r_cp_awdb_c_1ZgNAbJV6AY36)」 : DevOpsについて調べていた当時、大変参考となった書籍です。2014年に出版された書籍なので内容はちょっと古くなっているかもしれませんが、良書であることに変わりありません。