From 5bd5265b68898766e250cbfddd7c4c2e32ddaa2a Mon Sep 17 00:00:00 2001 From: morazow Date: Wed, 30 Sep 2020 17:06:59 +0200 Subject: [PATCH] Removed auto release setup from Travis CI. Fixes #80. --- .travis.yml | 28 --------- README.md | 1 + doc/changes/changes_0.3.2.md | 1 + doc/development/releasing.md | 116 +++++++++++++++++++++++++++++++++++ project/.gnupg/.gitkeep | 0 project/.gnupg/rings.tar.enc | Bin 12832 -> 0 bytes scripts/publish.sh | 56 ----------------- 7 files changed, 118 insertions(+), 84 deletions(-) create mode 100644 doc/development/releasing.md create mode 100644 project/.gnupg/.gitkeep delete mode 100644 project/.gnupg/rings.tar.enc delete mode 100755 scripts/publish.sh diff --git a/.travis.yml b/.travis.yml index 0dc5f2d4..6573eac2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,33 +9,6 @@ addons: packages: - shellcheck -env: - matrix: - - RELEASE=false - - global: - # ENCRYPTION_KEY - - secure: |- - PFjAMiewDaHDYt9gwtjv+EKCt864T3UwIutZVSmtZABP/DRcRSsDHEs0sY9WMTE0EvFN4XjwkzpkYv5IM5C3/f83O - CP4BsHsQ+3s8VmakQDhB3BSFnuz0g/Ot3cA3e54Xu8BhlTeeX5m0Y4tHYrFojDMUVGrLQ24WViqaCxGpr0ojn0ytr - gBMD11cdtcQwe3q2tjdkYnEKiLjdtaLIPdO9bv9n/HH2wIC1VliMngyTqL0UI+AjdmIa0Yrmb7HPtEsDJR5gDLlOd - agq8aQ2vXUigBGH9oIoDCE/s0aRwUiMRWlIj+vkTJBgbrnzC2UcO4qkx4qodNuiRagqVnscwe13wVPmQEkXqJ22Tk - j338jEiV7sVGIb4RdmMhlrvDQ1rHjRo270sTVCqww6YieRvkB/UhRkrXs1x8r6ZaSHhLLf4A7jR/EvS5dNLQ0LLxC - X/g2Mi/zRCRMTdwzPipN437D8LOwj7q+WEkVzsd9QasZncYpBaFgCfoNWiyuKeQF1c2hFYoPNRMFGFUER+sgJ6NYI - XmmtM/vJeok6N1Re+c5+iGACT30CL/yF8BmgBF7Xfu1jJH9LzQH6Dd0wH/G7XN7Kb0IzsvTw1nckgvFMo/4hSbT7P - nglwKzxWg3kPhRPaJshiZyRbtP0PWFDzPoRP3HrleYTSuS33OuesSJC5vVqQ= - - # PGP_PASSPHRASE - - secure: |- - AzxFI14cBnjxDFqm3Kq/SoEZLsTm4u5x7JWrch09WUBDwIFOLTp6CHdAcMzMYZ2LOqjLXVxqKs7gK0ZcK9oFsx0Wz - APxKvzKkjBZ/Fe6eLMCjtGGSgnHtOg1F2gTEChuXZf/pIsgFAx8N9pb3sJWfWQVzTBxr5CdW3uNcekiatq1zhLRYc - VGMOsCk+HftklUoO5Qjknsju3Kug7WZTpW86ULWBllQ3ZALMLyTAVuP65IFcN11DghGF69SojL7XuWNWjU6VL30N3 - IOKKI2nwIm++EMkK0zIzX7qxJGoj1WYr2hiy16RrBLFvG1Gd6hKlvGZoT5CWB3QdXN7QB6OsHmq/XcXUF9LA/a5vN - fR5uIpqsJmcjc14TF+U8/J3blJDc5PkD8v0TAJRaz7RcE6tKBYl2V0+aIkMBUlcCSs2ukjjO1jHcq7iJcY5edJL0g - ijwpmAHrxb/GJk3ZtvWRTCDvyQPw+8RyxGVWjo8MNrrxjYr34AXjDiCLJh2dRiMZkmPWCP8FIG65wBLa2JmB5l9eT - TE0+3vsd+7GULh5II/fTIc+jc0KrP28gOBmSEdK/zHcbsDFmYcicP16zTh1bXZ0+6CMs6NAS//jc/0N5YwkGYMz5C - gXwtqIW9ynF9CYK8ftX4GUbmPVAY9BhZrxsU5qPXXqqZKSmOIVynZujcVydw= - before_install: - git fetch --tags - docker pull exasol/docker-db:7.0.2 @@ -66,7 +39,6 @@ script: after_success: - bash <(curl -s https://codecov.io/bash) - ./sbtx coveralls - - ./scripts/publish.sh cache: directories: diff --git a/README.md b/README.md index 25ba81df..af694470 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,7 @@ and saving Spark DataFrame as an Exasol table. ## Information for Contributors * [Developer Guide](doc/development/developer_guide.md) +* [Releasing Guide](doc/development/releasing.md) ## Dependencies diff --git a/doc/changes/changes_0.3.2.md b/doc/changes/changes_0.3.2.md index 9b8737e3..2b7eb73d 100644 --- a/doc/changes/changes_0.3.2.md +++ b/doc/changes/changes_0.3.2.md @@ -13,6 +13,7 @@ to `7.0.0`. ## Documentation +* [#80](https://github.com/exasol/spark-exasol-connector/issues/80): Removed auto release setup from Travis CI (PR [#83](https://github.com/exasol/spark-exasol-connector/pull/83)). * [#81](https://github.com/exasol/spark-exasol-connector/issues/81): Updated user and development guide (PR [#82](https://github.com/exasol/spark-exasol-connector/pull/82)). ## Dependency Updates diff --git a/doc/development/releasing.md b/doc/development/releasing.md new file mode 100644 index 00000000..78a8cfad --- /dev/null +++ b/doc/development/releasing.md @@ -0,0 +1,116 @@ +# Releasing + +The Spark Exasol Connector is released to the Sonatype. + +## Prerequisite + +Please make sure that your have a Sonatype account and +[permission](https://issues.sonatype.org/browse/OSSRH-43049) to publish to the +`com.exasol` group. + +## GPG Key Preparation + +> This step should be setup only once. + +It is important to sign every artifact we publish. It ensures that our releases +are not manipulated by third parties. + +For that we use GPG. + +We recommend to create a different GPG key for publishing artifacts even if you +already have a personal one. + +### Create GPG Key and Files + +First create a separate folder for the keys, `mkdir -p gpg-keys/`. + +- Change to that directory: `cd gpg-keys/` +- Generate a key: `gpg --homedir . --gen-key` +- Enter your details, please make specific for the project +- Choose a passphrase with good password generator + +You have created a key, let us obtain ASCII files that +[sbt-gpg](https://github.com/sbt/sbt-pgp) uses for artifact publishing. + +We store the project signing keys in `spark-exasol-connector/project/.gnupg/` +folder. + +- Change to that directory: `cd spark-exasol-connector/project/.gnupg/` +- Export the public key from new key: `gpg --homedir ~/gpg-keys -a --export > local.pubring.asc` +- Export the secret key from new key: `gpg --homedir ~/gpg-keys -a --export-secret-keys > local.secring.asc` + +Please check out the [detailed manual](https://www.gnupg.org/gph/en/manual.html) +for more information. + +### Publish Your GPG Public Key + +To publish the artifacts to the Sonatype, you need to publish your GPG public +key so that others can confirm that it really belongs to you. + +There are many GPG servers. We recommend the [MIT PGP][mit-pgp] server. + +[mit-pgp]: http://pgp.mit.edu/ + +To publish your GPG public key: + +- [Visit the website][mit-pgp] +- Copy and paste the contents of `local.pubring.asc`, in the form with a "Submit a key" +- Click on "Submit this key to the server!" button + +If no errors occured, your key should already be published to the public GPG +Server. + +## Pre Release Steps + +- Make sure that the latest master branch continuous integration is green +- Checkout to the master branch: `git checkout master` +- Pull latest changes from master branch: `git pull origin master` +- Fetch the latest tags from remote: `git fetch --tags` +- Ensure that you have updated `doc/changes/changelog.md` file +- Ensure that you have updated `doc/changes/changes_VERSION.md` file +- Make sure the builds are green +- Run `./scripts/ci.sh` and check that everything works locally +- Add new version as a git tag, for example, `git tag -a 0.3.2 -m "Release version 0.3.2"` +- Push tags to the remote, `git push --tags` + +Please make sure that the new version follows the [Semantic Versioning +2.0.0](https://semver.org/). + +## Release + +Make sure that you do not have any uncommitted or untracked files: + +```sh +git status --porcelain +``` + +First check that you can publish to local repository: + +``` +./sbtx ";+clean ;+publishLocalSigned" +``` + +Provide your GPG passphrase when asked. Please notice that I used plus sign +(`+`) with the commands. This publishes artifacts for the cross Scala versions. + +Publish to Sonatype: + +``` +PGP_PASSPHRASE= SONATYPE_USERNAME= SONATYPE_PASSWORD= ./sbtx ";+clean ;+publishSigned ;sonatypeReleaseAll" +``` + +You can use the environment variable to provide the GPG passphrase, Sonatype +username and password. + +## Post Release Steps + +After successful release, update the Github Release notes. It should be the same +as the pre-release update to the `doc/changes/changes_VERSION.md` file. + +Github should already create a draft release from the git tag. Click on the +"Edit release" button on the draft release version on the Github releases page, +and add the release notes. + +## Using Release Robot + +TODO diff --git a/project/.gnupg/.gitkeep b/project/.gnupg/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/project/.gnupg/rings.tar.enc b/project/.gnupg/rings.tar.enc deleted file mode 100644 index 154a59bbaf1b81d05c95a09efe1a7d1ba3ced266..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12832 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