Jenkinsを使用したAlibaba Cloud ECS Ubuntuインスタンスでの継続的インテグレーション

このチュートリアルでは、Jenkinsを使用して**Alibaba Cloud ECS** Ubuntuインスタンス上に継続的インテグレーション配信環境を設定する方法を紹介します。

*本ブログは英語版からの翻訳です。オリジナルは[こちら](https://www.alibabacloud.com/blog/continuous-integration-with-jenkins-on-alibaba-cloud_594512)からご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。*

#Alibaba CloudのElastic Compute Service (ECS)とは？
Alibaba Cloudの[Elastic Compute Service（ECS）](https://www.alibabacloud.com/product/ecs?spm=a2c65.11461447.0.0.385169d8AH7djy)は、物理サーバーよりもシンプルで効率的な管理が可能な、弾力性のあるクラウドベースのサーバー製品です。インスタンスを作成し、メモリやストレージを追加し、必要なときに必要なだけスケールアップし、複雑に接続されたVPCをさまざまなリージョンに構築し、アリババクラウドの膨大なクラウド製品やサービスの必須コンポーネントとして利用することができます。

#Jenkinsとは？
Jenkinsは、コードに変更が加えられてコードベースにプッシュされた後、アプリケーションコードをビルドしてリリースする継続的インテグレーションビルドツールです。Jenkinsは、リポジトリにプッシュされた変更のたびにコードに対する自動テストを実行することで、開発時間を節約します。バグはすぐに発見され、チーム全体がビルドの失敗に気づくことができます。

JenkinsはオープンソースのCIツールであり、オープンソースとプロプライエタリな継続的統合ビルドツールの中の1つに過ぎません。Jenkinsは単純なCIサーバとして使用することもできますが、大規模なプロジェクトでは継続的なデリバリーの中心的なハブとして機能することが多いです。

継続的インテグレーションツールは、大規模なチームのプログラマーや開発者が同時にアプリケーションコードの別々の部分に変更を加えることで、ワークフローの断片化に関連する問題を解決します。予期せぬ問題が信じられないほど迅速に発見されるため、チームはビルドの失敗に効率的に対処することができ、変更が追加されてアプリケーションにさらなる問題が発生する前に対処することができます。

Jenkinsは拡張性があり、継続的インテグレーションとデリバリの世界のあらゆる製品と統合できるように、幅広いプラグインを提供しています。

#前提条件
Alibaba Cloudのアカウントが必要です。まだ持っていない場合は、Alibaba Cloud[無料トライアルのページ](https://www.alibabacloud.com/campaign/free-trial?spm=a2c65.11461447.0.0.385169d8AH7djy)にアクセスして300～1200ドル相当のAlibaba Cloud製品を手に入れて、Alibaba Cloud無料トライアルで遊んでみましょう。

それでは、Alibaba Cloud Ubuntu ECSsにJenkinsをインストールしてみましょう。

#Alibaba Cloud ECSインスタンスの構築と設定
まずは、お気に入りのリージョンでAlibaba Cloud ECSインスタンスをスピンアップしてみましょう。クリックしてElastic Compute Serviceの製品ページに移動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/9ae131d5-5946-12d1-602c-80ddda3b1d92.png)


お気に入りのリージョンで、[インスタンスの作成] をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/494b3938-149e-c538-ece6-c5b2ca5f243a.png)

基本構成の詳細を選択し、[次へ] 、[ネットワーキング] をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/fa8931f4-3abe-dea8-cd3f-8234348211c1.png)

OSはUbuntuの最新版を選びました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/d7097466-abf0-e25c-58c1-f7079620c28c.png)


[Networking] ページで、パブリック IP アドレスを割り当て、インスタンスの Security Group で HTTP と HTTPS ポートを開きます。

準備ができたら、System Configurationsをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/85451f84-b133-f33f-4314-a446efb16fb0.png)

システム設定ページでは、ルートアクセス用のパスワード、またはキーペアを設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/bda85ca5-4537-bcdd-1ebf-63c62617a900.png)

グループ化はそのままにして、プレビューに進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/26bd30c2-af78-1370-6979-a54a96f655e9.png)


プレビュー ページで、ECS 構成の詳細をすべて確認し、条件に同意して、Create Instance をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/23b728b6-7085-4de8-7fd6-869e3a4c7fda.png)

成功のメッセージが表示されます。[コンソールに戻る]をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/69c2b526-2d00-53cc-f0c8-7b8e927d21d9.png)


インスタンス一覧でインスタンスが起動しているのがわかります。パブリックIPをメモしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/a3086233-3d2d-8e39-814c-ba82cde1bbc2.png)

インスタンスが立ち上がったら、ssh経由でアクセスして、ターミナルからソフトウェアのインストールを行います。

#Ubuntu 18.04にJavaをインストール
インストールしておく必要があります。インスタンスにsshで接続します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/21b52654-b295-32f6-32a4-f1ffa6199e40.png)

インスタンスを更新します。

```
apt update
```

Java 8をインストールします。

```
apt install openjdk-8-jre-headless
```

