diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 98ac754c20..f490244570 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -34,6 +34,9 @@ permissions: {} env: CURL_CI: github CURL_TEST_MIN: 1700 + OPENSSH_WINDOWS_VERSION: 10.0.0.0p2-Preview + OPENSSH_WINDOWS_SHA256_ARM64: 698c6aec31c1dd0fb996206e8741f4531a97355686b5431ef347d531b07fcd42 + OPENSSH_WINDOWS_SHA256_WIN64: 23f50f3458c4c5d0b12217c6a5ddfde0137210a30fa870e98b29827f7b43aba5 STUNNEL_VERSION: 5.77 STUNNEL_SHA256: 59ba0c5330de85ef474164b40cc559b2eb4e2b8d788c48b564e2257efa236384 @@ -238,6 +241,7 @@ jobs: LDFLAGS: -s MAKEFLAGS: -j 5 MATRIX_BUILD: '${{ matrix.build }}' + MATRIX_OPENSSH: '${{ matrix.openssh }}' MATRIX_SYS: '${{ matrix.sys }}' MATRIX_TEST: '${{ matrix.test }}' strategy: @@ -281,10 +285,10 @@ jobs: build: 'cmake' , sys: 'ucrt64' , env: 'ucrt-x86_64' , tflags: '-t --shallow=13 --min=700 951 to 9999', config: '-DENABLE_DEBUG=ON -DBUILD_SHARED_LIBS=OFF -DCURL_USE_SCHANNEL=ON -DENABLE_UNICODE=ON -DENABLE_ARES=ON', install: 'mingw-w64-ucrt-x86_64-c-ares mingw-w64-ucrt-x86_64-libssh2' } - - { name: 'gnutls', type: 'Debug', + - { name: 'gnutls', type: 'Debug', openssh: 'OpenSSH-Windows', build: 'cmake' , sys: 'clang64' , env: 'clang-x86_64' , tflags: '' , config: '-DENABLE_DEBUG=ON -DBUILD_SHARED_LIBS=OFF -DCURL_USE_GNUTLS=ON -DENABLE_UNICODE=OFF -DUSE_NGTCP2=ON -DCURL_ENABLE_NTLM=ON', - install: 'mingw-w64-clang-x86_64-gnutls mingw-w64-clang-x86_64-nghttp3 mingw-w64-clang-x86_64-ngtcp2' } + install: 'mingw-w64-clang-x86_64-gnutls mingw-w64-clang-x86_64-nghttp3 mingw-w64-clang-x86_64-ngtcp2 unzip' } - { name: 'schannel R', type: 'Release', image: 'windows-11-arm', build: 'cmake' , sys: 'clangarm64', env: 'clang-aarch64', tflags: 'skiprun' , config: '-DENABLE_DEBUG=OFF -DBUILD_SHARED_LIBS=ON -DCURL_USE_SCHANNEL=ON -DENABLE_UNICODE=ON -DCURL_DROP_UNUSED=ON', @@ -462,7 +466,27 @@ jobs: - name: 'install test prereqs' if: ${{ matrix.tflags != 'skipall' && matrix.tflags != 'skiprun' }} timeout-minutes: 2 - run: /usr/bin/pacman --noconfirm --noprogressbar --sync --needed openssh + run: | + if [ -z "${MATRIX_OPENSSH}" ]; then # MSYS2 openssh + /usr/bin/pacman --noconfirm --noprogressbar --sync --needed openssh + elif [ "${MATRIX_OPENSSH}" = 'OpenSSH-Windows-builtin' ]; then + # https://learn.microsoft.com/windows-server/administration/openssh/openssh_install_firstuse + if [[ "${MATRIX_IMAGE}" = *'windows-2025'* ]]; then + pwsh -Command 'Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0' + pwsh -Command 'Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0' + fi + else # OpenSSH-Windows + cd /c # no D: drive on windows-11-arm runners + if [[ "${MATRIX_IMAGE}" = *'-arm'* ]]; then + curl --disable --fail --silent --show-error --connect-timeout 15 --max-time 60 --retry 3 --retry-connrefused \ + --location "https://github.com/PowerShell/Win32-OpenSSH/releases/download/${OPENSSH_WINDOWS_VERSION}/OpenSSH-ARM64.zip" --output pkg.bin + sha256sum pkg.bin && sha256sum pkg.bin | grep -qwF -- "${OPENSSH_WINDOWS_SHA256_ARM64}" && unzip pkg.bin && rm -f pkg.bin + else + curl --disable --fail --silent --show-error --connect-timeout 15 --max-time 60 --retry 3 --retry-connrefused \ + --location "https://github.com/PowerShell/Win32-OpenSSH/releases/download/${OPENSSH_WINDOWS_VERSION}/OpenSSH-Win64.zip" --output pkg.bin + sha256sum pkg.bin && sha256sum pkg.bin | grep -qwF -- "${OPENSSH_WINDOWS_SHA256_WIN64}" && unzip pkg.bin && rm -f pkg.bin + fi + fi - name: 'run tests' if: ${{ matrix.tflags != 'skipall' && matrix.tflags != 'skiprun' }} @@ -483,6 +507,22 @@ jobs: export CURL_TEST_NO_TASKKILL=1 # experiment to see if it reduces flaky failures fi fi + if [ -n "${MATRIX_OPENSSH}" ]; then # OpenSSH-Windows + TFLAGS+=' ~601 ~603 ~617 ~619 ~621 ~641 ~665 ~2004' # SCP + if [[ "${MATRIX_INSTALL_MSYS2} " = *'libssh '* || \ + "${MATRIX_INSTALL_VCPKG} " = *'libssh '* ]]; then + TFLAGS+=' ~614' # 'SFTP pre-quote chmod' SFTP, pre-quote, directory + else + TFLAGS+=' ~3022' # 'SCP correct sha256 host key' SCP, server sha256 key check + fi + fi + if [ "${MATRIX_OPENSSH}" = 'OpenSSH-Windows' ]; then + if [[ "${MATRIX_IMAGE}" = *'-arm'* ]]; then + PATH="/c/OpenSSH-ARM64:$PATH" + else + PATH="/c/OpenSSH-Win64:$PATH" + fi + fi if [ -x "$(cygpath "${SYSTEMROOT}/System32/curl.exe")" ]; then TFLAGS+=" -ac $(cygpath "${SYSTEMROOT}/System32/curl.exe")" fi @@ -837,8 +877,6 @@ jobs: MATRIX_OPENSSH: '${{ matrix.openssh }}' MATRIX_PLAT: '${{ matrix.plat }}' MATRIX_TYPE: '${{ matrix.type }}' - OPENSSH_WINDOWS_VERSION: v9.8.1.0p1-Preview - OPENSSH_WINDOWS_SHA256: c7a1369cd73c8165be00c66e90291c4dd67784de7c3aa3af18c68ebedffa6ea9 VCPKG_DISABLE_METRICS: '1' strategy: matrix: @@ -1074,7 +1112,7 @@ jobs: - name: 'install test prereqs' if: ${{ matrix.tflags != 'skipall' && matrix.tflags != 'skiprun' }} - timeout-minutes: 5 + timeout-minutes: 2 run: | if [ -z "${MATRIX_OPENSSH}" ]; then # MSYS2 openssh /usr/bin/pacman --noconfirm --noprogressbar --sync --needed openssh @@ -1086,9 +1124,15 @@ jobs: fi else # OpenSSH-Windows cd /c # no D: drive on windows-11-arm runners - curl --disable --fail --silent --show-error --connect-timeout 15 --max-time 60 --retry 3 --retry-connrefused \ - --location "https://github.com/PowerShell/Win32-OpenSSH/releases/download/${OPENSSH_WINDOWS_VERSION}/OpenSSH-Win64.zip" --output pkg.bin - sha256sum pkg.bin && sha256sum pkg.bin | grep -qwF -- "${OPENSSH_WINDOWS_SHA256}" && unzip pkg.bin && rm -f pkg.bin + if [[ "${MATRIX_IMAGE}" = *'-arm'* ]]; then + curl --disable --fail --silent --show-error --connect-timeout 15 --max-time 60 --retry 3 --retry-connrefused \ + --location "https://github.com/PowerShell/Win32-OpenSSH/releases/download/${OPENSSH_WINDOWS_VERSION}/OpenSSH-ARM64.zip" --output pkg.bin + sha256sum pkg.bin && sha256sum pkg.bin | grep -qwF -- "${OPENSSH_WINDOWS_SHA256_ARM64}" && unzip pkg.bin && rm -f pkg.bin + else + curl --disable --fail --silent --show-error --connect-timeout 15 --max-time 60 --retry 3 --retry-connrefused \ + --location "https://github.com/PowerShell/Win32-OpenSSH/releases/download/${OPENSSH_WINDOWS_VERSION}/OpenSSH-Win64.zip" --output pkg.bin + sha256sum pkg.bin && sha256sum pkg.bin | grep -qwF -- "${OPENSSH_WINDOWS_SHA256_WIN64}" && unzip pkg.bin && rm -f pkg.bin + fi fi if "bld/src/${MATRIX_TYPE}/curl.exe" --disable -V 2>/dev/null | grep smb; then python3 -m pip --disable-pip-version-check --no-input --no-cache-dir install --progress-bar off --prefer-binary -r tests/requirements.txt @@ -1115,7 +1159,13 @@ jobs: else TFLAGS+=' ~3022' # 'SCP correct sha256 host key' SCP, server sha256 key check fi - PATH="/c/OpenSSH-Win64:$PATH" + fi + if [ "${MATRIX_OPENSSH}" = 'OpenSSH-Windows' ]; then + if [[ "${MATRIX_IMAGE}" = *'-arm'* ]]; then + PATH="/c/OpenSSH-ARM64:$PATH" + else + PATH="/c/OpenSSH-Win64:$PATH" + fi fi PATH="$PWD/bld/lib/${MATRIX_TYPE}:$PATH:/c/my-stunnel/bin" cmake --build bld --config "${MATRIX_TYPE}" --target test-ci