diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ef6906b..e63098e 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -34,3 +34,32 @@ jobs: release-builds: name: Release builds uses: apple/swift-nio/.github/workflows/release_builds.yml@main + + construct-example-packages-matrix: + name: Construct example packages matrix + runs-on: ubuntu-latest + outputs: + example-packages-matrix: '${{ steps.generate-matrix.outputs.example-packages-matrix }}' + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + persist-credentials: false + - id: generate-matrix + run: echo "example-packages-matrix=$(curl -s https://raw.githubusercontent.com/apple/swift-nio/main/scripts/generate_matrix.sh | bash)" >> "$GITHUB_OUTPUT" + env: + MATRIX_LINUX_SETUP_COMMAND: git config --global --add safe.directory /swift-metrics-extras + MATRIX_LINUX_COMMAND: ./Scripts/test-examples.sh + MATRIX_LINUX_5_10_ENABLED: false + MATRIX_LINUX_6_0_ENABLED: false + MATRIX_LINUX_6_1_ENABLED: false + MATRIX_LINUX_NIGHTLY_NEXT_ENABLED: false + MATRIX_LINUX_NIGHTLY_MAIN_ENABLED: false + + example-packages: + name: Example packages + needs: construct-example-packages-matrix + uses: apple/swift-nio/.github/workflows/swift_test_matrix.yml@main + with: + name: "Example packages" + matrix_string: '${{ needs.construct-example-packages-matrix.outputs.example-packages-matrix }}' diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index dbff4c3..d708e93 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -38,3 +38,32 @@ jobs: release-builds: name: Release builds uses: apple/swift-nio/.github/workflows/release_builds.yml@main + + construct-example-packages-matrix: + name: Construct example packages matrix + runs-on: ubuntu-latest + outputs: + example-packages-matrix: '${{ steps.generate-matrix.outputs.example-packages-matrix }}' + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + persist-credentials: false + - id: generate-matrix + run: echo "example-packages-matrix=$(curl -s https://raw.githubusercontent.com/apple/swift-nio/main/scripts/generate_matrix.sh | bash)" >> "$GITHUB_OUTPUT" + env: + MATRIX_LINUX_SETUP_COMMAND: git config --global --add safe.directory /swift-metrics-extras + MATRIX_LINUX_COMMAND: ./Scripts/test-examples.sh + MATRIX_LINUX_5_10_ENABLED: false + MATRIX_LINUX_6_0_ENABLED: false + MATRIX_LINUX_6_1_ENABLED: false + MATRIX_LINUX_NIGHTLY_NEXT_ENABLED: false + MATRIX_LINUX_NIGHTLY_MAIN_ENABLED: false + + example-packages: + name: Build Examples + needs: construct-example-packages-matrix + uses: apple/swift-nio/.github/workflows/swift_test_matrix.yml@main + with: + name: "Example packages" + matrix_string: '${{ needs.construct-example-packages-matrix.outputs.example-packages-matrix }}' diff --git a/.licenseignore b/.licenseignore index 3fab865..c905c46 100644 --- a/.licenseignore +++ b/.licenseignore @@ -33,3 +33,4 @@ Dockerfile Snippets/* dev/git.commit.template .unacceptablelanguageignore +Scripts/* diff --git a/Scripts/test-examples.sh b/Scripts/test-examples.sh new file mode 100755 index 0000000..c8acf30 --- /dev/null +++ b/Scripts/test-examples.sh @@ -0,0 +1,36 @@ +#!/bin/bash +set -euo pipefail + +log() { printf -- "** %s\n" "$*" >&2; } +error() { printf -- "** ERROR: %s\n" "$*" >&2; } +fatal() { error "$@"; exit 1; } + +log "Checking required executables..." +SWIFT_BIN=${SWIFT_BIN:-$(command -v swift || xcrun -f swift)} || fatal "SWIFT_BIN unset and no swift on PATH" + +CURRENT_SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +REPO_ROOT="$(git -C "${CURRENT_SCRIPT_DIR}" rev-parse --show-toplevel)" +PACKAGE_NAME=$(basename "$REPO_ROOT") +TMP_DIR=$(/usr/bin/mktemp -d -p "${TMPDIR-/tmp}" "$(basename "$0").XXXXXXXXXX") +WORK_DIR="$TMP_DIR/$PACKAGE_NAME" +/bin/mkdir -p "$WORK_DIR" + +git archive HEAD "${REPO_ROOT}" --format tar | tar -C "${WORK_DIR}" -xvf- + +EXAMPLES_PATH="$WORK_DIR/Examples" +for EXAMPLE_PACKAGE_PATH in $(find "${EXAMPLES_PATH}" -maxdepth 2 -name Package.swift -type f -print0 | xargs -0 dirname | sort); do + EXAMPLE_PACKAGE_NAME=$(basename "$EXAMPLE_PACKAGE_PATH") + log "Building example package: ${EXAMPLE_PACKAGE_NAME}" + "${SWIFT_BIN}" build --build-tests \ + --package-path "${EXAMPLE_PACKAGE_PATH}" \ + --skip-update + log "✅ Successfully built the example package ${EXAMPLE_PACKAGE_NAME}." + + if [ -d "${EXAMPLE_PACKAGE_PATH}/Tests" ]; then + log "Running tests for example package: ${EXAMPLE_PACKAGE_NAME}" + "${SWIFT_BIN}" test \ + --package-path "${EXAMPLE_PACKAGE_PATH}" \ + --skip-update + log "✅ Passed the tests for the example package ${EXAMPLE_PACKAGE_NAME}." + fi +done