【Github Actions】CI/CDのランナーマシンに接続する方法(Win/Mac/Linux)

【Github Actions】CI:CDのランナーマシンに接続する方法(Win:Mac:Linux)アイキャッチ プログラミング

Github Actions うまくいきませんよね。また、スクリプト上のエラーを見てもよくわからないことが多々あります。なので、ランナーマシンが実際にどんな状況になっているか見られたら便利だなーと思ったこともあるのではないでしょうか。

そこで本記事では、Github Actions のCIが動いているマシンにリモート接続する方法を紹介します。

今回は、すべてリモート接続でGUI操作を行うことを目的にしています。SSHによるCUI操作なら、「https://github.com/mxschmitt/action-tmate」を使用すると良いです。

事前準備

本記事では、ngrokを使用してランナーマシンを一時的に外部に公開し、そこに対して接続する方法を実践します。

また、WindowsにはRDP、Mac / LinuxにはVNCで接続することを想定しています。

そのための準備として、以下5つほどあるので、さくっと済ましておきます。

  • ngrokのアカウント登録(必須)
  • RealVNCのアカウント登録(Mac / Linuxに接続する場合)
  • VNCクライアントをインストール(Mac / Linuxに接続する場合)
  • RDPクライアントをインストール(Windowsに接続 かつ 自PCが非Windows)
  • Secretsの設定(必須)

ngrokのアカウント登録

特に難しくないので、省略します。

ngrokトップページはこちら>https://dashboard.ngrok.com/signup

RealVNCのアカウント登録

ちょっと難しかったので、以下の記事を参考に登録しました。

VNCクライアントをインストール

Mac / LinuxにVNCで接続する際は必要。VNCクライアントならどれでも良いが、私は「VNC Viewer」で試した。

インストールはこちらから>https://www.realvnc.com/en/connect/download/viewer/

RDPクライアントをインストール

何でも良いですが、Windowsなら標準で入っている「リモートデスクトップ接続」、MacならApp Storeにある、「Microsoft Remote Desktop」で大丈夫です。

Secretsの設定

詳細は、ソースコードを見ていただきたいのですが、Githubに以下のSecretを割り当てておきます。

Secret名内容
NGROK_AUTH_TOKENngrokのAuthトークン
https://dashboard.ngrok.com/get-started/your-authtoken
ここに記載してある
VNC_USER_PASSWORDVNCで接続する際のパスワード。登録時のパスワードではなくても良い。
VNC_SCREENSIZELinuxに接続するときのVNCセッションの画面解像度800×600
VNC_DEPTHVALUEVNCが使用するデフォルトの色深度16

ランナーマシンに接続する

意外と大事

各ymlによるCI/CDが完了したら、「https://dashboard.ngrok.com/endpoints/status」から、トンネルのエンドポイント(リモート接続先)を取得して、各クライアントに入力してリモート接続を行ってください。

また、入力すべきユーザ名とパスワードは各章に記載しています。

Windowsに接続する

やっていることはシンプルで、ngrokをダウンロード、展開、トークンで認証して、トンネルを作成しているだけです。

ただ、「Enable TS」部分で、リモート接続を許可したり、リモート接続先のユーザーを作成したりしていることも重要です。

name: rdp-windows

on:
  push:
  workflow_dispatch:

jobs:
  rdp:
    runs-on: windows-latest
    steps:
      - name: Download
        run: Invoke-WebRequest https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-windows-amd64.zip -OutFile ngrok.zip
      - name: Extract
        run: Expand-Archive ngrok.zip
      - name: Auth
        run: .\ngrok\ngrok.exe authtoken ${{ secrets.NGROK_AUTH_TOKEN }}
      - name: Enable TS
        run: Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server'-name "fDenyTSConnections" -Value 0
      - run: Enable-NetFirewallRule -DisplayGroup "Remote Desktop"
      - run: Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -name "UserAuthentication" -Value 1
      - run: Set-LocalUser -Name "runneradmin" -Password (ConvertTo-SecureString -AsPlainText "P@ssw0rd!" -Force)
      - name: Create Tunnel
        run: .\ngrok\ngrok.exe tcp 3389

RDP接続するときは、「run: Set-LocalUser -Name “runneradmin” -Password (ConvertTo-SecureString -AsPlainText “P@ssw0rd!” -Force)」で設定しているユーザ名とパスワードで接続します。

Macに接続する

