Skip to content

Commit

Permalink
Added GoReleaser config, updated docs, made archive naming adjustments
Browse files Browse the repository at this point in the history
  • Loading branch information
ekingery committed Oct 10, 2019
1 parent d95de6b commit c19d34c
Show file tree
Hide file tree
Showing 6 changed files with 257 additions and 139 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
_obj
_test
vendor/
dist/

# Architecture specific extensions/prefixes
*.[568vq]
Expand Down
203 changes: 203 additions & 0 deletions .goreleaser.yml
Original file line number Diff line number Diff line change
@@ -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/<repo_owner>/<repo_name>/releases/download/{{ .Tag }}/{{ .ArtifactName }}"
# # Default for gitlab is "https://gitlab.com/<repo_owner>/<repo_name>/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: [email protected]
#
# # 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: |
# <?xml version="1.0" encoding="UTF-8"?>
# ...
#
# # 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"
# ...
#
8 changes: 2 additions & 6 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -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).
76 changes: 45 additions & 31 deletions RELEASE.md
Original file line number Diff line number Diff line change
@@ -1,32 +1,57 @@
# 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.

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.
Expand All @@ -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]
Expand Down
Loading

0 comments on commit c19d34c

Please sign in to comment.