Skip to content

Commit

Permalink
Merge pull request #166 from guardian/db/adopt-gha-scala-release-work…
Browse files Browse the repository at this point in the history
…flow

Adopt gha-scala-rel-workflow in the project
  • Loading branch information
Divs-B authored Mar 6, 2024
2 parents 8a8b60c + 44bc7d9 commit dae3433
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 225 deletions.
78 changes: 19 additions & 59 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -1,76 +1,36 @@
name: Release Sonatype
name: Release

on:
release:
types: [published]
workflow_dispatch:

jobs:
release_snapshot_sonatype:
if: "github.event.release.prerelease"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
base: main #see https://github.com/peter-evans/create-pull-request/blob/main/docs/concepts-guidelines.md#pull-request-events
- uses: actions/setup-java@v3
with:
distribution: corretto
java-version: 11
cache: sbt
- name: Release Snapshot (prerelease) to Sonatype
run: |
VERSION=$(git describe --tags | cut -f2 -d"@")
if [[ ${VERSION:0:1} == "v" ]] ; then
VERSION=${VERSION:1}
fi
if [[ ${VERSION: -9} != "-SNAPSHOT" ]] ; then
echo "Version must end in -SNAPSHOT. Adding -SNAPSHOT suffix"
VERSION="$VERSION-SNAPSHOT"
fi
echo $PGP_SECRET | base64 --decode | gpg --batch --import
export GPG_TTY=$(tty)
echo "Releasing version $VERSION Sonatype as snapshot"
yes | sbt -DRELEASE_TYPE=snapshot "clean" "release cross release-version $VERSION with-defaults"
env:
PGP_SECRET: ${{ secrets.PGP_SECRET }}
PGP_PASSPHRASE: ${{ secrets.PGP_PASSPHRASE }}
SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }}
SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }}
scala-maven-release:
name: Maven Release
uses: guardian/gha-scala-library-release-workflow/.github/workflows/reusable-release.yml@main
permissions: { contents: write, pull-requests: write }
secrets:
SONATYPE_PASSWORD: ${{ secrets.AUTOMATED_MAVEN_RELEASE_SONATYPE_PASSWORD }}
PGP_PRIVATE_KEY: ${{ secrets.AUTOMATED_MAVEN_RELEASE_PGP_SECRET }}
GITHUB_APP_PRIVATE_KEY: ${{ secrets.AUTOMATED_MAVEN_RELEASE_GITHUB_APP_PRIVATE_KEY }}

release_production_sonatype:
if: "! github.event.release.prerelease"
typescript-npm-release:
name: NPM Release
needs: scala-maven-release
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
base: main #see https://github.com/peter-evans/create-pull-request/blob/main/docs/concepts-guidelines.md#pull-request-events
- uses: actions/setup-java@v3
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: corretto
java-version: 11
cache: sbt
- uses: actions/setup-node@v3
- uses: actions/setup-node@v4
with:
node-version-file: .nvmrc
registry-url: https://registry.npmjs.org
- name: Release Production to Sonatype and NPM
- name: Release Typescript to NPM
run: |
VERSION=$(git describe --tags | cut -f2 -d"@")
if [[ ${VERSION:0:1} == "v" ]] ; then
VERSION=${VERSION:1}
fi
if [[ ${VERSION: -9} == "-SNAPSHOT" ]] ; then
echo "Version must NOT end in -SNAPSHOT."
exit 1
fi
echo $PGP_SECRET | base64 --decode | gpg --batch --import
export GPG_TTY=$(tty)
echo "Releasing version $VERSION Sonatype as production"
yes | sbt -DRELEASE_TYPE=production "clean" "release cross release-version $VERSION with-defaults" "project typescriptClasses" "releaseNpm $VERSION"
sbt "project typescriptClasses" "releaseNpm ${{ needs.scala-maven-release.outputs.RELEASE_VERSION }}"
env:
PGP_SECRET: ${{ secrets.PGP_SECRET }}
PGP_PASSPHRASE: ${{ secrets.PGP_PASSPHRASE }}
SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }}
SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }}
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
RELEASE_TYPE: ${{ needs.scala-maven-release.outputs.RELEASE_TYPE }}
63 changes: 4 additions & 59 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,64 +9,9 @@ This is the Thrift definition of the Content Atom model, and the published versi
In order for the scala code generated from the thrift definitions to be packaged correctly a scala namespace needs to be included. For example for the chart atom this would be:
`#@namespace scala com.gu.contentatom.thrift.atom.chart`

## How to release

### A note on version numbers
## How to make releases (maven and npm):

The version field in `package.json` should be kept in sync with the version in `version.sbt`

### Prerequisites

