From 8632cde3f29d41fd08597aec7287ab2af6d7d036 Mon Sep 17 00:00:00 2001 From: FabioPinheiro Date: Tue, 19 Nov 2024 18:12:09 +0000 Subject: [PATCH] build: New CI Job to make images for docker-hub # For https://github.com/hyperledger/identus/issues/87 Signed-off-by: FabioPinheiro --- .github/workflows/release-docker-hub.yml | 161 +++++++++++++++++++++++ build.sbt | 9 +- project/plugins.sbt | 7 +- version.sbt | 1 - 4 files changed, 172 insertions(+), 6 deletions(-) create mode 100644 .github/workflows/release-docker-hub.yml delete mode 100644 version.sbt diff --git a/.github/workflows/release-docker-hub.yml b/.github/workflows/release-docker-hub.yml new file mode 100644 index 00000000..3084fcd6 --- /dev/null +++ b/.github/workflows/release-docker-hub.yml @@ -0,0 +1,161 @@ +name: Release to Docker Hub +# ower: FabioPinheiro +# updated: 2024/11/25 +# How to test: +# > git tag v9.9.9 +# > act --artifact-server-path /tmp/artifacts -s GITHUB_TOKEN="$(gh auth token)" --var DOCKERHUB_FMGP_USERNAME=$DOCKERHUB_FMGP_USERNAME -s DOCKERHUB_FMGP_TOKEN=$DOCKERHUB_FMGP_TOKEN --var DOCKERHUB_IDENTUS_USERNAME=$DOCKERHUB_IDENTUS_USERNAME -s DOCKERHUB_IDENTUS_TOKEN=$DOCKERHUB_IDENTUS_TOKEN -j build-and-push-docker-images schedule +# > git tag --delete v9.9.9 + +concurrency: + group: release + +on: + workflow_dispatch: + schedule: + - cron: '0 0 * * *' # Run every day at midnight UTC + push: + tags: + - v* + +permissions: + contents: read + +jobs: + build-binaries: + if: ${{ !contains(github.event.head_commit.message, 'chore(release)') }} + runs-on: ubuntu-latest + env: + GITHUB_ACTOR: "hyperledger-bot" + GITHUB_ACTOR_EMAIL: "hyperledger-bot@hyperledger.org" + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + JAVA_TOOL_OPTIONS: -Djava.net.preferIPv4Stack=true + SBT_OPTS: -Xmx2G + steps: + - uses: actions/checkout@v4 + + - name: Setup Java and Scala + uses: olafurpg/setup-scala@v14 + with: + java-version: zulu@1.11.0 + + - name: Cache sbt + uses: coursier/cache-action@v6.3 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: "lts/*" + + - name: Build Binaries + env: + NODE_OPTIONS: --openssl-legacy-provider + run: sbt -J-Xmx5120m "docker:stage" + + - name: Save build Directory + uses: actions/upload-artifact@v4 + with: + name: docker-directory-artifact + path: ./mediator/target/docker/stage + + + build-and-push-docker-images: + name: Build and Push Docker images + runs-on: ubuntu-latest + needs: build-binaries + strategy: + fail-fast: false + matrix: + docker: + - # identus # This is a test account + registry: docker.io + repository: ${{vars.DOCKERHUB_IDENTUS_USERNAME}} + username: ${{vars.DOCKERHUB_IDENTUS_USERNAME}} + password_name: DOCKERHUB_IDENTUS_TOKEN + tags_noschedule: | + type=semver,pattern={{version}} + type=raw,value=latest,enable={{is_default_branch}} + # type=raw,value=${{needs.pick-build-version.outputs.build_version}} + tags_schedule: | + type=schedule,pattern=nightly,enable={{is_default_branch}} + - # fmgp # My presonal acount also for testing + registry: docker.io + repository: ${{vars.DOCKERHUB_FMGP_USERNAME}} + username: ${{vars.DOCKERHUB_FMGP_USERNAME}} + password_name: DOCKERHUB_FMGP_TOKEN + tags_noschedule: | + type=semver,pattern={{version}},enable={{is_default_branch}} + type=raw,value=latest,enable={{is_default_branch}} + tags_schedule: | + type=schedule,enable={{is_default_branch}} + + steps: + - name: Set test variable + run: | + echo "META_CONFIG<> $GITHUB_ENV + if [ ${{ github.event_name }} == 'schedule' ]; then + echo "${{matrix.docker.tags_schedule}}" >> $GITHUB_ENV; + # type=semver,pattern={{version}} + # type=sha,prefix={{branch}}- + else + echo "${{matrix.docker.tags_noschedule}}" >> $GITHUB_ENV; + # type=schedule,pattern={{date 'YYYYMMDD'}} + fi + echo "EOF" >> $GITHUB_ENV + + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ matrix.docker.registry }}/${{ matrix.docker.repository }}/identus-mediator + tags: "${{ env.META_CONFIG }}" + + - name: JOB INFO + run: | + echo "##################" + echo "#### JOB INFO ####" + echo "##################" + echo "### github.event_name=${{github.event_name}} (Is this type 'schedule'""? ${{ github.event_name == 'schedule' }})" + echo "### matrix.docker.tags_schedule: ${{ matrix.docker.tags_schedule }}" + echo "### matrix.docker.tags_noschedule: ${{ matrix.docker.tags_noschedule }}" + echo "### env.META_CONFIG: ${{ env.META_CONFIG }}" + echo "### TAGS: ${{ steps.meta.outputs.tags == '' }}" + echo "${{ steps.meta.outputs.tags }}" + echo "### runner: ${{ toJSON(runner) }}" + echo "### github: ${{ toJSON(github) }}" + + - name: Download docker-directory-artifact + uses: actions/download-artifact@v4 + with: + name: docker-directory-artifact + path: docker-artifact + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + with: + buildkitd-flags: --debug + buildkitd-config-inline: | + [worker.oci] + max-parallelism = 1 + platforms: linux/amd64,linux/arm64 + + - name: Login to the ${{ matrix.docker.registry }} Container Registry with ${{ matrix.docker.username }} + uses: docker/login-action@v3 + with: + registry: ${{ matrix.docker.registry }} + username: ${{ matrix.docker.username }} + password: ${{ secrets[matrix.docker.password_name] }} + + # TODO FIX These builds the image multiple times (matrix) + - name: Build and push identus-mediator Image + id: push + uses: docker/build-push-action@v6 + with: + context: ./docker-artifact/ + platforms: linux/amd64,linux/arm64 + tags: ${{ steps.meta.outputs.tags }} + push: ${{ steps.meta.outputs.tags != '' }} + labels: ${{ steps.meta.outputs.labels }} + annotations: ${{ steps.meta.outputs.annotations }} diff --git a/build.sbt b/build.sbt index 9ce08a0c..cc9710c3 100644 --- a/build.sbt +++ b/build.sbt @@ -4,6 +4,7 @@ resolvers ++= Resolver.sonatypeOssRepos("snapshots") inThisBuild( Seq( scalaVersion := "3.3.3", // Also update docs/publishWebsite.sh and any ref to scala-3.3.3 + versionScheme := Some("semver-spec"), // https://www.scala-sbt.org/1.x/docs/Publishing.html#Version+scheme ) ) @@ -172,7 +173,7 @@ lazy val scalaJSBundlerConfigure: Project => Project = // Compile / fullOptJS / webpackExtraArgs += "--mode=production", Compile / fastOptJS / webpackDevServerExtraArgs += "--mode=development", Compile / fullOptJS / webpackDevServerExtraArgs += "--mode=production", - useYarn := true + // useYarn := true ) lazy val buildInfoConfigure: Project => Project = _.enablePlugins(BuildInfoPlugin) @@ -286,10 +287,10 @@ lazy val webapp = project import sbtrelease.ReleasePlugin.autoImport.ReleaseTransformations.* releaseProcess := Seq[ReleaseStep]( checkSnapshotDependencies, - inquireVersions, + // inquireVersions, runClean, runTest, - setReleaseVersion, + // setReleaseVersion, ReleaseStep(releaseStepTask(mediator / Docker / stage)), - setNextVersion + // setNextVersion ) diff --git a/project/plugins.sbt b/project/plugins.sbt index 88729a36..0c2adf86 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -59,9 +59,11 @@ addSbtPlugin("com.github.sbt" % "sbt-release" % "1.4.0") // Github Packages if (sys.env.get("GITHUB_TOKEN").isDefined) { - println(s"Adding plugin sbt-dependency-tree since env GITHUB_TOKEN is defined.") // The reason for this is that the plugin needs the variable to be defined. We don't want to have that requirement. libraryDependencies += { + val log = sLog.value + log.info(s"Adding plugin sbt-dependency-tree since env GITHUB_TOKEN is defined.") + val dependency = "com.codecommit" % "sbt-github-packages" % "0.5.3" val sbtV = (pluginCrossBuild / sbtBinaryVersion).value val scalaV = (update / scalaBinaryVersion).value @@ -69,5 +71,8 @@ if (sys.env.get("GITHUB_TOKEN").isDefined) { } } else libraryDependencies ++= Seq[ModuleID]() +// PUBLISH +addSbtPlugin("com.github.sbt" % "sbt-ci-release" % "1.9.0") + // Native Packager addSbtPlugin("com.github.sbt" % "sbt-native-packager" % "1.10.0") diff --git a/version.sbt b/version.sbt deleted file mode 100644 index 67d9433f..00000000 --- a/version.sbt +++ /dev/null @@ -1 +0,0 @@ -ThisBuild / version := "1.0.1-SNAPSHOT"