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_TOKEN | ngrokのAuthトークン https://dashboard.ngrok.com/get-started/your-authtoken ここに記載してある | |
VNC_USER_PASSWORD | VNCで接続する際のパスワード。登録時のパスワードではなくても良い。 | |
VNC_SCREENSIZE | Linuxに接続するときのVNCセッションの画面解像度 | 800×600 |
VNC_DEPTHVALUE | VNCが使用するデフォルトの色深度 | 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:
コメント