Jenkins初心者がCodePipelineのチュートリアルをUbuntuでやろうとしたら苦しかった話

# はじめに
Jenkinsに一ミリも触ったことがないのにUbuntuイメージで「<a href="https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/tutorials-four-stage-pipeline.html">チュートリアル: 4 ステージのパイプラインを作成する</a>」をやろうとしたら苦労したので記事にしました。

# 困ったこと
## Jenkinsのセットアップ方法がわからない
如何せんJenkins未経験なので、Jenkinsのセットアップ方法がわかりませんでした。なので、<a href="https://www.jenkins.io/doc/book/installing/linux/">こちらの記事</a>を参考にセットアップを行いました。

なおAMIは`ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-20230115`を使用しました。（これがよくなかった、、、）

### 1. Javaをインストールする
Jenkinsの動作にJavaが必要みたいなので、以下のコマンドでJavaをインストールします。
```shell
$ sudo apt update
$ sudo apt install openjdk-11-jre
$ java -version
```

### 2. Jenkinsをインストールする
以下のコマンドでLTS版をインストールします。
```shell
curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo tee \
  /usr/share/keyrings/jenkins-keyring.asc > /dev/null
echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
  https://pkg.jenkins.io/debian-stable binary/ | sudo tee \
  /etc/apt/sources.list.d/jenkins.list > /dev/null
sudo apt-get update
sudo apt-get install jenkins
```

### 3. Jenkinsのダッシュボードにアクセスする
Jenkinsのインストールが終わったら、ダッシュボードにアクセスしてジョブの作成を行います。

まずはブラウザで`JenkinsサーバのIPアドレス:8080`にアクセスします。
すると最初のセットアップ画面みたいなものが表示され、「推奨されるプラグインをインストールする」か「プラグインをカスタマイズする」かを選択させられます。私は左側の「推奨されるプラグインをインストールする」方を選びました。

ここまで完了するとダッシュボードが表示され、ジョブが作成できるようになります。

### 4. CodePipelineのプラグインを追加する
チュートリアルを行うにはプラグインを追加する必要があるので、それを追加します。

1. `jenkinsの管理 > pluginの管理 > available plugin`を選択
1. 検索ボックスに`AWS CodePipeline`と入力して表示されるものをインストール
1. `ダウンロードして再起動後にインストール`を選択
1. インストール完了後、`実行中のジョブがなければ Jenkins を再起動する`を選択

### おまけ：ジョブの作成
セットアップではありませんが、ジョブの作成もさっぱりわからなかったので方法をメモします。
1. ダッシュボードで「新規ジョブの作成」ボタンをクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883790/a6e288e5-b6b5-8e72-464a-42e5c0354f82.png)
2. `フリースタイルプロジェクト`を選択して次へ
3. プロジェクトの設定ページで`必要な場合に複数のビルドを並列実行する`をチェック
4. ソースコードの管理で`CodePipeline`を選択
5. buildかtestかみたいなのがあるので`build`を選択
6. トリガーのビルドは`Poll SCM`だけチェック
7. スケジュールは`* * * * *`にする
8. ビルドステップを追加する（`シェルの実行`を選択し、コマンドで`rake`を入力してAddする）

これでCodePipelineから呼び出すジョブの完成です！

## ビルド実行時にエラーが出る
パイプラインも作成し実行したのですが、ビルド時にエラーが発生してしまいました、、
```
rake: not found
```
こちらのエラーを修正した後も、、
```
LoadError: cannot load such file -- haml
```

### 解決方法
以下のコマンドを実行して、rakeとhamlをインストールすることで解消しました！
セットアップ時に実行したほうがいいですね。
```shell
sudo apt-get install rake
sudo apt-get install -y ruby-haml
```

## CodeDeploy エージェントがインストールされていない
デプロイが失敗したので調査したところ、CodeDeployエージェントがインストールされていないことが原因の用でした。
調べて普通にインストールしたところ、`CodeDeploy agent is not supporting ruby v3.0.1`のエラーが出てしまい、うまくインストールできませんでした、、、

### 解決方法
<a href="https://github.com/aws/aws-codedeploy-agent/issues/301">こちら</a>を参考にしてインストールすることができました！

1. `touch install-code-deploy-ubuntu22-ec2.sh`を入力して、新規ファイルを作成
1. `cat > install-code-deploy-ubuntu22-ec2.sh`で作成したファイルを開く
1. 以下の内容をペースト

```shell
#!/bin/bash
# This installs the CodeDeploy agent and its prerequisites on Ubuntu 22.04.
sudo apt-get update
sudo apt-get install ruby-full ruby-webrick wget -y
cd /tmp
wget https://aws-codedeploy-us-east-1.s3.us-east-1.amazonaws.com/releases/codedeploy-agent_1.3.2-1902_all.deb
mkdir codedeploy-agent_1.3.2-1902_ubuntu22
dpkg-deb -R codedeploy-agent_1.3.2-1902_all.deb codedeploy-agent_1.3.2-1902_ubuntu22
sed 's/Depends:.*/Depends:ruby3.0/' -i ./codedeploy-agent_1.3.2-1902_ubuntu22/DEBIAN/control
dpkg-deb -b codedeploy-agent_1.3.2-1902_ubuntu22/
sudo dpkg -i codedeploy-agent_1.3.2-1902_ubuntu22.deb
systemctl list-units --type=service | grep codedeploy
```

4. `ctrl + d`でcatを閉じる
5. `chmod u+x install-code-deploy-ubuntu22-ec2.sh`で作成したファイルの権限を変更
6. `./install-code-deploy-ubuntu22-ec2.sh`で実行
7. `sudo service codedeploy-agent status`でCodeDeployエージェントが動いていることを確認


## サンプルコードのスクリプトが実行できなかった
AWSから提供されているサンプルコードですが、Ubuntuイメージでやろうとしたためにそのままでは実行できませんでした、、

### 解決方法
サンプルコードのスクリプトを少し書き換えてみました^^

```sh:install_dependencies
#!/bin/bash
sudo apt install -y apache2
```

```sh:start_server
#!/bin/bash
sudo apachectl start
```

```sh:stop:server
#!/bin/bash
isExistApp=`pgrep apache2`
if [[ -n  $isExistApp ]]; then
    sudo apachectl stop        
fi
```

# おわりに
複雑なパイプラインが組めてなんだか嬉しかったです:relaxed:

# 参考
* <a href="https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/tutorials-four-stage-pipeline.html">チュートリアル: 4 ステージのパイプラインを作成する</a>
* <a href="https://www.jenkins.io/doc/book/installing/linux/">Installing Jenkins/Linux</a>
* <a href="https://github.com/aws/aws-codedeploy-agent/issues/301">CodeDeploy agent is not supporting ruby v3.0.1 #301</a>