jenkinsでログ管理を行う

## 背景
jenkinsとは、Javaベースで起動するソフトウェア開発向けのツールです。
ソフトウェア開発のビルド、テスト、デプロイを目的としたオープンソースを構築し、自動化したい処理を定義します。
サーバ内のスクリプトを指定し、実行タイミングを定義することで、osのcronのような処理が実現できます。
cronでは、逐次処理（例えば、A処理→B処理といった内容を1時間毎に実行する）は、crontabの定義上難しいのに対して、jenkinsでは定義可能です。
Jenkins本来の用途とはズレていますが、ジョブ管理として使っていくとともに、課題としてあったログのデータベースへの挿入中にログのローテートがされてしまう問題を解決するのが本記事の目的となります。

---

## 導入方法
jenkinsの公式サイトより、warファイルがあるため、
以下サイトからダウンロードします。
https://www.jenkins.io/download/
※Redhat、CentOS、Almalinuxなどのディストリビューションでは下記より必要なバージョンをwgetでダウンロードすればOKです。
（インターネット接続不可のサーバを使う場合、他のPCからダウンロードし、持ち込みするなどで対応できるかと思います。）
https://pkg.jenkins.io/redhat/

---

## JDKのバージョン確認、インストール
JDKのバージョンによっては起動しない場合がありますので、JDKのバージョンをまずは確認します。
```
[root@homeserver jenkins]# pwd
/opt/jenkins
[root@homeserver jenkins]# java -version
openjdk version "11.0.21" 2023-10-17 LTS
OpenJDK Runtime Environment (Red_Hat-11.0.21.0.9-1) (build 11.0.21+9-LTS)
OpenJDK 64-Bit Server VM (Red_Hat-11.0.21.0.9-1) (build 11.0.21+9-LTS, mixed mode, sharing)
```


---

### jenkinsの起動
使用済みポートがないことを確認します。
```
[root@homeserver jenkins]# netstat -an | grep 8080
[root@homeserver jenkins]# 
```
Jenkinsの起動に関してはjavaコマンドのオプションでjarを指定するコマンドがありますので、以下の通り起動します。

```
[root@homeserver jenkins]# cd /root;pwd
/root
[root@homeserver ~]# /usr/lib/jvm/java-11-openjdk-11.0.21.0.9-2.el8.x86_64/bin/java -jar /opt/jenkins/jenkins.war -httpPort=8080 --prefix=/jenkins
/usr/lib/jvm/java-11-openjdk-11.0.21.0.9-2.el8.x86_64/bin/javaa -jar /opt/jenkins/jenkins.war -httpPort=8080 --prefix=/jenkins
Running from: /opt/jenkins/jenkins.war
webroot: /root/.jenkins/war
2023-11-03 17:53:13.336+0000 [id=1]	INFO	winstone.Logger#logInternal: Beginning extraction from war file
～～～長すぎるので割愛します～～～
2023-11-03 18:05:05.918+0000 [id=24]	INFO	winstone.Logger#logInternal: Jetty shutdown successfully
2023-11-03 18:05:05.921+0000 [id=23]	INFO	winstone.Logger#logInternal: Control thread shutdown successfully
[root@homeserver ~]# /usr/lib/jvm/java-11-openjdk-11.0.21.0.9-2.el8.x86_64/bin/javaa -jar /opt/jenkins/jenkins.war -httpPort=8080 --prefix=/jenkins

```

---

### 起動後のログイン
私の場合はApacheを導入しており、SSL証明書を導入しているため、https接続で行います。
下記のURLでログイン画面を開いてログインします。
https://<IPアドレス>/jenkins/login?from=%2Fjenkins%2F
※8080ポート指定せずにログインするようにApacheのProxyPass設定を変えています。
（設定方法はこんな感じです。チョメチョメは秘密です。）
```
ProxyPass /チョメチョメ http://localhost:8080/チョメチョメ
ProxyPassReverse /チョメチョメ http://localhost:8080/チョメチョメ
```
※Firewalldによりhttpを閉塞している場合、閉塞しないよう設定変更が必要です。
初期パスワードでのログインを行います。
こちらを参考にしました。https://qiita.com/zb185423/items/af2643fa6ebf0639b6ab

