Selaa lähdekoodia

Raise minimum Swift version to 5.5 (#1483)

Motivation:

Now that 5.7 has been released NIO is due to drop support for 5.4. gRPC
Swift must do the same.

Modifications:

- Remove 5.4 from the CI
- Add 5.7 release, move 5.7-nightly to main-nightly
- Update Package.swift for the FuzzTesting subpackage to 5.7
- Update the README.md and Docc index page.

Result:

Minimum supported Swift version is 5.4
George Barnett 3 vuotta sitten
vanhempi
commit
75030dddf5
5 muutettua tiedostoa jossa 32 lisäystä ja 491 poistoa
  1. 17 16
      .github/workflows/ci.yaml
  2. 1 1
      FuzzTesting/Package.swift
  3. 0 470
      Package@swift-5.4.swift
  4. 7 2
      README.md
  5. 7 2
      Sources/GRPC/Docs.docc/index.md

+ 17 - 16
.github/workflows/ci.yaml

@@ -24,7 +24,10 @@ jobs:
       fail-fast: false
       matrix:
         include:
-          - image: swiftlang/swift:nightly-5.7-focal
+          - image: swiftlang/swift:nightly-focal
+            # No TSAN because of: https://github.com/apple/swift/issues/59068
+            # swift-test-flags: "--sanitize=thread"
+          - image: swift:5.7-jammy
             # No TSAN because of: https://github.com/apple/swift/issues/59068
             # swift-test-flags: "--sanitize=thread"
           - image: swift:5.6-focal
@@ -32,8 +35,6 @@ jobs:
             # swift-test-flags: "--sanitize=thread"
           - image: swift:5.5-focal
             swift-test-flags: "--sanitize=thread"
-          - image: swift:5.4-focal
-            swift-test-flags: "--sanitize=thread"
     name: Build and Test on ${{ matrix.image }}
     runs-on: ubuntu-latest
     container:
@@ -53,7 +54,17 @@ jobs:
       fail-fast: false
       matrix:
         include:
-          - image: swiftlang/swift:nightly-5.7-focal
+          - image: swiftlang/swift:nightly-focal
+            env:
+              MAX_ALLOCS_ALLOWED_bidi_1k_rpcs_10_requests: 428000
+              MAX_ALLOCS_ALLOWED_bidi_1k_rpcs_1_request: 176000
+              MAX_ALLOCS_ALLOWED_embedded_server_bidi_1k_rpcs_10_small_requests: 110000
+              MAX_ALLOCS_ALLOWED_embedded_server_bidi_1k_rpcs_1_small_request: 65000
+              MAX_ALLOCS_ALLOWED_embedded_server_unary_1k_rpcs_1_small_request: 61000
+              MAX_ALLOCS_ALLOWED_unary_1k_ping_pong: 174000
+              MAX_ALLOCS_ALLOWED_unary_1k_ping_pong_interceptors_client: 181000
+              MAX_ALLOCS_ALLOWED_unary_1k_ping_pong_interceptors_server: 181000
+          - image: swift:5.7-jammy
             env:
               MAX_ALLOCS_ALLOWED_bidi_1k_rpcs_10_requests: 428000
               MAX_ALLOCS_ALLOWED_bidi_1k_rpcs_1_request: 176000
@@ -83,16 +94,6 @@ jobs:
               MAX_ALLOCS_ALLOWED_unary_1k_ping_pong: 186000
               MAX_ALLOCS_ALLOWED_unary_1k_ping_pong_interceptors_client: 193000
               MAX_ALLOCS_ALLOWED_unary_1k_ping_pong_interceptors_server: 193000
-          - image: swift:5.4-focal
-            env:
-              MAX_ALLOCS_ALLOWED_bidi_1k_rpcs_10_requests: 459000
-              MAX_ALLOCS_ALLOWED_bidi_1k_rpcs_1_request: 189000
-              MAX_ALLOCS_ALLOWED_embedded_server_bidi_1k_rpcs_10_small_requests: 110000
-              MAX_ALLOCS_ALLOWED_embedded_server_bidi_1k_rpcs_1_small_request: 65000
-              MAX_ALLOCS_ALLOWED_embedded_server_unary_1k_rpcs_1_small_request: 61000
-              MAX_ALLOCS_ALLOWED_unary_1k_ping_pong: 186000
-              MAX_ALLOCS_ALLOWED_unary_1k_ping_pong_interceptors_client: 193000
-              MAX_ALLOCS_ALLOWED_unary_1k_ping_pong_interceptors_server: 193000
     name: Performance Tests on ${{ matrix.image }}
     runs-on: ubuntu-latest
     container:
@@ -108,10 +109,10 @@ jobs:
       fail-fast: false
       matrix:
         include:
-          - image: swiftlang/swift:nightly-5.7-focal
+          - image: swiftlang/swift:nightly-focal
+          - image: swift:5.7-jammy
           - image: swift:5.6-focal
           - image: swift:5.5-focal
-          - image: swift:5.4-focal
     name: Integration Tests on ${{ matrix.image }}
     runs-on: ubuntu-latest
     container:

+ 1 - 1
FuzzTesting/Package.swift

@@ -1,4 +1,4 @@
-// swift-tools-version:5.4
+// swift-tools-version:5.7
 /*
  * Copyright 2021, gRPC Authors All rights reserved.
  *

+ 0 - 470
Package@swift-5.4.swift

@@ -1,470 +0,0 @@
-// swift-tools-version:5.4
-/*
- * Copyright 2022, gRPC Authors All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-import PackageDescription
-// swiftformat puts the next import before the tools version.
-// swiftformat:disable:next sortedImports
-import class Foundation.ProcessInfo
-
-let grpcPackageName = "grpc-swift"
-let grpcProductName = "GRPC"
-let cgrpcZlibProductName = "CGRPCZlib"
-let grpcTargetName = grpcProductName
-let cgrpcZlibTargetName = cgrpcZlibProductName
-
-let includeNIOSSL = ProcessInfo.processInfo.environment["GRPC_NO_NIO_SSL"] == nil
-
-// MARK: - Package Dependencies
-
-let packageDependencies: [Package.Dependency] = [
-  .package(
-    url: "https://github.com/apple/swift-nio.git",
-    from: "2.36.0"
-  ),
-  .package(
-    url: "https://github.com/apple/swift-nio-http2.git",
-    from: "1.22.0"
-  ),
-  .package(
-    url: "https://github.com/apple/swift-nio-transport-services.git",
-    from: "1.11.1"
-  ),
-  .package(
-    url: "https://github.com/apple/swift-nio-extras.git",
-    from: "1.4.0"
-  ),
-  .package(
-    name: "SwiftProtobuf",
-    url: "https://github.com/apple/swift-protobuf.git",
-    from: "1.19.0"
-  ),
-  .package(
-    url: "https://github.com/apple/swift-log.git",
-    from: "1.4.0"
-  ),
-  .package(
-    url: "https://github.com/apple/swift-argument-parser.git",
-    from: "1.0.0"
-  ),
-].appending(
-  .package(
-    url: "https://github.com/apple/swift-nio-ssl.git",
-    from: "2.14.0"
-  ),
-  if: includeNIOSSL
-)
-
-// MARK: - Target Dependencies
-
-extension Target.Dependency {
-  // Target dependencies; external
-  static let grpc: Self = .target(name: grpcTargetName)
-  static let cgrpcZlib: Self = .target(name: cgrpcZlibTargetName)
-  static let protocGenGRPCSwift: Self = .target(name: "protoc-gen-grpc-swift")
-
-  // Target dependencies; internal
-  static let grpcSampleData: Self = .target(name: "GRPCSampleData")
-  static let echoModel: Self = .target(name: "EchoModel")
-  static let echoImplementation: Self = .target(name: "EchoImplementation")
-  static let helloWorldModel: Self = .target(name: "HelloWorldModel")
-  static let routeGuideModel: Self = .target(name: "RouteGuideModel")
-  static let interopTestModels: Self = .target(name: "GRPCInteroperabilityTestModels")
-  static let interopTestImplementation: Self =
-    .target(name: "GRPCInteroperabilityTestsImplementation")
-
-  // Product dependencies
-  static let argumentParser: Self = .product(
-    name: "ArgumentParser",
-    package: "swift-argument-parser"
-  )
-  static let nio: Self = .product(name: "NIO", package: "swift-nio")
-  static let nioConcurrencyHelpers: Self = .product(
-    name: "NIOConcurrencyHelpers",
-    package: "swift-nio"
-  )
-  static let nioCore: Self = .product(name: "NIOCore", package: "swift-nio")
-  static let nioEmbedded: Self = .product(name: "NIOEmbedded", package: "swift-nio")
-  static let nioExtras: Self = .product(name: "NIOExtras", package: "swift-nio-extras")
-  static let nioFoundationCompat: Self = .product(name: "NIOFoundationCompat", package: "swift-nio")
-  static let nioHTTP1: Self = .product(name: "NIOHTTP1", package: "swift-nio")
-  static let nioHTTP2: Self = .product(name: "NIOHTTP2", package: "swift-nio-http2")
-  static let nioPosix: Self = .product(name: "NIOPosix", package: "swift-nio")
-  static let nioSSL: Self = .product(name: "NIOSSL", package: "swift-nio-ssl")
-  static let nioTLS: Self = .product(name: "NIOTLS", package: "swift-nio")
-  static let nioTransportServices: Self = .product(
-    name: "NIOTransportServices",
-    package: "swift-nio-transport-services"
-  )
-  static let logging: Self = .product(name: "Logging", package: "swift-log")
-  static let protobuf: Self = .product(name: "SwiftProtobuf", package: "SwiftProtobuf")
-  static let protobufPluginLibrary: Self = .product(
-    name: "SwiftProtobufPluginLibrary",
-    package: "SwiftProtobuf"
-  )
-}
-
-// MARK: - Targets
-
-extension Target {
-  static let grpc: Target = .target(
-    name: grpcTargetName,
-    dependencies: [
-      .cgrpcZlib,
-      .nio,
-      .nioCore,
-      .nioPosix,
-      .nioEmbedded,
-      .nioFoundationCompat,
-      .nioTLS,
-      .nioTransportServices,
-      .nioHTTP1,
-      .nioHTTP2,
-      .nioExtras,
-      .logging,
-      .protobuf,
-    ].appending(
-      .nioSSL, if: includeNIOSSL
-    ),
-    path: "Sources/GRPC"
-  )
-
-  static let cgrpcZlib: Target = .target(
-    name: cgrpcZlibTargetName,
-    path: "Sources/CGRPCZlib",
-    linkerSettings: [
-      .linkedLibrary("z"),
-    ]
-  )
-
-  static let protocGenGRPCSwift: Target = .executableTarget(
-    name: "protoc-gen-grpc-swift",
-    dependencies: [
-      .protobuf,
-      .protobufPluginLibrary,
-    ],
-    exclude: [
-      "README.md",
-    ]
-  )
-
-  static let grpcTests: Target = .testTarget(
-    name: "GRPCTests",
-    dependencies: [
-      .grpc,
-      .echoModel,
-      .echoImplementation,
-      .helloWorldModel,
-      .interopTestModels,
-      .interopTestImplementation,
-      .grpcSampleData,
-      .nioCore,
-      .nioConcurrencyHelpers,
-      .nioPosix,
-      .nioTLS,
-      .nioHTTP1,
-      .nioHTTP2,
-      .nioEmbedded,
-      .nioTransportServices,
-      .logging,
-    ].appending(
-      .nioSSL, if: includeNIOSSL
-    ),
-    exclude: [
-      "Codegen/Normalization/normalization.proto",
-    ]
-  )
-
-  static let interopTestModels: Target = .target(
-    name: "GRPCInteroperabilityTestModels",
-    dependencies: [
-      .grpc,
-      .nio,
-      .protobuf,
-    ],
-    exclude: [
-      "README.md",
-      "generate.sh",
-      "src/proto/grpc/testing/empty.proto",
-      "src/proto/grpc/testing/empty_service.proto",
-      "src/proto/grpc/testing/messages.proto",
-      "src/proto/grpc/testing/test.proto",
-      "unimplemented_call.patch",
-    ]
-  )
-
-  static let interopTestImplementation: Target = .target(
-    name: "GRPCInteroperabilityTestsImplementation",
-    dependencies: [
-      .grpc,
-      .interopTestModels,
-      .nioCore,
-      .nioPosix,
-      .nioHTTP1,
-      .logging,
-    ].appending(
-      .nioSSL, if: includeNIOSSL
-    )
-  )
-
-  static let interopTests: Target = .executableTarget(
-    name: "GRPCInteroperabilityTests",
-    dependencies: [
-      .grpc,
-      .interopTestImplementation,
-      .nioCore,
-      .nioPosix,
-      .logging,
-      .argumentParser,
-    ]
-  )
-
-  static let backoffInteropTest: Target = .executableTarget(
-    name: "GRPCConnectionBackoffInteropTest",
-    dependencies: [
-      .grpc,
-      .interopTestModels,
-      .nioCore,
-      .nioPosix,
-      .logging,
-      .argumentParser,
-    ],
-    exclude: [
-      "README.md",
-    ]
-  )
-
-  static let perfTests: Target = .executableTarget(
-    name: "GRPCPerformanceTests",
-    dependencies: [
-      .grpc,
-      .grpcSampleData,
-      .nioCore,
-      .nioEmbedded,
-      .nioPosix,
-      .nioHTTP2,
-      .argumentParser,
-    ]
-  )
-
-  static let grpcSampleData: Target = .target(
-    name: "GRPCSampleData",
-    dependencies: includeNIOSSL ? [.nioSSL] : [],
-    exclude: [
-      "bundle.p12",
-    ]
-  )
-
-  static let echoModel: Target = .target(
-    name: "EchoModel",
-    dependencies: [
-      .grpc,
-      .nio,
-      .protobuf,
-    ],
-    path: "Sources/Examples/Echo/Model",
-    exclude: [
-      "echo.proto",
-    ]
-  )
-
-  static let echoImplementation: Target = .target(
-    name: "EchoImplementation",
-    dependencies: [
-      .echoModel,
-      .grpc,
-      .nioCore,
-      .nioHTTP2,
-      .protobuf,
-    ],
-    path: "Sources/Examples/Echo/Implementation"
-  )
-
-  static let echo: Target = .executableTarget(
-    name: "Echo",
-    dependencies: [
-      .grpc,
-      .echoModel,
-      .echoImplementation,
-      .grpcSampleData,
-      .nioCore,
-      .nioPosix,
-      .logging,
-      .argumentParser,
-    ].appending(
-      .nioSSL, if: includeNIOSSL
-    ),
-    path: "Sources/Examples/Echo/Runtime"
-  )
-
-  static let helloWorldModel: Target = .target(
-    name: "HelloWorldModel",
-    dependencies: [
-      .grpc,
-      .nio,
-      .protobuf,
-    ],
-    path: "Sources/Examples/HelloWorld/Model",
-    exclude: [
-      "helloworld.proto",
-    ]
-  )
-
-  static let helloWorldClient: Target = .executableTarget(
-    name: "HelloWorldClient",
-    dependencies: [
-      .grpc,
-      .helloWorldModel,
-      .nioCore,
-      .nioPosix,
-      .argumentParser,
-    ],
-    path: "Sources/Examples/HelloWorld/Client"
-  )
-
-  static let helloWorldServer: Target = .executableTarget(
-    name: "HelloWorldServer",
-    dependencies: [
-      .grpc,
-      .helloWorldModel,
-      .nioCore,
-      .nioPosix,
-      .argumentParser,
-    ],
-    path: "Sources/Examples/HelloWorld/Server"
-  )
-
-  static let routeGuideModel: Target = .target(
-    name: "RouteGuideModel",
-    dependencies: [
-      .grpc,
-      .nio,
-      .protobuf,
-    ],
-    path: "Sources/Examples/RouteGuide/Model",
-    exclude: [
-      "route_guide.proto",
-    ]
-  )
-
-  static let routeGuideClient: Target = .executableTarget(
-    name: "RouteGuideClient",
-    dependencies: [
-      .grpc,
-      .routeGuideModel,
-      .nioCore,
-      .nioPosix,
-      .argumentParser,
-    ],
-    path: "Sources/Examples/RouteGuide/Client"
-  )
-
-  static let routeGuideServer: Target = .executableTarget(
-    name: "RouteGuideServer",
-    dependencies: [
-      .grpc,
-      .routeGuideModel,
-      .nioCore,
-      .nioConcurrencyHelpers,
-      .nioPosix,
-      .argumentParser,
-    ],
-    path: "Sources/Examples/RouteGuide/Server"
-  )
-
-  static let packetCapture: Target = .executableTarget(
-    name: "PacketCapture",
-    dependencies: [
-      .grpc,
-      .echoModel,
-      .nioCore,
-      .nioPosix,
-      .nioExtras,
-      .argumentParser,
-    ],
-    path: "Sources/Examples/PacketCapture",
-    exclude: [
-      "README.md",
-    ]
-  )
-}
-
-// MARK: - Products
-
-extension Product {
-  static let grpc: Product = .library(
-    name: grpcProductName,
-    targets: [grpcTargetName]
-  )
-
-  static let cgrpcZlib: Product = .library(
-    name: cgrpcZlibProductName,
-    targets: [cgrpcZlibTargetName]
-  )
-
-  static let protocGenGRPCSwift: Product = .executable(
-    name: "protoc-gen-grpc-swift",
-    targets: ["protoc-gen-grpc-swift"]
-  )
-}
-
-// MARK: - Package
-
-let package = Package(
-  name: grpcPackageName,
-  products: [
-    .grpc,
-    .cgrpcZlib,
-    .protocGenGRPCSwift,
-  ],
-  dependencies: packageDependencies,
-  targets: [
-    // Products
-    .grpc,
-    .cgrpcZlib,
-    .protocGenGRPCSwift,
-
-    // Tests etc.
-    .grpcTests,
-    .interopTestModels,
-    .interopTestImplementation,
-    .interopTests,
-    .backoffInteropTest,
-    .perfTests,
-    .grpcSampleData,
-
-    // Examples
-    .echoModel,
-    .echoImplementation,
-    .echo,
-    .helloWorldModel,
-    .helloWorldClient,
-    .helloWorldServer,
-    .routeGuideModel,
-    .routeGuideClient,
-    .routeGuideServer,
-    .packetCapture,
-  ]
-)
-
-extension Array {
-  func appending(_ element: Element, if condition: Bool) -> [Element] {
-    if condition {
-      return self + [element]
-    } else {
-      return self
-    }
-  }
-}

+ 7 - 2
README.md

@@ -35,8 +35,13 @@ The remainder of this README refers to the 1.x version of gRPC Swift.
 gRPC Swift's platform support is identical to the [platform support of Swift
 NIO][swift-nio-platforms].
 
-The earliest supported Swift version for gRPC Swift 1.8.x and newer is 5.4.
-For 1.7.x and earlier the oldest supported Swift version is 5.2.
+The earliest supported version of Swift for gRPC Swift releases are as follows:
+
+gRPC Swift Version | Earliest Swift Version
+-------------------|-----------------------
+`1.0.0 ..< 1.8.0`  | 5.2
+`1.8.0 ..< 1.11.0` | 5.4
+`1.11.0...`        | 5.5
 
 Versions of clients and services which are use Swift's Concurrency support
 are available from gRPC Swift 1.8.0 and require Swift 5.6 and newer.

+ 7 - 2
Sources/GRPC/Docs.docc/index.md

@@ -20,8 +20,13 @@ insecure channels.
 gRPC Swift's platform support is identical to the [platform support of Swift
 NIO][swift-nio-platforms].
 
-The earliest supported Swift version for gRPC Swift 1.8.x and newer is 5.4.
-For 1.7.x and earlier the oldest supported Swift version is 5.2.
+The earliest supported version of Swift for gRPC Swift releases are as follows:
+
+gRPC Swift Version | Earliest Swift Version
+-------------------|-----------------------
+`1.0.0 ..< 1.8.0`  | 5.2
+`1.8.0 ..< 1.11.0` | 5.4
+`1.11.0...`        | 5.5
 
 Versions of clients and services which are use Swift's Concurrency support
 are available from gRPC Swift 1.8.0 and require Swift 5.6 and newer.