こんにちは。テクマトリックスの監物です。
GitHub Actionsには他のCI/CDプラットフォームからの移行ツールとしてGitHub Actions Importerが用意されています。今回はこのツールでJenkinsのジョブをGitHub Actionsのワークフローにどの程度移行できるか試してみたのでご紹介します。
目次
GitHub Actions Importerとは
GitHub Actions ImporterはGitHubが公式に提供している他のCI/CDプラットフォームからの移行ツールで、既存のCI/CDの処理をGitHub Actionsのワークフローに自動で変換します。対象の構成にもよるようですが変換率80%を目標にしているようです。GitHub Actions ImporterはDockerコンテナとして配布されていて、GitHub CLI経由で利用します。
サポートプラットフォーム
- Azure DevOps
- Bamboo
- Bitbucket
- CircleCI
- GitLab
- Jenkins
- Travis CI
前提条件
- Dockerがインストールされていること
- GitHub CLIがインストールされていること
移行手順
今回は、GitHub Actions ImporterをJenkinsに利用してみます。
GitHub Actions Importer CLI拡張機能のインストール
以下のコマンドを実行してGitHub CLIに拡張機能をインストールします。
gh extension install github/gh-actions-importer
以下のコマンドを実行してGitHub Actions Importerのコンテナイメージを最新バージョンに更新します。
gh actions-importer update
認証情報の設定
GitHub Actions ImporterはGitHubとJenkinsに接続するため、GitHubのPersonal access token(classic)
とJenkinsのAPI Token
の発行が必要です。
GitHubのPersonal access token(classic)
を以下の手順で発行します。
- GitHubにサインイン
- 右上のユーザーアイコン > [Settings] > [Developer Settings] を選択
- [Personal access tokens] > [Tokens (classic)] を選択後、[Generate new token] から発行
- workflowスコープの権限が必要です
JenkinsのAPI Token
を以下の手順で発行します。
- Jenkinsにログイン
- 右上のユーザーアイコン > [Security] を選択後、APIトークンの [トークン新規追加] から発行
トークンを発行したら、以下のようにconfigure
コマンドを実行してGitHubとJenkinsに接続できるように資格情報などを対話形式で設定します。設定情報は.env.local
ファイルに出力されますが、平文なので取り扱いには注意が必要です。
gh actions-importer configure
V Which CI providers are you configuring?: Jenkins
Enter the following values (leave empty to omit):
V Personal access token for GitHub: ****************************************
V Base url of the GitHub instance: https://github.com
V Personal access token for Jenkins: **********************************
V Username of Jenkins user: xxxx
V Base url of the Jenkins instance: http://xxxx:8080
Environment variables successfully updated.
Jenkinsの移行
試しに4種類のジョブを管理しているJenkinsに対してGitHub Actions Importerを利用してみます。
- マルチブランチパイプライン(宣言型)
- パイプライン(宣言型)
- パイプライン(スクリプト)
- フリースタイル
ジョブの変換
以下のようにaudit
コマンドを実行すると、configure
コマンドで指定したJenkinsのジョブがすべてチェックされてGitHub Actionsのワークフローに変換されます。変換されたワークフローや変換結果のサマリーなどは--output-dir
オプションで指定したディレクトリに出力されます。
gh actions-importer audit jenkins --output-dir tmp/audit
サマリーはaudit_summary.md
ファイルに出力されます。ジョブやステップの変換率などの情報が確認できるため、移行するか否かの判断や移行の計画を立てるのに役立ちます。

サマリーではジョブが以下のように対応しているため、パイプライン(スクリプト)だけ未サポートで変換されなかったことが確認できました。
- マルチブランチパイプライン(宣言型):org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject
- パイプライン(宣言型):flow-definition
- パイプライン(スクリプト):scripted
- フリースタイル:project
他にもステップではメール通知が未サポートで変換されなかったものの、それ以外は問題がなかったことを確認できました。なお、移行のサポート範囲についてはドキュメントから確認できます。
変換されたワークフローはジョブ毎に出力されます。以下のパイプライン(宣言型)がどう変換されたか確認します。
pipeline {
agent {
label 'test'
}
stages {
stage('Build') {
steps {
bat 'build.bat'
}
}
stage('Test'){
steps {
bat 'test.bat'
}
post {
always {
junit 'reports/**/*.xml'
}
}
}
stage('Deploy') {
when {
branch 'main'
}
steps {
bat 'deploy.bat'
}
}
}
}
以下のようなワークフローに変換されました。パイプラインに日本語が含まれていると、文字化けにより正常に変換されないことがあるのでご注意ください。
name: declarative-pipeline
on:
workflow_dispatch:
jobs:
Build:
runs-on: windows-latest
steps:
- name: checkout
uses: actions/checkout@v4.1.0
- name: bat
shell: cmd
run: build.bat
Test:
runs-on: windows-latest
needs: Build
steps:
- name: checkout
uses: actions/checkout@v4.1.0
- name: bat
shell: cmd
run: test.bat
- name: Publish test results
uses: EnricoMi/publish-unit-test-result-action@v2.12.0
if: always()
with:
junit_files: reports/**/*.xml
Deploy:
if: github.ref == 'refs/heads/main'
runs-on: windows-latest
needs: Test
steps:
- name: checkout
uses: actions/checkout@v4.1.0
- name: bat
shell: cmd
run: deploy.bat
ほぼ問題なく変換されていて移行の際はとても助かりそうです。以下が気になりましたがいずれも大きな手間にはならなそうです。
- ワークフローのトリガーの調整が必要
- ランナーの調整が必要(セルフホステッドランナーを利用する場合など)
- アクションのバージョンが古い
Pull Requestの作成
以下のようにmigrate
コマンドを実行すると、変換したワークフローでPull Requestを作成することができます。--target-url
オプションにはGitHubリポジトリのURL、--source-url
にはJenkinsジョブのURLを指定します。
gh actions-importer migrate jenkins --target-url https://github.com/<user>/<repo_name> --output-dir tmp/migrate --source-url http://xxxx:8080/job/<job_name>

まとめ
GitHub Actions Importerを利用するとJenkinsからの移行を自動化することができます。変換されたワークフローは多少の手直しが必要な場合がありますが一から作成するよりも効率が良く、とても助かりそうです。セットアップも簡単でJenkins以外のCI/CDプラットフォームにも利用できますので移行を検討している方は試してみてはいかがでしょうか。