semantic-release-stack-upload
Version:
A semantic-release plugin to upload Haskell packages to Hackage with stack
168 lines (114 loc) • 4.93 kB
Markdown
# semantic-release-stack-upload
[semantic-release][] plugin to publish a Haskell package to [Hackage][] using
`stack upload`.
[semantic-release]: https://semantic-release.gitbook.io/semantic-release/
[hackage]: https://hackage.haskell.org/
## Requirements
1. Hpack in use, e.g. `package.yaml` exists
## Features
1. Supports multi-package projects
1. Supports PVP + SemVer versioning style
1. Supports `stack upload` behaviors like `--candidate` and `--pvp-bounds`
## Steps
| Step | Description |
| ------------------ | ------------------------------------------------------------------------------ |
| `verifyConditions` | verify the environment variable `HACKAGE_KEY` is set and `package.yaml` exists |
| `verifyRelease` | Update the version in `package.yaml` **if `PREPARE_IN_VERIFY=1`** |
| `prepare` | Update the version in `package.yaml` |
| `publish` | run `stack upload` to publish the package |
## Environment variables
| Variable | Description | Required |
| ------------------- | -------------------------------------------------------------- | -------- |
| `HACKAGE_KEY` | [API token](https://hackage.haskell.org/packages/) for hackage | true |
| `PREPARE_IN_VERIFY` | Should we update `package.yaml` in `verifyRelease`? | false |
## Prepare in Verify and `dryRun`
If the `PREPARE_IN_VERIFY` environment variable is set to `1`, we will perform
what is usually done in `prepare` as part of `verifyRelease`, i.e. update the
`package.yaml` file with the next version.
This is useful if, for example, you are compiling a binary that includes a
`version` sub-command or `--version` flag that uses the package version [through
the generated `Paths_` module][paths-version]. If `package.yaml` is not updated
before this compilation, the compiled-in version will be wrong.
To accomplish a pre-compile update, you can run `semantic-release` in [`dryRun`
mode][dryRun] with `PREPARE_IN_VERIFY=1`, build your assets, then run it again
to actually release.
[dryRun]: https://semantic-release.gitbook.io/semantic-release/usage/configuration#dryrun
[paths-version]: https://stackoverflow.com/a/2892624
## Install
With npm:
```console
npm install semantic-release-stack-upload -D
```
With yarn:
```console
yarn add semantic-release-stack-upload --dev
```
## GitHub Actions
```yaml
- id: release
uses: cycjimmy/semantic-release-action@v4
with:
extra_plugins: |
semantic-release-stack-upload
env:
GITHUB_TOKEN: ${{ github.token }}
HACKAGE_KEY: ${{ secrets.HACKAGE_KEY }}
```
## Usage
The plugin can be configured in the [semantic-release configuration
file][semantic-release-config]:
[semantic-release-config]: https://github.com/semantic-release/semantic-release/blob/master/docs/usage/configuration.md#configuration
```json
{
"plugins": [
"@semantic-release/commit-analyzer",
"@semantic-release/release-notes-generator",
[
"semantic-release-stack-upload",
{
"pvpBounds": "lower",
"stripSuffix": true
}
]
]
}
```
## Configuration
All options are optional.
### _candidate_
**Default**: undefined
Upload a release candidate (use the `--candidate` option). If this is undefined,
prerelease branches upload candidates and release branches don't.
### _ignoreCheck_
**Default**: `false`
Do not check packages for common mistakes (use the `--ignore-check` option).
### _item_
**Default**: `.`
A relative path to a package directory to upload.
> [!NOTE]
> This also determines where the `package.yaml` file is expected.
### _pvpBounds_
**Default**: `none`
Automatically add PVP bounds to dependencies based on the active resolver at
time of upload (use the `--pvp-bounds` option). One of `none`, `lower`, `upper`,
or `both`.
> [!NOTE]
> You may wish to set `STACK_YAML` to inform this.
### _stripSuffix_
**Default**: `false`
Whether to strip prerelease suffixes from versions. For example, when `true`, a
version like `1.0.0-rc.plugin.1` will be released as `1.0.0`.
### _versionPrefix_
**Default**: undefined
A prefix to apply to the version when used for the package. This allows the
project to use [SemVer][] (e.g. `1.0.0`), but release [PVP][]-compliant packages
by adding a prefix like `"0."` to result in `0.1.0.0`
[semver]: https://semver.org/
[PVP]: https://pvp.haskell.org/
If not defined, and your checked-in `package.yaml` uses a version matching
`^{prefix}{semver}$`, then `{prefix}` will be used. For example, setting a
version of `0.0.0.0` will mean `"0."` will be used as prefix. This is the
recommended configuration.
### _workingDirectory_
**Default**: undefined
Change to this directory before doing anything.