こんにちは。X(クロス)イノベーション本部 ソフトウェアデザインセンター の山下です。 今回は、GitHub ActionsのSelf-Hosted runnerを利用して、社内にあるオンプレミス環境へのContinuous Integration(以降CI)とContinuous Deployment(以降CD)を実現したのでその方法について紹介します。
GitHub actionsをオンプレミス環境に適用しようとする際の課題
GitHub actionsのようにインターネット上のサービスでは、デプロイの対象となる計算機へ直接アクセスを行ってデプロイを実現することが一般的でしょう。例えば、Amazon Web Servicesを対象にデプロイを実現する場合では、そのAPIをインターネット経由で呼びだしてデプロイを実現している場合が多いと思います。しかし、オンプレミス環境では、APIのように外部から呼び出してデプロイを行うといった手段を取れない場合があります。セキュリティや様々な理由によって外部からのアクセスを禁止している環境があります。オンプレミス環境だとGitHub actionsを利用したCI/CDは諦めることになるのでしょうか?
self-hosted runnerとは?
GitHub Actionsを利用している場合、この制約をself-hosted runnerを利用することで緩和することが出来ます。 以下がGitHub公式のself-hosted runnerのマニュアルです。 https://docs.github.com/en/actions/hosting-your-own-runners/about-self-hosted-runners
この、self-hosted runnerはGitHub actionsで利用するrunnerを自身の計算機資源を利用することを可能にするものです。例えば、自宅のデスクトップマシンなどを登録してGitHub actionsのrunnerとして利用することも可能になります。また、このself-hosted runnerは通信の仕組みとして、self-hosted runner「から」GitHubへのhttps通信を行うことで実現しています。self-hosted runnerが動いている計算機をサーバとして動作させて、特定のポートにGitHubがアクセスしてくるという形ではないということです。
つまり、オンプレミス環境であってもself-hosted runnerが動作している計算機からGitHubへのhttps通信ができる環境であれば動作します。さらに、self-hosted runnerからデプロイ対象となる計算機へのアクセスを許可することで、オンプレミス環境であってもGitHub actionsからCDを実現することが可能となります。
最終的には以下のような形で、GitHub actions経由でオンプレミス環境へのCI/CDを実現しました。
以降の節で、この環境の構築手順について説明します。
self-hosted runnerのセットアップ方法
ここでは、self-hosted runner自体のセットアップ方法について説明します。 なお、OSはUbuntu 20.04を利用しています。self-hosted runner自体はWindowsやMacでも動作します。 Windows専用やMac専用アプリのCI/CDを行いたい場合にも利用できます。
まず、github のプロジェクトの「settings」画面を開きます。
そして、画面左上にある「new self-hosted runner」ボタンをクリックします。
すると、以下のような画面が出るので、対象のOS(ここではLinux)を選択します。
あとは、表示されているコマンドを対象となる計算機上で実行すればOKです。
self-hosted runnerインストールのコマンド
それでは表示された手順に従ってインストール作業を行っていきます。まずは、self-hosted runnerをインストールします
# Create a folder $ mkdir actions-runner && cd actions-runner# Download the latest runner package $ curl -o actions-runner-linux-x64-2.291.1.tar.gz -L https://github.com/actions/runner/releases/download/v2.291.1/actions-runner-linux-x64-2.291.1.tar.gz# Optional: Validate the hash $ echo "1bde3f2baf514adda5f8cf2ce531edd2f6be52ed84b9b6733bf43006d36dcd4c actions-runner-linux-x64-2.291.1.tar.gz" | shasum -a 256 -c# Extract the installer $ tar xzf ./actions-runner-linux-x64-2.291.1.tar.gz
次に、GitHubへの接続設定を実行します
# Create the runner and start the configuration experience $ ./config.sh --url https://github.com/XXXXXX --token XXXXXXXXXXXXXX
このコマンドを実行する際に以下の内容を聞かれます
- runnerの名前
- runnerに付けるラベル
- 実行時に利用するディレクトリ名
これらの情報のうちラベルは、GitHub actionsで実行するrunnerを指定する際に利用することになります。意味があるラベルをつけておくと便利です。
プロキシサーバの設定
オンプレミス環境では、プロキシサーバ経由でのhttp/https通信しか許されていない場合があります。
self-hosted runnerは環境変数 http_proxy
、https_proxy
、no_proxy
といった設定を利用してプロキシの設定を行うことができます。また、.env
という設定ファイルを利用したプロキシ設定を行うことも可能です。
以下が公式のマニュアルとなります。 https://docs.github.com/en/actions/hosting-your-own-runners/using-a-proxy-server-with-self-hosted-runners
適宜環境に合わせて設定を行う必要があります。上記のインストールの手順だと環境変数による設定を行っておくと良いでしょう。環境変数による設定が上手くいかない場合は、.env
設定ファイルによる設定を試すと上手くいくかもしれません。今回の検証環境では環境変数による設定を利用しました。
self-hosted runnerの実行
ここまでで、self-hosted runnerを実行する準備は整いました。以下のコマンドでself-hosted runnerが起動します。
$ ./run.sh
GitHubの「runners」の画面を確認すると追加されていることが確認できます。
なお、run.sh
はCtrl+Cなどで終了してしまうと、runnerも止まってしまうのでサービス化しておく方が良いでしょう。
公式のマニュアルにも手順が記載されています。
https://docs.github.com/en/actions/hosting-your-own-runners/configuring-the-self-hosted-runner-application-as-a-service
以下の手順でサービス化することが出来ます。
sudo ./svc.sh install sudo ./svc.sh start
適宜設定しておきましょう。
CI/CDで利用するコマンドのインストール
GitHub actions中に利用するコマンドは、self-hosted runnerが動作している計算機に事前にインストールしておく必要があります。実行したい内容に合わせて適宜環境構築をしておきましょう。
self-hosted runnerを利用したGitHub actionsの実行方法
さて、ここまででself-hosted runnerをGitHubに登録できました。ここでは、その登録したrunnerを実際に利用する場合について説明します。これは、.github/workflows/*.yml
といったGitHub actionsの設定ファイル中のjobs
設定でrunnerを指定することが出来ます。
name: Deploy Internal on: workflow_dispatch: jobs: deploy-on-premises: runs-on: [self-hosted, linux] ...
上記のように runs-on
の設定を追加して、指定したラベルとマッチするrunnerで特定のjobを実行させることが出来ます。また、この設定はjob毎に指定できるので、テストはGitHubの提供しているrunnerで実行してデプロイはself-hosted runnerで実行するといったことも可能となります。
まとめ
今回はGitHub actionsを利用してオンプレミス環境に対するCI/CDの方法について解説しました。とても簡単に構築できるので積極的に活用していきたいです。特殊な環境でもself-hosted runnerを利用して効率的な開発を行っていきたいですね。
私たちは同じチームで働いてくれる仲間を探しています。今回のエントリで紹介したような仕事に興味のある方、ご応募お待ちしています。
執筆:@yamashita.tsuyoshi、レビュー:@sato.taichi (Shodoで執筆されました)