diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3a152e2d..ce9f907f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,6 +9,9 @@ on: branches: [main] # tags: ["v*"] +env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + jobs: Run-Tests: name: CI diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..d850b5b8 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,65 @@ +name: Release + +concurrency: + group: release + +on: + workflow_call: + inputs: + release-branch: + required: false + type: string + default: "main" + workflow_dispatch: + inputs: + release-branch: + description: "Branch to release from" + required: false + default: "main" + +jobs: + release: + env: + GITHUB_ACTOR: ${{ secrets.ATALA_GITHUB_ACTOR }} + GITHUB_TOKEN: ${{ secrets.ATALA_GITHUB_TOKEN }} + SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + token: ${{ secrets.ATALA_GITHUB_TOKEN }} + ref: ${{ github.event.inputs.release-branch }} + fetch-depth: 0 + - name: Setup Java and Scala + uses: olafurpg/setup-scala@v13 + with: + java-version: openjdk@1.11 + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: "lts/*" + - uses: crazy-max/ghaction-import-gpg@v3 + id: import_gpg + with: + gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }} + git-user-signingkey: true + git-commit-gpgsign: true + - name: Login to GitHub Container Registry + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ secrets.ATALA_GITHUB_ACTOR }} + password: ${{ secrets.ATALA_GITHUB_TOKEN }} + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + - name: Release + env: + GIT_AUTHOR_EMAIL: ${{ steps.import_gpg.outputs.email }} + GIT_COMMITTER_EMAIL: ${{ steps.import_gpg.outputs.email }} + GIT_AUTHOR_NAME: ${{ steps.import_gpg.outputs.name }} + GIT_COMMITTER_NAME: ${{ steps.import_gpg.outputs.name }} + run: | + npm install + npx semantic-release diff --git a/.gitignore b/.gitignore index d779e76c..a781d947 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ .bloop/ .metals/ .bsp/ +.idea/ .vscode/ project/metals.sbt project/project/ diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..e69de29b diff --git a/build.sbt b/build.sbt index cc270e2a..6279f5e1 100644 --- a/build.sbt +++ b/build.sbt @@ -211,3 +211,17 @@ lazy val mediator = project ) // .jvmConfigure(e => e.dependsOn(httpUtils)) .dependsOn(httpUtils.jvm) // did, didExample, + +// ############################ +// #### Release process ##### +// ############################ +import sbtrelease.ReleasePlugin.autoImport.ReleaseTransformations.* +releaseProcess := Seq[ReleaseStep]( + checkSnapshotDependencies, + inquireVersions, + runClean, + runTest, + setReleaseVersion, + ReleaseStep(releaseStepTask(mediator / Docker / stage)), + setNextVersion +) diff --git a/package.json b/package.json new file mode 100644 index 00000000..c0f1b8af --- /dev/null +++ b/package.json @@ -0,0 +1,84 @@ +{ + "name": "atala-prism-mediator", + "version": "0.1.0", + "engines": { + "node": ">=16.13.0" + }, + "devDependencies": { + "@commitlint/cli": "^17.0.3", + "@commitlint/config-conventional": "^17.0.3", + "@semantic-release/changelog": "^6.0.1", + "@semantic-release/exec": "^6.0.3", + "@semantic-release/git": "^10.0.1", + "conventional-changelog-conventionalcommits": "^5.0.0", + "gradle-semantic-release-plugin": "1.7.3", + "husky": "^8.0.1", + "pinst": "^3.0.0", + "prettier": "^2.7.1", + "semantic-release": "^19.0.3", + "semantic-release-slack-bot": "^3.5.3" + }, + "release": { + "branches": [ + { + "name": "main" + }, + { + "name": "prerelease/*", + "prerelease": "snapshot" + } + ], + "tagFormat": "prism-mediator-v${version}", + "plugins": [ + "@semantic-release/commit-analyzer", + "@semantic-release/release-notes-generator", + [ + "@semantic-release/exec", + { + "prepareCmd": "npm version ${nextRelease.version} --git-tag-version false" + } + ], + [ + "@semantic-release/exec", + { + "prepareCmd": "sbt \"release release-version ${nextRelease.version} next-version ${nextRelease.version}-SNAPSHOT with-defaults\"" + } + ], + [ + "@semantic-release/exec", + { + "prepareCmd": "docker buildx build --platform=linux/arm64,linux/amd64 --push -t ghcr.io/input-output-hk/atala-prism-mediator:${nextRelease.version} ./did-mediator/target/docker/stage" + } + ], + [ + "@semantic-release/changelog", + { + "changelogFile": "CHANGELOG.md" + } + ], + [ + "@semantic-release/git", + { + "assets": [ + "version.sbt", + "CHANGELOG.md", + "package.json", + "package-lock.json" + ], + "message": "chore(release): cut prism mediator ${nextRelease.version} release\n\n${nextRelease.notes}" + } + ], + [ + "semantic-release-slack-bot", + { + "notifyOnSuccess": true, + "notifyOnFail": true, + "markdownReleaseNotes": true, + "onSuccessTemplate": { + "text": "A new version of Atala PRISM Mediator successfully released!\nVersion: `$npm_package_version`\nTag: $repo_url/releases/tag/$npm_package_version\n\nRelease notes:\n$release_notes" + } + } + ] + ] + } +} \ No newline at end of file diff --git a/project/plugins.sbt b/project/plugins.sbt index 435d7f42..be362744 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -52,3 +52,12 @@ addSbtPlugin("ch.epfl.scala" % "sbt-scalafix" % "0.10.4") // Deploy demo addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.1.1") + +// Release +addSbtPlugin("com.github.sbt" % "sbt-release" % "1.1.0") + +// Github Packages +addSbtPlugin("com.codecommit" % "sbt-github-packages" % "0.5.3") + +// Native Packager +addSbtPlugin("com.github.sbt" % "sbt-native-packager" % "1.9.11") diff --git a/version.sbt b/version.sbt new file mode 100644 index 00000000..e91862e6 --- /dev/null +++ b/version.sbt @@ -0,0 +1 @@ +ThisBuild / version := "0.1.0-SNAPSHOT"