From 4ff9c2026a1823caa853dc7a6db69a23ecaf15f1 Mon Sep 17 00:00:00 2001 From: Denys Zadorozhnyi Date: Wed, 23 Oct 2019 16:09:06 +0300 Subject: [PATCH] Release publishing (#619) * add sbt-sonatype and sbt-pgp plugins; * remove scm from pom (generated with sbt-sonatype); skip publishing sub-projects; restructure travis.yml with stages; * add encrypted secring; * setup sbt-pgp for CI; * add jvm opts to sbt release script on travis; * import decrypted key; * read creadentials from file only if it exists; * add comments and links to guides; --- .travis.yml | 51 ++++++++------ build.sbt | 167 +++++++++++++++++++++++++------------------- ci/pubring.asc | 30 ++++++++ ci/secring.asc.enc | Bin 0 -> 3664 bytes project/plugins.sbt | 4 +- 5 files changed, 158 insertions(+), 94 deletions(-) create mode 100644 ci/pubring.asc create mode 100644 ci/secring.asc.enc diff --git a/.travis.yml b/.travis.yml index fe4bb11629..db05759cbc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,31 +1,42 @@ sudo: required dist: trusty - -# Tricks to avoid unnecessary cache updates before_cache: - - find $HOME/.sbt -name "*.lock" | xargs rm - - find $HOME/.ivy2 -name "ivydata-*.properties" | xargs rm - -# These directories are cached to S3 at the end of the build +- find $HOME/.sbt -name "*.lock" | xargs rm +- find $HOME/.ivy2 -name "ivydata-*.properties" | xargs rm cache: directories: - - $HOME/.ivy2/cache - - $HOME/.sbt + - "$HOME/.ivy2/cache" + - "$HOME/.sbt" language: scala - jdk: - - oraclejdk8 - -script: - - sbt -jvm-opts .travis.jvmopts test -# enable scoverage after SpamSpecification timeout issue is resolved -# - sbt -jvm-opts .travis.jvmopts coverage test - -after_success: -# - sbt coverageReport coveralls - - sbt -jvm-opts .travis.jvmopts publish - +- oraclejdk8 +stages: +- test +# - coverage +- name: release + if: tag =~ ^v +- name: snapshot + if: NOT tag IS present +jobs: + include: + - stage: test + script: sbt -jvm-opts .travis.jvmopts test + # enable scoverage after SpamSpecification timeout issue is resolved + # script: sbt -jvm-opts .travis.jvmopts coverage test +# - stage: coverage +# script: sbt coverageReport coveralls + - stage: release + script: sbt -jvm-opts .travis.jvmopts publishSigned sonatypeBundleRelease + - stage: snapshot + script: sbt -jvm-opts .travis.jvmopts publish env: global: - secure: IGwd+lY2TfkAeX1SfzaYBwyhiiPaFrTxoF0e+4R1bkGxiGCce1hBYjn15z1HRfK+k3hgEZh/FBG7dv8LQfNWQ6AJY5PQ2zwckd4ArYMhTVpiY4eRzUMqO1/gjTCCbbTjfFKOMsR2pAw+TGeglqoX4eyziIaS8nR901dZcFvHuC1Fr5EdKFZ0x+WHnX8vaSQoDE4u1MoBnyo5cRVumXG+xvs1Q0nZXm/hd/Flfx5u3L7veKAkGtvbHmdsJoSSySTbc1MGYQtofQjbjd9AVvUhgfP32J63UCC2SqgWWKVvIjW+dUn414BV3lelnWR3FdzhC7AUJqYWVfSILh1aj3STnizRnjtCScmyoRz4ldUQ3jr4jBJOREUEus5YH2EqY1MGjX+8kUu9IjDYiQyNy1EdivcmMlXCOcAW2mi4rGDRxZOeFt1ZSHzxqSghZOFwvk/OFcdDzV4/3OnAcGz8LH5qjZU/edjmfkSls5CqxuAFqeD7RZWIu0ccjt6dzQZAf02lBX9kQuwIruC4x4E0iEjml7jmaEeOT4Hqk7wAo6EFMSEkj4EnS/Kln6Wr7JBut5qrMk0+PDgvxaKCaN8LeycCSQdoXfPO602WzfasNcOJexSmGMAE5NYfeXjq1h3F9AVHJ3TbNAOdlQTHbSOqt7WO10JphljYnFEu4aSzvaA3E60= - secure: g4Egz1orKgCAgTckMYHHbpsFY8ppldLLUkBi0GasHN4M2zhfYlqzaJ+ZZ4soMPNshcS3XutGS+/ERF5zrnHF1C9h3txW6AJkgMkTF1q4UyKan25chdPnz1nNUrdQOvaCA4CzLIN3aQAHN40p44ELxfNTARTfbUAIcqNSrKmXZsUbhQg9yyM+gFL6cCw7SYQphC9GJq4mvW19dzzpU8MQ0AtktB6mscuUyiWgniHsnFAmeQBv0csCiMyjUsT1buIkO0gSvZBKkLXu7kXhash/mLjrBYGapVGGFORA3pWy9JCB9OfxV8Bj1wNUqPyAImjGgVfgK6RxOnQ/C4GTsf8uVH/sYIiPnzPmbCrO7fQee68/+SWtZc1kko8HuiqHvouNHmKQy+Hwku2AIdp6nZDhOuFtQTP1PbkYLrdNj1evAI6913rq51e7vDWTriWmOKjMz2m4Tj2HGJx0VS0pNOZkpxwVhHOdyc1UXurpBKgkYis1HVcaEM3trFzhsMf7kllNvJLA1COwg7KbVebKwA9gXfYrKAp6p76YMaSYodSDq9VaSDPF/2MVCZYXs+FAUZ3MzcsAZ7TegSX2OWrrneGArjcQgdMLUetm+UgBFZF7pG3BpjMLVwMgp9ulUNkq1sP1vLU08cvQv6A3W/kcyrVyCNzg80XTQqDpxz7hCTbyBSw= + - secure: gfhEv/PXEckwZPnwJHl4fBCJKCrCKK4KMeYCPNZZtKuV1gC4mZscvECm8r+kgB+o2G3i4tEIYcIC5Jbdcbjf4bk6uNZW/X3dna0irl/Mdswt7rTLzLan1rPz3k8Bylgs8ehETFBGr8HyNitEa8ODyaEXa84MPQaucXUmpHS+sUEhQn0Z70T70d1H9ZubUhGv9VLltNoSWkPGW5CPZlpQTHl63ZShfmylfQuQVTbVMdL8LLUHn2x2edlDKMGD8YPH5d+of0AKc3IKnlnMM36WjgYVsf1yehfLi0NH/b2Dzk7wLjetu/bw8Cu9Ne6/u0Lu83Hbh4DyS2iPQivDUGB+JXlHDFI4uji3GurnvpFDku1gbc4HVoFqhgOWyXQAiRllj2BXmq2vwp6797TUG4HrD2EVzIJV7eIZdWNN/QttZtNxNdSbBq8QQc92G2SU4q7PcogMSr0LpX05SfyL1sMgX2WeGzFzyMIu/+rAJhG0lPt7krBxEfQrRtTLdJ9eyeFjFQlxM6G/9gk68j+Nida6KunLwe9QEl2T+t1YbE4i9pndoCMJFxAOjirhw5OM3PfSWfb/mU7zXd4PSNK7RQIdOaPJff5C6UEM7h/iQ6riRZp1Pn7d/rxppTXsvUbtvwUYnkoOeUZyMvQNQsPI6Slns8jWl0zp5XiTmzSRVOuH3ME= +# decrypt the private key (exported via https://docs.scala-lang.org/overviews/contributors/index.html#export-your-pgp-key-pair ) +before_install: +- openssl aes-256-cbc -K $encrypted_98cf3af00429_key -iv $encrypted_98cf3af00429_iv + -in ci/secring.asc.enc -out ci/secring.asc -d +# import decrypted private key +before_script: gpg --import ci/secring.asc \ No newline at end of file diff --git a/build.sbt b/build.sbt index 929a3485ee..d80b2664ae 100644 --- a/build.sbt +++ b/build.sbt @@ -14,11 +14,8 @@ lazy val commonSettings = Seq( resolvers += Resolver.sonatypeRepo("public"), licenses := Seq("CC0" -> url("https://creativecommons.org/publicdomain/zero/1.0/legalcode")), homepage := Some(url("https://github.com/ScorexFoundation/sigmastate-interpreter")), + description := "Interpreter of a Sigma-State language", pomExtra := - - git@github.com:ScorexProject/scrypto.git - git@github.com:ScorexFoundation/sigmastate-interpreter.git - kushti @@ -30,14 +27,14 @@ lazy val commonSettings = Seq( Alexander Slesarenko https://github.com/aslesarenko/ + + greenhat + Denys Zadorozhnyi + https://github.com/greenhat/ + , publishMavenStyle := true, - publishTo := { - val nexus = "https://oss.sonatype.org/" - if (isSnapshot.value) { Some("snapshots" at nexus + "content/repositories/snapshots") } - else { Some("releases" at nexus + "service/local/staging/deploy/maven2") } - } - + publishTo := sonatypePublishToBundle.value, ) enablePlugins(GitVersioning) @@ -137,13 +134,26 @@ publishArtifact in Test := true pomIncludeRepository := { _ => false } -credentials += Credentials(Path.userHome / ".sbt" / ".sigma-sonatype-credentials") +val credentialFile = Path.userHome / ".sbt" / ".sigma-sonatype-credentials" +credentials ++= (for { + file <- if (credentialFile.exists) Some(credentialFile) else None +} yield Credentials(file)).toSeq credentials ++= (for { username <- Option(System.getenv().get("SONATYPE_USERNAME")) password <- Option(System.getenv().get("SONATYPE_PASSWORD")) } yield Credentials("Sonatype Nexus Repository Manager", "oss.sonatype.org", username, password)).toSeq + +// PGP key for signing a release build published to sonatype +// signing is done by sbt-pgp plugin +// how to generate a key - https://central.sonatype.org/pages/working-with-pgp-signatures.html +// how to export a key and use it with Travis - https://docs.scala-lang.org/overviews/contributors/index.html#export-your-pgp-key-pair +pgpPublicRing := file("ci/pubring.asc") +pgpSecretRing := file("ci/secring.asc") +pgpPassphrase := sys.env.get("PGP_PASSPHRASE").map(_.toArray) +usePgpKeyHex("28E27A67AEA38DA458C72228CA9254B5E0640FE4") + def libraryDefSettings = commonSettings ++ testSettings ++ Seq( scalacOptions ++= Seq( // s"-Xplugin:${file(".").absolutePath }/scalanizer/target/scala-2.12/scalanizer-assembly-core-opt-0d03a785-SNAPSHOT.jar" @@ -151,91 +161,102 @@ def libraryDefSettings = commonSettings ++ testSettings ++ Seq( ) lazy val common = Project("common", file("common")) - .settings(commonSettings ++ testSettings, - libraryDependencies ++= Seq( - "org.scala-lang" % "scala-reflect" % scalaVersion.value, - debox, commonsIo - )) + .settings(commonSettings ++ testSettings, + libraryDependencies ++= Seq( + "org.scala-lang" % "scala-reflect" % scalaVersion.value, + debox, commonsIo + )) + .settings(publish / skip := true) lazy val libraryapi = Project("library-api", file("library-api")) - .dependsOn(common % allConfigDependency) - .settings(libraryDefSettings :+ addCompilerPlugin(paradise), - libraryDependencies ++= Seq( - )) + .dependsOn(common % allConfigDependency) + .settings(libraryDefSettings :+ addCompilerPlugin(paradise), + libraryDependencies ++= Seq( + )) + .settings(publish / skip := true) lazy val libraryimpl = Project("library-impl", file("library-impl")) - .dependsOn(libraryapi % allConfigDependency) - .settings(libraryDefSettings, - libraryDependencies ++= Seq( debox )) + .dependsOn(libraryapi % allConfigDependency) + .settings(libraryDefSettings, + libraryDependencies ++= Seq( debox )) + .settings(publish / skip := true) lazy val core = Project("core", file("core")) - .dependsOn(common % allConfigDependency, libraryapi % allConfigDependency) - .settings(commonSettings, - libraryDependencies ++= Seq( configs, debox )) + .dependsOn(common % allConfigDependency, libraryapi % allConfigDependency) + .settings(commonSettings, + libraryDependencies ++= Seq( configs, debox )) + .settings(publish / skip := true) lazy val library = Project("library", file("library")) - .dependsOn(common % allConfigDependency, core % allConfigDependency, libraryapi, libraryimpl) - .settings(//commonSettings, - libraryDefSettings ++ testSettings, - libraryDependencies ++= Seq( debox )) + .dependsOn(common % allConfigDependency, core % allConfigDependency, libraryapi, libraryimpl) + .settings(//commonSettings, + libraryDefSettings ++ testSettings, + libraryDependencies ++= Seq( debox )) + .settings(publish / skip := true) lazy val sigmaconf = Project("sigma-conf", file("sigma-conf")) - .settings(commonSettings, - libraryDependencies ++= Seq( - plugin, libraryconf - )) + .settings(commonSettings, + libraryDependencies ++= Seq( + plugin, libraryconf + )) + .settings(publish / skip := true) lazy val scalanizer = Project("scalanizer", file("scalanizer")) - .dependsOn(sigmaconf, libraryapi, libraryimpl) - .settings(commonSettings, - libraryDependencies ++= Seq(meta, plugin), - assemblyOption in assembly ~= { _.copy(includeScala = false, includeDependency = true) }, - assemblyMergeStrategy in assembly := { - case PathList("scalan", xs @ _*) => MergeStrategy.first - case other => (assemblyMergeStrategy in assembly).value(other) - }, - artifact in(Compile, assembly) := { - val art = (artifact in(Compile, assembly)).value - art.withClassifier(Some("assembly")) - }, - addArtifact(artifact in(Compile, assembly), assembly) - ) + .dependsOn(sigmaconf, libraryapi, libraryimpl) + .settings(commonSettings, + libraryDependencies ++= Seq(meta, plugin), + assemblyOption in assembly ~= { _.copy(includeScala = false, includeDependency = true) }, + assemblyMergeStrategy in assembly := { + case PathList("scalan", xs @ _*) => MergeStrategy.first + case other => (assemblyMergeStrategy in assembly).value(other) + }, + artifact in(Compile, assembly) := { + val art = (artifact in(Compile, assembly)).value + art.withClassifier(Some("assembly")) + }, + addArtifact(artifact in(Compile, assembly), assembly) + ) + .settings(publish / skip := true) lazy val sigmaapi = Project("sigma-api", file("sigma-api")) - .dependsOn(common, libraryapi) - .settings(libraryDefSettings :+ addCompilerPlugin(paradise), - libraryDependencies ++= Seq( - macroCompat, scrypto, bouncycastleBcprov - )) + .dependsOn(common, libraryapi) + .settings(libraryDefSettings :+ addCompilerPlugin(paradise), + libraryDependencies ++= Seq( + macroCompat, scrypto, bouncycastleBcprov + )) + .settings(publish / skip := true) lazy val sigmaimpl = Project("sigma-impl", file("sigma-impl")) - .dependsOn( - sigmaapi % allConfigDependency, - libraryapi % allConfigDependency, - libraryimpl % allConfigDependency, - library % allConfigDependency) - .settings(libraryDefSettings, - libraryDependencies ++= Seq( scrypto, bouncycastleBcprov )) + .dependsOn( + sigmaapi % allConfigDependency, + libraryapi % allConfigDependency, + libraryimpl % allConfigDependency, + library % allConfigDependency) + .settings(libraryDefSettings, + libraryDependencies ++= Seq( scrypto, bouncycastleBcprov )) + .settings(publish / skip := true) lazy val sigmalibrary = Project("sigma-library", file("sigma-library")) - .dependsOn( - sigmaimpl % allConfigDependency, - common % allConfigDependency, - core % allConfigDependency, - libraryapi % allConfigDependency, - libraryimpl % allConfigDependency, - library % allConfigDependency) - .settings(libraryDefSettings, - libraryDependencies ++= Seq( - scrypto, - bouncycastleBcprov - )) + .dependsOn( + sigmaimpl % allConfigDependency, + common % allConfigDependency, + core % allConfigDependency, + libraryapi % allConfigDependency, + libraryimpl % allConfigDependency, + library % allConfigDependency) + .settings(libraryDefSettings, + libraryDependencies ++= Seq( + scrypto, + bouncycastleBcprov + )) + .settings(publish / skip := true) lazy val sigmastate = (project in file("sigmastate")) .dependsOn(sigmaimpl % allConfigDependency, sigmalibrary % allConfigDependency) .settings(libraryDefSettings) .settings(libraryDependencies ++= Seq( - scorexUtil, kiama, fastparse, circeCore, circeGeneric, circeParser)) + scorexUtil, kiama, fastparse, circeCore, circeGeneric, circeParser)) + .settings(publish / skip := true) lazy val sigma = (project in file(".")) .aggregate( diff --git a/ci/pubring.asc b/ci/pubring.asc new file mode 100644 index 0000000000..cf75b9dfab --- /dev/null +++ b/ci/pubring.asc @@ -0,0 +1,30 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQENBF2utdgBCAClRGOfWeus4AlHvCBgJVXH2CLqXLKCBggE2vwKbKvFdW1DTPZQ +T1RI6zBtMdaSNVm4ISO4dOO67VGdajr8/6kFt2+di2b7hMVaULf4UgYuZ+vvVUPp +3oSEJnHheh5ZfjV+jvL5GSAu+vgnC8qbPutCEpXBfx5zAOdLtiyegzx72asJvvkz +ghvyXVrg8gnXVtiSBV1EpfES7gZJmpuzv2dYrCtL2irlRlySLQ5JFKXrfOQvf4K9 +TCxRye1UNb+3ybL0ilXoRn3jDS9RLbLxiVMjjx/Bqk/mc3MNMoa+juzvI6xIxFG0 +3fwNOTXdQ6gLCjHJ9/nFvygkBW5bkeMujBhhABEBAAG0JlNpZ21hc3RhdGUgYm90 +IDxkZW55c0B6YWRvcm96aG55aS5jb20+iQFUBBMBCAA+FiEEKOJ6Z66jjaRYxyIo +ypJUteBkD+QFAl2utdgCGwMFCQPCZwAFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AA +CgkQypJUteBkD+Tt4Af/f5o2Yoc8ebOwMiNUYDkfUqFLzH1WySEKfAt2iXrIgVjV +NF6ddyaLadSYdU6HGJ6txn2a16TuItdBQJSTpnmiw1qtqNVJVRnUoytXeCYN0Utn ++3zYTOhkbhnIczGao+qlqhovfO8x+WPZ/2Fczm20A5TNAg7NzmeF7FP9OWLpnI4v +yktmAbpZaSoCZWC3ZPG2H3SOHUn8Lt0++ni4R0gT0HclwbyzuDgT0cmxarVzEFQQ +7nhNOhU1+1MYRpQ9wBUWFLwMvMUgA6rQeg7idtAXklGEZaN0RK3HpL1I+XAE9rYW +tdejY67u/hdInm33oqe5aJrPmH5DFNCpBpc2w2NzGbkBDQRdrrXYAQgAxGs1Fclq +MQJjIwu3dH+vBY5vdZ0M1Mhd2fjXu8s0tEZ8RjBBbtZ03KI5t97+oXs5rgKCCtRH +v+RfSDn1eTeKRIwYxsowd86SlC8rjhSAyJfWS7er7+4Jpsa1W91TucrMQMue4qEX +udlg18oNcX/MGDB+lPirL1zxp6jfysjlebx01dcKVj2a+rpyPeNNrV2M8Ywlm5/c +lmRciSXLMb+phhvcyYyvi4UmguQi7/o3hCNhRlEj4XqF6CT1S57X6nTuYRP1dcjG +GVxvlybrDIBV0oDGW0TEjGWaBwKOpqZDi8Jzj5P398nqnP0UDrW7q/qmrZcdE5ov +qYWERLqXzGwBFwARAQABiQE8BBgBCAAmFiEEKOJ6Z66jjaRYxyIoypJUteBkD+QF +Al2utdgCGwwFCQPCZwAACgkQypJUteBkD+Qbqwf+IR030kbKsE6rOLwlKUGN9pah +tZjoSxnq5K+nXn621K578z9r76rGkP84UeAvZqt2MkadhwyEqwv99DftoZCXNM8b +5oRsDOAbA0YTSPKIa8E7S8XhWzE6VCx+2DFtjrYeGhybVGd9aq6jeQgEkqioZT0n +l3acH1VsuFQdFNwBrEgAFORBt5zXtSn7lXmnOh4ZFeYCncdR3+L6nJ/PAPz0hWMz +CZjc7vGcEvAtTNb2brtHtvox0Gc0Xphe0iCaWyzN7P32+rJgsfCMj9FFQUxToZMY +ozM9at2zWzk9wOb41RLnY+rGBNQ3xNR23shWF4fcOwk6BIp+OYsSqnsEYYXuDw== +=huRW +-----END PGP PUBLIC KEY BLOCK----- diff --git a/ci/secring.asc.enc b/ci/secring.asc.enc new file mode 100644 index 0000000000000000000000000000000000000000..2cc0474c8955a6350b0417df05601b34b71e02c3 GIT binary patch literal 3664 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 literal 0 HcmV?d00001 diff --git a/project/plugins.sbt b/project/plugins.sbt index d4e535a944..0c2445295a 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -6,4 +6,6 @@ addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.9.0") addSbtPlugin("com.typesafe.sbt" % "sbt-git" % "1.0.0") addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.9.2") addSbtPlugin("org.scoverage" % "sbt-scoverage" % "1.5.1") -addSbtPlugin("org.scoverage" % "sbt-coveralls" % "1.2.7") \ No newline at end of file +addSbtPlugin("org.scoverage" % "sbt-coveralls" % "1.2.7") +addSbtPlugin("org.xerial.sbt" % "sbt-sonatype" % "3.8") +addSbtPlugin("com.jsuereth" % "sbt-pgp" % "2.0.0") \ No newline at end of file