Per @samali0996 's comment below: https://gist.github.com/pjobson/6b9fb926c59f58aa73d4efa10fe13654?permalink_comment_id=4487157#gistcomment-4487157
The new WSL Win10/11 should support this natevly. Thanks for posting the update!
Edit: I no longer have access to a Windows dev environment and don't really have much interest in setting one up, you can reply, but I can't offer you any support on any of this. I recommend reading the Deprecated notice and going from there.
As this is becoming more popular, I am officially licensing it as Public Domain, please do whatever you want with it. Sell it, modify it, steal it... I'm not concerned.
https://en.wikipedia.org/wiki/Public_domain
No clue why the directions for this are buried deep in WLS issues. This is how I setup my Cypress on Ubuntu WSL2 working for both on and off VPN with some corp firewall.
Before executing any command, be sure to read and understand it, I ask you to run two shell scripts which I wrote. You should review any shell script provided by anyone before blindly running it. I'm not doing anyting bad, but I advise you to check for yourself.
This is outside of the scope of this document, read this doc for more info: https://pureinfotech.com/install-windows-subsystem-linux-2-windows-10/
This is for Ubuntu, it should be similar for other distros.
sudo apt install libgtk2.0-0 libgtk-3-0 libgbm-dev libnotify-dev \
libgconf-2-4 libnss3 libxss1 libasound2 libxtst6 xauth xvfb \
x11-apps build-essential ca-certificates libcurl3-gnutls \
libcurl4 libcurl4-openssl-dev
mkdir ~/bin
echo "export PATH=~/bin:\$PATH" >> ~/.bashrc
Inside a firewall sometimes it is a PITA to get it to recognize certifications. I made a script to add the certs from github domains. If you're not behind a firewall and you can route to github hosts, then you do not need this.
cd ~/bin
wget --no-check-certificate https://gist.githubusercontent.com/pjobson/c7983da02ddb81c2c7457775111a4266/raw/90d23250c3466b7a39a76c2082591bd4880b7f5d/install_certs.sh
chmod +x install_certs.sh
sudo ./install_certs.sh
This uses tj/n which is what I like. You can use nvm or install from binary or source, those are outside of the scope of this document.
curl -k -L https://git.io/n-install | bash
source ~/.bashrc
n lts
node --version
npm --version
Download and install vcxsrv: https://sourceforge.net/projects/vcxsrv/
If you're unfamiliar with what this is, I recommend reading this article: https://askubuntu.com/questions/432255/what-is-the-display-environment-variable
WSL uses its own virtual network and has a different IP than Windows, so you need to tell WSL to use your Windows IP address and display.
In WSL, run:
netsh.exe interface show interface
Mine returns this at home while on the VPN:
Admin State State Type Interface Name
-------------------------------------------------------------------------
Enabled Connected Dedicated Ethernet 3
Disabled Disconnected Dedicated Ethernet 2
Enabled Connected Dedicated Wi-Fi
Enabled Connected Dedicated vEthernet (WSL)
Whereas at work off the VPN it returns:
Admin State State Type Interface Name
-------------------------------------------------------------------------
Disabled Disconnected Dedicated Ethernet 3
Disabled Disconnected Dedicated Ethernet 2
Enabled Connected Dedicated Wi-Fi
Enabled Disconnected Dedicated Ethernet
Enabled Connected Dedicated vEthernet (WSL)
In this example, my VPN connection is Ethernet 3
where as my non-VPN connection is Wi-Fi
. In my case I need to use the IP for the VPN while at home and the IP from the Wi-Fi at work. I'm not 100% sure why this is, but I dislike Windows, so whatever.
I wrote a script which will output the display based on VPN or Default.
cd ~/bin
wget --no-check-certificate https://gist.githubusercontent.com/pjobson/3c5c23edd8e49cef7816372f4931f564/raw/8121f630571c8391f031d378f9381590ecbda003/getdisplay.sh
chmod +x getdisplay.sh
~/bin/getdisplay.sh 'VPN Interface' 'Default Interface'
Note: If you're not on a VPN and just to use a single interface, you can just pass it twice. The script is written for my specific use case, so it will always require two.
~/bin/getdisplay.sh 'Default Interface' 'Default Interface'
Of course change the VPN Interface
and Default Interface
to whatever yours are.
Mine for example is:
~/bin/getdisplay.sh 'Ethernet 3' 'Wi-Fi'
This should output something like this. If it returns nothing, you probably are using the wrong interfaces.
10.10.10.10:0.0
Edit .bashrc
, add the following, again making the interfaces your own.
# set DISPLAY variable to the IP automatically assigned to WSL2
export DISPLAY="$(~/bin/getdisplay.sh 'VPN Interface' 'Default Interface')"
sudo /etc/init.d/dbus start &> /dev/null
sudo vi /etc/sudoers.d/dbus
Add:
<your username> ALL = (root) NOPASSWD: /etc/init.d/dbus
source ~/.bashrc
echo $DISPLAY
This should again display something like:
10.10.10.10:0.0
Open XLaunch from start menu.
Config:
- Select: Multiple Windows (default)
- Select: Start no client (default)
- Check: Disable access control
- Uncheck: Native opengl
- Save configuration on startup folder, location:
%AppData%\Microsoft\Windows\Start Menu\Programs\Startup
Start -> Run
%windir%\system32\WF.msc
Right-Click Inbound Rules -> New Rule...
- Rule Type: Program
- Program -> This Program Path: %ProgramFiles%\VcXsrv\vcxsrv.exe
- Action: Allow the Connection
- Profile: Check all
- Name: VcXsrv
Just run one of the x11-apps
installed at the top.
xeyes
Should open the xeyes application.
General:
cd code_path
npm init
If you're NOT behind a firewall:
npm install cypress --save-dev
If you are behind a firewall, you need to get the zip file and point NPM to use it.
# Version -------------------------------------------------VVVVV
wget --no-check-certificate https://cdn.cypress.io/desktop/9.5.3/linux-x64/cypress.zip -O ~/cypress.zip
CYPRESS_INSTALL_BINARY=~/cypress.zip npm install cypress --save-dev
If you get a certificate error, disable strict-ssl in npm.
npm config set strict-ssl false
Then start it.
./node_modules/.bin/cypress open
Frequently I'll temporarily add the path to it to my PATH.
export PATH=./node_modules/.bin/:$PATH
cypress open
I wanted to add a note that you can forward traffic from your AWS EC2 instance through WSL to the X Server in Windows.
In your WSL create a ~/.ssh/config
file and add:
Host <AWS_HOST_IP_ADDRESS>
HostName <AWS_HOST_IP_ADDRESS>
User <AWS_HOST_USERNAME>
IdentityFile ~/.ssh/<AWS_HOST_PEM_FILE>
Port 22
ForwardX11 yes
Host *
IdentitiesOnly=yes
PreferredAuthentications=publickey
Compression yes
ServerAliveInterval 30
ServerAliveCountMax 1200
LogLevel INFO
Then you can ssh
to your EC2 host inside WSL. From your EC2 install xorg-x11-apps
and run xeyes
, this should open that app within your Windows x-server. You should be able to run cypress headed from your EC2 and have it open in Windows.
And in UI, ie cypress open will open new window but no browsers are listed