作業ファイルをJenkinsで定期的にミラリーングして、作業ファイルのバックアップを取る

# 概要
Jenkisnを利用して作業ファイルを定期的にサーバーに保存します。
作業PCが不意に壊れても、作業ファイルはサーバーに退避されているので一命をとりとめることができます。
ファイルの定期保存程度ならWindowsタスクに登録するのも糸つの手段ですが、サーバーで自動処理を管理することにより再度環境を整える場合などは簡潔になります

# 経緯
短期間の間に立て続けて作業PCが壊れて、悲しみを背負うことになりました。
その際に復旧までのレイテンシを短くするためにサーバー構築の本腰を入れようかなと思いいたりまして、最近はちょっと趣味にもなりつつあるのですが、作業ファイルの自動保存はまぁメンタルに結構よかったので皆さんに紹介したいなと考えた所存です。

# 作業環境
- クライアントPC　Windws 11
　- [Java](https://www.oracle.com/java/technologies/downloads/#jdk23-windows) 
　- [python](https://www.python.org/)
　- [git](https://git-scm.com/)
- サーバー Ubuntu 24.04
　- [Docker](https://www.docker.com/ja-jp/)
　- [DockerCompose](https://docs.docker.com/compose/)

# 注意事項
事故防止のために冗長となりますが、先に記述しておきます。
ファイルのコピー先を間違えると危険ですので慎重に行ってください。

以下の作業の部分となります
- GitBucketのリポジトリのファイルを変更
- 適宜環境に合わせてコピー元とコピー先のフォルダを設定してください
```sh:AutomationPipeline\worker\cacheConfig.json
{
    "Assets":{
        "from":"D:\\Work\\Container\\Assets",
        "to": "\\\\portableserver\\AirBase\\hanger\\Container\\Assets"
    },
    "Products":{
        "from":"D:\\Work\\Container\\Products",
        "to": "\\\\portableserver\\AirBase\\hanger\\Container\\Products"
    },
    "WorkSpace":{
        "from":"D:\\Work\\Container\\WorkSpace",
        "to": "\\\\portableserver\\AirBase\\hanger\\Container\\WorkSpace"
    }
}
```

# Source
・おすすめのサーバーサービス
[server](https://github.com/koiusa/SustainableEnv/tree/recommend)

・Jenkinsエージェント
[agent](https://github.com/koiusa/jenkinsAgent)

・ファイルミラーリングスクリプト
[script](https://github.com/koiusa/AutomationPipeline/tree/worker)

# 環境構築

## サーバー
### Docker及びDockerCompose
- [おすすめのサーバーサービス](https://github.com/koiusa/SustainableEnv/tree/recommend)からSetupを起動してインストールしてしてください   

### Jenkins
- [おすすめのサーバーサービス](https://github.com/koiusa/SustainableEnv/tree/recommend)からJenkisnsをインストールしてください

### GitBucket
- [おすすめのサーバーサービス](https://github.com/koiusa/SustainableEnv/tree/recommend)からGitBucketをインストールしてください

## クライアント
### Java
- 公式サイトから最新のJDKをダウンロードしてインストール

### Paython
- 公式サイトから最新のPythonをダウンロードしてインストール 

# 環境設定

## JenkinsのJobのリポジトリをGitBucketに作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953463/095a1d72-51b5-81c0-cf2f-4c8b7f8c2e33.png)

- ローカルで起動しているサービスなので外部に公開しないのであれば、Publicで問題ないです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953463/7cca4d19-5a20-effa-948c-a262baa82d75.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953463/05966a73-a1f9-03ea-5ebc-96818e8067bd.png)

- リポジトリ作成後、任意の場所に空のディレクトリを作成し「Open Git Bush here」でgit bashを起動してください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953463/0ae7b92e-9d76-2662-3725-22a2b7df0d0e.png)

ローカルリポジトリを初期化
```sh
touch README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin http://portableserver:8083/git/root/AutomationPipeline.git
git push -u origin main
```

サンプル用のリモートリポジトリのURLの参照を追加
```sh
git remote add upstream https://github.com/koiusa/AutomationPipeline.git
```

リモートリポジトリ参照を確認
```sh
$ git remote -v
origin  http://portableserver:8083/git/root/AutomationPipeline.git (fetch)
origin  http://portableserver:8083/git/root/AutomationPipeline.git (push)
upstream        https://github.com/koiusa/AutomationPipeline.git (fetch)
upstream        https://github.com/koiusa/AutomationPipeline.git (push)
```

リモートリポジトリ参照情報を取得
```sh
$ git fetch upstream
remote: Enumerating objects: 17, done.
remote: Counting objects: 100% (17/17), done.
remote: Compressing objects: 100% (12/12), done.
remote: Total 17 (delta 1), reused 12 (delta 0), pack-reused 0 (from 0)
Unpacking objects: 100% (17/17), 7.35 KiB | 278.00 KiB/s, done.
From https://github.com/koiusa/AutomationPipeline
 * [new branch]      main       -> upstream/main
 * [new branch]      worker     -> upstream/worker
```

リモートリポジトリの更新をTrack
```sh
git branch -u upstream/worker
```

作成したGitBucketのリポジトリにプッシュ
```sh
git checkout main
git checkout --no-track -b worker refs/heads/main
git merge upstream/worker --allow-unrelated-histories
git push origin refs/heads/worker --set-upstream --verbose
```

GitBucketのリポジトリのファイルを変更
適宜環境に合わせてコピー元とコピー先のフォルダを設定してください
```sh:AutomationPipeline\worker\cacheConfig.json
{
    "Assets":{
        "from":"D:\\Work\\Container\\Assets",
        "to": "\\\\portableserver\\AirBase\\hanger\\Container\\Assets"
    },
    "Products":{
        "from":"D:\\Work\\Container\\Products",
        "to": "\\\\portableserver\\AirBase\\hanger\\Container\\Products"
    },
    "WorkSpace":{
        "from":"D:\\Work\\Container\\WorkSpace",
        "to": "\\\\portableserver\\AirBase\\hanger\\Container\\WorkSpace"
    }
}
```

変更内容をGitBucketのリポジトリに反映
```sh
git add .
git commit -m "何かコメント"
git push origin refs/heads/worker --set-upstream --verbose
```

## JenkinsのAgentの起動
- Jenkinsのワーカーノードを作成します
- ダッシュボード＞ビルド実行状態＞New Node
- ノード名は任意ですが、今回使用するサンプルのファイルミラーリングスクリプトは名称「Worker」を前提としているため「Worker」としてください。分かる方は適宜変更していください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953463/44b8e855-9110-e83f-9253-397241da87cc.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953463/70b0e6ce-6085-17b5-9553-cd09a2decacd.png)

- ノード一覧に追加されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953463/f1aa94b2-14e0-3c89-4717-edaf066f9cd3.png)

- 一覧からworkerノードを開くとエージェント起動用のスクリプトが表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953463/f3e668a2-a3c2-a983-f8ec-b023e88b05e8.png)

- 表示されたスクリプトを実行してもエージェントは起動できますが、サービスとして起動した方が何かと都合がよいためサービスとして起動します  

- [AjentService](https://github.com/koiusa/jenkinsAgent/tree/main/windows)

- 上記リンクを一式クライアントPCにダウンロードし、setting.iniに表示されている各情報を転記し、install.batを実行してください
- 梱包されているexeは[winsw](https://github.com/winsw/winsw)を使用しています

- 無事起動できれば、以下のようになります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953463/6a328a71-7d69-d7e9-a92b-b3028a051f85.png)

## JenkinsのJobの作成
- 新しいジョブを作成します
- ダッシュボード>新規ジョブ作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953463/9f49d140-bedd-3931-b886-2002c66f9c56.png)

- Multobranch Piplineを作成してください
- gitなどのソース管理サービスからジョブを作成する機能です
- 名称は任意です、今回は「AutomationPipeline」とします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953463/fa1d19cd-8770-e321-9465-8bbff63f0da0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953463/9966be9a-1fb8-a313-196f-1503b1fdae18.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953463/ccf0008e-f7b0-5db6-9486-b5d80ca7ab00.png)

- 事前に、GitBucketに作成した[ファイルミラーリングスクリプト](https://github.com/koiusa/AutomationPipeline/tree/worker)のリポジトリを選択してください
※Githubのリポジトリでも稼働しますが、GithubのApiの制限でJobの実行に待ち時間が発生します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953463/9ed6318d-4762-ee1e-39cf-640d6a9ceeac.png)
※DNSサーバを参照していない場合、mDNSするためUbuntuからLAN内の名前解決をする場合、サーバー名の後に[.local]が必要です。
例：http://portableserver.local:8083/root/AutomationPipeline

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953463/11c2a40e-b555-e6fc-8056-678cfdd2b2b3.png)

「Scan Multibranch Pipeline Now」を実行すると自動処理が開始されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953463/6592cf7a-bf19-33e2-6e45-714b69c1f5fc.png)


結果を確認します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953463/3b8e885d-eee7-39b4-32c7-086476ff75eb.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953463/28de8b53-2168-06dc-b62c-07136384545d.png)


以上

# 補足
Jenkisでの自動処理は上記の内容となります。
スクリプトの内容で自動処理の加々美が変わります。
基本的にはリポジトリ内のJenkinsファイルが処理内容となります。

各ノードのスクリプトコンソールでコマンドが有効か確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953463/cf2815ec-7c6c-a4eb-5783-5224fa671f0c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953463/a3159179-5b06-4475-eccc-f148b84d6440.png)