From c20f4bfece2a080b8005dbdbc0fe1ab48b564734 Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Fri, 8 Nov 2024 01:08:48 -0500 Subject: [PATCH] ci: Generate GitHub Actions --- .github/workflows/ci.yml | 156 ++++++++++++++++-- .github/workflows/clean.yml | 60 +++++++ build.sbt | 48 +++++- project/build.properties | 2 +- project/plugin.sbt | 6 +- sonatype.sbt | 13 -- .../flyway-sbt/test1/project/plugins.sbt | 2 +- .../flyway-sbt/test2/project/plugins.sbt | 2 +- .../flyway-sbt/test3/project/plugins.sbt | 2 +- .../flyway-sbt/test4/project/plugins.sbt | 2 +- 10 files changed, 250 insertions(+), 43 deletions(-) create mode 100644 .github/workflows/clean.yml delete mode 100644 sonatype.sbt diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d2c40cb..be2b5b7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,26 +1,150 @@ -name: CI +# This file was automatically generated by sbt-github-actions using the +# githubWorkflowGenerate task. You should add and commit this file to +# your git repository. It goes without saying that you shouldn't edit +# this file by hand! Instead, if you wish to make changes, you should +# change your sbt build configuration to revise the workflow description +# to meet your needs, then regenerate this file. + +name: Continuous Integration on: pull_request: + branches: ['**'] push: + branches: ['**'] + tags: [v*] + +env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} jobs: build: - runs-on: ubuntu-latest + name: Build and Test strategy: matrix: - java: [ '8', '11', '15' ] + os: [ubuntu-latest, macos-latest, windows-latest] + scala: [2.12.20] + java: [temurin@8, temurin@17] + exclude: + - java: temurin@8 + os: macos-latest + runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v4 - - name: Set up JDK - uses: actions/setup-java@v4 - with: - java-version: ${{ matrix.java }} - distribution: "zulu" - cache: sbt - - name: Setup sbt - uses: sbt/setup-sbt@v1 - - name: print Java version - run: java -version - - name: Run tests - run: sbt -v scripted + - name: Ignore line ending differences in git + if: contains(runner.os, 'windows') + shell: bash + run: git config --global core.autocrlf false + + - name: Configure pagefile for Windows + if: contains(runner.os, 'windows') + uses: al-cheb/configure-pagefile-action@v1.4 + with: + minimum-size: 2GB + maximum-size: 8GB + disk-root: 'C:' + + - name: Checkout current branch (full) + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Java (temurin@8) + if: matrix.java == 'temurin@8' + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: 8 + cache: sbt + + - name: Setup Java (temurin@17) + if: matrix.java == 'temurin@17' + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: 17 + cache: sbt + + - name: Setup sbt + uses: sbt/setup-sbt@v1 + + - name: Check that workflows are up to date + shell: bash + run: sbt '++ ${{ matrix.scala }}' githubWorkflowCheck + + - shell: bash + run: sbt '++ ${{ matrix.scala }}' test scripted + + - name: Compress target directories + shell: bash + run: tar cf targets.tar target project/target + + - name: Upload target directories + uses: actions/upload-artifact@v4 + with: + name: target-${{ matrix.os }}-${{ matrix.scala }}-${{ matrix.java }} + path: targets.tar + + publish: + name: Publish Artifacts + needs: [build] + if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v')) + strategy: + matrix: + os: [ubuntu-latest] + scala: [2.12.20] + java: [temurin@8] + 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: Configure pagefile for Windows + if: contains(runner.os, 'windows') + uses: al-cheb/configure-pagefile-action@v1.4 + with: + minimum-size: 2GB + maximum-size: 8GB + disk-root: 'C:' + + - name: Checkout current branch (full) + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Java (temurin@8) + if: matrix.java == 'temurin@8' + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: 8 + cache: sbt + + - name: Setup Java (temurin@17) + if: matrix.java == 'temurin@17' + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: 17 + cache: sbt + + - name: Setup sbt + uses: sbt/setup-sbt@v1 + + - name: Download target directories (2.12.20) + uses: actions/download-artifact@v4 + with: + name: target-${{ matrix.os }}-2.12.20-${{ matrix.java }} + + - name: Inflate target directories (2.12.20) + run: | + tar xf targets.tar + rm targets.tar + + - name: Publish project + env: + PGP_PASSPHRASE: ${{ secrets.PGP_PASSPHRASE }} + PGP_SECRET: ${{ secrets.PGP_SECRET }} + SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }} + SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }} + run: sbt ci-release diff --git a/.github/workflows/clean.yml b/.github/workflows/clean.yml new file mode 100644 index 0000000..bfc865d --- /dev/null +++ b/.github/workflows/clean.yml @@ -0,0 +1,60 @@ +# This file was automatically generated by sbt-github-actions using the +# githubWorkflowGenerate task. You should add and commit this file to +# your git repository. It goes without saying that you shouldn't edit +# this file by hand! Instead, if you wish to make changes, you should +# change your sbt build configuration to revise the workflow description +# to meet your needs, then regenerate this file. + +name: Clean + +on: push + +jobs: + delete-artifacts: + name: Delete Artifacts + runs-on: ubuntu-latest + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + steps: + - name: Delete artifacts + shell: bash {0} + run: | + # Customize those three lines with your repository and credentials: + REPO=${GITHUB_API_URL}/repos/${{ github.repository }} + + # A shortcut to call GitHub API. + ghapi() { curl --silent --location --user _:$GITHUB_TOKEN "$@"; } + + # A temporary file which receives HTTP response headers. + TMPFILE=$(mktemp) + + # An associative array, key: artifact name, value: number of artifacts of that name. + declare -A ARTCOUNT + + # Process all artifacts on this repository, loop on returned "pages". + URL=$REPO/actions/artifacts + while [[ -n "$URL" ]]; do + + # Get current page, get response headers in a temporary file. + JSON=$(ghapi --dump-header $TMPFILE "$URL") + + # Get URL of next page. Will be empty if we are at the last page. + URL=$(grep '^Link:' "$TMPFILE" | tr ',' '\n' | grep 'rel="next"' | head -1 | sed -e 's/.*.*//') + rm -f $TMPFILE + + # Number of artifacts on this page: + COUNT=$(( $(jq <<<$JSON -r '.artifacts | length') )) + + # Loop on all artifacts on this page. + for ((i=0; $i < $COUNT; i++)); do + + # Get name of artifact and count instances of this name. + name=$(jq <<<$JSON -r ".artifacts[$i].name?") + ARTCOUNT[$name]=$(( $(( ${ARTCOUNT[$name]} )) + 1)) + + id=$(jq <<<$JSON -r ".artifacts[$i].id?") + size=$(( $(jq <<<$JSON -r ".artifacts[$i].size_in_bytes?") )) + printf "Deleting '%s' #%d, %'d bytes\n" $name ${ARTCOUNT[$name]} $size + ghapi -X DELETE $REPO/actions/artifacts/$id + done + done diff --git a/build.sbt b/build.sbt index a10e148..d4932cb 100644 --- a/build.sbt +++ b/build.sbt @@ -1,12 +1,16 @@ val flywayVersion = "9.22.0" -val pluginVersion = "9.22.0" +ThisBuild / organization := "com.github.sbt" +ThisBuild / version := { + val orig = (ThisBuild / version).value + if (orig.startsWith("0.0") && orig.endsWith("-SNAPSHOT")) { + "9.0.0-SNAPSHOT" + } else orig +} lazy val root = (project in file (".")) .enablePlugins(SbtPlugin) .settings( name := "flyway-sbt", - organization := "io.github.davidmweber", - version := pluginVersion, libraryDependencies ++= Seq( "org.flywaydb" % "flyway-core" % flywayVersion ), @@ -15,17 +19,51 @@ lazy val root = (project in file (".")) "-unchecked", "-Xfuture" ), + pluginCrossBuild / sbtVersion := { + scalaBinaryVersion.value match { + case "2.12" => "1.5.8" + case _ => "2.0.0-M2" + } + }, Compile / doc / scalacOptions ++= { Seq( "-sourcepath", (LocalRootProject / baseDirectory).value.getAbsolutePath, "-doc-source-url", - s"""https://github.com/flyway/flyway-sbt/tree/${sys.process.Process("git rev-parse HEAD").lineStream_!.head}€{FILE_PATH}.scala""" + s"""https://github.com/sbt/flyway-sbt/tree/${sys.process.Process("git rev-parse HEAD").lineStream_!.head}€{FILE_PATH}.scala""" ) }, scriptedLaunchOpts := { scriptedLaunchOpts.value ++ Seq("-Xmx1024M", "-Dplugin.version=" + version.value) }, - scriptedBufferLog := false + scriptedBufferLog := false, + publishMavenStyle := true, ) +ThisBuild / developers := List( + Developer(id="davidmweber", name="David Weber", email="dave@veryflatcat.com", url=url("https://davidmweber.github.io/flyway-sbt-docs/")) +) +ThisBuild / licenses := Seq("APL2" -> url("http://www.apache.org/licenses/LICENSE-2.0.txt")) +ThisBuild / publishTo := sonatypePublishTo.value +ThisBuild / githubWorkflowBuild := Seq(WorkflowStep.Sbt(List("test", "scripted"))) +ThisBuild / githubWorkflowTargetTags ++= Seq("v*") +ThisBuild / githubWorkflowPublishTargetBranches := + Seq(RefPredicate.StartsWith(Ref.Tag("v"))) +ThisBuild / githubWorkflowPublish := Seq( + WorkflowStep.Sbt( + commands = List("ci-release"), + name = Some("Publish project"), + env = Map( + "PGP_PASSPHRASE" -> "${{ secrets.PGP_PASSPHRASE }}", + "PGP_SECRET" -> "${{ secrets.PGP_SECRET }}", + "SONATYPE_PASSWORD" -> "${{ secrets.SONATYPE_PASSWORD }}", + "SONATYPE_USERNAME" -> "${{ secrets.SONATYPE_USERNAME }}" + ) + ) +) +ThisBuild / githubWorkflowOSes := Seq("ubuntu-latest", "macos-latest", "windows-latest") +ThisBuild / githubWorkflowJavaVersions := Seq( + JavaSpec.temurin("8"), + JavaSpec.temurin("17") +) +ThisBuild / githubWorkflowBuildMatrixExclusions += MatrixExclude(Map("java" -> "temurin@8", "os" -> "macos-latest")) diff --git a/project/build.properties b/project/build.properties index af71419..67ced42 100644 --- a/project/build.properties +++ b/project/build.properties @@ -14,4 +14,4 @@ # limitations under the License. # -sbt.version=1.9.3 +sbt.version=1.10.5 diff --git a/project/plugin.sbt b/project/plugin.sbt index cdc7ed3..b00e953 100644 --- a/project/plugin.sbt +++ b/project/plugin.sbt @@ -1,4 +1,2 @@ -libraryDependencies += { "org.scala-sbt" %% "scripted-plugin" % sbtVersion.value } - -addSbtPlugin("org.xerial.sbt" % "sbt-sonatype" % "2.5") -addSbtPlugin("com.jsuereth" % "sbt-pgp" % "1.1.1") +addSbtPlugin("com.github.sbt" % "sbt-ci-release" % "1.9.0") +addSbtPlugin("com.github.sbt" % "sbt-github-actions" % "0.24.0") diff --git a/sonatype.sbt b/sonatype.sbt deleted file mode 100644 index 972dfd4..0000000 --- a/sonatype.sbt +++ /dev/null @@ -1,13 +0,0 @@ -import xerial.sbt.Sonatype._ - -sonatypeProfileName := "io.github.davidmweber" -publishMavenStyle := true -sonatypeProjectHosting := Some(GitHubHosting(user="flyway", repository="flyway-sbt", email="dave@veryflatcat.com")) -//developers := List( -// Developer(id="davidmweber", name="David Weber", email="dave@veryflatcat.com", url=url("https://davidmweber.github.io/flyway-sbt-docs/")) -//) -licenses := Seq("APL2" -> url("http://www.apache.org/licenses/LICENSE-2.0.txt")) -publishTo := sonatypePublishTo.value - -// sbt publishSigned -// sbt sonatypeRelease diff --git a/src/sbt-test/flyway-sbt/test1/project/plugins.sbt b/src/sbt-test/flyway-sbt/test1/project/plugins.sbt index a968be8..1088043 100644 --- a/src/sbt-test/flyway-sbt/test1/project/plugins.sbt +++ b/src/sbt-test/flyway-sbt/test1/project/plugins.sbt @@ -1,5 +1,5 @@ sys.props.get("plugin.version") match { - case Some(x) => addSbtPlugin("io.github.davidmweber" % "flyway-sbt" % x) + case Some(x) => addSbtPlugin("com.github.sbt" % "flyway-sbt" % x) case _ => sys.error("""|The system property 'plugin.version' is not defined. |Specify this property using the scriptedLaunchOpts -D.""".stripMargin) } diff --git a/src/sbt-test/flyway-sbt/test2/project/plugins.sbt b/src/sbt-test/flyway-sbt/test2/project/plugins.sbt index a968be8..1088043 100644 --- a/src/sbt-test/flyway-sbt/test2/project/plugins.sbt +++ b/src/sbt-test/flyway-sbt/test2/project/plugins.sbt @@ -1,5 +1,5 @@ sys.props.get("plugin.version") match { - case Some(x) => addSbtPlugin("io.github.davidmweber" % "flyway-sbt" % x) + case Some(x) => addSbtPlugin("com.github.sbt" % "flyway-sbt" % x) case _ => sys.error("""|The system property 'plugin.version' is not defined. |Specify this property using the scriptedLaunchOpts -D.""".stripMargin) } diff --git a/src/sbt-test/flyway-sbt/test3/project/plugins.sbt b/src/sbt-test/flyway-sbt/test3/project/plugins.sbt index a968be8..1088043 100644 --- a/src/sbt-test/flyway-sbt/test3/project/plugins.sbt +++ b/src/sbt-test/flyway-sbt/test3/project/plugins.sbt @@ -1,5 +1,5 @@ sys.props.get("plugin.version") match { - case Some(x) => addSbtPlugin("io.github.davidmweber" % "flyway-sbt" % x) + case Some(x) => addSbtPlugin("com.github.sbt" % "flyway-sbt" % x) case _ => sys.error("""|The system property 'plugin.version' is not defined. |Specify this property using the scriptedLaunchOpts -D.""".stripMargin) } diff --git a/src/sbt-test/flyway-sbt/test4/project/plugins.sbt b/src/sbt-test/flyway-sbt/test4/project/plugins.sbt index a968be8..1088043 100644 --- a/src/sbt-test/flyway-sbt/test4/project/plugins.sbt +++ b/src/sbt-test/flyway-sbt/test4/project/plugins.sbt @@ -1,5 +1,5 @@ sys.props.get("plugin.version") match { - case Some(x) => addSbtPlugin("io.github.davidmweber" % "flyway-sbt" % x) + case Some(x) => addSbtPlugin("com.github.sbt" % "flyway-sbt" % x) case _ => sys.error("""|The system property 'plugin.version' is not defined. |Specify this property using the scriptedLaunchOpts -D.""".stripMargin) }