Macでは、ほとんどの処理を「mac_configure.sh」の中で行っているので、そちらも参照してください。

name: vnc-mac

on: 
  push:
  workflow_dispatch:

jobs:
  vnc:
    runs-on: macos-latest
    steps:
    - uses: actions/checkout@v2
    - name: Setting the environment up.
      env:
        NGROK_AUTH_TOKEN: ${{ secrets.NGROK_AUTH_TOKEN }}
        VNC_USER_PASSWORD: ${{ secrets.VNC_USER_PASSWORD }}
      run: source ./scripts/mac_configure.sh "$VNC_USER_PASSWORD" "$NGROK_AUTH_TOKEN"
    - run: sleep 600

Windows同様に、ngrokに関する処理と、VNC接続先のユーザーを作成しているのみです。

#configure.sh VNC_USER_PASSWORD NGROK_AUTH_TOKEN

#disable spotlight indexing
sudo mdutil -i off -a

#Create new account
sudo dscl . -create /Users/vncuser
sudo dscl . -create /Users/vncuser UserShell /bin/bash
sudo dscl . -create /Users/vncuser RealName "VNC User"
sudo dscl . -create /Users/vncuser UniqueID 1001
sudo dscl . -create /Users/vncuser PrimaryGroupID 80
sudo dscl . -create /Users/vncuser NFSHomeDirectory /Users/vncuser
sudo dscl . -passwd /Users/vncuser $1
sudo createhomedir -c -u vncuser > /dev/null

#Enable VNC
sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -configure -allowAccessFor -allUsers -privs -all
sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -configure -clientopts -setvnclegacy -vnclegacy yes 

#Start VNC/reset changes
sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -restart -agent -console
sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -activate

#install ngrok
brew install ngrok

#configure ngrok and start it
ngrok authtoken $2
ngrok tcp 5900 &

VNCクライアントで接続するときは、ユーザー名に上記「RealName “VNC User”」で設定したユーザ名(ここでいうと”VNC User”)とSecretsに設定したVNC_USER_PASSWORDを入力してください。

Linuxに接続する

Windows / Mac同様のことをしています。

name: vnc-Linux

on:
  push:
  workflow_dispatch:

jobs:
  vnc:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Preparing environment...
      env:
        NGROK_AUTH_TOKEN: ${{ secrets.NGROK_AUTH_TOKEN }}
        VNC_USER_PASSWORD: ${{ secrets.VNC_USER_PASSWORD }}
      run: sh ./scripts/linux_configure.sh
    - name: Starting VNC Server...
      env:
        VNC_SCREENSIZE: ${{ secrets.VNC_SCREENSIZE }}
        VNC_DEPTHVALUE: ${{ secrets.VNC_DEPTHVALUE }}
      run: export PATH=$PATH:/opt/TurboVNC/bin && cd $HOME && vncserver :1 -geometry $VNC_SCREENSIZE -depth $VNC_DEPTHVALUE -rfbport 7582
    - name: Creating tunnel with ngrok...
      run: ./ngrok tcp 7582
# First, install required packages...
sudo apt update
sudo apt install -y xfce4 xfce4-goodies xfonts-base xubuntu-icon-theme xubuntu-wallpapers gnome-icon-theme x11-apps x11-common x11-session-utils x11-utils x11-xserver-utils x11-xkb-utils dbus-user-session dbus-x11 gnome-system-monitor gnome-control-center libpam0g libxt6 libxext6

# Second, install TurboVNC
wget https://phoenixnap.dl.sourceforge.net/project/turbovnc/2.2.5/turbovnc_2.2.5_amd64.deb
sudo dpkg -i turbovnc_2.2.5_amd64.deb

# Third, download ngrok
wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip
unzip ngrok-stable-linux-amd64.zip
chmod +x ngrok

# Fourth, generate and copy passwd file and xstartup script
export PATH=$PATH:/opt/TurboVNC/bin
mkdir $HOME/.vnc
cp ./resources/xstartup $HOME/.vnc/xstartup.turbovnc
echo $VNC_USER_PASSWORD | vncpasswd -f > $HOME/.vnc/passwd
chmod 0600 $HOME/.vnc/passwd

# Fifth and last, set up auth token from argument
./ngrok authtoken $NGROK_AUTH_TOKEN
exit

ユーザ名は「runner」、パスワードはSecretsに記載したパスワードを使用して接続します。

参考にさせていただいたコード

Windows:

Mac:

Linux:

コメント

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