Prechádzať zdrojové kódy

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 rokov pred
rodič
commit
75030dddf5

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

@@ -24,7 +24,10 @@ jobs:
       fail-fast: false
       fail-fast: false
       matrix:
       matrix:
         include:
         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
             # No TSAN because of: https://github.com/apple/swift/issues/59068
             # swift-test-flags: "--sanitize=thread"
             # swift-test-flags: "--sanitize=thread"
           - image: swift:5.6-focal
           - image: swift:5.6-focal
@@ -32,8 +35,6 @@ jobs:
             # swift-test-flags: "--sanitize=thread"
             # swift-test-flags: "--sanitize=thread"
           - image: swift:5.5-focal
           - image: swift:5.5-focal
             swift-test-flags: "--sanitize=thread"
             swift-test-flags: "--sanitize=thread"
-          - image: swift:5.4-focal
-            swift-test-flags: "--sanitize=thread"
     name: Build and Test on ${{ matrix.image }}
     name: Build and Test on ${{ matrix.image }}
     runs-on: ubuntu-latest
     runs-on: ubuntu-latest
     container:
     container:
@@ -53,7 +54,17 @@ jobs:
       fail-fast: false
       fail-fast: false
       matrix:
       matrix:
         include:
         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:
             env:
               MAX_ALLOCS_ALLOWED_bidi_1k_rpcs_10_requests: 428000
               MAX_ALLOCS_ALLOWED_bidi_1k_rpcs_10_requests: 428000
               MAX_ALLOCS_ALLOWED_bidi_1k_rpcs_1_request: 176000
               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: 186000
               MAX_ALLOCS_ALLOWED_unary_1k_ping_pong_interceptors_client: 193000
               MAX_ALLOCS_ALLOWED_unary_1k_ping_pong_interceptors_client: 193000
               MAX_ALLOCS_ALLOWED_unary_1k_ping_pong_interceptors_server: 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 }}
     name: Performance Tests on ${{ matrix.image }}
     runs-on: ubuntu-latest
     runs-on: ubuntu-latest
     container:
     container:
@@ -108,10 +109,10 @@ jobs:
       fail-fast: false
       fail-fast: false
       matrix:
       matrix:
         include:
         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.6-focal
           - image: swift:5.5-focal
           - image: swift:5.5-focal
-          - image: swift:5.4-focal
     name: Integration Tests on ${{ matrix.image }}
     name: Integration Tests on ${{ matrix.image }}
     runs-on: ubuntu-latest
     runs-on: ubuntu-latest
     container:
     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.
  * 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
 gRPC Swift's platform support is identical to the [platform support of Swift
 NIO][swift-nio-platforms].
 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
 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.
 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
 gRPC Swift's platform support is identical to the [platform support of Swift
 NIO][swift-nio-platforms].
 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
 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.
 are available from gRPC Swift 1.8.0 and require Swift 5.6 and newer.