gitlab-release v0.2.13
gitlab-release

Performs a release of a git project hosted in GitLab
Installation
$ npm install -g gitlab-release # For the binary
$ npm install --save-dev gitlab-release # For the libraryUsage
Make sure you have the GITLAB_API_TOKEN exported in your environment so that
the module can access your GitLab API.
As a Binary
gitlab-release [major|minor|patch] --pre-command <cmd> --post-command <cmd> --file-path <path> --patterns <globs>This will:
- Fire up
${EDITOR}to enter a MarkDown release description - Run the pre-command if specified
- Add the
patterns - Bump the version in the
file-pathJSON file - Tag the project
- Remove the
patterns - Create a GitLab release note
For example, releasing polymer projects can be done as so:
gitlab-release [major|minor|patch] --pre-command 'polymer build' --file-path bower.json --patterns 'build/**/*,build/**/.*'Rather than specifying the commands each time, it is possible to specify a .grrc file to define the optional arguments
for a project. The above command is equivalent to the following .grrc file:
{
"filePath": "bower.json",
"preCommand": ["polymer", "build"],
"patterns": ["build/**/*", "build/**/.*"]
}As a Library
For npm Projects
There are two functions preversion and postversion that provide the
following:
preversion:- Retrieve all issues that have been closed since the last version
- Retrieve all the resolved merge requests since the last version
- Ask the user with their editor to describe the release. A list of the issues and MRs are added for convienience
- Update the changelog using the issues and merge requests
postversion:- Create a GitLab release note that is attached to the
npmcreated version tag
- Create a GitLab release note that is attached to the
Here is an example for integrating these scripts with
gulp:
import process from 'process';
import * as release from 'gitlab-release';
const releaseDataJson = '.release-data.json';
gulp.task('preversion', () => {
const argv = JSON.parse(process.env.npm_config_argv);
const type = argv.remain[0];
return release.preversion({type})
.then(data => release.writeJson(releaseDataJson, data));
});
gulp.task('postversion', () => {
return release.readJson(releaseDataJson)
.then(data => release.postversion({notes: data.description}))
.then(() => release.unlink(releaseDataJson));
});Those gulp tasks can be ran by npm by adding the following scripts to
package.json:
{
"scripts": {
"preversion": "gulp preversion",
"postversion": "gulp postversion"
}
}Then just use your normal npm version and npm publish workflow to create
versions of your npm module with changelog history and version release notes:
$ npm version patch
$ npm publishIdeally the publish should be done when a tag gets pushed to the repository on
the GitLab CI. Make sure your runner has permissions to publish your package
with npm owner add <gitlab-runner-npm-account>, then use the following task
in .gitlab-ci.yml:
Publish:
only:
- tags
cache:
paths:
- node_modules/
script:
- npm install
- npm test
- npm publishFor other package managers
Some JavaScript package managers (notably bower) require that the dist
folder is present in the git repository. This is due to the package manager
using the git repository as the backend for the package manager. The dist
script in the gitlab-release module provides an easy way to release a project
for one of these package managers. It adds the dist folder as part of the
version tag and then removes it for continued development. The following steps
are performed:
- retrieves release data from GitLab for the release such as issues closed and resolved merge requests
- asks the user for the release description
- adds the ignored
distfolder - bumps the package version
- updates the changelog using the release description and the GitLab data
- commits the changed files
- creates a version tag for the project
- removes the
distfolder - pushes the commits and tag
- creates GitLab release notes to accompany the new git tag
To integrate the script into gulp:
import yargs from 'yargs';
import * as release from 'gitlab-release';
// Release task
gulp.task('release', ['build'], (done) => {
const args = yargs
.usage('Usage: gulp release [options]')
.option('type', {choices: ['major', 'minor', 'patch'], describe: 'The type of release', demand: true})
.option('description', {type: 'string', describe: 'The markdown description of the release'})
.option('token', {type: 'string', describe: 'The GitLab API token', default: process.env.GITLAB_API_TOKEN})
.argv;
if (typeof(args.description) === 'string') {
args.description = args.description.trimRight();
if (!args.description) {
throw new Error('Must provide a non-empty release description');
}
}
if (!args.token) {
throw new Error('Must provide a GitLab API token. Provide either --token or GITLAB_API_TOKEN');
}
release.dist({type: args.type, notes: args.description, token: args.token})
.then((version) => {
$.util.log(`Successfully released ${version}`);
done();
})
.catch(done);
});Then to do a release just run gulp release. You will want to ignore the dist
folder in your .gitignore.
Custom Release Script
If the above two prepackaged scripts don't do what you need then you can roll
your own release script! This module provides all the necessary promised based
APIs that you should need to create a fully fledged release script. Check out
the source code for the dist, preversion and postversion functions to see
how the various APIs are pulled together.
License
MIT © VCA Technology
8 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago