diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f1a4ee1d..95ebf52d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,39 +15,38 @@ on: tags: [v*] env: - PGP_PASSPHRASE: ${{ secrets.PGP_PASSPHRASE }} - SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }} - SONATYPE_CREDENTIAL_HOST: ${{ secrets.SONATYPE_CREDENTIAL_HOST }} - SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }} - PGP_SECRET: ${{ secrets.PGP_SECRET }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + +concurrency: + group: ${{ github.workflow }} @ ${{ github.ref }} + cancel-in-progress: true + jobs: build: - name: Build and Test + name: Test strategy: fail-fast: false matrix: os: - - ubuntu-latest - - ubuntu-20.04 - - ubuntu-22.04 - - macos-11 - - macos-12 - - windows-2022 - scala: [3.3.3, 2.13.12] + - ubuntu-latest + - ubuntu-22.04 + - macos-13 + - windows-2022 + scala: [3, 2.13] java: [temurin@17] project: [rootJVM, rootNative] include: - os: ubuntu-latest experimental: yes exclude: - - scala: 3.3.3 + - scala: 3 os: windows-2022 - project: rootJVM runs-on: ${{ matrix.os }} env: EXPERIMENTAL: ${{ matrix.experimental }} + timeout-minutes: 60 steps: - name: Ignore line ending differences in git if: contains(runner.os, 'windows') @@ -55,37 +54,26 @@ jobs: run: git config --global core.autocrlf false - name: Checkout current branch (full) - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - - name: Download Java (temurin@17) - id: download-java-temurin-17 - if: matrix.java == 'temurin@17' - uses: typelevel/download-java@v2 - with: - distribution: temurin - java-version: 17 + - name: Setup sbt + uses: sbt/setup-sbt@v1 - name: Setup Java (temurin@17) + id: setup-java-temurin-17 if: matrix.java == 'temurin@17' - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: - distribution: jdkfile + distribution: temurin java-version: 17 - jdkFile: ${{ steps.download-java-temurin-17.outputs.jdkFile }} + cache: sbt - - name: Cache sbt - uses: actions/cache@v3 - with: - path: | - ~/.sbt - ~/.ivy2/cache - ~/.coursier/cache/v1 - ~/.cache/coursier/v1 - ~/AppData/Local/Coursier/Cache/v1 - ~/Library/Caches/Coursier/v1 - key: ${{ runner.os }}-sbt-cache-v2-${{ hashFiles('**/*.sbt') }}-${{ hashFiles('project/build.properties') }} + - name: sbt update + if: matrix.java == 'temurin@17' && steps.setup-java-temurin-17.outputs.cache-hit == 'false' + shell: bash + run: sbt +update - name: Install libcurl (ubuntu) if: startsWith(matrix.os, 'ubuntu') && matrix.experimental != 'yes' @@ -149,23 +137,23 @@ jobs: run: sbt 'project ${{ matrix.project }}' '++ ${{ matrix.scala }}' doc - name: Check scalafix lints - if: matrix.java == 'temurin@17' && !startsWith(matrix.scala, '3.') + if: matrix.java == 'temurin@17' && !startsWith(matrix.scala, '3') shell: bash run: sbt 'project ${{ matrix.project }}' '++ ${{ matrix.scala }}' 'scalafixAll --check' - name: Make target directories if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main') shell: bash - run: mkdir -p target .js/target curl/target test-server/target .jvm/target .native/target tests/websocket/target example/target tests/http/target tests/common/target project/target + run: mkdir -p curl/target project/target - name: Compress target directories if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main') shell: bash - run: tar cf targets.tar target .js/target curl/target test-server/target .jvm/target .native/target tests/websocket/target example/target tests/http/target tests/common/target project/target + run: tar cf targets.tar curl/target project/target - name: Upload target directories if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main') - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: target-${{ matrix.os }}-${{ matrix.java }}-${{ matrix.scala }}-${{ matrix.project }} path: targets.tar @@ -185,37 +173,25 @@ jobs: run: git config --global core.autocrlf false - name: Checkout current branch (full) - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - - name: Download Java (temurin@17) - id: download-java-temurin-17 - if: matrix.java == 'temurin@17' - uses: typelevel/download-java@v2 - with: - distribution: temurin - java-version: 17 + - name: Setup sbt + uses: sbt/setup-sbt@v1 - name: Setup Java (temurin@17) + id: setup-java-temurin-17 if: matrix.java == 'temurin@17' - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: - distribution: jdkfile + distribution: temurin java-version: 17 - jdkFile: ${{ steps.download-java-temurin-17.outputs.jdkFile }} + cache: sbt - - name: Cache sbt - uses: actions/cache@v3 - with: - path: | - ~/.sbt - ~/.ivy2/cache - ~/.coursier/cache/v1 - ~/.cache/coursier/v1 - ~/AppData/Local/Coursier/Cache/v1 - ~/Library/Caches/Coursier/v1 - key: ${{ runner.os }}-sbt-cache-v2-${{ hashFiles('**/*.sbt') }}-${{ hashFiles('project/build.properties') }} + - name: sbt update + if: matrix.java == 'temurin@17' && steps.setup-java-temurin-17.outputs.cache-hit == 'false' + run: sbt +update - name: Install libcurl (ubuntu) if: startsWith(matrix.os, 'ubuntu') && matrix.experimental != 'yes' @@ -247,36 +223,116 @@ jobs: vcpkg install --triplet x64-windows curl cp "C:\vcpkg\installed\x64-windows\lib\libcurl.lib" "C:\vcpkg\installed\x64-windows\lib\curl.lib" - - name: Download target directories (3.3.3, rootNative) - uses: actions/download-artifact@v3 + - name: Download target directories (3, rootNative) + uses: actions/download-artifact@v4 with: - name: target-${{ matrix.os }}-${{ matrix.java }}-3.3.3-rootNative + name: target-${{ matrix.os }}-${{ matrix.java }}-3-rootNative - - name: Inflate target directories (3.3.3, rootNative) + - name: Inflate target directories (3, rootNative) run: | tar xf targets.tar rm targets.tar - - name: Download target directories (2.13.12, rootNative) - uses: actions/download-artifact@v3 + - name: Download target directories (2.13, rootNative) + uses: actions/download-artifact@v4 with: - name: target-${{ matrix.os }}-${{ matrix.java }}-2.13.12-rootNative + name: target-${{ matrix.os }}-${{ matrix.java }}-2.13-rootNative - - name: Inflate target directories (2.13.12, rootNative) + - name: Inflate target directories (2.13, rootNative) run: | tar xf targets.tar rm targets.tar - name: Import signing key if: env.PGP_SECRET != '' && env.PGP_PASSPHRASE == '' - run: echo $PGP_SECRET | base64 -di | gpg --import + env: + PGP_SECRET: ${{ secrets.PGP_SECRET }} + PGP_PASSPHRASE: ${{ secrets.PGP_PASSPHRASE }} + run: echo $PGP_SECRET | base64 -d -i - | gpg --import - name: Import signing key and strip passphrase if: env.PGP_SECRET != '' && env.PGP_PASSPHRASE != '' + env: + PGP_SECRET: ${{ secrets.PGP_SECRET }} + PGP_PASSPHRASE: ${{ secrets.PGP_PASSPHRASE }} run: | - echo "$PGP_SECRET" | base64 -di > /tmp/signing-key.gpg + echo "$PGP_SECRET" | base64 -d -i - > /tmp/signing-key.gpg echo "$PGP_PASSPHRASE" | gpg --pinentry-mode loopback --passphrase-fd 0 --import /tmp/signing-key.gpg (echo "$PGP_PASSPHRASE"; echo; echo) | gpg --command-fd 0 --pinentry-mode loopback --change-passphrase $(gpg --list-secret-keys --with-colons 2> /dev/null | grep '^sec:' | cut --delimiter ':' --fields 5 | tail -n 1) - name: Publish + env: + SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }} + SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }} + SONATYPE_CREDENTIAL_HOST: ${{ secrets.SONATYPE_CREDENTIAL_HOST }} run: sbt tlCiRelease + + dependency-submission: + name: Submit Dependencies + if: github.event.repository.fork == false && github.event_name != 'pull_request' + strategy: + matrix: + os: [ubuntu-22.04] + java: [temurin@17] + runs-on: ${{ matrix.os }} + steps: + - name: Ignore line ending differences in git + if: contains(runner.os, 'windows') + run: git config --global core.autocrlf false + + - name: Checkout current branch (full) + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup sbt + uses: sbt/setup-sbt@v1 + + - name: Setup Java (temurin@17) + id: setup-java-temurin-17 + if: matrix.java == 'temurin@17' + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: 17 + cache: sbt + + - name: sbt update + if: matrix.java == 'temurin@17' && steps.setup-java-temurin-17.outputs.cache-hit == 'false' + run: sbt +update + + - name: Install libcurl (ubuntu) + if: startsWith(matrix.os, 'ubuntu') && matrix.experimental != 'yes' + run: | + sudo apt-get update + sudo apt-get install libcurl4-openssl-dev + + - name: Build libcurl from source (ubuntu) + if: startsWith(matrix.os, 'ubuntu') && matrix.experimental == 'yes' + run: | + sudo apt-get update + sudo apt-get purge curl + sudo apt-get install libssl-dev autoconf libtool make wget unzip + cd /usr/local/src + sudo wget https://curl.se/download/curl-7.87.0.zip + sudo unzip curl-7.87.0.zip + cd curl-7.87.0 + sudo ./configure --with-openssl --enable-websockets + sudo make + sudo make install + curl-config --version + curl-config --protocols + echo "LD_LIBRARY_PATH=/usr/local/lib/" >> $GITHUB_ENV + + - name: Install libcurl (windows) + if: startsWith(matrix.os, 'windows') + run: | + vcpkg integrate install + vcpkg install --triplet x64-windows curl + cp "C:\vcpkg\installed\x64-windows\lib\libcurl.lib" "C:\vcpkg\installed\x64-windows\lib\curl.lib" + + - name: Submit Dependencies + uses: scalacenter/sbt-dependency-submission@v2 + with: + modules-ignore: rootjs_3 rootjs_2.13 testserver_3 testserver_2.13 rootjvm_3 rootjvm_2.13 rootnative_3 rootnative_2.13 sbt-http4s-org-scalafix-internal_3 sbt-http4s-org-scalafix-internal_2.13 websockettestsuite_native0.4_3 websockettestsuite_native0.4_2.13 example_native0.4_3 example_native0.4_2.13 httptestsuite_native0.4_3 httptestsuite_native0.4_2.13 testcommon_native0.4_3 testcommon_native0.4_2.13 + configs-ignore: test scala-tool scala-doc-tool test-internal diff --git a/curl/src/main/scala/org/http4s/curl/unsafe/CurlRuntime.scala b/curl/src/main/scala/org/http4s/curl/unsafe/CurlRuntime.scala index 3bb2c110..41dbd5ff 100644 --- a/curl/src/main/scala/org/http4s/curl/unsafe/CurlRuntime.scala +++ b/curl/src/main/scala/org/http4s/curl/unsafe/CurlRuntime.scala @@ -54,6 +54,7 @@ object CurlRuntime { installGlobal { CurlRuntime() } + () } _global diff --git a/project/TestServer.scala b/project/TestServer.scala index 1b8e1471..c9fa4c85 100644 --- a/project/TestServer.scala +++ b/project/TestServer.scala @@ -1,5 +1,5 @@ import java.io.IOException -import java.net.URL +import java.net.URI import sbt._ import Keys._ import scala.util.{Failure, Success, Try} @@ -41,7 +41,7 @@ object TestServer { private def waitForStart(): Try[_] = { val maxAttempts = 10 - val u = new URL("http://localhost:8080") + val u = new URI("http://localhost:8080").toURL val c = u.openConnection() val result = (1 to maxAttempts).toStream .map { i => diff --git a/project/Versions.scala b/project/Versions.scala index 2cb903d7..e0d8a9cf 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -1,6 +1,6 @@ object Versions { val scala3 = "3.3.3" - val scala213 = "2.13.12" + val scala213 = "2.13.16" val http4sVersion = "0.23.27" val catsEffectVersion = "3.5.4" val munitCEVersion = "2.0.0-RC1" diff --git a/project/build.properties b/project/build.properties index 081fdbbc..61c9b1cb 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.10.0 +sbt.version=1.11.1 diff --git a/project/plugins.sbt b/project/plugins.sbt index c32c63b8..7b47475a 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,2 +1,2 @@ -addSbtPlugin("org.http4s" % "sbt-http4s-org" % "0.14.13") +addSbtPlugin("org.http4s" % "sbt-http4s-org" % "2.0.0") addSbtPlugin("org.scala-native" % "sbt-scala-native" % "0.4.17") diff --git a/workflows.sbt b/workflows.sbt index 5d4a9591..4d712ab5 100644 --- a/workflows.sbt +++ b/workflows.sbt @@ -1,9 +1,9 @@ import org.typelevel.sbt.gha.WorkflowStep.Use ThisBuild / githubWorkflowJavaVersions := Seq(JavaSpec.temurin("17")) ThisBuild / githubWorkflowOSes := - Seq("ubuntu-latest", "ubuntu-20.04", "ubuntu-22.04", "macos-11", "macos-12", "windows-2022") + Seq("ubuntu-latest", "ubuntu-22.04", "macos-13", "windows-2022") ThisBuild / githubWorkflowBuildMatrixExclusions ++= Seq( - MatrixExclude(Map("scala" -> Versions.scala3, "os" -> "windows-2022")), // dottydoc bug + MatrixExclude(Map("scala" -> "3", "os" -> "windows-2022")), // dottydoc bug MatrixExclude(Map("project" -> "rootJVM")), // no need to run ) @@ -18,7 +18,7 @@ ThisBuild / githubWorkflowBuildPostamble ~= { ThisBuild / githubWorkflowGeneratedCI ~= { _.map { job => if (job.id == "build") - job.copy(env = job.env.updated("EXPERIMENTAL", s"$${{ matrix.experimental }}")) + job.withEnv(job.env.updated("EXPERIMENTAL", s"$${{ matrix.experimental }}")) else job } } @@ -63,7 +63,7 @@ ThisBuild / githubWorkflowJobSetup ++= Seq( ThisBuild / githubWorkflowBuild ~= { steps => steps.map { case step: WorkflowStep.Sbt if step.name == Some("Test") => - step.copy(commands = List("integrate")) + step.withCommands(List("integrate")) case other => other } }