RundeckのGitHub連携（エクスポート機能）

Rundeckで作成したジョブ定義を、GitHubでバージョン管理できるようにします

## 本記事の概要
RundeckからGitHubへのエクスポート機能の利用方法について書いています
このエクスポート機能により、Rundeckで作成したジョブ定義をGitHubにバックアップが取れるようになります
なお、別環境への移行などを目的としたインポート機能もありますが、ひとまずはこのエクスポート機能が使えるようになれば、設定方法は概ね同じですのでわかると思います

### 前提
- GitHubアカウントを有すること
- 構築済みのRundeck実行環境があること
  - [構築のご参考：Rundeckを使ってみた](https://qiita.com/aki-nasu/items/fd24be2566a01ac0935c)

### 本記事で作成する情報
- GitHub
  - Rundeck用のリポジトリ
  - Personal Access Token
- Rundeck
  - Account Profile(GitHubのアカウント名を設定する)
  - Key Storage(GitHub Personal Access Tokenを登録する)
  - Projectの新規作成
    - ジョブの新規作成

## GitHub側の準備
### リポジトリを作成する
実運用を意識して次のようにしました(お試しであれば何でも構いません)
作成したら、リポジトリのURLを控えておきます
- リポジトリ: `my-automation` を作成する
- ブランチ: `rundeck` を作成する
  ![](https://i.imgur.com/XX4VJQj.png)
### Personal Access Tokenを生成する
Rundeckで使用するPersonal Access Tokenを生成します
- [Token設定ページ](https://github.com/settings/tokens)
  - 権限はrepoのみ
  - 生成直後に表示されるトークン情報を後で使用するため控えておく

## Rundeck環境を構築する
Rundeck環境の構築は別の記事を参考にしてください
- [構築のご参考：Rundeckを使ってみた](https://qiita.com/aki-nasu/items/fd24be2566a01ac0935c)
## Rundeck側の準備
### ログインアカウント情報を変更する
画面右上のProfileからアカウント情報を変更します
- Profileを選択する
  ![](https://i.imgur.com/d5Z6GBA.png)

それぞれGitHubで使用している情報を入力してください
- Email : GitHubで使用しているメールアドレス
- First Name : GitHubで使用しているアカウント名
  ![](https://i.imgur.com/Et9HSBI.png)

### GitHub Personal Access Tokenを登録する
GitHub側の準備で生成したGitHub Personal Access TokenをRundeckに登録します
- 画面右上のギアマークから`Key Storage`を選択する
  ![](https://i.imgur.com/SSCXM24.png)
- `Add or Upload a Key`を選択する
 ![](https://i.imgur.com/mpHSEu7.png)
- GitHub Personal Access Tokenを入力する
  ※Key Type以外はわかりやすければ何でもよい
  - Key Type : `Password`
  - Storage Path : `git-token`
  - Name : `<GitHub UserName>`
    ![](https://i.imgur.com/fmYvYuJ.png)

### プロジェクトを作成する
プロジェクトを作成します
プロジェクト作成時にいくつか設定が可能ですが、今回は名前だけ付けて作成します
  ![](https://i.imgur.com/6Zsrw1q.png)

### SCMの設定をする
SCMとは、Source Control Managementの略でGitやSVNなどのことです
今回はGitを使いますので次のように設定します
- 画面左下の `PROJECT SETTINGS`＞`SETUP SCM`を選択する
  ![](https://i.imgur.com/JwK8o1o.png)
- `SCM Export`＞`Setup`を選択する
  ![](https://i.imgur.com/LhV56mE.png)

#### SCMの設定内容
SCMに設定する内容のうち、変更箇所のみ説明します
- Commiter Name: `${user.firstName}`
- Git Repository
  - Synchronize Automatically: `true`
  - Create Branch if it doesn't exist: (チェックをつける)
  - Base branch on: `main`
  - Git URL: `https://<GitHubアカウント名>@github.com/<GitHubリポジトリ名>.git`
    - GitHubのURLに、`<GitHubアカウント名>@`を付ける
  - Branch: `rundeck`
- Job Source Files
  - File Path Template: `rundeck/jobs/${job.project}/${job.group}${job.name}`
  - Format: `yaml`
- Authentication
  - SSH: Strict Host Key Checking: `no`
  - Password Storage Path: (Rundeckに登録したGitHubのPersonal Access Token)

SCMの設定イメージ
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129204/063b33b0-3724-c3bd-1989-37ccdb9a1572.png)
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129204/45536e07-834c-4f43-f6d9-a1cc8c16f99b.png)


:warning: `File Path Template`の設定をこの通りにすると、ジョブ名を一意にしなければなりません
  分かりやすさを重視してUUIDを使用しない設定にしています
  ※Rundeckでジョブを作成するときにジョブ名の一意性を意識したくなければ、`${job.id}`を使用してください

設定すると、git cloneが実行されてRundeck側にローカルリポジトリができます
```bash
root@rundeck-vm:/var/lib/rundeck/projects/aki-nasu-prj-03/ScmExport# ls -la
total 16
drwxrwxr-x 3 rundeck rundeck 4096 Aug 21 02:17 .
drwxrwxr-x 3 rundeck rundeck 4096 Aug 21 02:17 ..
drwxrwxr-x 7 rundeck rundeck 4096 Aug 21 02:17 .git
-rw-rw-r-- 1 rundeck rundeck   15 Aug 21 02:17 README.md
```

### ジョブを作成、GitHubにpushする
設定は以上となります。ここでは実際にジョブを作成して確認します
SCMの設定をすると、`!`マークがジョブ名のところに付くようになります
commitやpushしていないなどの状態を示します(カーソルを合わせるとTooltipが表示されます)
- ジョブを作成する（何でも構いません）
- `Action`>`SCM Export Plugin`>`Commit Changes to Git`を選択する
  ![](https://i.imgur.com/a6G5XwK.png)
- gitのローカルリポジトリにCommit、リモートリポジトリにもPushする
  - Commit Message: コミットメッセージを入力する
  - Push Remotely?: `True`を選択する（リモートリポジトリにPushする）
  ![](https://i.imgur.com/EkIpMSz.png)
#### メモ: Commit時にエラー
Commit時にエラー `No changes to local git repo need to be exported` が出るこ
とがあります。その後、ジョブを微修正して再度1つずつコミットしたら問題なくCommit＆Pushができました
再度検証しなければ確定できませんが、以下のようなことをご参考にしてください。
Rundeck内で一意性のチェックをしているためエラーになっているような動きをしているような気がします。
- 別のジョブグループでも同名のジョブが存在するとエラーになる
- SCM設定： `Export UUID Behavior`を `remove`にしたほうがよい？

## 設定結果の確認
### GitHubのリモートリポジトリにPushできていることを確認する
確認のため、GitHub側を見に行きます
※試行錯誤のためコミットメッセージなどはテキトウになってます
![](https://i.imgur.com/6k2IwGI.png)
SCMの設定で記述した、`File Path Template`の値がパス、ファイル名に使用されていることがわかります

## おわりに
GitHubにRundeck上からジョブ定義をPushできるのは便利です。前回からの差分がでていることもGUIで確認することができます
また、ジョブの定義はXMLかYAML形式を選んで作成できる点もよいかとおもいます
間違っている点やわからない点がありましたらコメントをお願いいたします

## 追記
SCMの設定は個人のアカウントとGitHub Tokenを使用していますが、コミッターは上述の設定にしておけば反映されるのでチーム開発もひとまず問題なくできそうです
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129204/375f3bdd-6c88-9e82-e0e1-8e076a0223c3.png)

## 参考ドキュメント
https://docs.rundeck.com/docs/manual/projects/scm/
https://docs.rundeck.com/docs/manual/projects/scm/git.html