JenkinsとGitHubを使って自動ビルドしたい

ソフトウェア

はじめに

本記事はJenkinsとGitHubを連携してGitHubのmainブランチにプッシュされた際に自動的にビルドを行い成果物をSSHで別のサーバーへ送信するところまでを行います。
本記事でGitHubへの接続の設定を個人アクセストークンとSSH方式の両方で行っていますがどちらか片方で問題ありません。またパブリックリポジトリの場合は必要ありません。

環境

  • Ubuntu Server: 24.04.1
  • Jenkins: 2.479.2
  • Java: 17

手順

Jenkinsのインストール

まずJenkinsはJavaアプリケーションなのでJavaが必要です。以下のコマンドを実行しインストールされているか確認してください

Bash
 java -version

インストールされてない場合:

Bash
sudo apt update
sudo apt install fontconfig openjdk-17-jre

JavaのインストールができたらJenkinsをインストールします。(以下のコマンドはUbuntu用)

Bash
sudo wget -O /usr/share/keyrings/jenkins-keyring.asc \
  https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key
echo "deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc]" \
  https://pkg.jenkins.io/debian-stable binary/ | sudo tee \
  /etc/apt/sources.list.d/jenkins.list > /dev/null
sudo apt-get update
sudo apt-get install jenkins

インストール後にJenkinsが起動しているか確認します。

Bash
sudo systemctl status jenkins

「Active: active (running)」となっていればOKです。なっていなければ起動します。

Bash
sudo systemctl start jenkins #起動していない場合

Jenkinsのセットアップ

Jenkinsをインストールしたサーバーの8080ポートにブラウザからアクセスします。アドレスは「http://”アドレス”:8080」(“アドレス”にはサーバーのアドレス)です。

アクセスすると以下のような画面になります。

この画面になったら以下のコマンドで管理者パスワードを取得して入力します。

Bash
sudo cat /var/lib/jenkins/secrets/initialAdminPassword

Continueを押し、以下の画面になったら今回は「Install suggested plugins」を選択します。

インストールが完了するまでしばらく待ちます。

GitHubと連携するための設定(個人アクセストークン)

以下の設定はGitHubにアクセストークンで接続する際に必要となる設定です。
SSHを使用する場合不要です。

GitHubで個人アクセストークンの取得

GitHubにアクセスし右上のアイコンをクリックし「Settings」を選択します。
左側のメニューから「Developer settings」をクリックします。

Developers settingsから「Personal access tokens」の「Tokens(classic)」を選択します。

Generate new tokenをクリックし、「Generate new token(classic)」を選択します。

トークンの期限を選択します。(今回は90日)
下の選択肢から「repo」をチェックし画面の一番下の「Genarate Token」をクリックしトークンを生成します。

トークンが生成されると以下のような画面になります。

Jenkinsの設定

Jenkinsに戻り「Credentials」を選択します。

System -> グローバルドメイン -> Add credentialsの順に選択します。

New credentialsで種類はユーザー名とパスワードを選択、ユーザー名にGitHubのユーザー名、パスワードに先ほど作成したトークン、IDにはわかりやすいように適当な名前を入力してCreateをクリックします。

以上で個人アクセストークンを使用するための設定は完了です。

GitHubと連携するための設定(SSH)

以下の設定はGitHubにSSHで接続する際に必要となる設定です。
Access Tokenを使用する場合不要です。
複数人で共有する場合アクセストークンの使用を推奨します。

SSH鍵の準備

ターミナルからSSHキーを作成します。以下のコマンドを実行しすべてEnterをクリックします。

Bash
ssh-keygen -t ed25519

GitHubへ鍵の登録

以下のコマンドで公開鍵を取得します。コマンドの結果をコピーしておきます。

Bash
cat .ssh/id_ed25519.pub

GitHubのSettingsから「SSH and GPG keys」を選択し、右上の「New SSH key」をクリックします。

Titleに適当な名前を、Keyに先ほどコピーした公開鍵を入力し「Add SSH key」をクリックします。

