Jenkinsのパイプラインでsubmoduleをごにょごにょする

サブモジュールの更新を反映する方法をめちゃくちゃ悩んだので、備忘として記載する。
（もしかすると、つよつよエンジニアからすれば何言ってんだコイツってなるかもしれませんが、生暖かい目で見守ってもらえると嬉しいです。）
（あと、今回初めて書くので、書き方とかおかしかったらごめんなさい）
# 前提

　・gitlab、Jenkinsはプライベートサブネットに構築
　・両者には踏み台を経由してHTTPで接続（SSHポートフォワード）
　・原則として、teratermなどのターミナルは使用しない（Jenkinsのジョブとして操作する）
　　※コードの修正はVScodeを使用する

# 問題（そもそも）

　VScodeでサブモジュールの更新をかけるのが難しい。
　　↓
　理由は、サブモジュールの参照先のアドレスがGitLab上はローカルIPアドレスなのに対して、VScode上ではlocalhostのXXXXポートだから

# 解決策その１（方針）

　仕方ないので、ローカルIPで接続を確立できるJenkinsのWorkspaceでサブモジュールをアップデートし、リモートリポジトリに反映する（したい）。


### 最初に書いたPipelineのコード

```
pipeline{
    agent any

    stages {
        stage('git clone'){ //アップデートをかけるサブモジュールのあるレポジトリをクローンする。
            steps{
                git branch: 'XXXX', credentialsId: 'XXXXX', url: 'git@<リポジトリのアドレス>/<リポジトリのディレクトリ>.git'
            }
        }
        stage('check_b'){ 
            steps{
                //クローンしたリポジトリの確認
                sh 'pwd'
                sh 'ls -la'
                //サブモジュール内部も確認
                dir('/var/lib/jenkins/workspace/<パイプラインのWorkSpace>/<サブモジュールのディレクトリ>'){
                    sh 'pwd'
                    sh 'ls -la'
                }
            }
        }
        stage('update_submodule') {
            steps {
                dir('/var/lib/jenkins/workspace/<パイプラインのWorkSpace>/<サブモジュールのディレクトリ>'){
                    //サブモジュールの中身が表示されるようにする
                    sh 'git submodule init'
                    sh 'git submodule update --remote'
                }
            }
        }
        stage(check_a){
            steps{
                dir('/var/lib/jenkins/workspace/<パイプラインのWorkSpace>/<サブモジュールのディレクトリ>'){
                    sh 'pwd'
                    sh 'ls -la'
                }
            }
        }
    }
}
```

# 結果

　あほほど的外れ
　
　check_aの結果は惨敗、更新されずに終わる。

# 結果を受けて、いろいろ調べたら…

惨敗したので、とりあえずDMZ（パブリックサブネット）にサーバ立てて、通常時の動作を確認した。

### サブモジュールの更新を反映する方法

　リポジトリA：サブモジュール**が**登録されていリポジトリ
　リポジトリB：サブモジュール**として**登録されているリポジトリ

　⓪ リポジトリBを更新する

　① リポジトリAの /リポジトリB ディレクトリに移動し、`git submodule update -i` を実行する
　② リポジトリAの / （root）に移動し、`git submoduke update --remote` を実行する

　ーーーーここまでで、ローカルリポジトリでサブモジュールの更新ができた

　③リポジトリＡの / （root）で、`git commit -a -m "<コメント>"` を実行する
　④リポジトリＡの / （root）で、`git push origin main` を実行する

　ーーーーここまでで、リモートリポジトリでサブモジュールの更新ができた

### piplineの中でディレクトリを移動して実行した処理は、`dir()` を抜けたら結果が維持されない問題

　前項、反映する方法で、リポジトリBのディレクトリ→リポジトリAの`/`という風に移動する。
　この移動により、前項①の内容が、②、③、④のときにクリアされていて、エラーが起きる…

# 解決策その２（方針）

とりあえず、サブモジュールの更新方法はわかったので、それをコードに起こしていく。

```
pipeline{
    agent any

    stages {
        stage('git clone'){ //アップデートをかけるサブモジュールのあるレポジトリをクローンする。
            steps{
                git branch: 'main', credentialsId: '<Jenkinsに保存したクレデンシャル>', url: 'git@<リポジトリのアドレス>:<リポジトリのディレクトリ>.git'
            }
        }
        stage('update_submodule') {
            steps {
                dir('/var/lib/jenkins/workspace/<パイプラインのワークスペース>/<サブモジュールのディレクトリ>'){
                    //サブモジュールの中身を取得する
                    sh 'git submodule update -i'
                    //表示されることを確認する
                    sh 'pwd'
                    sh 'ls -la'
                    //サブモジュールの更新を取得する
                    sh 'git submodule update --remote'
                    //更新が反映されていることを確認する
                    sh 'pwd'
                    sh 'ls -la'
                    //ここから解決できていない部分
                    dir('/var/lib/jenkins/workspace/<パイプラインのワークスペース>'){
                        //リモートリポジトリに更新を反映する
                        sh 'git commit -a -m "submodule update"'
                        sh 'git push origin main'
                    }
                }
            }
        }
}
```

# 今後の予定

ディレクトリの移動に関する部分を解消したい。