Skip to content

codegen: Disambiguate when shared response model shared between multiple codes in same group, and handle 'default' error codes #15644

codegen: Disambiguate when shared response model shared between multiple codes in same group, and handle 'default' error codes

codegen: Disambiguate when shared response model shared between multiple codes in same group, and handle 'default' error codes #15644

Workflow file for this run

name: CI
on:
pull_request:
push:
branches: ['**']
tags: [v*]
permissions:
contents: write # release-drafter, auto-merge requirement
pull-requests: write # labeler, auto-merge requirement
env:
# .sbtopts specifies 8g, which is needed to import into IntelliJ, but on GH that exceeds the maximum available memory
SBT_JAVA_OPTS: -J-Xms4g -J-Xmx4g
jobs:
ci:
# run on 1) push, 2) external PRs, 3) github-actions PRs
# do not run on internal, non-steward PRs since those will be run by push to branch
if: |
github.event_name == 'push' ||
github.event.pull_request.head.repo.full_name != github.repository ||
github.event.pull_request.user.login == 'softwaremill-ci' ||
github.event.pull_request.user.login == 'dependabot[bot]'
runs-on: ubuntu-24.04
strategy:
fail-fast: false
matrix:
scala-version: [ "2.12", "2.13", "3" ]
target-platform: [ "JVM", "JS", "Native" ]
java: [ "11", "21" ]
exclude:
- java: "21"
include: # Restricted to build only specific Loom-based modules
- scala-version: "2.13"
target-platform: "JVM"
java: "21"
- scala-version: "3"
target-platform: "JVM"
java: "21"
steps:
- name: Checkout
uses: actions/checkout@v7
- uses: sbt/setup-sbt@66fb4376e81982c7d92a4074170846fff88e2e30 # v1, specifically v1.5.0
- name: Set up JDK
uses: actions/setup-java@v5
with:
distribution: 'temurin'
cache: 'sbt'
java-version: ${{ matrix.java }}
- name: Install sam cli
if: matrix.java == '11'
run: |
wget -q https://github.com/aws/aws-sam-cli/releases/latest/download/aws-sam-cli-linux-x86_64.zip
unzip -q aws-sam-cli-linux-x86_64.zip -d sam-installation
sudo ./sam-installation/install --update
sam --version
- name: Install NPM
if: matrix.java == '11'
uses: actions/setup-node@v6
with:
node-version: 18
- run: npm --version
- name: Install AWS CDK
if: matrix.java == '11'
run: |
npm install -g aws-cdk
cdk --version
- name: Install libidn2-dev libcurl3-dev
if: matrix.target-platform == 'Native'
run: |
sudo apt-get update
sudo apt-get install libidn2-dev libcurl3-dev
echo "STTP_NATIVE=1" >> $GITHUB_ENV
- name: Install scala-cli
if: matrix.target-platform == 'JVM' && matrix.java == '21' && matrix.scala-version == '3'
uses: VirtusLab/scala-cli-setup@42e5f90b7aed2c0478e8074e5c25a030e1db3af6 # main, specifically v1.15.0
with:
jvm: '' # needed because scala-cli-setup otherwise forces the installation of their default JVM (17)
- name: Enable Loom-specific modules
if: matrix.java == '21'
run: echo "ONLY_LOOM=1" >> $GITHUB_ENV
- name: Enable ZIO-specific modules # zio-json requires JDK 17+
if: matrix.java == '21'
run: echo "WITH_ZIO=1" >> $GITHUB_ENV
- name: Compile
run: sbt $SBT_JAVA_OPTS -v "compileScoped ${{ matrix.scala-version }} ${{ matrix.target-platform }}"
- name: Compile core & server-core with next Scala 3
if: matrix.scala-version == '3' && matrix.target-platform == 'JVM' && matrix.java == '21'
env:
SCALA_3_NEXT: "3.8.3"
run: |
sbt $SBT_JAVA_OPTS -v \
"set LocalProject(\"core3\") / scalaVersion := \"$SCALA_3_NEXT\"" \
"set LocalProject(\"serverCore3\") / scalaVersion := \"$SCALA_3_NEXT\"" \
"set LocalProject(\"coreJS3\") / scalaVersion := \"$SCALA_3_NEXT\"" \
"set LocalProject(\"serverCoreJS3\") / scalaVersion := \"$SCALA_3_NEXT\"" \
core3/Test/compile serverCore3/Test/compile \
coreJS3/Test/compile serverCoreJS3/Test/compile
- name: Compile documentation
if: matrix.target-platform == 'JVM' && matrix.java == '21'
run: sbt $SBT_JAVA_OPTS -v compileDocumentation
- name: Verify that examples compile using Scala CLI
if: matrix.target-platform == 'JVM' && matrix.java == '21' && matrix.scala-version == '3'
run: sbt $SBT_JAVA_OPTS -v "project examples3" verifyExamplesCompileUsingScalaCli
- name: Test
if: matrix.target-platform != 'JS'
uses: nick-fields/retry@ad984534de44a9489a53aefd81eb77f87c70dc60 # v3, specifically v4.0.0
with:
# this step runs every server-backend suite; on a slower runner the total wall-clock approaches 10 min and
# flakily trips the timeout, with both attempts then timing out, so allow more room
timeout_minutes: 15
max_attempts: 2
# the netty server interpreter tests include some which run a large number of requests, to detect potential leaks
# storing the output to verify it in the next step
command: |
# watchdog: the test run sometimes hangs silently (a stuck test or a wedged shutdown); when output.log
# hasn't been written to for >240s, capture thread dumps from all JVMs (into thread-dumps.log, uploaded
# as an artifact below) so the hang can be diagnosed
touch output.log
(
while true; do
sleep 30
if [ $(( $(date +%s) - $(stat -c %Y output.log) )) -gt 240 ]; then
{
echo "=== $(date -u '+%Y-%m-%d %H:%M:%S') build silent for >240s, dumping threads ==="
for pid in $(jps -q); do
echo "--- jcmd $pid Thread.print ---"
jcmd "$pid" Thread.print || true
done
} >> thread-dumps.log 2>&1
fi
done
) &
WATCHDOG_PID=$!
# reStop the forked client test server while the JVM is healthy; otherwise sbt-revolver's
# shutdown hook races on JVM exit (IllegalStateException: Shutdown in progress) and can flake the build
sbt $SBT_JAVA_OPTS -v "testScoped ${{ matrix.scala-version }} ${{ matrix.target-platform }}" "clientTestServer/reStop" 2>&1 | tee output.log
SBT_EXIT_CODE=${PIPESTATUS[0]}
kill $WATCHDOG_PID 2>/dev/null || true
exit $SBT_EXIT_CODE
- name: Upload thread dumps (if hang occurred)
if: always()
uses: actions/upload-artifact@v7
with:
name: 'thread-dumps-${{ matrix.scala-version }}-${{ matrix.target-platform }}-${{ matrix.java }}'
path: thread-dumps.log
if-no-files-found: ignore
- name: Check for reported leaks
if: matrix.target-platform != 'JS'
run: |
if grep -q "LEAK" output.log; then
echo "Leak detected!"
exit 1
fi
- name: Test OpenAPI codegen
if: matrix.target-platform == 'JVM' && (matrix.scala-version == '2.12' || matrix.scala-version == '3')
run: sbt $SBT_JAVA_OPTS -v $(sed 's/\./_/' <<<"openapiCodegenSbt${{ matrix.scala-version }}/scripted")
# The finatra tests take a really long time (1/3 of the build duration); hence, they are disabled and need to be run separately
#- name: Test finatra
# if: matrix.target-platform != 'JS'
# run: sbt $SBT_JAVA_OPTS -v testFinatra
# Temporarily call JS tests for each subproject explicitly as a workaround until
# https://github.com/scala-js/scala-js/issues/4317 has a solution
- name: Test
if: matrix.target-platform == 'JS' && matrix.scala-version == '2.12'
run: sbt $SBT_JAVA_OPTS catsJS2_12/test circeJsonJS2_12/test clientCoreJS2_12/test clientTestsJS2_12/test coreJS2_12/test enumeratumJS2_12/test jsoniterScalaJS2_12/test newtypeJS2_12/test openapiDocsJS2_12/test playJsonJS2_12/test redocJS2_12/test serverCoreJS2_12/test sttpClientJS2_12/test testingJS2_12/test testsJS2_12/test uPickleJsonJS2_12/test zioJsonJS2_12/test clientTestServer/reStop
- name: Test
if: matrix.target-platform == 'JS' && matrix.scala-version == '2.13'
run: sbt $SBT_JAVA_OPTS catsJS/test circeJsonJS/test clientCoreJS/test clientTestsJS/test coreJS/test enumeratumJS/test jsoniterScalaJS/test newtypeJS/test openapiDocsJS/test playJsonJS/test redocJS/test serverCoreJS/test sttpClientJS/test testingJS/test testsJS/test uPickleJsonJS/test zioJsonJS/test clientTestServer/reStop
- name: Test
if: matrix.target-platform == 'JS' && matrix.scala-version == '3'
run: sbt $SBT_JAVA_OPTS catsJS3/test circeJsonJS3/test clientCoreJS3/test clientTestsJS3/test coreJS3/test jsoniterScalaJS3/test openapiDocsJS3/test redocJS3/test serverCoreJS3/test sttpClientJS3/test testingJS3/test testsJS3/test uPickleJsonJS3/test zioJsonJS3/test clientTestServer/reStop
- uses: actions/upload-artifact@v7 # upload test results
if: success() || failure() # run this step even if previous step failed
with:
name: 'tests-results-${{ matrix.scala-version }}-${{ matrix.target-platform }}-${{ matrix.java }}'
path: '**/test-reports/TEST*.xml'
- name: Prepare release notes
if: github.ref == 'refs/heads/master' # this should not run on PR builds
uses: release-drafter/release-drafter@4d75298e00d9e34c483e5ff8c68d0ea1c1940c1e # v6, specifically v7.5.1
with:
config-name: release-drafter.yml
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# identify binary incompatibilities (check build.sbt for details)
mima:
uses: softwaremill/github-actions-workflows/.github/workflows/mima.yml@main
with:
java-version: '21'
java-opts: '-Xms4g -Xmx4g' # SBT_JAVA_OPTS env parameter adapted for JVM
publish:
name: Publish release
needs: [ci]
if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v'))
runs-on: ubuntu-24.04
strategy:
matrix:
java: [ "11", "21" ]
steps:
- name: Checkout
uses: actions/checkout@v7
- uses: sbt/setup-sbt@66fb4376e81982c7d92a4074170846fff88e2e30 # v1, specifically v1.5.0
- name: Set up JDK
uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: ${{ matrix.java }}
cache: 'sbt'
- name: Install libidn2-dev libcurl3-dev
if: matrix.java == '11'
run: |
sudo apt-get update
sudo apt-get install libidn2-dev libcurl3-dev
- name: Enable Native-specific modules
if: matrix.java == '11'
run: echo "STTP_NATIVE=1" >> $GITHUB_ENV
- name: Enable Loom and ZIO-specific modules # zio-json requires JDK 17+
if: matrix.java == '21'
run: |
echo "ONLY_LOOM=1" >> $GITHUB_ENV
echo "WITH_ZIO=1" >> $GITHUB_ENV
- name: Compile
run: sbt $SBT_JAVA_OPTS compile
- name: Publish artifacts
run: sbt $SBT_JAVA_OPTS ci-release
env:
PGP_PASSPHRASE: ${{ secrets.PGP_PASSPHRASE }}
PGP_SECRET: ${{ secrets.PGP_SECRET }}
SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }}
SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }}
- name: Extract version from commit message
if: matrix.java == '11'
run: |
version=${GITHUB_REF/refs\/tags\/v/}
echo "VERSION=$version" >> $GITHUB_ENV
env:
COMMIT_MSG: ${{ github.event.head_commit.message }}
- name: Publish release notes
if: matrix.java == '11'
uses: release-drafter/release-drafter@4d75298e00d9e34c483e5ff8c68d0ea1c1940c1e # v6, specifically v7.5.1
with:
config-name: release-drafter.yml
publish: true
name: "v${{ env.VERSION }}"
tag: "v${{ env.VERSION }}"
version: "v${{ env.VERSION }}"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
label:
# only for PRs by softwaremill-ci
if: github.event.pull_request.user.login == 'softwaremill-ci'
uses: softwaremill/github-actions-workflows/.github/workflows/label.yml@main
secrets: inherit
auto-merge-github-actions:
# only for PRs by softwaremill-ci
if: github.event.pull_request.user.login == 'softwaremill-ci'
needs: [ ci, mima, label ]
uses: softwaremill/github-actions-workflows/.github/workflows/auto-merge.yml@main
secrets: inherit
auto-merge-dependabot:
# only for PRs by dependabot[bot]
if: github.event.pull_request.user.login == 'dependabot[bot]'
needs: [ ci, mima ]
uses: softwaremill/github-actions-workflows/.github/workflows/auto-merge.yml@main
secrets:
github-token: ${{ secrets.SOFTWAREMILL_CI_PR_TOKEN }}