Jenkinsの設定

ターミナルで以下のコマンドを実行し秘密鍵の中身を取得しコピーしておきます。
秘密鍵ですので扱いには注意して下さい。

Bash
cat .ssh/id_ed25519

Jenkinsに戻り「Credentials」を選択します。
CredentialsからSystem -> グローバルドメイン -> Add credentialsの順に選択します。

New credentialsで種類はSSHユーザー名と秘密鍵を選択します。、IDにはわかりやすいように適当な名前を、IDにはGitHubのユーザー名を入力します。秘密鍵の直接入力を選択「Add」をクリックし、先ほどの秘密鍵を入力してCreateをクリックします。

Jenkinsの管理から「Security」を選択します。

Securityの画面下部の「Git Host Key Verification Configuration」のHost Key Verification Strategyを「Accept first connection」に変更して保存します。

以上で個人アクセストークンを使用するための設定は完了です。

SSHで成果物を送信するための設定

以下の設定はSSHで成果物を送信するための設定です。

プラグインのインストール

Jenkinsの管理からPluginsを選択します。

Available pluginsを選択

上の検索から「Publish Over SSH」と検索

Installをチェックし、右上のInstallを押します。

SSHホストの登録

Jenkinsの管理からを選択します。

下側にある「Publish over SSH」からSSH Serversの「追加」をクリックします。

Nameに適当な名前、HostnameにSSH接続先のアドレス、Usernameに接続先のユーザーネーム、「Use password authentication, or use a different key」をチェックしパスワードなどの必要なものを入力します。

下にある「Test Configuration」をクリックし「Success」となれば成功です。保存して設定は終わりです。

プロジェクトの設定

プロジェクトの作成

Jenkinsのトップにもどり「新規ジョブ作成」をクリックします。

適当な名前を入力し、「フリースタイル・プロジェクトのビルド」を選択し「OK」をクリックします。

GitをチェックしリポジトリのURLを入力し認証情報に先ほど登録した設定を選択します。

個人アクセストークンを使用する場合はHTTPSをSSHを使用する場合はSSHのURLを入力してください。

リポジトリのブランチを選択します。今回はmainブランチを使用します。デフォルトだとmasterになっているので自分の環境に合わせてください。

GitHubへのプッシュで自動ビルドするための設定

「GitHub hook trigger for GITScm polling」をチェックします。

GitHubへ移動し使用するリポジトリのSettingsを選択します。

左側のメニューから「Webhooks」を選択、「Add webhook」をクリックします。

「Payload URL」にjenkinsのアドレスに/github-webhook/を足したものを入力し保存します。

Jenkinsに戻ります。

ビルドの設定

ビルド手順を追加をクリックしビルド方法を選択します。今回は例としてGradleを使用します。

Gradleの例:

成果物をSSHで送信するための設定

「ビルド後の処理の追加」をクリックし、「Send build artifacts over SSH」を選択します。

Nameに先ほど登録したSSH設定を選択、Source filesに送りたいファイルを選択、Remove prefixはSource filesにディレクトリが含まれる場合そのディレクトリも送られてしまうのですがそれを削除する設定です。
以下の設定の場合build/libs/ディレクトリのなかの.jarのすべてのファイルを/build/libsをなくしたものを送信します。(つまり送信されるのは.jarファイルをだけです。)
また、ファイルがわからない場合登録せずにビルドを行い、ワークスペースから確認してから登録することをお勧めします。

「*.jar」のようにワイルドカードが使用できます。

プロジェクトを保存します

テスト

GitHubの指定したブランチにプッシュをして自動でビルドが始まれば成功です。
ビルドが実行されているかはプロジェクトのページから見れます。

おわりに

ここまで読んでいただきありがとうございます。動かない場合やこの記事が間違っている場合教えていただけると助かります。

参考

Jenkins User Documentation:https://www.jenkins.io/doc/

コメント

タイトルとURLをコピーしました