🐈

GitHub ActionsのSelfhosted Runnerを使って社内ネットワークにあるサーバーにデプロイを行う

2022/07/01に公開

社内ネットワーク※上のサーバーに、GitHub Actionsを使ってCI/CDするためには、Selfhosted Runnerの利用が必要です。
そこで今回は、Selfhosted Runner導入の手順を紹介します。
導入したサーバーのOSは、RHEL8系のRockey Linux8です。Selfhosted Runnerは、Linuxの他にもWindowsやMacOSへの導入もサポートされています。なお、RHEL9で試したところ、GitHubとの接続ができない問題が発生しました。

※ここでの社内ネットワークの定義は、インターネットから直接ネットワーク内のサーバーにアクセスできないという環境を指しています。

事前確認

GitHubリポジトリの作成

  1. Selfhosted Runnerを使うリポジトリを作成する

Proxy設定の確認

ここからのコマンドは、Selfhosted Runnerを導入するOSで実行します。

  1. 下記コマンドを実行して、環境変数に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のダウンロード

ここでは、動作確認のために仮のインストール場所にモジュールを展開します。

  1. Selfhosted Runnerを使いたいリポジトリの設定を開く

  2. 左メニュー「Actions」->「Runners」を開き、「New self-hosted runner」を押す。

    Settings Actions

  3. 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
    

    Add New Runner

  4. 下記コマンドを実行して、tar.gzファイルを削除する

    rm ./actions-runner-linux-x64-2.292.0.tar.gz
    

Selfhosted Runnnerの設定

  1. installdependencies.shを実行する。

    $ sudo ./bin/installdependencies.sh
    --------OS Information--------
    NAME="Rocky Linux"
    VERSION="8.6 (Green Obsidian)"
    ...
    -----------------------------
    Finish Install Dependencies
    -----------------------------
    
  2. 下記のようにブラウザに表示されている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の接続確認

  1. run.shを実行する

    $ ./run.sh
    
    √ Connected to GitHub
    
    Current runner version: '2.292.0'
    2022-06-14 07:38:08Z: Listening for Jobs
    
  2. ブラウザでRunnerのページに行き、ランナーが表示され、状態がidleになっていることを確認する

    Runners

  3. Ctrl+Cを押してrun.shの実行を終了する

Selfhosted Runner用ユーザーの作成と自動起動の設定

ここからが山場という…。

Selfhosted Runner用OSユーザーとホームディレクトリの作成

  1. useraddでユーザーとホームディレクトリを作る

    sudo useradd runner
    

ファイルの移動

  1. 下記コマンドを実行して、ファイルを移動して所有者を変える

    $ sudo mv * /home/runner/
    $ sudo mv .* /home/runner/
    mv: '.' から '/home/runner/.' へ移動できません: デバイスもしくはリソースがビジー状態です
    mv: '..' から '/home/runner/..' へ移動できません: デバイスもしくはリソースがビジー状態です
    $ sudo chown -R runner:runner /home/runner/
    

Proxy設定の追加

サービスとして起動すると環境変数のProxyの設定を使ってくれないため。

  1. .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を実行します。

  1. 下記コマンドを実行して、サービスを追加する。

    $ 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のタグを変更します。

  1. 下記コマンドを実行して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サービスの起動と確認

  1. 下記コマンドを実行してサービスを起動する

    $ 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
    
    615 16:36:06 rocky8-runner systemd[1]: Started GitHub Actions Runner (hoge-fuga-selfhosted-runner.rocky8-runner).
    
  2. 下記コマンドを実行してサービスの状態が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
    
    ...
    615 16:36:06 rocky8-runner runsvc.sh[1494]: Started running service
    615 16:36:09 rocky8-runner runsvc.sh[1494]: √ Connected to GitHub
    615 16:36:10 rocky8-runner runsvc.sh[1494]: Current runner version: '2.292.0'
    615 16:36:10 rocky8-runner runsvc.sh[1494]: 2022-06-15 07:36:10Z: Listening for Jobs
    
  3. ブラウザでRunnerのページに行き、状態がidleになっていることを確認する

  4. OSを再起動する

    sudo reboot
    
  5. ブラウザでRunnerのページに行き、しばらく待つと状態がidleになることを確認する

Actionsの実行確認

リポジトリのクローン

  1. PCのローカルにSelfhosted Runnerを動かすリポジトリをクローンする

hello.sh シェルスクリプトの作成

  1. クローンしたリポジトリのディレクトリ直下に 下記の内容でhello.shスクリプトを作成する

    #!/bin/bash
    
    echo "Hello"
    pwd
    uname -a
    

hello.yml ワークフローファイルの作成

  1. .github/workflowディレクトリ作成する

  2. .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
    
  3. 上記2つのコードをステージングして、コミット、プッシュする

動作確認

  1. ブラウザで、対象のリポジトリの「Actions」のタブを開く

  2. Hello Selfhosted Runner」ワークフローを選択して「Run workflow」を押す

    Execute Action
    ※数回、実験しているため、実行結果が複数あります

  3. 実行が終了したらログを確認して、hello.shが実行され、結果が下図のように出力されていることを確認する

    Result Action

Discussion