| # 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. |