Disclaimer: This tool is in active development.
denogent is a tool for creating and running build pipelines.
To install the latest version of the denogent CLI tool, run
deno install -A --unstable https://deno.land/x/denogent/denogent.tsThe build file is the place where you define your build pipeline. To create one, run
denogent createBy default, denogent create will create the build file at build/build.ts. To create the file at a different path, run
denogent create --file path/to/buid/file.tsOnce you open the newly created build file, you'll see
import { createBuilder, task } from "https://deno.land/x/denogent/mod.ts";
const someTask = task('some task')
.does(async ctx => {
// do something here
ctx?.logger.info('doing something');
});
createBuilder({
name: 'build',
targetTasks: someTask,
ciIntegrations: [] // define CI integrations here
});A task is a function that executes code inside of the build pipeline.
Tasks can have dependencies on other tasks. For example,
const compile = task('compile')
.does(async ctx => {
// compile program
});
const test = task('test')
.dependsOn(compile)
.does(async ctx => {
// run tests
});
const buildImage = task('build image')
.dependsOn(compile)
.does(async ctx => {
// build image
});
const publishImage = task('publish image')
.dependsOn([test, buildImage])
.does(async ctx => {
// publish image
});In this scenario, task compile will run at the beginning and then will triggers tasks test and buildImage which will run in parallel and will then trigger the publush image task.
Tasks can define conditions for their run. For example,
import { git } from "https://deno.land/x/denogent/mod.ts";
...
const publishImage = task('publish image')
.dependsOn([test, buildImage])
.when(async ctx => await git.isTagged({ logger: false }))
.does(async ctx => {
// publish image
});In this scenario, we tell the publish image to run only when the the commit that has triggered the build is tagged.
To execute the build pipeline locally, run
denogent run --file build/build.tsAlthough denogent provides a tool for executing build pipelines, it's no a CI system.
However, you can run denogent pipelines from a CI system, and denogent provides convenient way to integrate with popular CI systems.
In the build.ts file, in the call to createBuilder, you can add a CI system integration. Once you've defined your CI system integration in the build file, run
denogent generate --file build/build.ts --ci {the name of the CI system}to generate manifests files for said CI system.
Here's an example of integrating with GitHub Actions.
In build.ts
import { createGitHubActions } from "https://deno.land/x/denogent/mod.ts";
...
createBuilder({
name: 'build',
targetTasks: someTask,
ciIntegrations: [
createGitHubActions({
image: 'ubuntu-latest',
onPRBranches: ['master'] // run pipeline on PR that merges to master
})
]
});denogent generate --file build/build.ts --ci gh-actionsTask extensions allow you to declare dependency on certain environmental components.
You can use the docker.service extension to declare dependency on a service that needs to run alongside your task.
For example, if you have a task that runs integration tests which depend on Redis, you can use docker.service do declare a dependency on Redis.
import { docker } from "https://deno.land/x/denogent/mod.ts";
...
const test = task('test')
.dependsOn(docker.service({ name: 'redis', image: 'redis', ports: [6379] }))
.does(async ctx => {
// run tests...
});