diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 0336d05c6f..2e9498e793 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -76,3 +76,8 @@ jobs: run: swift test --filter "(?i)vsock" | tee test.out - name: Check for skipped tests run: test -r test.out && ! grep -i skipped test.out + + static-sdk: + name: Static SDK + # Workaround https://github.com/nektos/act/issues/1875 + uses: apple/swift-nio/.github/workflows/static_sdk.yml@static_sdk_workflow # TODO: change to @main diff --git a/.github/workflows/static_sdk.yml b/.github/workflows/static_sdk.yml new file mode 100644 index 0000000000..3a0220214e --- /dev/null +++ b/.github/workflows/static_sdk.yml @@ -0,0 +1,37 @@ +name: Static SDK + +on: + workflow_call: + +jobs: + static-sdk: + name: Static SDK + # Workaround https://github.com/nektos/act/issues/1875 + uses: apple/swift-nio/.github/workflows/swift_test_matrix.yml@static_sdk_workflow # TODO: change to @main + with: + name: "Static SDK" + matrix_string: >- + { + "swift":[ + { + "name":"latest-release Jammy", + "swift_version":"6.0.2", + "platform":"Linux", + "runner":"ubuntu-latest", + "image":"ubuntu:jammy", + "setup_command":"INSTALL_SWIFT_STATIC_SDK_VERSION=latest INSTALL_SWIFT_STATIC_SDK_ARCH=x86_64 ./scripts/install_static_sdk.sh", + "command":"swift build", + "command_arguments":"--swift-sdk x86_64-swift-linux-musl" + }, + { + "name":"main Jammy", + "swift_version":"main", + "platform":"Linux", + "runner":"ubuntu-latest", + "image":"ubuntu:jammy", + "setup_command":"INSTALL_SWIFT_STATIC_SDK_BRANCH=main INSTALL_SWIFT_STATIC_SDK_ARCH=x86_64 ./scripts/install_static_sdk.sh", + "command":"swift build", + "command_arguments":"--swift-sdk x86_64-swift-linux-musl" + } + ] + } diff --git a/.github/workflows/swift_load_test_matrix.yml b/.github/workflows/swift_load_test_matrix.yml index f0c34c2da5..7e53038c0c 100644 --- a/.github/workflows/swift_load_test_matrix.yml +++ b/.github/workflows/swift_load_test_matrix.yml @@ -28,13 +28,14 @@ jobs: run: git config --global --add safe.directory ${GITHUB_WORKSPACE} - id: load-matrix run: | - printf "swift-matrix=%s" "$(jq -c '.' ${{ inputs.matrix_path }})" >> "$GITHUB_OUTPUT" + printf "swift-matrix=%s" "$(jq -ec '.' ${{ inputs.matrix_path }})" >> "$GITHUB_OUTPUT" + execute-matrix: name: Execute matrix needs: load-matrix # Workaround https://github.com/nektos/act/issues/1875 - uses: apple/swift-nio/.github/workflows/swift_test_matrix.yml@main + uses: apple/swift-nio/.github/workflows/swift_test_matrix.yml@static_sdk_workflow # TODO: change to @main with: name: ${{ inputs.name }} matrix_string: '${{ needs.load-matrix.outputs.swift-matrix }}' diff --git a/.github/workflows/swift_test_matrix.yml b/.github/workflows/swift_test_matrix.yml index cec7fd70f5..8d40e3ede6 100644 --- a/.github/workflows/swift_test_matrix.yml +++ b/.github/workflows/swift_test_matrix.yml @@ -47,7 +47,7 @@ jobs: -e setup_command_expression="$setup_command_expression" \ -e workspace="$workspace" \ ${{ matrix.swift.image }} \ - bash -c "swift --version && git config --global --add safe.directory \"$workspace\" && $setup_command_expression ${{ matrix.swift.command }} ${{ matrix.swift.command_arguments }}" + bash -c "$setup_command_expression ${{ matrix.swift.command }} ${{ matrix.swift.command_arguments }}" - name: Run matrix job (Windows) if: ${{ matrix.swift.platform == 'Windows' }} run: | diff --git a/scripts/install_static_sdk.sh b/scripts/install_static_sdk.sh new file mode 100755 index 0000000000..51ac354725 --- /dev/null +++ b/scripts/install_static_sdk.sh @@ -0,0 +1,130 @@ +#!/bin/bash +##===----------------------------------------------------------------------===## +## +## This source file is part of the SwiftNIO open source project +## +## Copyright (c) 2024 Apple Inc. and the SwiftNIO project authors +## Licensed under Apache License v2.0 +## +## See LICENSE.txt for license information +## See CONTRIBUTORS.txt for the list of SwiftNIO project authors +## +## SPDX-License-Identifier: Apache-2.0 +## +##===----------------------------------------------------------------------===## + +set -uo pipefail + +log() { printf -- "** %s\n" "$*" >&2; } +error() { printf -- "** ERROR: %s\n" "$*" >&2; } +fatal() { error "$@"; exit 1; } + +# Parameter environment variables +branch="${INSTALL_SWIFT_STATIC_SDK_BRANCH:=""}" +version="${INSTALL_SWIFT_STATIC_SDK_VERSION:=""}" +arch="${INSTALL_SWIFT_STATIC_SDK_ARCH:="aarch64"}" +os_image="${INSTALL_SWIFT_STATIC_SDK_OS_IMAGE:="ubuntu22.04"}" + +if [[ ! ( -n "$branch" && -z "$version" ) && ! ( -z "$branch" && -n "$version") ]]; then + fatal "Exactly one of build or version must be defined." +fi + +log "Installing tools for this script" +if command -v apt-get >/dev/null; then + package_manager="apt-get" + apt-get update > /dev/null +elif command -v yum >/dev/null; then + package_manager="yum" +else + fatal "Cannot find either 'apt' or 'yum'" +fi + +"$package_manager" install -y curl rsync jq tar > /dev/null +case "$arch" in + "aarch64") + arch_suffix="-$arch" ;; + "x86_64") + arch_suffix="" ;; + *) + fatal "Unexpected architecture: $arch" ;; +esac + +os_image_sanitized="${os_image//./}" +echo $os_image_sanitized + +if [[ -n "$branch" ]]; then + # Some snapshots may not have all the artefacts we require + log "Discovering branch snapshot for branch $branch" + snapshots="$(curl -s "https://www.swift.org/api/v1/install/dev/main/${os_image_sanitized}.json" | jq -r --arg arch $arch '.[$arch] | unique | reverse | .[].dir')" + for snapshot in $snapshots; do + snapshot_url="https://download.swift.org/development/${os_image_sanitized}${arch_suffix}/${snapshot}/${snapshot}-${os_image}${arch_suffix}.tar.gz" + static_sdk_url="https://download.swift.org/development/static-sdk/${snapshot}/${snapshot}_static-linux-0.0.1.artifactbundle.tar.gz" + + # check that the files exist + curl -sILXGET --fail "$snapshot_url" > /dev/null; snapshot_return_code=$? + curl -sILXGET --fail "$static_sdk_url" > /dev/null; static_sdk_return_code=$? + + if [[ ("$snapshot_return_code" -eq 0) && ("$static_sdk_return_code" -eq 0) ]]; then + log "Discovered branch snapshot: $snapshot" + break + else + log "Snapshot unavailable: $snapshot (Snapshot return code: $snapshot_return_code, Static SDK return code: $static_sdk_return_code)" + snapshot="" + fi + done + if [[ -z "$snapshot" ]]; then + fatal "Failed to discover usable Swift snapshot" + fi + +elif [[ -n "$version" ]]; then + if [[ "$version" == "latest" ]]; then + log "Discovering latest version" + version=$(curl -s https://www.swift.org/api/v1/install/releases.json | jq -r '.[-1].tag' | sed -E 's/swift-([0-9]+\.[0-9]+\.[0-9]+)-RELEASE/\1/') + if [[ -z "$version" ]]; then + fatal "Failed to discover latest Swift version" + fi + log "Discovered latest Swift version: $version" + fi + + snapshot_url="https://download.swift.org/swift-${version}-release/${os_image_sanitized}${arch_suffix}/swift-${version}-RELEASE/swift-${version}-RELEASE-${os_image}${arch_suffix}.tar.gz" + static_sdk_url="https://download.swift.org/swift-${version}-release/static-sdk/swift-${version}-RELEASE/swift-${version}-RELEASE_static-linux-0.0.1.artifactbundle.tar.gz" +fi + +log "Installing standard Swift pre-requisites" # pre-reqs list taken from swift.org +DEBIAN_FRONTEND=noninteractive "$package_manager" install -y\ + binutils\ + git\ + gnupg2\ + libc6-dev\ + libcurl4-openssl-dev\ + libedit2\ + libgcc-11-dev\ + libpython3-dev\ + libsqlite3-0\ + libstdc++-11-dev\ + libxml2-dev\ + libz3-dev\ + pkg-config\ + python3-lldb-13\ + tzdata\ + unzip\ + zlib1g-dev\ + > /dev/null + +log "Obtaining Swift toolchain" +log "Snapshot URL: $snapshot_url" +snapshot_path="/tmp/$(basename "$snapshot_url")" +curl -sL "$snapshot_url" -o "$snapshot_path" + +log "Installing Swift toolchain" +mkdir -p /tmp/snapshot +tar xfz "$snapshot_path" --strip-components 1 -C /tmp/snapshot +rsync -a /tmp/snapshot/* / + +log "Obtaining Static SDK" +log "Static SDK URL: $static_sdk_url" +static_sdk_path="/tmp/$(basename "$static_sdk_url")" +curl -sL "$static_sdk_url" -o "$static_sdk_path" + +log "Installing Static SDK" +swift sdk install "$static_sdk_path" \ No newline at end of file