3.1 コードに変更を加える
前に言った通り、ソフトウェア開発っていうのはコードに小さな変更を加えることなんだ。
何百万ものプログラマーが何十年もかけてこのプロセスに取り組んできた結果、すっごく整理されて標準化されて、あらゆる方法で形式化されたってわけ。
コードを保存するための特別なプログラムがあるんだよ、それがGitなんだ。
Gitっていうのは、バージョン管理の分散型システムなんだ。
単にコードを保存するだけじゃなくて、全ての変更を追跡してくれるし、プログラマーたちが一緒にプロジェクトに取り組むのを手助けしてくれるんだ。
Gitを使うと、開発者たちはプロジェクトのいろんなバージョン(ブランチ)を作ったり、完全な変更履歴を保存したり、過去の任意の時点に戻ることもできるんだ。それって、コードのためのタイムマシンみたいだ!Gitがおかげで、変更をまとめたり、コンフリクトを解決するのがすごく楽になって、現代開発のチームプレイには欠かせないツールになったんだよ。
3.2 プロジェクトをビルドする
プロジェクトをテストしたりサーバーにアップロードする前に、ビルドする必要があるよ。
プロジェクトのビルドっていうのは、プロジェクトのソースコードを実行可能なプログラムや他の実行フォーマットにコンパイルするプロセスなんだ。
よくテストとデプロイも含まれるね。これがソフトウェア開発の重要な側面で、プログラムが使える状態になるために必要なことなんだよ。
ビルドって、単なるコンパイルじゃないんだ。コンパイルはビルドプロセスの一部によく含まれるけどね。ビルドが終わると、何十や何百ものファイルができて、それをいろんなサーバーにアップロードしなきゃならなくなることもある。
ビルドツールには、次のような低レベルのものがあるよ:
MavenやGradleはJavaプロジェクトでの依存管理とビルドで広く使われているよ。
Apache AntもJavaのプロジェクトのためのビルドツールで、ビルドスクリプトを書くのに柔軟性があるんだ。
MSBuildはMicrosoft Visual Studioを使って作ったプロジェクトのビルドに使われるんだ。
Makeはビルドルールを定義するためにMakefileを使うクラシックなビルドツールで、特にCやC++のプロジェクトで人気なんだよ。
WebpackはJavaScriptアプリケーションのビルドによく使われてて、依存関係やモジュールを管理してくれるんだ。
GulpやGruntは、ファイルの縮小化やSCSSのCSSへのコンパイルとか、ウェブアプリ開発でよくやるタスクを自動化するのを手助けしてくれるツールだね。
それから、高レベルのビルドツールだってあるんだ。この後説明するね。
3.3 CI/CD
CI/CD (Continuous Integration/Continuous Delivery)ってのは、全ての開発ブランチの変更をメインブランチに絶えず統合し、これらの変更を自動テストしてデプロイする方法論なんだ。これによって、エラーをすぐに見つけて修正することができて、開発の効率とスピードが向上するんだよ。
一番よく使われてて、ちょっと古いけど、CI/CDシステムとしてJenkinsがあるんだ。小さな会社で働いていると、80%の確率でJenkinsを使ってるってことになるかもね。
Jenkinsは人気のある自動化されたシステムで、継続的なインテグレーションとデリバリー(CI/CD)に使われてる。Jenkinsを使うとソフトウェア開発の様々なステージを自動化できて、ビルドやテスト、デプロイまでもっていけるから、コードの質が向上して開発プロセスが加速するんだ。
大きな会社に入ると、他にも5つの選択肢があるかも:
TeamCityはJetBrains製の強力な商用システムで、いろんな開発環境やテスト環境との深い統合を提供してる。
GitLab CIはGitLabの一部で、YAMLファイルを使った設定ができて継続的なインテグレーションとデリバリーを可能にしてるんだ。
CircleCIはクラウドベースのCI/CDサービスで、多くのプロジェクトのテストとデプロイの自動化をサポートしてるよ。
Travis CIは最初のクラウドベースのCIサービスの1つで多くのオープンソースプロジェクトで使われてる。GitHubとの統合が良くできてるよ。
BambooはAtlassianの製品で、この会社の他のツール(JiraやBitbucketなど)と緊密に統合されてる。
これらを知ってて使いこなす必要はないよ。普通は会社にDevOps専門家がいて、それらのプロセスを設定してくれるから。ただ、Jenkins、CI/CD、または「コンティニュアスインテグレーション」についての話が出たときに、何を話してるのかが分かっているといいよね。
3.4 サーバーにプロジェクトを届ける
プロジェクトを作るだけじゃ足りないんだ、それをサーバーに持っていかなきゃ。デプロイ(deploy)プロジェクトをサーバーに展開するっていうのは、プロジェクトをユーザーがインターネットを通じてアクセスできるようにするためにサーバーに配置し、アクティブにするプロセスを指すよ。
このプロセスには、プロジェクトファイルをサーバーに移動したり、サーバー環境の設定、データベースや依存関係の設定、ネットワーク設定やセキュリティの設定も含まれるんだ。
さあ、どうやってあなたのコードがサーバーに届くのか考えてみて?誰かがそれをアップロードしてくれるのかな?それとも、SSHを使ってリモートサーバーに接続して、いくつかのファイルをアップロードして全部セットアップするのかな?安心して、そんなことはもう誰もしないよ。今はDockerがあるんだ。
Dockerってのは、コンテナを使ってアプリケーションの開発、配信、実行を行うプラットフォームなんだ。Dockerはアプリケーションを全ての依存関係や環境と一緒に1つにパッケージ化して、作成、展開、実行を簡単にしてくれる。これにより、開発からテスト、本番環境まで、一貫した環境を保証するんだ。
Dockerを使うと、プロジェクトをDockerコンテナにパッケージ化できるんだ。これは仮想マシンみたいなものだよ。
Dockerを「仮想マシン」って呼ぶと、どんなDockerフォーラムでも非難されるだろうけど、Dockerコンテナを仮想マシンとして考えてもいいんだ。でも、ずっと軽量なんだ。
基本的に、
Dockerコンテナは仮想の「仮想マシン」だと言えるんだ。
仮想マシンは完全なOSのコピーやOSカーネルや仮想ハードウェアを含んでるけど、Dockerコンテナはホストのカーネルを共有するからもっと軽量で速い。
Dockerを使ったプロジェクトのデプロイはプロセスを大幅に簡略化してくれて、速くて信頼性が高いんだ。プロジェクトはDockerコンテナにパッケージ化されて、Dockerをサポートしている任意のシステムに簡単に移動して実行することができるんだよ。
これにより、サーバー環境の違いに関連する問題を解消し、負荷に応じてコンテナを追加したり削除したりすることで、アプリケーションを簡単にスケールアップできるんだ。全ての人がDockerに移行してるんだ、すごく便利で簡単だからね。
GO TO FULL VERSION