GitHub ActionsのSelfhosted Runnerを使って社内ネットワークにあるサーバーにデプロイを行う
社内ネットワーク※上のサーバーに、GitHub Actionsを使ってCI/CDするためには、Selfhosted Runnerの利用が必要です。
そこで今回は、Selfhosted Runner導入の手順を紹介します。
導入したサーバーのOSは、RHEL8系のRockey Linux8です。Selfhosted Runnerは、Linuxの他にもWindowsやMacOSへの導入もサポートされています。なお、RHEL9で試したところ、GitHubとの接続ができない問題が発生しました。
※ここでの社内ネットワークの定義は、インターネットから直接ネットワーク内のサーバーにアクセスできないという環境を指しています。
事前確認
GitHubリポジトリの作成
- Selfhosted Runnerを使うリポジトリを作成する
Proxy設定の確認
ここからのコマンドは、Selfhosted Runnerを導入するOSで実行します。
-
下記コマンドを実行して、環境変数にProxyが設定されていることを確認する
$ set | grep PROXY HTTPS_PROXY=http://proxy.example.com:8080 HTTP_PROXY=http://proxy.example.com:8080 NO_PROXY=169.254.169.254
Selfhosted Runnerのダウンロードと設定
Selfhosted Runnnerのダウンロード
ここでは、動作確認のために仮のインストール場所にモジュールを展開します。
-
Selfhosted Runnerを使いたいリポジトリの設定を開く
-
左メニュー「Actions」->「Runners」を開き、「New self-hosted runner」を押す。
-
Linuxを選択して、下記のように「Download」に表示されたコマンドを順に入力する。なお、モジュールのチェックサムの確認は省略する
mkdir actions-runner && cd actions-runner curl -o actions-runner-linux-x64-2.292.0.tar.gz -L https://github.com/actions/runner/releases/download/v2.292.0/actions-runner-linux-x64-2.292.0.tar.gz tar xzf ./actions-runner-linux-x64-2.292.0.tar.gz
-
下記コマンドを実行して、tar.gzファイルを削除する
rm ./actions-runner-linux-x64-2.292.0.tar.gz
Selfhosted Runnnerの設定
-
installdependencies.shを実行する。
$ sudo ./bin/installdependencies.sh --------OS Information-------- NAME="Rocky Linux" VERSION="8.6 (Green Obsidian)" ... ----------------------------- Finish Install Dependencies -----------------------------
-
下記のようにブラウザに表示されているconfig.shコマンドを実行する。途中、設定に関する質問があるので適当に答える。
$ ./config.sh --url https://github.com/hoge/fuga --token AAAAAAAAAAAAAAHOGEFUGA -------------------------------------------------------------------------------- | ____ _ _ _ _ _ _ _ _ | | / ___(_) |_| | | |_ _| |__ / \ ___| |_(_) ___ _ __ ___ | | | | _| | __| |_| | | | | '_ \ / _ \ / __| __| |/ _ \| '_ \/ __| | | | |_| | | |_| _ | |_| | |_) | / ___ \ (__| |_| | (_) | | | \__ \ | | \____|_|\__|_| |_|\__,_|_.__/ /_/ \_\___|\__|_|\___/|_| |_|___/ | | | | Self-hosted runner registration | | | -------------------------------------------------------------------------------- # Authentication √ Connected to GitHub # Runner Registration Enter the name of the runner group to add this runner to: [press Enter for Default] Enter the name of runner: [press Enter for rocky8-runner] This runner will have the following labels: 'self-hosted', 'Linux', 'X64' Enter any additional labels (ex. label-1,label-2): [press Enter to skip] √ Runner successfully added √ Runner connection is good # Runner settings Enter name of work folder: [press Enter for _work] √ Settings Saved.
Selfhosted Runnerの接続確認
-
run.shを実行する
$ ./run.sh √ Connected to GitHub Current runner version: '2.292.0' 2022-06-14 07:38:08Z: Listening for Jobs
-
ブラウザでRunnerのページに行き、ランナーが表示され、状態がidleになっていることを確認する
-
Ctrl+Cを押してrun.shの実行を終了する
Selfhosted Runner用ユーザーの作成と自動起動の設定
ここからが山場という…。
Selfhosted Runner用OSユーザーとホームディレクトリの作成
-
useraddでユーザーとホームディレクトリを作る
sudo useradd runner
ファイルの移動
-
下記コマンドを実行して、ファイルを移動して所有者を変える
$ sudo mv * /home/runner/ $ sudo mv .* /home/runner/ mv: '.' から '/home/runner/.' へ移動できません: デバイスもしくはリソースがビジー状態です mv: '..' から '/home/runner/..' へ移動できません: デバイスもしくはリソースがビジー状態です $ sudo chown -R runner:runner /home/runner/
Proxy設定の追加
サービスとして起動すると環境変数のProxyの設定を使ってくれないため。
-
.envファイルにProxyの設定を追加する
sudo -u runner sh -c "echo 'http_proxy=http://proxy.example.com:8080' >> /home/runner/.env" sudo -u runner sh -c "echo 'https_proxy=http://proxy.example.com:8080' >> /home/runner/.env" sudo -u runner sh -c "echo 'no_proxy=169.254.169.254' >> /home/runner/.env"
サービスの追加
svc.sh installコマンドは、相対パスかつrootで実行しないといけないので、下記のようにsudoを実行します。
-
下記コマンドを実行して、サービスを追加する。
$ sudo sh -c "cd /home/runner; ./svc.sh install runner" Creating launch runner in /etc/systemd/system/actions.runner.hoge-fuga-selfhosted-runner.rocky8-runner.service Run as user: runner Run as uid: 1001 gid: 1001 Relabeled /etc/systemd/system/actions.runner.hoge-fuga-selfhosted-runner.rocky8-runner.service from unconfined_u:object_r:user_home_t:s0 to unconfined_u:object_r:systemd_unit_file_t:s0 Created symlink /etc/systemd/system/multi-user.target.wants/actions.runner.hoge-fuga-selfhosted-runner.rocky8-runner.service → /etc/systemd/system/actions.runner.hoge-fuga-selfhosted-runner.rocky8-runner.service.
SELinuxの設定を変更
SELinuxを有効にしている環境では、下記のようにrunsrc.shのタグを変更します。
-
下記コマンドを実行してSELinuxのタグを変更する
$ sudo semanage fcontext -a -t usr_t /home/runner/runsvc.sh $ sudo restorecon -v /home/runner/runsvc.sh Relabeled /home/runner/runsvc.sh from unconfined_u:object_r:user_home_t:s0 to unconfined_u:object_r:usr_t:s0
Selfhostef Runnerサービスの起動と確認
-
下記コマンドを実行してサービスを起動する
$ sudo sh -c "cd /home/runner; ./svc.sh start" /etc/systemd/system/actions.runner.hoge-fuga-selfhosted-runner.rocky8-runner.service ● actions.runner.hoge-fuga-selfhosted-runner.rocky8-runner.service - GitHub Actions Runner (hoge-fuga-selfhosted-runner.rocky8-runner) Loaded: loaded (/etc/systemd/system/actions.runner.hoge-fuga-selfhosted-runner.rocky8-runner.service; enabled; vendor preset: disabled) Active: active (running) since Wed 2022-06-15 16:36:06 JST; 14ms ago Main PID: 1491 (runsvc.sh) Tasks: 0 (limit: 10992) Memory: 0B CGroup: /system.slice/actions.runner.hoge-fuga-selfhosted-runner.rocky8-runner.service └─1491 /bin/bash /home/runner/runsvc.sh 6月 15 16:36:06 rocky8-runner systemd[1]: Started GitHub Actions Runner (hoge-fuga-selfhosted-runner.rocky8-runner).
-
下記コマンドを実行してサービスの状態がactiveであることを確認する。ログに、Connected to GitHubと表示されていることを確認する
$ sudo sh -c "cd /home/runner; ./svc.sh status" /etc/systemd/system/actions.runner.hoge-fuga-selfhosted-runner.rocky8-runner.service ● actions.runner.hoge-fuga-selfhosted-runner.rocky8-runner.service - GitHub Actions Runner (hoge-fuga-selfhosted-runner.rocky8-runner) Loaded: loaded (/etc/systemd/system/actions.runner.hoge-fuga-selfhosted-runner.rocky8-runner.service; enabled; vendor preset: disabled) Active: active (running) since Wed 2022-06-15 16:36:06 JST; 18s ago Main PID: 1491 (runsvc.sh) Tasks: 26 (limit: 10992) Memory: 46.0M CGroup: /system.slice/actions.runner.hoge-fuga-selfhosted-runner.rocky8-runner.service ├─1491 /bin/bash /home/runner/runsvc.sh ├─1494 ./externals/node16/bin/node ./bin/RunnerService.js └─1501 /home/runner/bin/Runner.Listener run --startuptype service ... 6月 15 16:36:06 rocky8-runner runsvc.sh[1494]: Started running service 6月 15 16:36:09 rocky8-runner runsvc.sh[1494]: √ Connected to GitHub 6月 15 16:36:10 rocky8-runner runsvc.sh[1494]: Current runner version: '2.292.0' 6月 15 16:36:10 rocky8-runner runsvc.sh[1494]: 2022-06-15 07:36:10Z: Listening for Jobs
-
ブラウザでRunnerのページに行き、状態がidleになっていることを確認する
-
OSを再起動する
sudo reboot
-
ブラウザでRunnerのページに行き、しばらく待つと状態がidleになることを確認する
Actionsの実行確認
リポジトリのクローン
- PCのローカルにSelfhosted Runnerを動かすリポジトリをクローンする
hello.sh シェルスクリプトの作成
-
クローンしたリポジトリのディレクトリ直下に 下記の内容でhello.shスクリプトを作成する
#!/bin/bash echo "Hello" pwd uname -a
hello.yml ワークフローファイルの作成
-
.github/workflowディレクトリ作成する
-
.github/workflow配下に、下記の内容でhello.ymlを作成する
name: Hello Selfhosted Runner on: workflow_dispatch jobs: hello: name: Hello runs-on: self-hosted steps: - name: Checkout uses: actions/checkout@v3 - name: Hello run : bash hello.sh
-
上記2つのコードをステージングして、コミット、プッシュする
動作確認
-
ブラウザで、対象のリポジトリの「Actions」のタブを開く
-
Hello Selfhosted Runner」ワークフローを選択して「Run workflow」を押す
※数回、実験しているため、実行結果が複数あります -
実行が終了したらログを確認して、hello.shが実行され、結果が下図のように出力されていることを確認する
Discussion