※画像については後ほどアップいたします。

---

### Jenkinsでできること
基本的には、処理全般実行できますが、実装しているスクリプトに関しては基本的に実行できました。
・指定のjarファイルの停止・起動
・MySQLデータベースのバックアップ、ダンプエクスポート
・MongoDBへのログインサート
・ログローテーション（ログの世代管理）
cronでは、時間指定はできますが、特定処理が終わったら後続の処理を行うといった設定はできないのに対して、Jenkinsではジョブの並列処理、直列処理が可能です。
パイプライン処理を1時間毎に行う実装を作っています。

MongoDBへのログインサート（log_insert_data.sh）
　　↓
ログローテーション（os_forcelogrotate.sh）


---

●log_insert_data.sh
```
#!/bin/bash
allAggregationLogs=/root/logaggregation.log
tmpLogList=/root/tmpLogList.log
logListConfig=/root/logList.conf
monthListConfig=/root/monthList.conf
tmpCountResult=/root/tmpCountResult.txt
tmpLogInsertJavascriptFile=/root/tmploginsertinsert.js
tmpCronLogFile=/root/tmpCronLog.log

###Filterlizedlog
cat /var/log/cron | grep 'CMD\ ' > ${tmpCronLogFile} 
for filename in `cat ${logListConfig}`
do
  grep -h "" ${filename} > ${tmpLogList}
  cat /dev/null > ${tmpLogInsertJavascriptFile}
  while read sentences
  do
    tmpMonth=`echo ${sentences} | awk -F ' ' '{print $1}'`
    tmpYearMonth=`grep ${tmpMonth} ${monthListConfig} | awk -F ',' '{print $2}'`

    tmpdatetime=`echo ${tmpYearMonth}`"-"`echo ${sentences} | awk -F ' ' '{print $2" "$3}'`
    tmphostname=`echo ${sentences} | awk -F ' ' '{print $4}'`
    tmpcontents=`echo ${sentences} | awk '{for(i=5;i<NF;++i){printf("%s ",$i)}print $NF}' | sed "s/'/''/g"`
    echo "db.logdata.update({ datetimecol: \""${tmpdatetime}"\", logfilename: \""${filename}"\", hostname: \""${tmphostname}"\", logcontent: \""${tmpcontents}"\"}, {\$inc: {hits: 1}},  {upsert:true}); " >> ${tmpLogInsertJavascriptFile}
  done < ${tmpLogList}
  mongo admin -u t_kyn_ana -p 秘密！！ < ${tmpLogInsertJavascriptFile}
  rm -f ${tmpLogList}
done

####mongo admin -u t_kyn_ana -p 秘密！！ < ${tmpLogInsertJavascriptFile}
rm -f ${tmpCronLogFile}
```

---

●os_forcelogrotate.sh
```
#!/bin/bash
#logrotate -fv /etc/logrotate.conf
/usr/sbin/logrotate -fv /etc/logrotate.conf

```

---

参考：

https://qiita.com/to-fmak/items/00cd757e7188188baf9a

---

### Jenkinsでできないこと
当たり前かもしれないですが、以下に関してはJenkinsでジョブの実行結果が取得できない理由から、実行不可でした。
・Apacheの再起動（systemctl restart httpd）
・OSシャットダウン（shutdown系のコマンド）

---

### 残更新事項


---

### あとがき
使い方は間違っているかと思いますが、Jenkinsはある意味ジョブ管理ツールとしても有用です。理由としてはjavaベースで稼働する点、比較的リソースを消費しなさそうなので、単一サーバであればJenkinsで十分かと思います。
また、OSSのジョブ管理ツールとしてはRundeckというOSSもあるようです。
最近なのか分からないですが、適当に入力すればrpmパッケージや手順をダウンロードできそうです。

---

参考：Rundeckに関するサイト

https://www.rundeck.com/downloads

https://qiita.com/aki-nasu/items/fd24be2566a01ac0935c