version: 2.1 orbs: win: circleci/windows@4.0.0 workflows: version: 2 test_and_build: jobs: - test-cli - test-gui - build-win64: requires: - test-cli - test-gui - build-win32: requires: - test-cli - test-gui - build-macos: requires: - test-cli - test-gui # - build-snapcraft: # requires: # - test-cli # - test-gui jobs: test-cli: docker: - image: cimg/python:3.9 working_directory: ~/repo steps: - checkout - run: name: Install dependencies command: | sudo apt-get update sudo apt-get -y install tor obfs4proxy pip install poetry cd ~/repo/cli poetry install - run: name: Run tests command: | cd ~/repo/cli poetry run pytest -v ./tests poetry run onionshare-cli --local-only ./tests --auto-stop-timer 2 poetry run onionshare-cli --local-only --receive --auto-stop-timer 2 poetry run onionshare-cli --local-only --website ../docs --auto-stop-timer 2 poetry run onionshare-cli --local-only --chat --auto-stop-timer 2 test-gui: docker: - image: cimg/python:3.9 working_directory: ~/repo steps: - checkout - run: name: Install dependencies command: | sudo apt-get update sudo apt-get install -y tor obfs4proxy gcc python3-dev python3-pyside2.qtcore python3-pyside2.qtwidgets python3-pyside2.qtgui sudo apt-get install -y xvfb x11-utils libxkbcommon-x11-0 libxcb-randr0-dev libxcb-xtest0-dev libxcb-xinerama0-dev libxcb-shape0-dev libxcb-xkb-dev libxcb-render-util0 libxcb-icccm4 libxcb-keysyms1 libxcb-image0 cd ~/repo/desktop poetry install - run: name: Run tests command: | cd ~/repo/desktop QT_DEBUG_PLUGINS=1 xvfb-run poetry run pytest -v ./tests/test_gui_*.py build-win64: executor: name: win/default shell: powershell.exe steps: - checkout - run: name: Install Python 3.9.12 command: | choco install python3 --version=3.9.12 - run: name: Install poetry command: (Invoke-WebRequest -Uri https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py -UseBasicParsing).Content | python - - run: name: Install poetry dependencies command: | cd ~\project\desktop poetry install - run: name: Download tor (Windows Expert Bundle) command: | mkdir ~\Downloads\tor cd ~\Downloads\tor $URL = "https://www.torproject.org/dist/torbrowser/11.0.10/tor-win32-0.4.6.10.zip" $Filename = "tor-win32-0.4.6.10.zip" $ExpectedHash = "d3f62317507dbe1a1aa74b9e0e03996dbded2143f94409270828f6a8bcdda16a" Invoke-WebRequest -Uri $URL -OutFile $Filename $FileHash = Get-FileHash $Filename if($FileHash.Hash -ne $ExpectedHash) { throw "Invalid hash" } Expand-Archive -LiteralPath tor-win32-0.4.6.10.zip -DestinationPath ~\project\desktop\onionshare\resources\tor - run: name: Build obfs4proxy command: | mkdir ~\Downloads\obfs4proxy cd Downloads\obfs4proxy git clone https://gitlab.com/yawning/obfs4 cd obfs4 go build .\obfs4proxy Move-Item -Path .\obfs4proxy.exe -Destination ~\project\desktop\onionshare\resources\tor\Tor\obfs4proxy.exe - run: name: Build snowflake-client command: | go install git.torproject.org/pluggable-transports/snowflake.git/client@latest Move-Item -Path ~\go\bin\client.exe -Destination ~\project\desktop\onionshare\resources\tor\Tor\snowflake-client.exe - run: name: Build meek-client command: | go install git.torproject.org/pluggable-transports/meek.git/meek-client@v0.37.0 Move-Item -Path ~\go\bin\meek-client.exe -Destination ~\project\desktop\onionshare\resources\tor\Tor\meek-client.exe - run: name: Build OnionShare command: | cd ~\project\desktop poetry run python .\setup-freeze.py build poetry run python .\scripts\build-windows.py cleanup-build - run: name: Compress command: | mv ~\project\desktop\build\exe.win-amd64-3.9\ ~\onionshare-win64 Compress-Archive -LiteralPath ~\onionshare-win64 -DestinationPath ~\onionshare-win64.zip - store_artifacts: path: ~\onionshare-win64.zip build-win32: executor: name: win/default shell: powershell.exe steps: - checkout - run: name: Install Python 3.9.12 (32-bit) command: | choco install python3 --params "/InstallDir32:C:\Python-32bit" --version=3.9.12 - run: name: Install golang (32-bit) command: | cd ~\Downloads Invoke-WebRequest -Uri https://go.dev/dl/go1.18.windows-386.msi -OutFile go1.18.windows-386.msi msiexec.exe /i go1.18.windows-386.msi /quiet /L*V go-install.log - run: name: Install poetry (32-bit) command: C:\Python-32bit\Scripts\pip install poetry - run: name: Install poetry dependencies command: | cd ~\project\desktop C:\Python-32bit\Scripts\poetry install - run: name: Download tor (Windows Expert Bundle) command: | mkdir ~\Downloads\tor cd ~\Downloads\tor $URL = "https://www.torproject.org/dist/torbrowser/11.0.10/tor-win32-0.4.6.10.zip" $Filename = "tor-win32-0.4.6.10.zip" $ExpectedHash = "d3f62317507dbe1a1aa74b9e0e03996dbded2143f94409270828f6a8bcdda16a" Invoke-WebRequest -Uri $URL -OutFile $Filename $FileHash = Get-FileHash $Filename if($FileHash.Hash -ne $ExpectedHash) { throw "Invalid hash" } Expand-Archive -LiteralPath tor-win32-0.4.6.10.zip -DestinationPath ~\project\desktop\onionshare\resources\tor - run: name: Build obfs4proxy command: | mkdir ~\Downloads\obfs4proxy cd Downloads\obfs4proxy git clone https://gitlab.com/yawning/obfs4 cd obfs4 "C:\\Program Files (x86)\\Go\\bin\\go" build .\obfs4proxy Move-Item -Path .\obfs4proxy.exe -Destination ~\project\desktop\onionshare\resources\tor\Tor\obfs4proxy.exe - run: name: Build snowflake-client command: | "C:\\Program Files (x86)\\Go\\bin\\go" install git.torproject.org/pluggable-transports/snowflake.git/client@latest Move-Item -Path ~\go\bin\client.exe -Destination ~\project\desktop\onionshare\resources\tor\Tor\snowflake-client.exe - run: name: Build meek-client command: | "C:\\Program Files (x86)\\Go\\bin\\go" install git.torproject.org/pluggable-transports/meek.git/meek-client@v0.37.0 Move-Item -Path ~\go\bin\meek-client.exe -Destination ~\project\desktop\onionshare\resources\tor\Tor\meek-client.exe - run: name: Build OnionShare command: | cd ~\project\desktop C:\Python-32bit\Scripts\poetry run python .\setup-freeze.py build C:\Python-32bit\Scripts\poetry run python .\scripts\build-windows.py cleanup-build - run: name: Compress command: | mv ~\project\desktop\build\exe.win32-3.9\ ~\onionshare-win32 Compress-Archive -LiteralPath ~\onionshare-win32 -DestinationPath ~\onionshare-win32.zip - store_artifacts: path: ~\onionshare-win32.zip build-macos: macos: xcode: 12.5.1 environment: - INSTALL_X86_64: /Users/distiller/install/x86_64 - INSTALL_ARM64: /Users/distiller/install/arm64 - INSTALL_UNIVERSAL2: /Users/distiller/install/universal2 steps: - checkout - run: name: Install Homebrew dependencies command: | brew install wget brew install go - run: name: Make folders for x86_64 and arm64 tor deps command: mkdir -p $INSTALL_X86_64 $INSTALL_ARM64 $INSTALL_UNIVERSAL2 - run: name: Build openssl (x86_64 and arm64) command: | # Download and verify cd ~/Downloads URL=https://www.openssl.org/source/openssl-3.0.2.tar.gz FILENAME=openssl-3.0.2.tar.gz EXPECTED_SHA256=98e91ccead4d4756ae3c9cde5e09191a8e586d9f4d50838e7ec09d6411dfdb63 wget $URL SHA256=$(shasum -a 256 $FILENAME | cut -d" " -f1) if [ "$SHA256" != "$EXPECTED_SHA256" ]; then echo "Failed" && exit -1; fi tar -xvf $FILENAME rm $FILENAME mv openssl-* openssl-x86_64 cp -r openssl-x86_64 openssl-arm64 # Build x86_64 cd openssl-x86_64 export MACOSX_DEPLOYMENT_TARGET=10.9 ./Configure darwin64-x86_64-cc shared --prefix=$INSTALL_X86_64 make make install # Build arm64 cd ../openssl-arm64 export MACOSX_DEPLOYMENT_TARGET=10.15 ./Configure enable-rc5 zlib darwin64-arm64-cc no-asm --prefix=$INSTALL_ARM64 make make install - run: name: Build libevent (x86_64 and arm64) command: | # Download and verify cd ~/Downloads URL=https://github.com/libevent/libevent/releases/download/release-2.1.12-stable/libevent-2.1.12-stable.tar.gz FILENAME=libevent-2.1.12-stable.tar.gz EXPECTED_SHA256=92e6de1be9ec176428fd2367677e61ceffc2ee1cb119035037a27d346b0403bb wget $URL SHA256=$(shasum -a 256 $FILENAME | cut -d" " -f1) if [ "$SHA256" != "$EXPECTED_SHA256" ]; then echo "Failed" && exit -1; fi tar -xvf $FILENAME rm $FILENAME mv libevent-* libevent-x86_64 cp -r libevent-x86_64 libevent-arm64 # Build x86_64 cd libevent-x86_64 export CFLAGS="-arch x86_64" ./configure --disable-openssl --prefix=$INSTALL_X86_64 make make install # Build arm64 cd ../libevent-arm64 export CFLAGS="-arch x86_64" # temporarily, change after the fact ./configure --disable-openssl --prefix=$INSTALL_ARM64 # Fix the Makefile so it builds for arm64 sed -i '' -e 's/host_triplet = x86_64-apple-darwin20.5.0/host_triplet = arm64-apple-darwin20.5.0/g' Makefile sed -i '' -e 's/CFLAGS = -arch x86_64/CFLAGS = -arch arm64/g' Makefile sed -i '' -e 's/host = x86_64-apple-darwin20.5.0/host = arm64-apple-darwin20.5.0/g' Makefile sed -i '' -e 's/host_cpu = x86_64/host_cpu = arm64/g' Makefile make make install - run: name: Build tor (x86_64 and arm64) command: | # Download and verify cd ~/Downloads URL=https://dist.torproject.org/tor-0.4.6.10.tar.gz FILENAME=tor-0.4.6.10.tar.gz EXPECTED_SHA256=94ccd60e04e558f33be73032bc84ea241660f92f58cfb88789bda6893739e31c wget $URL SHA256=$(shasum -a 256 $FILENAME | cut -d" " -f1) if [ "$SHA256" != "$EXPECTED_SHA256" ]; then echo "Failed" && exit -1; fi tar -xvf $FILENAME rm $FILENAME mv tor-* tor-x86_64 cp -r tor-x86_64 tor-arm64 mkdir -p /Users/distiller/compiled/tor-x86-64 /Users/distiller/compiled/tor-amd64 /Users/distiller/compiled/tor-universal # Build x86_64 cd tor-x86_64 export CFLAGS="-arch x86_64" ./configure --prefix=$INSTALL_X86_64 make make install # Build arm64 cd ../tor-arm64 export CFLAGS="-arch arm64" ./configure --host=x86_64-apple-darwin20.5.0 --disable-tool-name-check --prefix=$INSTALL_ARM64 make make install - run: name: Make tor universal2 binary command: | cp $INSTALL_ARM64/share/tor/* $INSTALL_UNIVERSAL2 lipo -create -output $INSTALL_UNIVERSAL2/libevent-2.1.7.dylib $INSTALL_ARM64/lib/libevent-2.1.7.dylib $INSTALL_X86_64/lib/libevent-2.1.7.dylib lipo -create -output $INSTALL_UNIVERSAL2/tor $INSTALL_ARM64/bin/tor $INSTALL_X86_64/bin/tor - run: name: Build obfs4proxy (universal2) command: | # Get source code mkdir ~/Downloads/obfs4proxy cd ~/Downloads/obfs4proxy git clone https://gitlab.com/yawning/obfs4 cd obfs4 # Build x86_64 and arm64 GOOS=darwin GOARCH=amd64 go build -o obfs4proxy_x86_64 ./obfs4proxy GOOS=darwin GOARCH=arm64 go build -o obfs4proxy_arm64 ./obfs4proxy # Combine them lipo -create -output $INSTALL_UNIVERSAL2/obfs4proxy obfs4proxy_arm64 obfs4proxy_x86_64 - run: name: Build snowflake-client (universal2) command: | # Get source code mkdir ~/Downloads/snowflake-client cd ~/Downloads/snowflake-client git clone https://git.torproject.org/pluggable-transports/snowflake.git cd snowflake # Build x86_64 and arm64 GOOS=darwin GOARCH=amd64 go build -o snowflake-client_x86_64 ./client GOOS=darwin GOARCH=arm64 go build -o snowflake-client_arm64 ./client # Combine them lipo -create -output $INSTALL_UNIVERSAL2/snowflake-client snowflake-client_arm64 snowflake-client_x86_64 - run: name: Build meek-client (universal2) command: | # Get source code mkdir ~/Downloads/meek-client cd ~/Downloads/meek-client git clone https://git.torproject.org/pluggable-transports/meek.git cd meek # Build x86_64 and arm64 GOOS=darwin GOARCH=amd64 go build -o meek-client_x86_64 ./meek-client GOOS=darwin GOARCH=arm64 go build -o meel-client_arm64 ./meek-client # Combine them lipo -create -output $INSTALL_UNIVERSAL2/meek-client meek-client_arm64 meek-client_x86_64 - run: name: Install Python 3.9.12 command: | wget https://www.python.org/ftp/python/3.9.12/python-3.9.12-macos11.pkg -O ~/Downloads/python.pkg sudo installer -pkg ~/Downloads/python.pkg -target / - run: name: Install poetry command: | pip3 install poetry ln -s /Library/Frameworks/Python.framework/Versions/3.9/bin/poetry /usr/local/bin - run: name: Install poetry dependencies command: | cd ~/project/desktop poetry install - run: name: Build OnionShare command: | cd ~/project/desktop poetry run python ./setup-freeze.py build poetry run python ./setup-freeze.py bdist_mac poetry run python ./scripts/build-macos.py cleanup-build - run: name: Compress command: | cd ~/project/desktop/build zip -r ~/onionshare-macos.zip OnionShare.app - store_artifacts: path: ~/onionshare-macos.zip # build-snapcraft: # docker: # - image: snapcore/snapcraft:stable # working_directory: ~/repo # steps: # - checkout # - run: # name: Install extra snaps without snapd # command: | # mkdir ~/tmp # install_snap () { cd ~/tmp && snap download $1 && mkdir -p /snap/$1 && unsquashfs -d /snap/$1/current *.snap && rm ~/tmp/*; } # install_snap "core18" # install_snap "go" # install_snap "gnome-3-34-1804" # install_snap "gnome-3-34-1804-sdk" # - run: # name: Build the snap # command: | # cd ~/repo # snapcraft # mv onionshare-*_amd64.snap ~/onionshare_amd64.snap # - store_artifacts: # path: ~/onionshare_amd64.snap