blob: 635d81c925f31321d3042a01b7b13efbee64561d [file] [log] [blame] [view] [edit]
# Task Runner #
## Introduction ##
The task runner tool executes user defined tasks.
Tasks are recipes for performing typical build and test actions as found on
most CI systems. The task runner abstracts those so:
- Tasks can be tracked in a version control repository.
- Multiple tasks can share common files that come with the repository.
- Tasks can be run locally without installing a complete CI system.
- Tasks can be run via ssh on a separate machine without installing a CI system.
Task files describe:
- Required inputs (source control checkouts, artifacts to download,
string parameters)
- Steps to perform the task
- The outputs (currently everything the task produced in the `result` folder)
- Tasks are written as posix shell scripts with some conventions and a well
defined environment.
## Running ##
### Local ###
Tasks can be run on the local machine without a CI system running. Example:
```bash
$ ./task try hello_world3.sh
```
### One-time Jenkins Build ###
We have a special jenkins job running which accepts task submission for
one-time execution. Example:
```bash
$ ./task submit hello_world3.sh
```
### Jenkins Job ###
Tasks can be executed as part of a normal jenkins job. This allows to use
jenkins triggers like version control changes or reporting features like
sending mails on failures to be used.
- The tool assumes the CI system already performed the source code checkouts.
It will therefore merely verify the expected directories exist.
- Artifacts specified on the commandline (`-a xxx=yyy`) however work as usual.
The corresponding jenkins job should:
- Check out the repository containing the task definition and task runner into
`${WORKSPACE}/config`
- Checkout all dependent repositories.
- Invoke the task tool in a jenkins shell step. Example:
```bash
config/task jenkinsrun config/hello_world3.sh
```
### SSH Remote ###
Tasks can be executed on a remote machine via ssh without having a CI system
installed. Requirements for this to work:
- Make sure you can login to the remote machine via ssh without a password
- Make sure you can login from the remote to the local machine via ssh
without a password.
- You can then run on a remote machine. Example:
```bash
$ ./task sshrun mymachine.local hello_world3.sh
```
Notes:
- You can use `username@mymachine.local` to switch user names
- Use `$HOME/.ssh/config` to configure the ssh connection (see ssh docu)
- The script uses `ssh -A` so ssh keys from your local machine are forwarded
and available on the remote machine.
## Task Tool Operation
### Artifact sources ###
The `task` tool decides what inputs are use for the tasks artifact parameters
before starting/submitting a build.
This is usually done by querying the repository definitions in the `repos`
directory (and `repos.try` in some modes). For example for an artifact
parameter called `llvm` we could have a `repos/llvm.json` configuration file
to query the latest revision of a git repository:
```json
{
"url": "https://github.com/my-project.git",
"type": "git",
"default_rev": "refs/heads/main"
}
```
To query the latest artifact from a directory in the A2 artifact server:
```json
{
"url": "http://lab.llvm.org:8080/artifacts/clang-stage1-configure-RA",
"type": "artifact_server"
}
```
You can specify an URL to an archive file on the commandline to override the
other mechanisms:
```bash
$ lnt task try -a compiler=http://my.storage.server/my_compiler.tar.bz2
```
## Task Files ##
Tasks files are written as posix shell scripts.
The following describes the environment in which they are executed.
### Tutorial ###
`hello_world0.sh` up to `hello_world3.sh` and
`hello_param.sh` are considered tutorials.
They are simple tasks that are well documented and show more advanced uses with each script.
### Workspace ###
Scripts execute in an empty directory called workspace:
- The `WORKSPACE` environment variable contains the name of this directory.
- This directory is exclusively to a single run:
No other tasks interfere, no files remaining from previous runs.
- Files outside the workspace directory should not be modified.
There are some exceptions like creating temporary files or writing
to `/dev/null`. See `hooks/try.sb` for the sandbox definition.
### Task Parameters ###
A task can have named string and artifact parameters. An artifact is a
directory conaining files and subdirectories. Typical artifact sources are git
repositories or archives from artifact storage servers.
Artifacts can be queried and extracted into a workspace directory with the
same name:
```bash
build get ARTIFACT_NAME
```
To extract an artifact into a directory with a different name use:
```bash
build get DIRECTORY_NAME --from=ARTIFACT_NAME
```
Arguments for string parameters can be queried with:
```bash
VARIABLE="$(build get arg PARAMETER_NAME)"
```
Parameters marked as optional don't need an argument and will then return an
empty string:
```bash
VARIABLE="$(build get arg --optional PARAMETER_NAME)"
```
Other default values can be supplied with the usual shell tricks:
```bash
: ${VARIABLE:='DefaultValue'}
```
- Abstract artifacts like `refs/heads/main` in a git repository or
`clang-stage2-cmake` on an A2 server are resolved to a concrete git revision
or a specific URL when the task is started.
- A task with a set of artifact and parameter inputs is called a build.
- `task try mytask.sh` resolves artifact inputs and executes a local build.
- `task submit mytask.sh` resolves artifact inputs and submits a build to
a queue on a jenkins server.
- `task jenkinsrun mytask.sh` may be used to run the task as part of a
recurring jenking project.
### Config Artifact ###
The task files are part of a version control repository. When running a task
this repository is always checked out to a subdirectory named `config`. This
allows task files to bundle and reference additional files in the repository
such as helper scripts shared between multiple tasks.