From c19d34c002bb8f3af5aa1cc940a247e6f2db379e Mon Sep 17 00:00:00 2001 From: Eric Kingery Date: Fri, 23 Aug 2019 23:31:56 -0500 Subject: [PATCH] Added GoReleaser config, updated docs, made archive naming adjustments --- .gitignore | 1 + .goreleaser.yml | 203 ++++++++++++++++++++++++++++++++++++++++++++++++ CONTRIBUTING.md | 8 +- RELEASE.md | 76 ++++++++++-------- bin/build-all | 99 ----------------------- cli/cli.go | 9 ++- 6 files changed, 257 insertions(+), 139 deletions(-) create mode 100644 .goreleaser.yml delete mode 100755 bin/build-all diff --git a/.gitignore b/.gitignore index 76a9fc205..1f3baf919 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ _obj _test vendor/ +dist/ # Architecture specific extensions/prefixes *.[568vq] diff --git a/.goreleaser.yml b/.goreleaser.yml new file mode 100644 index 000000000..572e09681 --- /dev/null +++ b/.goreleaser.yml @@ -0,0 +1,203 @@ +# You can find the GoReleaser documentation at http://goreleaser.com +project_name: exercism + +builds: +- env: + - CGO_ENABLED=0 + main: ./exercism/main.go + goos: + - darwin + - linux + - windows + - freebsd + - openbsd + goarch: + - amd64 + - 386 + - arm + - ppc64 + goarm: + - 5 + - 6 + ignore: + - goos: openbsd + goarch: arm + - goos: freebsd + goarch: arm + +checksum: + name_template: '{{ .ProjectName }}_checksums.txt' + +changelog: + sort: asc + filters: + exclude: + - '^docs:' + - '^test:' + +archives: + - name_template: "{{ .ProjectName }}-{{ .Version }}-{{ .Os }}-{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}" + replacements: + amd64: x86_64 + 386: i386 + format_overrides: + - goos: windows + format: zip + files: + - shell/**/* + - LICENSE + - README.md + +signs: +- artifacts: checksum + +release: + # Repo in which the release will be created. + # Default is extracted from the origin remote URL. + github: + name: cli + + # If set to true, will not auto-publish the release. + # Default is false. + draft: true + + # If set to auto, will mark the release as not ready for production + # in case there is an indicator for this in the tag e.g. v1.0.0-rc1 + # If set to true, will mark the release as not ready for production. + # Default is false. + prerelease: auto + + # You can change the name of the GitHub release. + # Default is `{{.Tag}}` + name_template: "{{.ProjectName}}-v{{.Version}} {{.Env.USER}}" + +snapcrafts: + - + name: exercism-cli + license: MIT + # Whether to publish the snap to the snapcraft store. + # Remember you need to `snapcraft login` first. + # Defaults to false. + # publish: true + summary: Command-line client for https://exercism.io + # https://snapcraft.io/docs/reference/confinement + confinement: strict + # A snap of type base to be used as the execution environment for this snap. + base: core18 + # https://snapcraft.io/docs/reference/channels + grade: stable + description: Exercism is an online platform designed to help you improve your coding skills through practice and mentorship. Exercism provides you with thousands of exercises spread across numerous language tracks. Each one is a fun and interesting challenge designed to teach you a little more about the features of a language. + name_template: "{{ .ProjectName }}-{{ .Version }}-{{ .Os }}-{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}" + replacements: + amd64: x86_64 + 386: i386 + apps: + exercism: + plugs: ["home", "network", "removable-media"] + + +# [TODO] +# brews: +# - +# # Name template of the recipe +# # Default to project name +# name: myproject +# +# # IDs of the archives to use. +# # Defaults to all. +# ids: +# - foo +# - bar +# +# +# # NOTE: make sure the url_template, the token and given repo (github or gitlab) owner and name are from the +# # same kind. We will probably unify this in the next major version like it is done with scoop. +# +# # Github repository to push the tap to. +# github: +# owner: github-user +# name: homebrew-tap +# +# # OR Gitlab +# # gitlab: +# # owner: gitlab-user +# # name: homebrew-tap +# +# # Template for the url which is determined by the given Token (github or gitlab) +# # Default for github is "https://github.com///releases/download/{{ .Tag }}/{{ .ArtifactName }}" +# # Default for gitlab is "https://gitlab.com///uploads/{{ .ArtifactUploadHash }}/{{ .ArtifactName }}" +# url_template: "http://github.mycompany.com/foo/bar/releases/{{ .Tag }}/{{ .ArtifactName }}" +# +# # Allows you to set a custom download strategy. +# # Default is empty. +# download_strategy: GitHubPrivateRepositoryReleaseDownloadStrategy +# +# # Allows you to add a custom require_relative at the top of the formula template +# # Default is empty +# custom_require: custom_download_strategy +# +# # Git author used to commit to the repository. +# # Defaults are shown. +# commit_author: +# name: goreleaserbot +# email: goreleaser@carlosbecker.com +# +# # Folder inside the repository to put the formula. +# # Default is the root folder. +# folder: Formula +# +# # Caveats for the user of your binary. +# # Default is empty. +# caveats: "How to use this binary" +# +# # Your app's homepage. +# # Default is empty. +# homepage: "https://example.com/" +# +# # Your app's description. +# # Default is empty. +# description: "Software to create fast and easy drum rolls." +# +# # Setting this will prevent goreleaser to actually try to commit the updated +# # formula - instead, the formula file will be stored on the dist folder only, +# # leaving the responsibility of publishing it to the user. +# # If set to auto, the release will not be uploaded to the homebrew tap +# # in case there is an indicator for prerelease in the tag e.g. v1.0.0-rc1 +# # Default is false. +# skip_upload: true +# +# # Custom block for brew. +# # Can be used to specify alternate downloads for devel or head releases. +# # Default is empty. +# custom_block: | +# head "https://github.com/some/package.git" +# ... +# +# # Packages your package depends on. +# dependencies: +# - git +# - zsh +# +# # Packages that conflict with your package. +# conflicts: +# - svn +# - bash +# +# # Specify for packages that run as a service. +# # Default is empty. +# plist: | +# +# ... +# +# # So you can `brew test` your formula. +# # Default is empty. +# test: | +# system "#{bin}/program --version" +# ... +# +# # Custom install script for brew. +# # Default is 'bin.install "program"'. +# install: | +# bin.install "program" +# ... +# diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e170e9da2..df85ab2cf 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -49,9 +49,5 @@ On Windows: - `go build -o testercism.exe exercism\main.go` - `testercism.exe —h` -### Building for All Platforms - -In order to cross-compile for all platforms, run `bin/build-all`. The binaries -will be built into the `release` directory. - -[fork]: https://github.com/exercism/cli/fork +### Releasing a new CLI version +Consult the [release documentation](https://github.com/exercism/cli/master/RELEASE.md). diff --git a/RELEASE.md b/RELEASE.md index 71aecd0a3..f13a02357 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,25 +1,49 @@ # Cutting a CLI Release -## Bootstrap Cross-Compilation for Go - -**This only has to be done once.** - -Change directory to the go source. Then run the bootstrap command for -each operating system and architecture. - -```plain -$ cd `which go`/../../src -$ sudo GCO_ENABLED=0 GOOS=windows GOARCH=386 ./make.bash --no-clean -$ sudo GCO_ENABLED=0 GOOS=darwin GOARCH=386 ./make.bash --no-clean -$ sudo GCO_ENABLED=0 GOOS=linux GOARCH=386 ./make.bash --no-clean -$ sudo GCO_ENABLED=0 GOOS=windows GOARCH=amd64 ./make.bash --no-clean -$ sudo GCO_ENABLED=0 GOOS=darwin GOARCH=amd64 ./make.bash --no-clean -$ sudo GCO_ENABLED=0 GOOS=linux GOARCH=amd64 ./make.bash --no-clean -$ sudo GCO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=6 ./make.bash --no-clean -$ sudo GCO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=5 ./make.bash --no-clean +The Exercism CLI uses [GoReleaser](https://goreleaser.com) to automate the +release process. + +## Requirements + +1. [Install GoReleaser](https://goreleaser.com/install/) +1. [Install snapcraft](https://snapcraft.io/docs/snapcraft-overview) +1. [Setup GitHub token](https://goreleaser.com/environment/#github-token) +1. Have a gpg key installed on your machine - it is [used for signing the artifacts](https://goreleaser.com/sign/) + +## Cut a release + +```bash + +# Test run +goreleaser --skip-publish --snapshot --rm-dist + +# Commit any changes, then create a new tag and push it +git tag -a v3.0.16 -m "Trying out GoReleaser" +git push origin v3.0.16 + +# Build and release +goreleaser --rm-dist + +# Remember to update cmd/version.go in the code +# (until we use: https://goreleaser.com/environment/#using-the-main-version) + +# You must be logged into snapcraft to publish a new snap +snapcraft login + +# Push to snapcraft +for f in `ls dist/*.snap`; do snapcraft push --release=stable $f; done + +# [TODO] Push to homebrew + +# Run [exercism-cp-archive-hack.sh](https://gist.github.com/ekingery/961650fca4e2233098c8320f32736836) which takes the new archive files and renames them to match the old naming scheme for backward compatibility. ``` -## Update the Changelog +Lastly, head to [the release page](https://github.com/exercism/cli/releases) to test and publish the draft. Until mid to late 2020, we will need to manually upload the backward-compatible archive files generated in `/tmp/exercism_tmp_upload` by the shell script referenced above. + + +## Confirm / Update the Changelog + +GoReleaser supports [auto generation of changelog](https://goreleaser.com/customization/#customize-the-changelog) that we will want to customize to meet our standards (not including refactors, test updates, etc). We should also consider [the release notes](https://goreleaser.com/customization/#custom-release-notes). Make sure all the recent changes are reflected in the "next release" section of the Changelog. Make this a separate commit from bumping the version. @@ -27,6 +51,7 @@ of the Changelog. Make this a separate commit from bumping the version. You can view changes using the /compare/ view: https://github.com/exercism/cli/compare/$PREVIOUS_RELEASE...master + ## Bump the version Edit the `Version` constant in `cmd/version.go`, and edit the Changelog. @@ -38,27 +63,16 @@ The "next release" section should contain only "Your contribution here". _Note: It's useful to add the version to the commit message when you bump it: e.g. `Bump version to v2.3.4`._ -## Generate the Binaries - -```plain -$ rm release/* -$ CGO_ENABLED=0 bin/build-all -``` +In the future we will probably want to replace the hardcoded `Version` constant with [main.version](https://goreleaser.com/environment/#using-the-main-version). Here is a [stack overflow post on injecting to cmd/version.go](https://stackoverflow.com/a/47510909). ## Cut Release on GitHub Go to [the exercism/cli "new release" page](https://github.com/exercism/cli/releases/new). -Describe the release, select a specific commit to target, name the version `v{VERSION}`, where -VERSION matches the value of the `Version` constant. - -Upload all the binaries from `release/*`. - -Paste the release text and describe the new changes. +A draft will have been auto-generated by GoReleaser. Describe the release, select a specific commit to target, paste the release text and describe the new changes. ``` To install, follow the interactive installation instructions at https://exercism.io/cli-walkthrough - --- [describe changes in this release] diff --git a/bin/build-all b/bin/build-all deleted file mode 100755 index 36ebe54fb..000000000 --- a/bin/build-all +++ /dev/null @@ -1,99 +0,0 @@ -#!/bin/bash - -set -e -x - -echo "Creating release dir..." -mkdir -p release - -# variables as defined by "go tool nm" -OSVAR=github.com/exercism/cli/cmd.BuildOS -ARCHVAR=github.com/exercism/cli/cmd.BuildARCH -ARMVAR=github.com/exercism/cli/cmd.BuildARM - -# handle alternate binary name for pre-releases -BINNAME=${NAME:-exercism} - -createRelease() { - os=$1 - arch=$2 - arm=$3 - - if [ "$os" = darwin ] - then - osname='mac' - else - osname=$os - fi - if [ "$arch" = amd64 ] - then - osarch=64bit - elif [ "$os" = linux ] && [ "$arch" = ppc64 ] - then - osarch=ppc64 - else - osarch=32bit - - fi - - ldflags="-s -w -X $OSVAR=$os -X $ARCHVAR=$arch" - if [ "$arm" ] - then - osarch=arm-v$arm - ldflags="$ldflags -X $ARMVAR=$arm" - elif [ "$arch" = arm64 ] - then - osarch=arm-v8 - ldflags="$ldflags -X $ARMVAR=8" - fi - - binname=$BINNAME - if [ "$osname" = windows ] - then - binname="$binname.exe" - fi - - echo "Creating $os/$arch binary..." - - if [ "$arm" ] - then - GOOS=$os GOARCH=$arch GOARM=$arm go build -ldflags "$ldflags" -o "out/$binname" exercism/main.go - else - GOOS=$os GOARCH=$arch go build -ldflags "$ldflags" -o "out/$binname" exercism/main.go - fi - - release_name="release/$BINNAME-$osname-$osarch" - if [ "$osname" = windows ]; then - (cd out && zip "../$release_name.zip" ../shell/* "./$binname") - else - tar cvzf "$release_name.tgz" shell -C out "./$binname" - fi -} - -# Mac Releases -createRelease darwin 386 -createRelease darwin amd64 - -# PowerPC Releases -createRelease linux ppc64 - -# Linux Releases -createRelease linux 386 -createRelease linux amd64 - -# FreeBSD Releases -createRelease freebsd 386 -createRelease freebsd amd64 - -# OpenBSD Releases -createRelease openbsd 386 -createRelease openbsd amd64 - -# ARM Releases -createRelease linux arm 5 -createRelease linux arm 6 -createRelease linux arm 7 -createRelease linux arm64 - -# Windows Releases -createRelease windows 386 -createRelease windows amd64 diff --git a/cli/cli.go b/cli/cli.go index 29f6d64a3..4312eb018 100644 --- a/cli/cli.go +++ b/cli/cli.go @@ -30,15 +30,18 @@ var ( var ( osMap = map[string]string{ - "darwin": "mac", + "darwin": "darwin", + "freebsd": "freebsd", "linux": "linux", + "openbsd": "openbsd", "windows": "windows", } archMap = map[string]string{ - "amd64": "64bit", - "386": "32bit", + "386": "i386", + "amd64": "x86_64", "arm": "arm", + "ppc64": "ppc64", } )