こんにちは。テクマトリックスの監物です。

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)を以下の手順で発行します。

  1. GitHubにサインイン
  2. 右上のユーザーアイコン > [Settings] > [Developer Settings] を選択
  3. [Personal access tokens] > [Tokens (classic)] を選択後、[Generate new token] から発行
    • workflowスコープの権限が必要です

JenkinsのAPI Tokenを以下の手順で発行します。

  1. Jenkinsにログイン
  2. 右上のユーザーアイコン > [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ファイルに出力されます。ジョブやステップの変換率などの情報が確認できるため、移行するか否かの判断や移行の計画を立てるのに役立ちます。

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>
Pull Request

まとめ

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