diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index eba5c39a91..4f2ac685e6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,196 +1,270 @@ -name: CI +# This file was autogenerated using `zio-sbt-ci` plugin via `sbt ciGenerateGithubWorkflow` +# task and should be included in the git repository. Please do not edit it manually. +name: CI env: - JDK_JAVA_OPTIONS: -XX:+PrintCommandLineFlags -Djava.locale.providers=CLDR,JRE # JDK_JAVA_OPTIONS is _the_ env. variable to use for modern Java - JVM_OPTS: -XX:+PrintCommandLineFlags -Djava.locale.providers=CLDR,JRE # for Java 8 only (sadly, it is not modern enough for JDK_JAVA_OPTIONS) - -on: - pull_request: - push: - branches: ['main'] + JDK_JAVA_OPTIONS: -XX:+PrintCommandLineFlags -Djava.locale.providers=CLDR,JRE +'on': + workflow_dispatch: {} release: types: - - published + - published + push: {} + pull_request: + branches-ignore: + - gh-pages +permissions: + id-token: write + contents: read concurrency: - group: ci-pr-${{ github.event_name == 'pull_request' && github.event.pull_request.number || github.ref }} + group: ${{ github.workflow }}-${{ github.ref == format('refs/heads/{0}', github.event.repository.default_branch) && github.run_id || github.ref }} cancel-in-progress: true - jobs: - buildDocs: - name: Build Docs + build: + name: Build runs-on: ubuntu-latest - timeout-minutes: 10 + continue-on-error: true steps: - - name: Git Checkout - uses: actions/checkout@v6.0.2 - with: - fetch-depth: '0' - - name: Install libuv - run: sudo apt-get update && sudo apt-get install -y libuv1-dev - - name: Setup Scala - uses: actions/setup-java@v5 - with: - distribution: corretto - java-version: '17' - check-latest: true - - name: Setup SBT - uses: sbt/setup-sbt@v1 - - name: Cache Dependencies - uses: coursier/cache-action@v8 - - name: Check website build process - run: sbt docs/clean docs/buildWebsite - + - name: Git Checkout + uses: actions/checkout@v6 + with: + fetch-depth: '0' + - name: Install libuv + run: sudo apt-get update && sudo apt-get install -y libuv1-dev + - name: Setup Scala + uses: actions/setup-java@v5 + with: + distribution: corretto + java-version: '17' + check-latest: true + - name: Setup SBT + uses: sbt/setup-sbt@v1 + - name: Cache Dependencies + uses: coursier/cache-action@v7 + - name: Check all code compiles + run: sbt +Test/compile + - name: Check artifacts build process + run: sbt +publishLocal + - name: Check website build process + run: sbt docs/clean; sbt docs/buildWebsite lint: + name: Lint runs-on: ubuntu-latest - timeout-minutes: 10 + continue-on-error: false steps: - - name: Install locale data - run: | - sudo apt-get update - sudo apt-get install -y locales - sudo locale-gen en_US.UTF-8 - - name: Checkout current branch - uses: actions/checkout@v6.0.2 - with: - fetch-depth: 0 - - name: Setup Action - uses: coursier/setup-action@v2 - with: - jvm: temurin:11 - apps: sbt - - name: Cache scala dependencies - uses: coursier/cache-action@v8 - - name: Lint code - run: sbt "++2.13; check; ++3.7; check" - - testJVM: + - name: Git Checkout + uses: actions/checkout@v6 + with: + fetch-depth: '0' + - name: Install libuv + run: sudo apt-get update && sudo apt-get install -y libuv1-dev + - name: Setup Scala + uses: actions/setup-java@v5 + with: + distribution: corretto + java-version: '17' + check-latest: true + - name: Setup SBT + uses: sbt/setup-sbt@v1 + - name: Cache Dependencies + uses: coursier/cache-action@v7 + - name: Check if the site workflow is up to date + run: sbt ciCheckGithubWorkflow + - name: Lint + run: sbt lint + test: + name: Test runs-on: ubuntu-latest - timeout-minutes: 25 + continue-on-error: false strategy: fail-fast: false matrix: - java: [11, 25] - platform: ['JVM'] - scala: ['2.13.x', '3.3.x', '3.7.x'] + java: + - '11' + - '17' + - '21' steps: - - name: Checkout current branch - uses: actions/checkout@v6.0.2 - with: - fetch-depth: 0 - - name: Set JVM options for JDK 25+ - if: matrix.java >= 25 - run: echo "JAVA_TOOL_OPTIONS=-XX:+UseCompactObjectHeaders" >> $GITHUB_ENV - shell: bash - - name: Setup Action - uses: coursier/setup-action@v2 - with: - jvm: temurin:${{ matrix.java }} - jvm-index: https://raw.githubusercontent.com/coursier/jvm-index/refs/heads/master/index.json - apps: sbt - - name: Cache scala dependencies - uses: coursier/cache-action@v8 - - name: Run Scala 2 tests and compile Scala 2 docs - if: ${{ startsWith(matrix.scala, '2.') }} - run: sbt ++${{ matrix.scala }} test${{ matrix.platform }} doc${{ matrix.platform }} - - name: Run Scala 3 tests with test coverage and docs (JDK 11) - if: ${{ startsWith(matrix.scala, '3.') && matrix.java == 11 }} - run: sbt ++${{ matrix.scala }} coverage test${{ matrix.platform }} coverageReport doc${{ matrix.platform }} - - name: Run Scala 3 tests with test coverage (JDK 25, skip docs due to scaladoc bug) - if: ${{ startsWith(matrix.scala, '3.') && matrix.java >= 25 }} - run: sbt ++${{ matrix.scala }} coverage test${{ matrix.platform }} coverageReport - - name: Run Scala Next tests - if: ${{ matrix.scala == '3.7.x' }} - run: sbt ++3.7.4 scalaNextTests${{ matrix.platform }}/test benchmarks/test - - name: Compile example project - run: sbt ++${{ matrix.scala }} examples/compile - - testJS: + - name: Install libuv + run: sudo apt-get update && sudo apt-get install -y libuv1-dev + - name: Setup Scala + uses: actions/setup-java@v5 + with: + distribution: corretto + java-version: ${{ matrix.java }} + check-latest: true + - name: Setup SBT + uses: sbt/setup-sbt@v1 + - name: Cache Dependencies + uses: coursier/cache-action@v7 + - name: Git Checkout + uses: actions/checkout@v6 + with: + fetch-depth: '0' + - name: Test + run: sbt +test + update-readme: + name: Update README runs-on: ubuntu-latest - timeout-minutes: 20 - strategy: - fail-fast: false - matrix: - java: [11] - platform: ['JS'] - # Note: 3.7.x excluded due to Scala.js compiler bug (URISyntaxException in genSJSIR) - scala: ['2.13.x', '3.3.x'] + continue-on-error: false + if: ${{ github.ref == format('refs/heads/{0}', github.event.repository.default_branch) }} steps: - - name: Checkout current branch - uses: actions/checkout@v6.0.2 - with: - fetch-depth: 0 - - name: Setup Action - uses: coursier/setup-action@v2 - with: - jvm: temurin:${{ matrix.java }} - jvm-index: https://raw.githubusercontent.com/coursier/jvm-index/refs/heads/master/index.json - apps: sbt - - name: Cache scala dependencies - uses: coursier/cache-action@v8 - - name: Run tests and compile docs - run: sbt ++${{ matrix.scala }} test${{ matrix.platform }} doc${{ matrix.platform }} + - name: Git Checkout + uses: actions/checkout@v6 + with: + fetch-depth: '0' + - name: Install libuv + run: sudo apt-get update && sudo apt-get install -y libuv1-dev + - name: Setup Scala + uses: actions/setup-java@v5 + with: + distribution: corretto + java-version: '17' + check-latest: true + - name: Setup SBT + uses: sbt/setup-sbt@v1 + - name: Cache Dependencies + uses: coursier/cache-action@v7 + - name: Generate Readme + run: sbt docs/generateReadme + - name: Commit Changes + run: | + git config --local user.email "zio-assistant[bot]@users.noreply.github.com" + git config --local user.name "ZIO Assistant" + git add README.md + git commit -m "Update README.md" || echo "No changes to commit" + - name: Generate Token + id: generate-token + uses: zio/generate-github-app-token@v1.0.0 + with: + app_id: ${{ secrets.APP_ID }} + app_private_key: ${{ secrets.APP_PRIVATE_KEY }} + - name: Create Pull Request + id: cpr + uses: peter-evans/create-pull-request@v8 + with: + body: |- + Autogenerated changes after running the `sbt docs/generateReadme` command of the [zio-sbt-website](https://zio.dev/zio-sbt) plugin. + I will automatically update the README.md file whenever there is new change for README.md, e.g. + - After each release, I will update the version in the installation section. + - After any changes to the "docs/index.md" file, I will update the README.md file accordingly. + branch: zio-sbt-website/update-readme + commit-message: Update README.md + token: ${{ steps.generate-token.outputs.token }} + delete-branch: true + title: Update README.md + - name: Approve PR + if: ${{ steps.cpr.outputs.pull-request-number }} + run: gh pr review "$PR_URL" --approve + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PR_URL: ${{ steps.cpr.outputs.pull-request-url }} + - name: Enable Auto-Merge + if: ${{ steps.cpr.outputs.pull-request-number }} + run: gh pr merge --auto --squash "$PR_URL" || gh pr merge --squash "$PR_URL" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PR_URL: ${{ steps.cpr.outputs.pull-request-url }} ci: + name: ci runs-on: ubuntu-latest - needs: [lint, testJVM, testJS, buildDocs] + continue-on-error: false + needs: + - lint + - test + - build steps: - - name: Aggregate of lint, and all tests - run: echo "ci passed" - + - name: Report Successful CI + run: echo "ci passed" release: + name: Release runs-on: ubuntu-latest - timeout-minutes: 30 - needs: [ci] + continue-on-error: false + needs: + - ci if: ${{ github.event_name != 'pull_request' }} steps: - - name: Checkout current branch - uses: actions/checkout@v6.0.2 - with: - fetch-depth: 0 - - name: Setup Action - uses: coursier/setup-action@v2 - with: - jvm: temurin:11 - apps: sbt - - name: Release - run: sbt ci-release - env: - PGP_PASSPHRASE: ${{ secrets.PGP_PASSPHRASE }} - PGP_SECRET: ${{ secrets.PGP_SECRET }} - SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }} - SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }} - + - name: Git Checkout + uses: actions/checkout@v6 + with: + fetch-depth: '0' + - name: Install libuv + run: sudo apt-get update && sudo apt-get install -y libuv1-dev + - name: Setup Scala + uses: actions/setup-java@v5 + with: + distribution: corretto + java-version: '17' + check-latest: true + - name: Setup SBT + uses: sbt/setup-sbt@v1 + - name: Cache Dependencies + uses: coursier/cache-action@v7 + - name: Release + run: sbt ci-release + env: + PGP_PASSPHRASE: ${{ secrets.PGP_PASSPHRASE }} + PGP_SECRET: ${{ secrets.PGP_SECRET }} + SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }} + SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }} release-docs: name: Release Docs runs-on: ubuntu-latest continue-on-error: false needs: - - release + - release if: ${{ ((github.event_name == 'release') && (github.event.action == 'published')) || (github.event_name == 'workflow_dispatch') }} - permissions: - id-token: write - contents: read steps: - - name: Git Checkout - uses: actions/checkout@v6 - with: - fetch-depth: '0' - - name: Install libuv - run: sudo apt-get update && sudo apt-get install -y libuv1-dev - - name: Setup Scala - uses: actions/setup-java@v5 - with: - distribution: corretto - java-version: '17' - check-latest: true - - name: Setup SBT - uses: sbt/setup-sbt@v1 - - name: Cache Dependencies - uses: coursier/cache-action@v8 - - name: Setup NodeJs - uses: actions/setup-node@v6 - with: - node-version: 24.12.0 - registry-url: https://registry.npmjs.org - - name: Publish Docs to NPM Registry - run: sbt docs/publishToNpm + - name: Git Checkout + uses: actions/checkout@v6 + with: + fetch-depth: '0' + - name: Install libuv + run: sudo apt-get update && sudo apt-get install -y libuv1-dev + - name: Setup Scala + uses: actions/setup-java@v5 + with: + distribution: corretto + java-version: '17' + check-latest: true + - name: Setup SBT + uses: sbt/setup-sbt@v1 + - name: Cache Dependencies + uses: coursier/cache-action@v7 + - name: Setup NodeJs + uses: actions/setup-node@v6 + with: + node-version: 24.12.0 + registry-url: https://registry.npmjs.org + - name: Publish Docs to NPM Registry + run: sbt docs/publishToNpm + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + notify-docs-release: + name: Notify Docs Release + runs-on: ubuntu-latest + continue-on-error: false + needs: + - release-docs + if: ${{ (github.event_name == 'release') && (github.event.action == 'published') }} + steps: + - name: Git Checkout + uses: actions/checkout@v6 + with: + fetch-depth: '0' + - name: notify the main repo about the new release of docs package + run: | + PACKAGE_NAME=$(cat docs/package.json | grep '"name"' | awk -F'"' '{print $4}') + PACKAGE_VERSION=$(npm view $PACKAGE_NAME version) + curl -L \ + -X POST \ + -H "Accept: application/vnd.github+json" \ + -H "Authorization: token ${{ secrets.PAT_TOKEN }}"\ + https://api.github.com/repos/zio/zio/dispatches \ + -d '{ + "event_type":"update-docs", + "client_payload":{ + "package_name":"'"${PACKAGE_NAME}"'", + "package_version": "'"${PACKAGE_VERSION}"'" + } + }' diff --git a/build.sbt b/build.sbt index c7b282443f..2511705ad3 100644 --- a/build.sbt +++ b/build.sbt @@ -30,6 +30,7 @@ addCommandAlias("build", "; fmt; coverage; root/test; coverageReport") addCommandAlias("fmt", "all root/scalafmtSbt root/scalafmtAll") addCommandAlias("fmtCheck", "all root/scalafmtSbtCheck root/scalafmtCheckAll") addCommandAlias("check", "; scalafmtSbtCheck; scalafmtCheckAll") +addCommandAlias("lint", "check") addCommandAlias("mimaChecks", "all schemaJVM/mimaReportBinaryIssues") addCommandAlias( "testJVM", @@ -54,6 +55,7 @@ lazy val root = project .settings( publish / skip := true ) + .enablePlugins(ZioSbtCiPlugin) .aggregate( typeid.jvm, typeid.js, @@ -492,6 +494,7 @@ lazy val examples = project .settings( publish / skip := true ) + .enablePlugins(ZioSbtCiPlugin) .dependsOn( schema.jvm, markdown.jvm, @@ -528,3 +531,32 @@ lazy val docs = project mediatype.jvm ) .enablePlugins(WebsitePlugin) + +import zio.sbt.githubactions._ + +import zio.sbt.githubactions.Step + + +ThisBuild / ciJvmOptions := Seq("-Djava.locale.providers=CLDR,JRE") + +ThisBuild / ciPostReleaseJobs := { + import zio.sbt.githubactions._ + + def updateStep(step: Step): Step = step match { + case s: Step.SingleStep if s.name == "Publish Docs to NPM Registry" => + s.copy(env = s.env + ("NODE_AUTH_TOKEN" -> "${{ secrets.NPM_TOKEN }}")) + case s: Step.StepSequence => + val updatedSteps = s.steps.map(updateStep) + s.copy(steps = updatedSteps) + case other => other + } + + (ThisBuild / ciPostReleaseJobs).value.map { job => + if (job.id == "release-docs") { + val updatedSteps = job.steps.map(updateStep) + job.copy(steps = updatedSteps) + } else { + job + } + } +} diff --git a/project/plugins.sbt b/project/plugins.sbt index dda7a65ea1..98d08f65cb 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,5 +1,6 @@ lazy val zioSbtVersion = "0.4.10" addSbtPlugin("dev.zio" % "zio-sbt-website" % zioSbtVersion) +addSbtPlugin("dev.zio" % "zio-sbt-ci" % zioSbtVersion) addSbtPlugin("com.timushev.sbt" % "sbt-updates" % "0.6.4") addSbtPlugin("pl.project13.scala" % "sbt-jmh" % "0.4.8")