Java Runtime Environmentが正しくインストールされていることを確認します。

```
java -version
```

次にJava開発キットをインストールします。

```
apt install openjdk-8-jdk
```

JDKが正しくインストールされていることを確認してください。

```
java -version
```

今すぐパッケージをアップデートしましょう。

```
apt update

apt upgrade
```

環境変数`JAVA_HOME`を設定します。まず、利用可能なパスを確認します。

```
update-alternatives --config java
```

次に環境ファイルを開き、パス変数を追加します。

```
nano /etc/environment

JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/“
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/2c2af977-c3e6-4976-3930-0e212bc2fb89.png)


変更を適用するためにファイルをリロードします。

```
source /etc/environment
```

変数が正しく設定されていることを確認します。

```
echo $JAVA_HOME
```

念のためにインストールを更新します。

```
apt update
```
これでJenkinsをインストールする準備が整いました。

#UbuntuにJenkinsをインストールする
インスタンスにsshで接続します。

非rootユーザを作成してみましょう。

```
adduser jenkins_user
```

新しいユーザーに管理用の sudo 権限を与えます。

```
usermod -aG sudo jenkins_user
```

今度はインスタンスにファイアウォールを追加して有効にし、ファイアウォールが有効になっているかどうかを確認します。

```
ufw allow OpenSSH
ufw enable
ufw status
```

これでJenkinsをインストールする準備が整いました。まず、パッケージにリポジトリキーを追加します。

```
wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add –
```

インスタンスの `sources.list` に Debian パッケージのリポジトリアドレスを追加します。

```
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list’
```

これでJenkinsをアップデートしてインストールします。

```
apt update
apt install jenkins
```

Jenkinsのサービスを起動して状態を確認してみましょう。

```
sudo systemctl start jenkins

sudo systemctl status jenkins
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/5c6c1ff2-e7fb-98ef-25d4-be30b4d9854d.png)

デフォルトでは、Jenkinsは8080番ポートで動作します。ufwでポートを開き、ステータスを確認します。

```
sudo ufw allow 8080
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/1877b4ff-ea84-1ddf-4e73-07d4e7a1ccad.png)

Jenkinsのログを確認します。

```
tail -f /var/log/jenkins/jenkins.log
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/452c950b-ecbf-c0f9-f928-5d7640d67ef6.png)

インスタンスのセキュリティグループでポート808080のインバウンドとアウトバウンドを開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/36512211-0bb9-6c99-f82b-8672c2c6ffc4.png)

インスタンスを再起動します。インスタンスが再起動したら、パブリックIPと8080番ポートを使ってJenkinsにアクセスできるようになります。ブラウザのウィンドウに移動し、以下のように入力します。

```
http://<<Public IP Address>>:8080
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/6665b996-9aeb-63c7-a730-7fdfa7e5297c.png)

画面の指示に従ってJenkinsを設定します。

管理者パスワードを探して入力します。

```
nano /var/lib/Jenkins/secrets/initialAdminPassword
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/9ce55521-45f9-aac7-ac73-d4f0126dee8a.png)

提案されたプラグインをインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/df2a6ad9-d745-7eb9-9ad3-15a6a49c375a.png)


プラグインのインストール手順の詳細が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/25940f48-03a4-4b61-3b26-525439d37b18.png)

完了すると、Jenkinsユーザーの設定を求められますが、管理者として継続しても構いません。

今回は管理者ユーザーとして継続しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/8b1465de-adf9-a8b1-23ad-1a28c7e99522.png)

これでJenkinsのURLを保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/8cffab66-d8d3-8490-bcfc-9f9ee60da2dc.png)

これでJenkinsを使い始めることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/03a580c9-db93-4463-bd99-fbfef1bb3d46.png)

何もない画面が表示されたら、Jenkinsを再起動します。

```
sudo service jenkins stop

sudo service jenkins start
```

これで管理者情報でログインし、ジョブの作成を開始することができるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/c05f7b4c-36c9-396f-3c35-4659a7a1a736.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/88221724-7f9c-5952-2274-865c0a519e1e.png)

プロジェクトのリリースをJenkinsで管理するように設定してください。

#概要
まとめとして、Alibaba Cloudの[Elastic Compute Service](https://www.alibabacloud.com/product/ecs?spm=a2c65.11461447.0.0.385169d8AH7djy)（ECS）とJenkinsの継続的インテグレーション構築ツールについてお伝えしました。ECSのUbuntu 18.04インスタンスの作成方法、sshでのログイン方法、JavaとJenkinsのインストール方法をお伝えしました。最後に、ブラウザウィンドウ経由でJenkinsを正しくインストールしたことを確認し、初期設定を行いました。

今後もアリババクラウドの製品やサービスに関するチュートリアルは、[www.alibabacloud.com/blog](http://www.alibabacloud.com/blog?spm=a2c65.11461447.0.0.385169d8AH7djy)

*アリババクラウドは日本に２つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
[アリババクラウドジャパン公式ページ](https://www.alibabacloud.com/ja)*