Prior to releasing, you will need to ensure that:
- `tsc` is installed on your machine (e.g. `brew install typescript`)
- `npm` is installed on your machine
- you have an NPM account which is part of the [@guardian](https://www.npmjs.com/org/guardian) org
- you have configured an NPM [access token](https://docs.npmjs.com/creating-and-viewing-authentication-tokens) to
publish to @guardian; a convenient way to set this up is to execute `npm login` locally and follow the prompts;
this will create/append to an `~/.npmrc` file with the sufficient config
- you have the followed the [guide](https://docs.google.com/document/d/1rNXjoZDqZMsQblOVXPAIIOMWuwUKe3KzTCttuqS7AcY/edit)
for publishing to Maven and Sonatype


#### Non-production releases (Sonatype only):

The easiest way to release a snapshot version is via the github UI.
[This](https://github.com/guardian/content-api-firehose-client/pull/28/373) PR introduced the ability to use a github action to trigger the release.

The steps you should take are:
- Push the branch with the changes you want to release to Github.
- [Click here](https://github.com/guardian/content-api-firehose-client/releases/new?prerelease=true) to create prerelease using Github releases.

- You must then:
- Set the Target to your branch.
- Create a tag for the snapshot release (the tag can be created from this same UI if it doesn't already exist).
- The tag should ideally have format "vX.X.X-SNAPSHOT".
- Double-check that the "Set as pre-release" box is ticket.
- To automatically release the snapshot to sonatype then click the "Publish release" button.

And then manually release the npm module:
`npm i -g typescript && sbt 'project typescriptClasses; releaseNpm X.X.X-SNAPSHOT'`


#### Production releases (Sonatype and NPM):

When your changes are done and tested and you're ready to release a new production version, edit the `version.sbt` file to reflect the version you are about to release.

Typically this should just require the removal of the -SNAPSHOT part, but check in [maven](https://repo1.maven.org/maven2/com/gu/content-api-firehose-client_2.13/) to make sure nobody else has released this version before you.

Open a PR.

When your PR is approved, merge it to `main` and ensure the build actions complete successfully.

Then, on the [releases](https://github.com/guardian/content-api-firehose-client/releases) page:
- Choose `Draft a new release`
- Create a new tag of the version number e.g. `v1.0.10`
- Set the target to the `main` branch
- Add a release title (the version number again is fine)
- Add an optional description
- Ensure that `Set as pre-release` is **unchecked**
- Click the `Publish release` button

When the release process has finished, pull the updated `main` branch locally and update the `version.sbt` file to reflect the next build number, e.g. `1.0.11-SNAPSHOT` and commit that directly back to `main` - there's no need to open a PR for that.

When your release shows up on [maven](https://repo1.maven.org/maven2/com/gu/content-api-firehose-client_2.13/) the updated version can be referenced in client code.
This repo uses [`gha-scala-library-release-workflow`](https://github.com/guardian/gha-scala-library-release-workflow)
to automate publishing releases (both full & preview releases) - see
[**Making a Release**](https://github.com/guardian/gha-scala-library-release-workflow/blob/main/docs/making-a-release.md).
125 changes: 24 additions & 101 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -5,117 +5,40 @@ val contentEntityVersion = "2.2.1"
val scroogeVersion = "22.1.0" // remember to also update plugins.sbt if the scrooge version changes
val thriftVersion = "0.15.0" // remember to also update package.json if the thrift version changes

//https://github.com/xerial/sbt-sonatype/issues/103
publishTo := sonatypePublishToBundle.value

lazy val mavenSettings = Seq(
pomExtra := <url>https://github.com/guardian/content-atom</url>
<developers>
<developer>
<id>paulmr</id>
<name>Paul Roberts</name>
<url>https://github.com/paulmr</url>
</developer>
<developer>
<id>LATaylor-guardian</id>
<name>Luke Taylor</name>
<url>https://github.com/LATaylor-guardian</url>
</developer>
<developer>
<id>mchv</id>
<name>Mariot Chauvin</name>
<url>https://github.com/mchv</url>
</developer>
<developer>
<id>tomrf1</id>
<name>Tom Forbes</name>
<url>https://github.com/tomrf1</url>
</developer>
<developer>
<id>annebyrne</id>
<name>Anne Byrne</name>
<url>https://github.com/annebyrne</url>
</developer>
<developer>
<id>regiskuckaertz</id>
<name>Regis Kuckaertz</name>
<url>https://github.com/regiskuckaertz</url>
</developer>
<developer>
<id>justinpinner</id>
<name>Justin Pinner</name>
<url>https://github.com/justinpinner</url>
</developer>
</developers>,
licenses := Seq("Apache V2" -> url("http://www.apache.org/licenses/LICENSE-2.0.html")),
publishTo := sonatypePublishToBundle.value,
publishConfiguration := publishConfiguration.value.withOverwrite(true)
)

val snapshotReleaseType = "snapshot"

lazy val releaseProcessSteps: Seq[ReleaseStep] = {
val commonSteps:Seq[ReleaseStep] = Seq(
checkSnapshotDependencies,
inquireVersions,
runClean,
runTest,
setReleaseVersion,
)

val localExtraSteps:Seq[ReleaseStep] = Seq(
commitReleaseVersion,
tagRelease,
publishArtifacts,
setNextVersion,
commitNextVersion
)

val snapshotSteps:Seq[ReleaseStep] = Seq(
publishArtifacts,
releaseStepCommand("sonatypeReleaseAll")
)

val prodSteps:Seq[ReleaseStep] = Seq(
releaseStepCommandAndRemaining("+publishSigned"),
releaseStepCommand("sonatypeBundleRelease")
)

val localPostRelease:Seq[ReleaseStep] = Seq(
pushChanges,
)

(sys.props.get("RELEASE_TYPE"), sys.env.get("CI")) match {
case (Some(v), None) if v == snapshotReleaseType => commonSteps ++ localExtraSteps ++ snapshotSteps ++ localPostRelease
case (_, None) => commonSteps ++ localExtraSteps ++ prodSteps ++ localPostRelease
case (Some(v), _) if v == snapshotReleaseType => commonSteps ++ snapshotSteps
case (_, _)=> commonSteps ++ prodSteps
}
}

val commonSettings = Seq(
val artifactProductionSettings = Seq(
organization := "com.gu",
scalaVersion := "2.13.2",
scalaVersion := "2.13.12",
// downgrade scrooge reserved word clashes to warnings
Compile / scroogeDisableStrict := true,
// Scrooge 21.3.0 dropped support for scala < 2.12, so we can only build for Scala 2.12+
// https://twitter.github.io/scrooge/changelog.html#id11
crossScalaVersions := Seq("2.12.11", scalaVersion.value),
scmInfo := Some(ScmInfo(url("https://github.com/guardian/content-atom"),
"scm:git:[email protected]:guardian/content-atom.git")),
releasePublishArtifactsAction := PgpKeys.publishSigned.value,
) ++ mavenSettings
crossScalaVersions := Seq("2.12.18", scalaVersion.value),
licenses := Seq(License.Apache2)
/*
Test / testOptions +=
Tests.Argument(TestFrameworks.ScalaTest, "-u", s"test-results/scala-${scalaVersion.value}", "-o")
*/ // Need to uncomment when testcases gets added.Also to change ci.yml to add "Build and Test" as well.
)

lazy val root = Project(id = "root", base = file("."))
.settings(commonSettings)
.aggregate(thrift, scalaClasses)
.settings(
publishArtifact := false,
releaseProcess := releaseProcessSteps
publish / skip := true,
releaseProcess := Seq[ReleaseStep](
checkSnapshotDependencies,
inquireVersions,
runClean,
runTest,
setReleaseVersion,
commitReleaseVersion,
tagRelease,
setNextVersion,
commitNextVersion
)
)

lazy val thrift = Project(id = "content-atom-model-thrift", base = file("thrift"))
.settings(commonSettings)
.settings(artifactProductionSettings)
.disablePlugins(ScroogeSBT)
.settings(
description := "Content atom model Thrift files",
Expand All @@ -127,7 +50,7 @@ lazy val thrift = Project(id = "content-atom-model-thrift", base = file("thrift"
)

lazy val scalaClasses = Project(id = "content-atom-model", base = file("scala"))
.settings(commonSettings)
.settings(artifactProductionSettings)
.settings(
description := "Scala library built from Content-atom thrift definition",
Compile / scroogeThriftSourceFolder := baseDirectory.value / "../thrift/src/main/thrift",
Expand All @@ -147,7 +70,7 @@ lazy val scalaClasses = Project(id = "content-atom-model", base = file("scala"))

lazy val typescriptClasses = (project in file("ts"))
.enablePlugins(ScroogeTypescriptGen)
.settings(commonSettings)
.settings(artifactProductionSettings)
.settings(
name := "content-atom-typescript",
scroogeTypescriptNpmPackageName := "@guardian/content-atom-model",
Expand Down
2 changes: 1 addition & 1 deletion project/build.properties
Original file line number Diff line number Diff line change
@@ -1 +1 @@
sbt.version=1.9.7
sbt.version=1.9.8
13 changes: 8 additions & 5 deletions project/plugins.sbt
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
addSbtPlugin("com.github.sbt" % "sbt-pgp" % "2.1.2")
addSbtPlugin("org.xerial.sbt" % "sbt-sonatype" % "3.9.10")
addSbtPlugin("org.xerial.sbt" % "sbt-sonatype" % "3.10.0")
addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.7.0")
addSbtPlugin("com.github.sbt" % "sbt-release" % "1.1.0")

addSbtPlugin("com.github.sbt" % "sbt-release" % "1.4.0")
addSbtPlugin("com.twitter" % "scrooge-sbt-plugin" % "22.1.0")

addSbtPlugin("com.gu" % "sbt-scrooge-typescript" % "1.6.0")
addSbtPlugin("ch.epfl.scala" % "sbt-version-policy" % "3.2.0")





0 comments on commit dae3433

Please sign in to comment.