Add 3.17 docs (#6922)
@@ -33,6 +33,7 @@ Here you can find documentation for previous versions of Woodpecker.
|
||||
|
||||
| | | |
|
||||
| ------- | ---------- | ------------------------------------------------------------------------------------- |
|
||||
| 3.16.0 | 2026-06-27 | [Documentation](https://github.com/woodpecker-ci/woodpecker/tree/v3.16.0/docs/docs/) |
|
||||
| 3.15.0 | 2026-05-28 | [Documentation](https://github.com/woodpecker-ci/woodpecker/tree/v3.15.0/docs/docs/) |
|
||||
| 3.14.0 | 2026-05-01 | [Documentation](https://github.com/woodpecker-ci/woodpecker/tree/v3.14.0/docs/docs/) |
|
||||
| 3.13.0 | 2026-01-14 | [Documentation](https://github.com/woodpecker-ci/woodpecker/tree/v3.13.0/docs/docs/) |
|
||||
|
||||
@@ -1,259 +0,0 @@
|
||||
# Environment variables
|
||||
|
||||
Woodpecker provides the ability to pass environment variables to individual pipeline steps. Note that these can't overwrite any existing, built-in variables. Example pipeline step with custom environment variables:
|
||||
|
||||
```diff
|
||||
steps:
|
||||
- name: build
|
||||
image: golang
|
||||
+ environment:
|
||||
+ CGO: 0
|
||||
+ GOOS: linux
|
||||
+ GOARCH: amd64
|
||||
commands:
|
||||
- go build
|
||||
- go test
|
||||
```
|
||||
|
||||
Please note that the environment section is not able to expand environment variables. If you need to expand variables they should be exported in the commands section.
|
||||
|
||||
```diff
|
||||
steps:
|
||||
- name: build
|
||||
image: golang
|
||||
- environment:
|
||||
- - PATH=$PATH:/go
|
||||
commands:
|
||||
+ - export PATH=$PATH:/go
|
||||
- go build
|
||||
- go test
|
||||
```
|
||||
|
||||
:::warning
|
||||
`${variable}` expressions are subject to pre-processing. If you do not want the pre-processor to evaluate your expression it must be escaped:
|
||||
:::
|
||||
|
||||
```diff
|
||||
steps:
|
||||
- name: build
|
||||
image: golang
|
||||
commands:
|
||||
- - export PATH=${PATH}:/go
|
||||
+ - export PATH=$${PATH}:/go
|
||||
- go build
|
||||
- go test
|
||||
```
|
||||
|
||||
## Built-in environment variables
|
||||
|
||||
This is the reference list of all environment variables available to your pipeline containers. These are injected into your pipeline step and plugins containers, at runtime.
|
||||
|
||||
| NAME | Description | Example |
|
||||
| ---------------------------------- | ------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------- |
|
||||
| `CI` | CI environment name | `woodpecker` |
|
||||
| | **Repository** | |
|
||||
| `CI_REPO` | repository full name `<owner>/<name>` | `john-doe/my-repo` |
|
||||
| `CI_REPO_OWNER` | repository owner | `john-doe` |
|
||||
| `CI_REPO_NAME` | repository name | `my-repo` |
|
||||
| `CI_REPO_REMOTE_ID` | repository remote ID, is the UID it has in the forge | `82` |
|
||||
| `CI_REPO_URL` | repository web URL | `https://git.example.com/john-doe/my-repo` |
|
||||
| `CI_REPO_CLONE_URL` | repository clone URL | `https://git.example.com/john-doe/my-repo.git` |
|
||||
| `CI_REPO_CLONE_SSH_URL` | repository SSH clone URL | `git@git.example.com:john-doe/my-repo.git` |
|
||||
| `CI_REPO_DEFAULT_BRANCH` | repository default branch | `main` |
|
||||
| `CI_REPO_PRIVATE` | repository is private | `true` |
|
||||
| `CI_REPO_TRUSTED_NETWORK` | repository has trusted network access | `false` |
|
||||
| `CI_REPO_TRUSTED_VOLUMES` | repository has trusted volumes access | `false` |
|
||||
| `CI_REPO_TRUSTED_SECURITY` | repository has trusted security access | `false` |
|
||||
| | **Current Commit** | |
|
||||
| `CI_COMMIT_SHA` | commit SHA | `eba09b46064473a1d345da7abf28b477468e8dbd` |
|
||||
| `CI_COMMIT_REF` | commit ref | `refs/heads/main` |
|
||||
| `CI_COMMIT_REFSPEC` | commit ref spec | `issue-branch:main` |
|
||||
| `CI_COMMIT_BRANCH` | commit branch (equals target branch for pull requests) | `main` |
|
||||
| `CI_COMMIT_SOURCE_BRANCH` | commit source branch (set only for pull request events) | `issue-branch` |
|
||||
| `CI_COMMIT_TARGET_BRANCH` | commit target branch (set only for pull request events) | `main` |
|
||||
| `CI_COMMIT_TAG` | commit tag name (empty if event is not `tag`) | `v1.10.3` |
|
||||
| `CI_COMMIT_PULL_REQUEST` | commit pull request number (set only for pull request events) | `1` |
|
||||
| `CI_COMMIT_PULL_REQUEST_LABELS` | labels assigned to pull request (set only for pull request events) | `server` |
|
||||
| `CI_COMMIT_PULL_REQUEST_MILESTONE` | milestone assigned to pull request (set only for `pull_request` and `pull_request_closed` events) | `summer-sprint` |
|
||||
| `CI_COMMIT_MESSAGE` | commit message | `Initial commit` |
|
||||
| `CI_COMMIT_AUTHOR` | commit author username | `john-doe` |
|
||||
| `CI_COMMIT_AUTHOR_EMAIL` | commit author email address | `john-doe@example.com` |
|
||||
| `CI_COMMIT_PRERELEASE` | release is a pre-release (empty if event is not `release`) | `false` |
|
||||
| | **Current pipeline** | |
|
||||
| `CI_PIPELINE_NUMBER` | pipeline number | `8` |
|
||||
| `CI_PIPELINE_PARENT` | number of parent pipeline | `0` |
|
||||
| `CI_PIPELINE_EVENT` | pipeline event (see [`event`](../20-usage/20-workflow-syntax.md#event)) | `push`, `pull_request`, `pull_request_closed`, `pull_request_metadata`, `tag`, `release`, `manual`, `cron` |
|
||||
| `CI_PIPELINE_EVENT_REASON` | exact reason why `pull_request_metadata` event was send. it is forge instance specific and can change | `label_updated`, `milestoned`, `demilestoned`, `assigned`, `edited`, ... |
|
||||
| `CI_PIPELINE_URL` | link to the web UI for the pipeline | `https://ci.example.com/repos/7/pipeline/8` |
|
||||
| `CI_PIPELINE_FORGE_URL` | link to the forge's web UI for the commit(s) or tag that triggered the pipeline | `https://git.example.com/john-doe/my-repo/commit/eba09b46064473a1d345da7abf28b477468e8dbd` |
|
||||
| `CI_PIPELINE_DEPLOY_TARGET` | pipeline deploy target for `deployment` events | `production` |
|
||||
| `CI_PIPELINE_DEPLOY_TASK` | pipeline deploy task for `deployment` events | `migration` |
|
||||
| `CI_PIPELINE_CREATED` | pipeline created UNIX timestamp | `1722617519` |
|
||||
| `CI_PIPELINE_STARTED` | pipeline started UNIX timestamp | `1722617519` |
|
||||
| `CI_PIPELINE_FILES` | changed files (empty if event is not `push` or `pull_request`), it is undefined if more than 500 files are touched | `[]`, `[".woodpecker.yml","README.md"]` |
|
||||
| `CI_PIPELINE_AUTHOR` | pipeline author username | `octocat` |
|
||||
| `CI_PIPELINE_AVATAR` | pipeline author avatar | `https://git.example.com/avatars/5dcbcadbce6f87f8abef` |
|
||||
| | **Current workflow** | |
|
||||
| `CI_WORKFLOW_NAME` | workflow name | `release` |
|
||||
| | **Current step** | |
|
||||
| `CI_STEP_NAME` | step name | `build package` |
|
||||
| `CI_STEP_NUMBER` | step number | `0` |
|
||||
| `CI_STEP_STARTED` | step started UNIX timestamp | `1722617519` |
|
||||
| `CI_STEP_URL` | URL to step in UI | `https://ci.example.com/repos/7/pipeline/8` |
|
||||
| | **Previous commit** | |
|
||||
| `CI_PREV_COMMIT_SHA` | previous commit SHA | `15784117e4e103f36cba75a9e29da48046eb82c4` |
|
||||
| `CI_PREV_COMMIT_REF` | previous commit ref | `refs/heads/main` |
|
||||
| `CI_PREV_COMMIT_REFSPEC` | previous commit ref spec | `issue-branch:main` |
|
||||
| `CI_PREV_COMMIT_BRANCH` | previous commit branch | `main` |
|
||||
| `CI_PREV_COMMIT_SOURCE_BRANCH` | previous commit source branch (set only for pull request events) | `issue-branch` |
|
||||
| `CI_PREV_COMMIT_TARGET_BRANCH` | previous commit target branch (set only for pull request events) | `main` |
|
||||
| `CI_PREV_COMMIT_URL` | previous commit link in forge | `https://git.example.com/john-doe/my-repo/commit/15784117e4e103f36cba75a9e29da48046eb82c4` |
|
||||
| `CI_PREV_COMMIT_MESSAGE` | previous commit message | `test` |
|
||||
| `CI_PREV_COMMIT_AUTHOR` | previous commit author username | `john-doe` |
|
||||
| `CI_PREV_COMMIT_AUTHOR_EMAIL` | previous commit author email address | `john-doe@example.com` |
|
||||
| | **Previous pipeline** | |
|
||||
| `CI_PREV_PIPELINE_NUMBER` | previous pipeline number | `7` |
|
||||
| `CI_PREV_PIPELINE_PARENT` | previous pipeline number of parent pipeline | `0` |
|
||||
| `CI_PREV_PIPELINE_EVENT` | previous pipeline event (see [`event`](../20-usage/20-workflow-syntax.md#event)) | `push`, `pull_request`, `pull_request_closed`, `pull_request_metadata`, `tag`, `release`, `manual`, `cron` |
|
||||
| `CI_PREV_PIPELINE_EVENT_REASON` | previous exact reason `pull_request_metadata` event was send. it is forge instance specific and can change | `label_updated`, `milestoned`, `demilestoned`, `assigned`, `edited`, ... |
|
||||
| `CI_PREV_PIPELINE_URL` | previous pipeline link in CI | `https://ci.example.com/repos/7/pipeline/7` |
|
||||
| `CI_PREV_PIPELINE_FORGE_URL` | previous pipeline link to event in forge | `https://git.example.com/john-doe/my-repo/commit/15784117e4e103f36cba75a9e29da48046eb82c4` |
|
||||
| `CI_PREV_PIPELINE_DEPLOY_TARGET` | previous pipeline deploy target for `deployment` events | `production` |
|
||||
| `CI_PREV_PIPELINE_DEPLOY_TASK` | previous pipeline deploy task for `deployment` events | `migration` |
|
||||
| `CI_PREV_PIPELINE_STATUS` | previous pipeline status | `success`, `failure` |
|
||||
| `CI_PREV_PIPELINE_CREATED` | previous pipeline created UNIX timestamp | `1722610173` |
|
||||
| `CI_PREV_PIPELINE_STARTED` | previous pipeline started UNIX timestamp | `1722610173` |
|
||||
| `CI_PREV_PIPELINE_FINISHED` | previous pipeline finished UNIX timestamp | `1722610383` |
|
||||
| `CI_PREV_PIPELINE_AUTHOR` | previous pipeline author username | `octocat` |
|
||||
| `CI_PREV_PIPELINE_AVATAR` | previous pipeline author avatar | `https://git.example.com/avatars/5dcbcadbce6f87f8abef` |
|
||||
| |   | |
|
||||
| `CI_WORKSPACE` | Path of the workspace where source code gets cloned to | `/woodpecker/src/git.example.com/john-doe/my-repo` |
|
||||
| | **System** | |
|
||||
| `CI_SYSTEM_NAME` | name of the CI system | `woodpecker` |
|
||||
| `CI_SYSTEM_URL` | link to CI system | `https://ci.example.com` |
|
||||
| `CI_SYSTEM_HOST` | hostname of CI server | `ci.example.com` |
|
||||
| `CI_SYSTEM_VERSION` | version of the server | `2.7.0` |
|
||||
| | **Forge** | |
|
||||
| `CI_FORGE_TYPE` | name of forge | `bitbucket` , `bitbucket_dc` , `forgejo` , `gitea` , `github` , `gitlab` |
|
||||
| `CI_FORGE_URL` | root URL of configured forge | `https://git.example.com` |
|
||||
| | **Internal** - Please don't use! | |
|
||||
| `CI_SCRIPT` | Internal script path. Used to call pipeline step commands. | |
|
||||
| `CI_NETRC_USERNAME` | Credentials for private repos to be able to clone data. (Only available for specific images) | |
|
||||
| `CI_NETRC_PASSWORD` | Credentials for private repos to be able to clone data. (Only available for specific images) | |
|
||||
| `CI_NETRC_MACHINE` | Credentials for private repos to be able to clone data. (Only available for specific images) | |
|
||||
|
||||
## Global environment variables
|
||||
|
||||
If you want specific environment variables to be available in all of your pipelines use the `WOODPECKER_ENVIRONMENT` setting on the Woodpecker server. Note that these can't overwrite any existing, built-in variables.
|
||||
|
||||
```ini
|
||||
WOODPECKER_ENVIRONMENT=first_var:value1,second_var:value2
|
||||
```
|
||||
|
||||
These can be used, for example, to manage the image tag used by multiple projects.
|
||||
|
||||
```ini
|
||||
WOODPECKER_ENVIRONMENT=GOLANG_VERSION:1.18
|
||||
```
|
||||
|
||||
```diff
|
||||
steps:
|
||||
- name: build
|
||||
- image: golang:1.18
|
||||
+ image: golang:${GOLANG_VERSION}
|
||||
commands:
|
||||
- [...]
|
||||
```
|
||||
|
||||
## String Substitution
|
||||
|
||||
Woodpecker provides the ability to substitute environment variables at runtime. This gives us the ability to use dynamic settings, commands and filters in our pipeline configuration.
|
||||
|
||||
Example commit substitution:
|
||||
|
||||
```diff
|
||||
steps:
|
||||
- name: s3
|
||||
image: woodpeckerci/plugin-s3
|
||||
settings:
|
||||
+ target: /target/${CI_COMMIT_SHA}
|
||||
```
|
||||
|
||||
Example tag substitution:
|
||||
|
||||
```diff
|
||||
steps:
|
||||
- name: s3
|
||||
image: woodpeckerci/plugin-s3
|
||||
settings:
|
||||
+ target: /target/${CI_COMMIT_TAG}
|
||||
```
|
||||
|
||||
## String Operations
|
||||
|
||||
Woodpecker also emulates bash string operations. This gives us the ability to manipulate the strings prior to substitution. Example use cases might include substring and stripping prefix or suffix values.
|
||||
|
||||
| OPERATION | DESCRIPTION |
|
||||
| ------------------ | ------------------------------------------------ |
|
||||
| `${param}` | parameter substitution |
|
||||
| `${param,}` | parameter substitution with lowercase first char |
|
||||
| `${param,,}` | parameter substitution with lowercase |
|
||||
| `${param^}` | parameter substitution with uppercase first char |
|
||||
| `${param^^}` | parameter substitution with uppercase |
|
||||
| `${param:pos}` | parameter substitution with substring |
|
||||
| `${param:pos:len}` | parameter substitution with substring and length |
|
||||
| `${param=default}` | parameter substitution with default |
|
||||
| `${param##prefix}` | parameter substitution with prefix removal |
|
||||
| `${param%%suffix}` | parameter substitution with suffix removal |
|
||||
| `${param/old/new}` | parameter substitution with find and replace |
|
||||
|
||||
Example variable substitution with substring:
|
||||
|
||||
```diff
|
||||
steps:
|
||||
- name: s3
|
||||
image: woodpeckerci/plugin-s3
|
||||
settings:
|
||||
+ target: /target/${CI_COMMIT_SHA:0:8}
|
||||
```
|
||||
|
||||
Example variable substitution strips `v` prefix from `v.1.0.0`:
|
||||
|
||||
```diff
|
||||
steps:
|
||||
- name: s3
|
||||
image: woodpeckerci/plugin-s3
|
||||
settings:
|
||||
+ target: /target/${CI_COMMIT_TAG##v}
|
||||
```
|
||||
|
||||
## `pull_request_metadata` specific event reason values
|
||||
|
||||
For the `pull_request_metadata` event, the exact reason a metadata change was detected is passe through in `CI_PIPELINE_EVENT_REASON`.
|
||||
|
||||
**GitLab** merges metadata updates into one webhook. Event reasons are separated by `,` as a list.
|
||||
|
||||
:::note
|
||||
Event reason values are forge-specific and may change between versions.
|
||||
:::
|
||||
|
||||
| Event | GitHub | Gitea | Forgejo | GitLab | Bitbucket | Bitbucket Datacenter | Description |
|
||||
| -------------------- | ------------------ | ------------------ | ------------------ | ------------------ | --------- | -------------------- | ------------------------------------------------------------------------------ |
|
||||
| `assigned` | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | Pull request was assigned to a user |
|
||||
| `converted_to_draft` | :white_check_mark: | :x: | :x: | :x: | :x: | :x: | Pull request was converted to a draft |
|
||||
| `demilestoned` | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | Pull request was removed from a milestone |
|
||||
| `description_edited` | :x: | :x: | :x: | :white_check_mark: | :x: | :x: | Description edited |
|
||||
| `edited` | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | :x: | The title or body of a pull request was edited, or the base branch was changed |
|
||||
| `label_added` | :x: | :x: | :x: | :white_check_mark: | :x: | :x: | Pull had no labels and now got label(s) added |
|
||||
| `label_cleared` | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | All labels removed |
|
||||
| `label_updated` | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | New label(s) added / label(s) changed |
|
||||
| `locked` | :white_check_mark: | :x: | :x: | :x: | :x: | :x: | Conversation on a pull request was locked |
|
||||
| `milestoned` | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | Pull request was added to a milestone |
|
||||
| `ready_for_review` | :white_check_mark: | :x: | :x: | :x: | :x: | :x: | Draft pull request was marked as ready for review |
|
||||
| `review_requested` | :x: | :x: | :x: | :white_check_mark: | :x: | :x: | New review was requested |
|
||||
| `title_edited` | :x: | :x: | :x: | :white_check_mark: | :x: | :x: | Title edited |
|
||||
| `unassigned` | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | User was unassigned from a pull request |
|
||||
| `unlabeled` | :white_check_mark: | :x: | :x: | :x: | :x: | :x: | Label was removed from a pull request |
|
||||
| `unlocked` | :white_check_mark: | :x: | :x: | :x: | :x: | :x: | Conversation on a pull request was unlocked |
|
||||
|
||||
**Bitbucket** and **Bitbucket Datacenter** [are not supported at the moment](https://github.com/woodpecker-ci/woodpecker/pull/5214).
|
||||
@@ -1,352 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<!-- Generated by graphviz version 12.2.1 (0)
|
||||
-->
|
||||
<!-- Title: WoodpeckerArchitecture Pages: 1 -->
|
||||
<svg width="1112pt" height="577pt"
|
||||
viewBox="0.00 0.00 1112.00 576.75" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 572.75)">
|
||||
<title>WoodpeckerArchitecture</title>
|
||||
<polygon fill="white" stroke="none" points="-4,4 -4,-572.75 1108,-572.75 1108,4 -4,4"/>
|
||||
<g id="clust1" class="cluster">
|
||||
<title>cluster_ui</title>
|
||||
<path fill="#c7efe9" stroke="black" d="M411,-389.25C411,-389.25 457,-389.25 457,-389.25 463,-389.25 469,-395.25 469,-401.25 469,-401.25 469,-453 469,-453 469,-459 463,-465 457,-465 457,-465 411,-465 411,-465 405,-465 399,-459 399,-453 399,-453 399,-401.25 399,-401.25 399,-395.25 405,-389.25 411,-389.25"/>
|
||||
<text text-anchor="middle" x="434" y="-447.7" font-family="Helvetica,sans-Serif" font-size="14.00">UI</text>
|
||||
</g>
|
||||
<g id="clust2" class="cluster">
|
||||
<title>cluster_sdk</title>
|
||||
<path fill="#e8f5e9" stroke="black" d="M411,-293.5C411,-293.5 535,-293.5 535,-293.5 541,-293.5 547,-299.5 547,-305.5 547,-305.5 547,-357.25 547,-357.25 547,-363.25 541,-369.25 535,-369.25 535,-369.25 411,-369.25 411,-369.25 405,-369.25 399,-363.25 399,-357.25 399,-357.25 399,-305.5 399,-305.5 399,-299.5 405,-293.5 411,-293.5"/>
|
||||
<text text-anchor="middle" x="473" y="-351.95" font-family="Helvetica,sans-Serif" font-size="14.00">SDK (woodpecker-go)</text>
|
||||
</g>
|
||||
<g id="clust3" class="cluster">
|
||||
<title>cluster_cli</title>
|
||||
<path fill="#bfe9e0" stroke="black" d="M493,-389.25C493,-389.25 575,-389.25 575,-389.25 581,-389.25 587,-395.25 587,-401.25 587,-401.25 587,-548.75 587,-548.75 587,-554.75 581,-560.75 575,-560.75 575,-560.75 493,-560.75 493,-560.75 487,-560.75 481,-554.75 481,-548.75 481,-548.75 481,-401.25 481,-401.25 481,-395.25 487,-389.25 493,-389.25"/>
|
||||
<text text-anchor="middle" x="534" y="-543.45" font-family="Helvetica,sans-Serif" font-size="14.00">woodpecker-cli</text>
|
||||
</g>
|
||||
<g id="clust4" class="cluster">
|
||||
<title>cluster_agent</title>
|
||||
<path fill="#ffe0c7" stroke="black" d="M636,-293.5C636,-293.5 739,-293.5 739,-293.5 745,-293.5 751,-299.5 751,-305.5 751,-305.5 751,-453 751,-453 751,-459 745,-465 739,-465 739,-465 636,-465 636,-465 630,-465 624,-459 624,-453 624,-453 624,-305.5 624,-305.5 624,-299.5 630,-293.5 636,-293.5"/>
|
||||
<text text-anchor="middle" x="687.5" y="-447.7" font-family="Helvetica,sans-Serif" font-size="14.00">woodpecker-agent</text>
|
||||
</g>
|
||||
<g id="clust5" class="cluster">
|
||||
<title>cluster_pipelines</title>
|
||||
<path fill="#ffe8d6" stroke="black" d="M816,-196C816,-196 930,-196 930,-196 936,-196 942,-202 942,-208 942,-208 942,-454.75 942,-454.75 942,-460.75 936,-466.75 930,-466.75 930,-466.75 816,-466.75 816,-466.75 810,-466.75 804,-460.75 804,-454.75 804,-454.75 804,-208 804,-208 804,-202 810,-196 816,-196"/>
|
||||
<text text-anchor="middle" x="873" y="-449.45" font-family="Helvetica,sans-Serif" font-size="14.00">Pipelines</text>
|
||||
</g>
|
||||
<g id="clust6" class="cluster">
|
||||
<title>cluster_server</title>
|
||||
<path fill="#dbe9ff" stroke="black" d="M20,-8C20,-8 379,-8 379,-8 385,-8 391,-14 391,-20 391,-20 391,-453 391,-453 391,-459 385,-465 379,-465 379,-465 20,-465 20,-465 14,-465 8,-459 8,-453 8,-453 8,-20 8,-20 8,-14 14,-8 20,-8"/>
|
||||
<text text-anchor="middle" x="199.5" y="-447.7" font-family="Helvetica,sans-Serif" font-size="14.00">woodpecker-server</text>
|
||||
</g>
|
||||
<g id="clust7" class="cluster">
|
||||
<title>cluster_shared</title>
|
||||
<path fill="#eeeeee" stroke="black" d="M598,-102C598,-102 1084,-102 1084,-102 1090,-102 1096,-108 1096,-114 1096,-114 1096,-165.75 1096,-165.75 1096,-171.75 1090,-177.75 1084,-177.75 1084,-177.75 598,-177.75 598,-177.75 592,-177.75 586,-171.75 586,-165.75 586,-165.75 586,-114 586,-114 586,-108 592,-102 598,-102"/>
|
||||
<text text-anchor="middle" x="841" y="-160.45" font-family="Helvetica,sans-Serif" font-size="14.00">Shared Libs</text>
|
||||
</g>
|
||||
<g id="clust8" class="cluster">
|
||||
<title>cluster_external</title>
|
||||
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M411,-8C411,-8 621,-8 621,-8 627,-8 633,-14 633,-20 633,-20 633,-71.75 633,-71.75 633,-77.75 627,-83.75 621,-83.75 621,-83.75 411,-83.75 411,-83.75 405,-83.75 399,-77.75 399,-71.75 399,-71.75 399,-20 399,-20 399,-14 405,-8 411,-8"/>
|
||||
<text text-anchor="middle" x="516" y="-66.45" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">External Systems</text>
|
||||
</g>
|
||||
<!-- ui_web -->
|
||||
<g id="node1" class="node">
|
||||
<title>ui_web</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M449,-433.25C449,-433.25 419,-433.25 419,-433.25 413,-433.25 407,-427.25 407,-421.25 407,-421.25 407,-409.25 407,-409.25 407,-403.25 413,-397.25 419,-397.25 419,-397.25 449,-397.25 449,-397.25 455,-397.25 461,-403.25 461,-409.25 461,-409.25 461,-421.25 461,-421.25 461,-427.25 455,-433.25 449,-433.25"/>
|
||||
<text text-anchor="middle" x="434" y="-409.82" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">web/</text>
|
||||
</g>
|
||||
<!-- srv_router -->
|
||||
<g id="node11" class="node">
|
||||
<title>srv_router</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M269.12,-337.5C269.12,-337.5 196.88,-337.5 196.88,-337.5 190.88,-337.5 184.88,-331.5 184.88,-325.5 184.88,-325.5 184.88,-313.5 184.88,-313.5 184.88,-307.5 190.88,-301.5 196.88,-301.5 196.88,-301.5 269.12,-301.5 269.12,-301.5 275.12,-301.5 281.12,-307.5 281.12,-313.5 281.12,-313.5 281.12,-325.5 281.12,-325.5 281.12,-331.5 275.12,-337.5 269.12,-337.5"/>
|
||||
<text text-anchor="middle" x="233" y="-314.07" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">server/router/</text>
|
||||
</g>
|
||||
<!-- ui_web->srv_router -->
|
||||
<g id="edge1" class="edge">
|
||||
<title>ui_web->srv_router</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M406.58,-415C400.15,-415 395.12,-415 395.12,-415 395.12,-415 395.12,-326 395.12,-326 395.12,-326 289.72,-326 289.72,-326"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="289.72,-323.55 282.72,-326 289.72,-328.45 289.72,-323.55"/>
|
||||
<text text-anchor="middle" x="375.77" y="-329.2" font-family="Times,serif" font-size="14.00">HTTP</text>
|
||||
</g>
|
||||
<!-- srv_api -->
|
||||
<g id="node12" class="node">
|
||||
<title>srv_api</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M255.5,-241.75C255.5,-241.75 200.5,-241.75 200.5,-241.75 194.5,-241.75 188.5,-235.75 188.5,-229.75 188.5,-229.75 188.5,-217.75 188.5,-217.75 188.5,-211.75 194.5,-205.75 200.5,-205.75 200.5,-205.75 255.5,-205.75 255.5,-205.75 261.5,-205.75 267.5,-211.75 267.5,-217.75 267.5,-217.75 267.5,-229.75 267.5,-229.75 267.5,-235.75 261.5,-241.75 255.5,-241.75"/>
|
||||
<text text-anchor="middle" x="228" y="-218.32" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">server/api/</text>
|
||||
</g>
|
||||
<!-- ui_web->srv_api -->
|
||||
<g id="edge2" class="edge">
|
||||
<title>ui_web->srv_api</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M434.94,-396.82C434.94,-379.75 434.94,-357 434.94,-357 434.94,-357 290.88,-357 290.88,-357 290.88,-357 290.88,-230 290.88,-230 290.88,-230 276.33,-230 276.33,-230"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="276.33,-227.55 269.33,-230 276.33,-232.45 276.33,-227.55"/>
|
||||
<text text-anchor="middle" x="283.17" y="-360.2" font-family="Times,serif" font-size="14.00">REST API</text>
|
||||
</g>
|
||||
<!-- sdk -->
|
||||
<g id="node2" class="node">
|
||||
<title>sdk</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M505.12,-337.5C505.12,-337.5 420.88,-337.5 420.88,-337.5 414.88,-337.5 408.88,-331.5 408.88,-325.5 408.88,-325.5 408.88,-313.5 408.88,-313.5 408.88,-307.5 414.88,-301.5 420.88,-301.5 420.88,-301.5 505.12,-301.5 505.12,-301.5 511.12,-301.5 517.12,-307.5 517.12,-313.5 517.12,-313.5 517.12,-325.5 517.12,-325.5 517.12,-331.5 511.12,-337.5 505.12,-337.5"/>
|
||||
<text text-anchor="middle" x="463" y="-314.07" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">woodpecker-go</text>
|
||||
</g>
|
||||
<!-- sdk->srv_api -->
|
||||
<g id="edge5" class="edge">
|
||||
<title>sdk->srv_api</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M408.65,-314C360.23,-314 297,-314 297,-314 297,-314 297,-218 297,-218 297,-218 276.25,-218 276.25,-218"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="276.25,-215.55 269.25,-218 276.25,-220.45 276.25,-215.55"/>
|
||||
<text text-anchor="middle" x="325.88" y="-314.65" font-family="Times,serif" font-size="14.00">REST API</text>
|
||||
</g>
|
||||
<!-- cli_cmd -->
|
||||
<g id="node3" class="node">
|
||||
<title>cli_cmd</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M543.25,-529C543.25,-529 504.75,-529 504.75,-529 498.75,-529 492.75,-523 492.75,-517 492.75,-517 492.75,-505 492.75,-505 492.75,-499 498.75,-493 504.75,-493 504.75,-493 543.25,-493 543.25,-493 549.25,-493 555.25,-499 555.25,-505 555.25,-505 555.25,-517 555.25,-517 555.25,-523 549.25,-529 543.25,-529"/>
|
||||
<text text-anchor="middle" x="524" y="-505.57" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">cmd/cli/</text>
|
||||
</g>
|
||||
<!-- cli_core -->
|
||||
<g id="node4" class="node">
|
||||
<title>cli_core</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M539,-433.25C539,-433.25 509,-433.25 509,-433.25 503,-433.25 497,-427.25 497,-421.25 497,-421.25 497,-409.25 497,-409.25 497,-403.25 503,-397.25 509,-397.25 509,-397.25 539,-397.25 539,-397.25 545,-397.25 551,-403.25 551,-409.25 551,-409.25 551,-421.25 551,-421.25 551,-427.25 545,-433.25 539,-433.25"/>
|
||||
<text text-anchor="middle" x="524" y="-409.82" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">cli/</text>
|
||||
</g>
|
||||
<!-- cli_cmd->cli_core -->
|
||||
<g id="edge3" class="edge">
|
||||
<title>cli_cmd->cli_core</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M524,-492.54C524,-492.54 524,-442.17 524,-442.17"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="526.45,-442.17 524,-435.17 521.55,-442.17 526.45,-442.17"/>
|
||||
</g>
|
||||
<!-- cli_core->sdk -->
|
||||
<g id="edge4" class="edge">
|
||||
<title>cli_core->sdk</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M507.06,-396.79C507.06,-396.79 507.06,-346.42 507.06,-346.42"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="509.51,-346.42 507.06,-339.42 504.61,-346.42 509.51,-346.42"/>
|
||||
</g>
|
||||
<!-- agent_cmd -->
|
||||
<g id="node5" class="node">
|
||||
<title>agent_cmd</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M716.75,-433.25C716.75,-433.25 657.25,-433.25 657.25,-433.25 651.25,-433.25 645.25,-427.25 645.25,-421.25 645.25,-421.25 645.25,-409.25 645.25,-409.25 645.25,-403.25 651.25,-397.25 657.25,-397.25 657.25,-397.25 716.75,-397.25 716.75,-397.25 722.75,-397.25 728.75,-403.25 728.75,-409.25 728.75,-409.25 728.75,-421.25 728.75,-421.25 728.75,-427.25 722.75,-433.25 716.75,-433.25"/>
|
||||
<text text-anchor="middle" x="687" y="-409.82" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">cmd/agent/</text>
|
||||
</g>
|
||||
<!-- agent_core -->
|
||||
<g id="node6" class="node">
|
||||
<title>agent_core</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M702,-337.5C702,-337.5 672,-337.5 672,-337.5 666,-337.5 660,-331.5 660,-325.5 660,-325.5 660,-313.5 660,-313.5 660,-307.5 666,-301.5 672,-301.5 672,-301.5 702,-301.5 702,-301.5 708,-301.5 714,-307.5 714,-313.5 714,-313.5 714,-325.5 714,-325.5 714,-331.5 708,-337.5 702,-337.5"/>
|
||||
<text text-anchor="middle" x="687" y="-314.07" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">agent/</text>
|
||||
</g>
|
||||
<!-- agent_cmd->agent_core -->
|
||||
<g id="edge6" class="edge">
|
||||
<title>agent_cmd->agent_core</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M687,-396.79C687,-396.79 687,-346.42 687,-346.42"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="689.45,-346.42 687,-339.42 684.55,-346.42 689.45,-346.42"/>
|
||||
</g>
|
||||
<!-- pipe_backend -->
|
||||
<g id="node9" class="node">
|
||||
<title>pipe_backend</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M921.5,-243.5C921.5,-243.5 824.5,-243.5 824.5,-243.5 818.5,-243.5 812.5,-237.5 812.5,-231.5 812.5,-231.5 812.5,-216 812.5,-216 812.5,-210 818.5,-204 824.5,-204 824.5,-204 921.5,-204 921.5,-204 927.5,-204 933.5,-210 933.5,-216 933.5,-216 933.5,-231.5 933.5,-231.5 933.5,-237.5 927.5,-243.5 921.5,-243.5"/>
|
||||
<text text-anchor="middle" x="873" y="-226.2" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">pipeline/backend/</text>
|
||||
<text text-anchor="middle" x="873" y="-210.45" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">(exec engines)</text>
|
||||
</g>
|
||||
<!-- agent_core->pipe_backend -->
|
||||
<g id="edge9" class="edge">
|
||||
<title>agent_core->pipe_backend</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M706.12,-301.09C706.12,-273.34 706.12,-224 706.12,-224 706.12,-224 803.77,-224 803.77,-224"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="803.77,-226.45 810.77,-224 803.77,-221.55 803.77,-226.45"/>
|
||||
<text text-anchor="middle" x="680.4" y="-227.2" font-family="Times,serif" font-size="14.00">execute steps</text>
|
||||
</g>
|
||||
<!-- srv_grpc -->
|
||||
<g id="node13" class="node">
|
||||
<title>srv_grpc</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M370.88,-241.75C370.88,-241.75 315.12,-241.75 315.12,-241.75 309.12,-241.75 303.12,-235.75 303.12,-229.75 303.12,-229.75 303.12,-217.75 303.12,-217.75 303.12,-211.75 309.12,-205.75 315.12,-205.75 315.12,-205.75 370.88,-205.75 370.88,-205.75 376.88,-205.75 382.88,-211.75 382.88,-217.75 382.88,-217.75 382.88,-229.75 382.88,-229.75 382.88,-235.75 376.88,-241.75 370.88,-241.75"/>
|
||||
<text text-anchor="middle" x="343" y="-218.32" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">server/rpc/</text>
|
||||
</g>
|
||||
<!-- agent_core->srv_grpc -->
|
||||
<g id="edge7" class="edge">
|
||||
<title>agent_core->srv_grpc</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M679.12,-301.16C679.12,-275.76 679.12,-233 679.12,-233 679.12,-233 391.72,-233 391.72,-233"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="391.72,-230.55 384.72,-233 391.72,-235.45 391.72,-230.55"/>
|
||||
<text text-anchor="middle" x="530.5" y="-236.2" font-family="Times,serif" font-size="14.00">gRPC connect</text>
|
||||
</g>
|
||||
<!-- srv_queue -->
|
||||
<g id="node14" class="node">
|
||||
<title>srv_queue</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M371.25,-146C371.25,-146 296.75,-146 296.75,-146 290.75,-146 284.75,-140 284.75,-134 284.75,-134 284.75,-122 284.75,-122 284.75,-116 290.75,-110 296.75,-110 296.75,-110 371.25,-110 371.25,-110 377.25,-110 383.25,-116 383.25,-122 383.25,-122 383.25,-134 383.25,-134 383.25,-140 377.25,-146 371.25,-146"/>
|
||||
<text text-anchor="middle" x="334" y="-122.58" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">server/queue/</text>
|
||||
</g>
|
||||
<!-- agent_core->srv_queue -->
|
||||
<g id="edge8" class="edge">
|
||||
<title>agent_core->srv_queue</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M659.65,-320C617.06,-320 539.75,-320 539.75,-320 539.75,-320 539.75,-128 539.75,-128 539.75,-128 392.06,-128 392.06,-128"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="392.06,-125.55 385.06,-128 392.06,-130.45 392.06,-125.55"/>
|
||||
<text text-anchor="middle" x="513.5" y="-213.3" font-family="Times,serif" font-size="14.00">poll work</text>
|
||||
</g>
|
||||
<!-- pipe_core -->
|
||||
<g id="node7" class="node">
|
||||
<title>pipe_core</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M894.12,-337.5C894.12,-337.5 851.88,-337.5 851.88,-337.5 845.88,-337.5 839.88,-331.5 839.88,-325.5 839.88,-325.5 839.88,-313.5 839.88,-313.5 839.88,-307.5 845.88,-301.5 851.88,-301.5 851.88,-301.5 894.12,-301.5 894.12,-301.5 900.12,-301.5 906.12,-307.5 906.12,-313.5 906.12,-313.5 906.12,-325.5 906.12,-325.5 906.12,-331.5 900.12,-337.5 894.12,-337.5"/>
|
||||
<text text-anchor="middle" x="873" y="-314.07" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">pipeline/</text>
|
||||
</g>
|
||||
<!-- pipe_core->pipe_backend -->
|
||||
<g id="edge11" class="edge">
|
||||
<title>pipe_core->pipe_backend</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M873,-301.04C873,-301.04 873,-252.32 873,-252.32"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="875.45,-252.32 873,-245.32 870.55,-252.32 875.45,-252.32"/>
|
||||
</g>
|
||||
<!-- shared_util -->
|
||||
<g id="node19" class="node">
|
||||
<title>shared_util</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M1076,-146C1076,-146 1018,-146 1018,-146 1012,-146 1006,-140 1006,-134 1006,-134 1006,-122 1006,-122 1006,-116 1012,-110 1018,-110 1018,-110 1076,-110 1076,-110 1082,-110 1088,-116 1088,-122 1088,-122 1088,-134 1088,-134 1088,-140 1082,-146 1076,-146"/>
|
||||
<text text-anchor="middle" x="1047" y="-122.58" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">shared/util/</text>
|
||||
</g>
|
||||
<!-- pipe_core->shared_util -->
|
||||
<g id="edge24" class="edge">
|
||||
<title>pipe_core->shared_util</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M906.55,-320C957.11,-320 1047,-320 1047,-320 1047,-320 1047,-154.92 1047,-154.92"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="1049.45,-154.92 1047,-147.92 1044.55,-154.92 1049.45,-154.92"/>
|
||||
</g>
|
||||
<!-- pipe_frontend -->
|
||||
<g id="node8" class="node">
|
||||
<title>pipe_frontend</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M920.75,-435C920.75,-435 825.25,-435 825.25,-435 819.25,-435 813.25,-429 813.25,-423 813.25,-423 813.25,-407.5 813.25,-407.5 813.25,-401.5 819.25,-395.5 825.25,-395.5 825.25,-395.5 920.75,-395.5 920.75,-395.5 926.75,-395.5 932.75,-401.5 932.75,-407.5 932.75,-407.5 932.75,-423 932.75,-423 932.75,-429 926.75,-435 920.75,-435"/>
|
||||
<text text-anchor="middle" x="873" y="-417.7" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">pipeline/frontend/</text>
|
||||
<text text-anchor="middle" x="873" y="-401.95" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">(yaml)</text>
|
||||
</g>
|
||||
<!-- pipe_frontend->pipe_core -->
|
||||
<g id="edge10" class="edge">
|
||||
<title>pipe_frontend->pipe_core</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M873,-395.41C873,-395.41 873,-346.21 873,-346.21"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="875.45,-346.21 873,-339.21 870.55,-346.21 875.45,-346.21"/>
|
||||
</g>
|
||||
<!-- srv_cmd -->
|
||||
<g id="node10" class="node">
|
||||
<title>srv_cmd</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M230.62,-433.25C230.62,-433.25 167.38,-433.25 167.38,-433.25 161.38,-433.25 155.38,-427.25 155.38,-421.25 155.38,-421.25 155.38,-409.25 155.38,-409.25 155.38,-403.25 161.38,-397.25 167.38,-397.25 167.38,-397.25 230.62,-397.25 230.62,-397.25 236.62,-397.25 242.62,-403.25 242.62,-409.25 242.62,-409.25 242.62,-421.25 242.62,-421.25 242.62,-427.25 236.62,-433.25 230.62,-433.25"/>
|
||||
<text text-anchor="middle" x="199" y="-409.82" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">cmd/server/</text>
|
||||
</g>
|
||||
<!-- srv_cmd->srv_router -->
|
||||
<g id="edge12" class="edge">
|
||||
<title>srv_cmd->srv_router</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M213.75,-396.79C213.75,-396.79 213.75,-346.42 213.75,-346.42"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="216.2,-346.42 213.75,-339.42 211.3,-346.42 216.2,-346.42"/>
|
||||
</g>
|
||||
<!-- srv_router->srv_api -->
|
||||
<g id="edge13" class="edge">
|
||||
<title>srv_router->srv_api</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M228,-301.04C228,-301.04 228,-250.67 228,-250.67"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="230.45,-250.67 228,-243.67 225.55,-250.67 230.45,-250.67"/>
|
||||
</g>
|
||||
<!-- shared_token -->
|
||||
<g id="node20" class="node">
|
||||
<title>shared_token</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M957.88,-146C957.88,-146 884.12,-146 884.12,-146 878.12,-146 872.12,-140 872.12,-134 872.12,-134 872.12,-122 872.12,-122 872.12,-116 878.12,-110 884.12,-110 884.12,-110 957.88,-110 957.88,-110 963.88,-110 969.88,-116 969.88,-122 969.88,-122 969.88,-134 969.88,-134 969.88,-140 963.88,-146 957.88,-146"/>
|
||||
<text text-anchor="middle" x="921" y="-122.58" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">shared/token/</text>
|
||||
</g>
|
||||
<!-- srv_router->shared_token -->
|
||||
<g id="edge21" class="edge">
|
||||
<title>srv_router->shared_token</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M274.31,-301.08C274.31,-264.24 274.31,-185 274.31,-185 274.31,-185 902.81,-185 902.81,-185 902.81,-185 902.81,-154.86 902.81,-154.86"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="905.26,-154.86 902.81,-147.86 900.36,-154.86 905.26,-154.86"/>
|
||||
</g>
|
||||
<!-- srv_api->srv_queue -->
|
||||
<g id="edge16" class="edge">
|
||||
<title>srv_api->srv_queue</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M259.88,-205.59C259.88,-179.36 259.88,-134 259.88,-134 259.88,-134 276.04,-134 276.04,-134"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="276.04,-136.45 283.04,-134 276.04,-131.55 276.04,-136.45"/>
|
||||
</g>
|
||||
<!-- srv_pubsub -->
|
||||
<g id="node15" class="node">
|
||||
<title>srv_pubsub</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M109.62,-146C109.62,-146 28.38,-146 28.38,-146 22.38,-146 16.38,-140 16.38,-134 16.38,-134 16.38,-122 16.38,-122 16.38,-116 22.38,-110 28.38,-110 28.38,-110 109.62,-110 109.62,-110 115.62,-110 121.62,-116 121.62,-122 121.62,-122 121.62,-134 121.62,-134 121.62,-140 115.62,-146 109.62,-146"/>
|
||||
<text text-anchor="middle" x="69" y="-122.58" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">server/pubsub/</text>
|
||||
</g>
|
||||
<!-- srv_api->srv_pubsub -->
|
||||
<g id="edge15" class="edge">
|
||||
<title>srv_api->srv_pubsub</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M188.29,-224C141.19,-224 69,-224 69,-224 69,-224 69,-154.57 69,-154.57"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="71.45,-154.57 69,-147.57 66.55,-154.57 71.45,-154.57"/>
|
||||
</g>
|
||||
<!-- srv_store -->
|
||||
<g id="node16" class="node">
|
||||
<title>srv_store</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M236.5,-146C236.5,-146 169.5,-146 169.5,-146 163.5,-146 157.5,-140 157.5,-134 157.5,-134 157.5,-122 157.5,-122 157.5,-116 163.5,-110 169.5,-110 169.5,-110 236.5,-110 236.5,-110 242.5,-110 248.5,-116 248.5,-122 248.5,-122 248.5,-134 248.5,-134 248.5,-140 242.5,-146 236.5,-146"/>
|
||||
<text text-anchor="middle" x="203" y="-122.58" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">server/store/</text>
|
||||
</g>
|
||||
<!-- srv_api->srv_store -->
|
||||
<g id="edge14" class="edge">
|
||||
<title>srv_api->srv_store</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M218.5,-205.29C218.5,-205.29 218.5,-154.92 218.5,-154.92"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="220.95,-154.92 218.5,-147.92 216.05,-154.92 220.95,-154.92"/>
|
||||
</g>
|
||||
<!-- shared_http -->
|
||||
<g id="node21" class="node">
|
||||
<title>shared_http</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M686.25,-146C686.25,-146 605.75,-146 605.75,-146 599.75,-146 593.75,-140 593.75,-134 593.75,-134 593.75,-122 593.75,-122 593.75,-116 599.75,-110 605.75,-110 605.75,-110 686.25,-110 686.25,-110 692.25,-110 698.25,-116 698.25,-122 698.25,-122 698.25,-134 698.25,-134 698.25,-140 692.25,-146 686.25,-146"/>
|
||||
<text text-anchor="middle" x="646" y="-122.58" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">shared/httputil/</text>
|
||||
</g>
|
||||
<!-- srv_api->shared_http -->
|
||||
<g id="edge22" class="edge">
|
||||
<title>srv_api->shared_http</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M263.69,-205.48C263.69,-188.24 263.69,-165 263.69,-165 263.69,-165 619.5,-165 619.5,-165 619.5,-165 619.5,-155.01 619.5,-155.01"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="621.95,-155.01 619.5,-148.01 617.05,-155.01 621.95,-155.01"/>
|
||||
</g>
|
||||
<!-- srv_grpc->srv_queue -->
|
||||
<g id="edge17" class="edge">
|
||||
<title>srv_grpc->srv_queue</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M343,-205.29C343,-205.29 343,-154.92 343,-154.92"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="345.45,-154.92 343,-147.92 340.55,-154.92 345.45,-154.92"/>
|
||||
</g>
|
||||
<!-- shared_log -->
|
||||
<g id="node22" class="node">
|
||||
<title>shared_log</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M824.12,-146C824.12,-146 745.88,-146 745.88,-146 739.88,-146 733.88,-140 733.88,-134 733.88,-134 733.88,-122 733.88,-122 733.88,-116 739.88,-110 745.88,-110 745.88,-110 824.12,-110 824.12,-110 830.12,-110 836.12,-116 836.12,-122 836.12,-122 836.12,-134 836.12,-134 836.12,-140 830.12,-146 824.12,-146"/>
|
||||
<text text-anchor="middle" x="785" y="-122.58" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">shared/logger/</text>
|
||||
</g>
|
||||
<!-- srv_grpc->shared_log -->
|
||||
<g id="edge23" class="edge">
|
||||
<title>srv_grpc->shared_log</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M383.08,-215C489.88,-215 773.19,-215 773.19,-215 773.19,-215 773.19,-154.96 773.19,-154.96"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="775.64,-154.96 773.19,-147.96 770.74,-154.96 775.64,-154.96"/>
|
||||
</g>
|
||||
<!-- srv_model -->
|
||||
<g id="node17" class="node">
|
||||
<title>srv_model</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M240.25,-52C240.25,-52 165.75,-52 165.75,-52 159.75,-52 153.75,-46 153.75,-40 153.75,-40 153.75,-28 153.75,-28 153.75,-22 159.75,-16 165.75,-16 165.75,-16 240.25,-16 240.25,-16 246.25,-16 252.25,-22 252.25,-28 252.25,-28 252.25,-40 252.25,-40 252.25,-46 246.25,-52 240.25,-52"/>
|
||||
<text text-anchor="middle" x="203" y="-28.57" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">server/model/</text>
|
||||
</g>
|
||||
<!-- srv_store->srv_model -->
|
||||
<g id="edge18" class="edge">
|
||||
<title>srv_store->srv_model</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M203,-109.88C203,-109.88 203,-60.9 203,-60.9"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="205.45,-60.9 203,-53.9 200.55,-60.9 205.45,-60.9"/>
|
||||
</g>
|
||||
<!-- ext_db -->
|
||||
<g id="node24" class="node">
|
||||
<title>ext_db</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M480.88,-48.73C480.88,-50.53 464.35,-52 444,-52 423.65,-52 407.12,-50.53 407.12,-48.73 407.12,-48.73 407.12,-19.27 407.12,-19.27 407.12,-17.47 423.65,-16 444,-16 464.35,-16 480.88,-17.47 480.88,-19.27 480.88,-19.27 480.88,-48.73 480.88,-48.73"/>
|
||||
<path fill="none" stroke="black" d="M480.88,-48.73C480.88,-46.92 464.35,-45.45 444,-45.45 423.65,-45.45 407.12,-46.92 407.12,-48.73"/>
|
||||
<text text-anchor="middle" x="444" y="-28.57" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">Database</text>
|
||||
</g>
|
||||
<!-- srv_store->ext_db -->
|
||||
<g id="edge20" class="edge">
|
||||
<title>srv_store->ext_db</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M248.68,-122C253.15,-122 256.06,-122 256.06,-122 256.06,-122 256.06,-34 256.06,-34 256.06,-34 398.36,-34 398.36,-34"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="398.36,-36.45 405.36,-34 398.36,-31.55 398.36,-36.45"/>
|
||||
<text text-anchor="middle" x="266.77" y="-37.2" font-family="Times,serif" font-size="14.00">SQL</text>
|
||||
</g>
|
||||
<!-- srv_forge -->
|
||||
<g id="node18" class="node">
|
||||
<title>srv_forge</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M358.88,-433.25C358.88,-433.25 291.12,-433.25 291.12,-433.25 285.12,-433.25 279.12,-427.25 279.12,-421.25 279.12,-421.25 279.12,-409.25 279.12,-409.25 279.12,-403.25 285.12,-397.25 291.12,-397.25 291.12,-397.25 358.88,-397.25 358.88,-397.25 364.88,-397.25 370.88,-403.25 370.88,-409.25 370.88,-409.25 370.88,-421.25 370.88,-421.25 370.88,-427.25 364.88,-433.25 358.88,-433.25"/>
|
||||
<text text-anchor="middle" x="325" y="-409.82" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">server/forge/</text>
|
||||
</g>
|
||||
<!-- ext_scm -->
|
||||
<g id="node23" class="node">
|
||||
<title>ext_scm</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M612.75,-52C612.75,-52 529.25,-52 529.25,-52 523.25,-52 517.25,-46 517.25,-40 517.25,-40 517.25,-28 517.25,-28 517.25,-22 523.25,-16 529.25,-16 529.25,-16 612.75,-16 612.75,-16 618.75,-16 624.75,-22 624.75,-28 624.75,-28 624.75,-40 624.75,-40 624.75,-46 618.75,-52 612.75,-52"/>
|
||||
<text text-anchor="middle" x="571" y="-28.57" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">SCM Providers</text>
|
||||
</g>
|
||||
<!-- srv_forge->ext_scm -->
|
||||
<g id="edge19" class="edge">
|
||||
<title>srv_forge->ext_scm</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M337,-397C337,-386.75 337,-376 337,-376 337,-376 528.5,-376 528.5,-376 528.5,-376 528.5,-60.9 528.5,-60.9"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="530.95,-60.9 528.5,-53.9 526.05,-60.9 530.95,-60.9"/>
|
||||
<text text-anchor="middle" x="555.5" y="-327.9" font-family="Times,serif" font-size="14.00">SCM API</text>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 27 KiB |
@@ -24,3 +24,5 @@ Then you might want to jump directly into it and [start creating your first pipe
|
||||
## Want to start from scratch and deploy your own Woodpecker instance?
|
||||
|
||||
Woodpecker is lightweight and even runs on a Raspberry Pi. You can follow the [deployment guide](../30-administration/00-general.md) to set up your own Woodpecker instance.
|
||||
|
||||
If you want to try a pipeline before installing a server, you can also run workflow files locally with [`woodpecker-cli exec`](../20-usage/73-local-execution.md).
|
||||
@@ -66,7 +66,17 @@ You can use any image from registries like the [Docker Hub](https://hub.docker.c
|
||||
- aws help
|
||||
```
|
||||
|
||||
## 3. Push the file and trigger first pipeline
|
||||
## 3. Run the workflow locally
|
||||
|
||||
If you have `woodpecker-cli` and a supported backend installed, you can run the workflow before pushing it:
|
||||
|
||||
```shell
|
||||
woodpecker-cli exec .woodpecker/my-first-workflow.yaml
|
||||
```
|
||||
|
||||
This is useful for checking workflow syntax, command output, and metadata conditions while you are still editing the file. For more examples, including secrets and downloaded metadata, see [local pipeline execution](./73-local-execution.md).
|
||||
|
||||
## 4. Push the file and trigger first pipeline
|
||||
|
||||
If you push this file to your repository now, Woodpecker will already execute your first pipeline.
|
||||
|
||||
@@ -79,7 +89,7 @@ As you probably noticed, there is another step in called `clone` which is execut
|
||||
This for example allows the first step to build your application using your source code and as the second step will receive
|
||||
the same workspace it can use the previously built binary and test it.
|
||||
|
||||
## 4. Use a plugin for reusable tasks
|
||||
## 5. Use a plugin for reusable tasks
|
||||
|
||||
Sometimes you have some tasks that you need to do in every project. For example, deploying to Kubernetes or sending a Slack message. Therefore you can use one of the [official and community plugins](/plugins) or simply [create your own](./51-plugins/20-creating-plugins.md).
|
||||
|
||||
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
@@ -196,7 +196,7 @@ Some of the steps may be allowed to fail without causing the whole workflow and
|
||||
+ failure: ignore
|
||||
```
|
||||
|
||||
If you would like to cancel the full pipeline once the step fails, you can set `failure: cancel`.
|
||||
If you would like to cancel the full pipeline once the step fails, you can set `failure: cancel`. For the default behaviour, use `failure: fail`.
|
||||
|
||||
### `when` - Conditional Execution
|
||||
|
||||
@@ -426,7 +426,9 @@ when:
|
||||
|
||||
You can use [glob patterns](https://github.com/bmatcuk/doublestar#patterns) to match the changed files and specify if the step should run if a file matching that pattern has been changed `include` or if some files have **not** been changed `exclude`.
|
||||
|
||||
For pipelines without file changes (empty commits or on events without file changes like `tag`), you can use `on_empty` to set whether this condition should be **true** _(default)_ or **false** in these cases.
|
||||
`pull_request` events always contain all changed files of the pull request **not** just the files from the last pushed commit.
|
||||
|
||||
For pipelines without file changes (empty commits), you can use `on_empty` to set whether this condition should be **true** _(default)_ or **false** in these cases.
|
||||
|
||||
```yaml
|
||||
when:
|
||||
@@ -757,7 +759,10 @@ skip_clone: true
|
||||
|
||||
## `when` - Global workflow conditions
|
||||
|
||||
Woodpecker gives the ability to skip whole workflows ([not just steps](#when---conditional-execution)) based on certain conditions by a `when` block. If all conditions in the `when` block evaluate to true the workflow is executed, otherwise it is skipped, but treated as successful and other workflows depending on it will still continue.
|
||||
Woodpecker gives the ability to skip whole workflows ([not just steps](#when---conditional-execution)) based on certain conditions by a `when` block.
|
||||
If all conditions in the `when` block evaluate to true the workflow is executed, otherwise it is not included in the pipeline.
|
||||
Other workflows that have a `depends_on` referencing a skipped workflow will also be excluded.
|
||||
Use [`optional: true` on a dependency](./25-workflows.md#optional-dependencies) if you want it to be ignored when the referenced workflow is not part of the pipeline.
|
||||
|
||||
For more information about the specific filters, take a look at the [step-specific `when` filters](#when---conditional-execution).
|
||||
|
||||
@@ -782,6 +787,19 @@ The workflow now triggers on `main`, but also if the target branch of a pull req
|
||||
|
||||
Woodpecker supports to define multiple workflows for a repository. Those workflows will run independent from each other. To depend them on each other you can use the [`depends_on`](./25-workflows.md#flow-control) keyword.
|
||||
|
||||
### Optional dependencies in `depends_on`
|
||||
|
||||
Each entry in `depends_on` can be a string (required dependency) or an object with `name` and `optional: true`.
|
||||
Optional dependencies are silently ignored when the referenced workflow or step is not part of the pipeline (e.g. filtered out by `when` conditions).
|
||||
If present, the workflow waits for them as usual. See [optional dependencies](./25-workflows.md#optional-dependencies) for details.
|
||||
|
||||
```yaml
|
||||
depends_on:
|
||||
- check-a
|
||||
- name: check-b
|
||||
optional: true
|
||||
```
|
||||
|
||||
## Advanced network options for steps
|
||||
|
||||
:::warning
|
||||
@@ -115,7 +115,74 @@ Workflows that need to run even on failures should set the `status` filter.
|
||||
|
||||
This works just like the [`status` filter for steps](./20-workflow-syntax.md#status).
|
||||
|
||||
### Optional dependencies
|
||||
|
||||
In a monorepo, workflows often use `when: path` to only run when relevant files change. A deploy workflow may need to wait for all check workflows, but some of them might not run because their path filter didn't match. With `depends_on`, this would block the deploy workflow entirely.
|
||||
|
||||
Mark a dependency as `optional: true` so it is only enforced when the referenced workflow is part of the pipeline. If the dependency is not built (e.g. its `when` conditions don't match), it is silently ignored.
|
||||
|
||||
```diff
|
||||
steps:
|
||||
- name: deploy
|
||||
image: debian:stable-slim
|
||||
commands:
|
||||
- echo deploying app a
|
||||
|
||||
depends_on:
|
||||
- check-a
|
||||
+ - name: check-b
|
||||
+ optional: true
|
||||
+ - name: check-c
|
||||
+ optional: true
|
||||
```
|
||||
|
||||
In this example, `deploy` always waits for `check-a`. It also waits for `check-b` and `check-c` if they are part of the pipeline, but runs without them if they were filtered out.
|
||||
|
||||
The same syntax works at the step level within a workflow: if a step uses `depends_on` with `optional: true` on another step that was filtered out by a `when` condition, the dependency is silently dropped.
|
||||
|
||||
:::info
|
||||
Some workflows don't need the source code, like creating a notification on failure.
|
||||
Read more about `skip_clone` at [pipeline syntax](./20-workflow-syntax.md#skip_clone)
|
||||
:::
|
||||
|
||||
## Concurrency
|
||||
|
||||
By default workflows run with no concurrency limit. Some workflows, however, must not run more than a given number of times at once. A typical example is a deployment workflow: running two deployments at the same time can cause race conditions or corrupt state. Cancelling the previous pipeline is often not an option either, since it could interrupt an ongoing deployment.
|
||||
|
||||
The `concurrency` setting limits how many instances of a workflow may run at the same time. When the limit is reached, additional instances stay queued and start only once a running one has finished. Nothing is cancelled.
|
||||
|
||||
```yaml title=".woodpecker/deploy.yaml"
|
||||
steps:
|
||||
- name: deploy
|
||||
image: debian:stable-slim
|
||||
commands:
|
||||
- echo deploying
|
||||
|
||||
depends_on:
|
||||
- test
|
||||
|
||||
concurrency:
|
||||
limit: 1
|
||||
```
|
||||
|
||||
You can also use the shorthand form to only set the limit:
|
||||
|
||||
```yaml
|
||||
concurrency: 1
|
||||
```
|
||||
|
||||
### Ordering
|
||||
|
||||
Queued workflows of the same group start in the order their pipelines were created, **not** in the order they become ready to run. This matters when a workflow depends on other workflows (via `depends_on`) whose duration varies: even if a later pipeline's checks finish first, its limited workflow will not overtake an earlier pipeline that is still waiting. This guarantees that, for example, deployments happen in commit order.
|
||||
|
||||
### Groups
|
||||
|
||||
By default, the limit applies per workflow within a repository. Different runs of the same workflow are limited against each other, while different workflows (and other repositories) are unaffected.
|
||||
|
||||
Setting a `group` is optional. You can set a custom `group` to share a limit across workflows or to make the limit more specific. The group supports [environment variable substitution](./50-environment.md), so you can, for example, limit concurrency per branch or per deployment target:
|
||||
|
||||
```yaml
|
||||
concurrency:
|
||||
limit: 1
|
||||
group: deploy-${CI_COMMIT_BRANCH}
|
||||
```
|
||||
@@ -0,0 +1,289 @@
|
||||
# Environment variables
|
||||
|
||||
Woodpecker provides the ability to pass environment variables to individual pipeline steps. Note that these can't overwrite any existing, built-in variables. Example pipeline step with custom environment variables:
|
||||
|
||||
```diff
|
||||
steps:
|
||||
- name: build
|
||||
image: golang
|
||||
+ environment:
|
||||
+ CGO: 0
|
||||
+ GOOS: linux
|
||||
+ GOARCH: amd64
|
||||
commands:
|
||||
- go build
|
||||
- go test
|
||||
```
|
||||
|
||||
Please note that the environment section is not able to expand environment variables. If you need to expand variables they should be exported in the commands section.
|
||||
|
||||
```diff
|
||||
steps:
|
||||
- name: build
|
||||
image: golang
|
||||
- environment:
|
||||
- - PATH=$PATH:/go
|
||||
commands:
|
||||
+ - export PATH=$PATH:/go
|
||||
- go build
|
||||
- go test
|
||||
```
|
||||
|
||||
:::warning
|
||||
`${variable}` expressions are subject to pre-processing. If you do not want the pre-processor to evaluate your expression it must be escaped:
|
||||
:::
|
||||
|
||||
```diff
|
||||
steps:
|
||||
- name: build
|
||||
image: golang
|
||||
commands:
|
||||
- - export PATH=${PATH}:/go
|
||||
+ - export PATH=$${PATH}:/go
|
||||
- go build
|
||||
- go test
|
||||
```
|
||||
|
||||
## Built-in environment variables
|
||||
|
||||
This is the reference list of all environment variables available to your pipeline containers. These are injected into your pipeline step and plugins containers, at runtime.
|
||||
|
||||
The **Scope** column documents when each variable can be used:
|
||||
|
||||
- `config`: the variable is available at config-evaluation time, when the pipeline configuration is parsed. It can be referenced in [`when`](./20-workflow-syntax.md#when---conditional-execution) filters and expanded via [string substitution](#string-substitution) (e.g. `${CI_COMMIT_SHA}`).
|
||||
- `runtime`: the variable is available as an environment variable inside the running step.
|
||||
|
||||
Most variables are available in both scopes. Variables scoped only to `runtime` (e.g. the step-specific variables and `CI_PIPELINE_STATUS`) are not populated while the configuration is evaluated, so they cannot be used in `when` filters or substitutions.
|
||||
|
||||
| NAME | Scope | Description | Example |
|
||||
| ---------------------------------- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `CI` | `config, runtime` | CI environment name | `woodpecker` |
|
||||
| | | **Repository** | |
|
||||
| `CI_REPO` | `config, runtime` | repository full name `<owner>/<name>` | `john-doe/my-repo` |
|
||||
| `CI_REPO_OWNER` | `config, runtime` | repository owner | `john-doe` |
|
||||
| `CI_REPO_NAME` | `config, runtime` | repository name | `my-repo` |
|
||||
| `CI_REPO_REMOTE_ID` | `config, runtime` | repository remote ID, is the UID it has in the forge | `82` |
|
||||
| `CI_REPO_URL` | `config, runtime` | repository web URL | `https://git.example.com/john-doe/my-repo` |
|
||||
| `CI_REPO_CLONE_URL` | `config, runtime` | repository clone URL | `https://git.example.com/john-doe/my-repo.git` |
|
||||
| `CI_REPO_CLONE_SSH_URL` | `config, runtime` | repository SSH clone URL | `git@git.example.com:john-doe/my-repo.git` |
|
||||
| `CI_REPO_DEFAULT_BRANCH` | `config, runtime` | repository default branch | `main` |
|
||||
| `CI_REPO_PRIVATE` | `config, runtime` | repository is private | `true` |
|
||||
| `CI_REPO_TRUSTED_NETWORK` | `config, runtime` | repository has trusted network access | `false` |
|
||||
| `CI_REPO_TRUSTED_VOLUMES` | `config, runtime` | repository has trusted volumes access | `false` |
|
||||
| `CI_REPO_TRUSTED_SECURITY` | `config, runtime` | repository has trusted security access | `false` |
|
||||
| | | **Current Commit** | |
|
||||
| `CI_COMMIT_SHA` | `config, runtime` | commit SHA | `deadbee...` |
|
||||
| `CI_COMMIT_REF` | `config, runtime` | commit ref | `refs/heads/main` |
|
||||
| `CI_COMMIT_REFSPEC` | `config, runtime` | commit ref spec | `issue-branch:main` |
|
||||
| `CI_COMMIT_BRANCH` | `config, runtime` | commit branch (equals target branch for pull requests) | `main` |
|
||||
| `CI_COMMIT_SOURCE_BRANCH` | `config, runtime` | commit source branch (set only for pull request events) | `issue-branch` |
|
||||
| `CI_COMMIT_TARGET_BRANCH` | `config, runtime` | commit target branch (set only for pull request events) | `main` |
|
||||
| `CI_COMMIT_TAG` | `config, runtime` | commit tag name (empty if event is not `tag`) | `v1.10.3` |
|
||||
| `CI_COMMIT_PULL_REQUEST` | `config, runtime` | commit pull request number (set only for pull request events) | `1` |
|
||||
| `CI_COMMIT_PULL_REQUEST_LABELS` | `config, runtime` | labels assigned to pull request (set only for pull request events) | `server` |
|
||||
| `CI_COMMIT_PULL_REQUEST_MILESTONE` | `config, runtime` | milestone assigned to pull request (set only for `pull_request` and `pull_request_closed` events) | `summer-sprint` |
|
||||
| `CI_COMMIT_PULL_REQUEST_DRAFT` | `config, runtime` | whether the pull request is a draft (set only for pull request events; see [forge support](#ci_commit_pull_request_draft-forge-support)) | `true`, `false` |
|
||||
| `CI_COMMIT_MESSAGE` | `config, runtime` | commit message | `Initial commit` |
|
||||
| `CI_COMMIT_TIMESTAMP` | `config, runtime` | commit UNIX timestamp | `1722617519` |
|
||||
| `CI_COMMIT_AUTHOR` | `config, runtime` | commit author username | `john-doe` |
|
||||
| `CI_COMMIT_AUTHOR_EMAIL` | `config, runtime` | commit author email address | `john-doe@example.com` |
|
||||
| `CI_COMMIT_PRERELEASE` | `config, runtime` | release is a pre-release (empty if event is not `release`) — **deprecated**, use `CI_PIPELINE_RELEASE_PRE` | `false` |
|
||||
| | | **Current pipeline** | |
|
||||
| `CI_PIPELINE_NUMBER` | `config, runtime` | pipeline number | `8` |
|
||||
| `CI_PIPELINE_PARENT` | `config, runtime` | number of parent pipeline | `0` |
|
||||
| `CI_PIPELINE_STATUS` | `runtime` | state of the workflow right before the step was started | `success`, `failure` |
|
||||
| `CI_PIPELINE_EVENT` | `config, runtime` | pipeline event (see [`event`](../20-usage/20-workflow-syntax.md#event)) | `push`<br/>`pull_request`<br/>`pull_request_closed`<br/>`pull_request_metadata`<br/>`tag`<br/>`release`<br/>`manual`<br/>`cron` |
|
||||
| `CI_PIPELINE_EVENT_REASON` | `config, runtime` | exact reason why `pull_request_metadata` event was send. it is forge instance specific and can change | `label_updated`<br/>`milestoned`<br/>`demilestoned`<br/>`assigned`<br/>`edited`<br/>... |
|
||||
| `CI_PIPELINE_URL` | `config, runtime` | link to the web UI for the pipeline | `https://ci.example.com/repos/7/pipeline/8` |
|
||||
| `CI_PIPELINE_FORGE_URL` | `config, runtime` | link to the forge's web UI for the commit(s) or tag that triggered the pipeline | `https://git.example.com/john-doe/my-repo/commit/deadbee...` |
|
||||
| `CI_PIPELINE_DEPLOY_TARGET` | `config, runtime` | pipeline deploy target for `deployment` events | `production` |
|
||||
| `CI_PIPELINE_DEPLOY_TASK` | `config, runtime` | pipeline deploy task for `deployment` events | `migration` |
|
||||
| `CI_PIPELINE_RELEASE_TITLE` | `config, runtime` | release title (empty if event is not `release`) | `v1.10.3` |
|
||||
| `CI_PIPELINE_RELEASE_PRE` | `config, runtime` | release is a pre-release (empty if event is not `release`) | `false` |
|
||||
| `CI_PIPELINE_CREATED` | `config, runtime` | pipeline created UNIX timestamp | `1722617519` |
|
||||
| `CI_PIPELINE_STARTED` | `config, runtime` | pipeline started UNIX timestamp | `1722617519` |
|
||||
| `CI_PIPELINE_FILES` | `config, runtime` | changed files (empty if event is not `push` or `pull_request`), it is undefined if more than 500 files are touched | `[]`, `[".woodpecker.yml","README.md"]` |
|
||||
| `CI_PIPELINE_AUTHOR` | `config, runtime` | pipeline author username | `octocat` |
|
||||
| `CI_PIPELINE_AVATAR` | `config, runtime` | pipeline author avatar | `https://git.example.com/avatars/5dcbcadbce6f87f8abef` |
|
||||
| `CI_PIPELINE_RERUNS` | `config, runtime` | number of times the pipeline has been restarted; not set on the initial run, `1` after the first restart, incremented on each subsequent restart | `1` |
|
||||
| | | **Current workflow** | |
|
||||
| `CI_WORKFLOW_NAME` | `config, runtime` | workflow name | `release` |
|
||||
| | | **Current step** | |
|
||||
| `CI_STEP_NAME` | `runtime` | step name | `build package` |
|
||||
| `CI_STEP_TYPE` | `runtime` | step type (`commands`, `plugin`, `service`, `clone` or `cache`) | `commands` |
|
||||
| `CI_STEP_NUMBER` | `runtime` | step number | `0` |
|
||||
| `CI_STEP_STARTED` | `runtime` | step started UNIX timestamp | `1722617519` |
|
||||
| `CI_STEP_URL` | `runtime` | URL to step in UI | `https://ci.example.com/repos/7/pipeline/8` |
|
||||
| | | **Previous commit** | |
|
||||
| `CI_PREV_COMMIT_SHA` | `config, runtime` | previous commit SHA | `deadbee...` |
|
||||
| `CI_PREV_COMMIT_REF` | `config, runtime` | previous commit ref | `refs/heads/main` |
|
||||
| `CI_PREV_COMMIT_REFSPEC` | `config, runtime` | previous commit ref spec | `issue-branch:main` |
|
||||
| `CI_PREV_COMMIT_BRANCH` | `config, runtime` | previous commit branch | `main` |
|
||||
| `CI_PREV_COMMIT_SOURCE_BRANCH` | `config, runtime` | previous commit source branch (set only for pull request events) | `issue-branch` |
|
||||
| `CI_PREV_COMMIT_TARGET_BRANCH` | `config, runtime` | previous commit target branch (set only for pull request events) | `main` |
|
||||
| `CI_PREV_COMMIT_URL` | `config, runtime` | previous commit link in forge | `https://git.example.com/john-doe/my-repo/commit/deadbee...` |
|
||||
| `CI_PREV_COMMIT_MESSAGE` | `config, runtime` | previous commit message | `test` |
|
||||
| `CI_PREV_COMMIT_TIMESTAMP` | `config, runtime` | previous commit UNIX timestamp | `1722617519` |
|
||||
| `CI_PREV_COMMIT_AUTHOR` | `config, runtime` | previous commit author username | `john-doe` |
|
||||
| `CI_PREV_COMMIT_AUTHOR_EMAIL` | `config, runtime` | previous commit author email address | `john-doe@example.com` |
|
||||
| | | **Previous pipeline** | |
|
||||
| `CI_PREV_PIPELINE_NUMBER` | `config, runtime` | previous pipeline number | `7` |
|
||||
| `CI_PREV_PIPELINE_PARENT` | `config, runtime` | previous pipeline number of parent pipeline | `0` |
|
||||
| `CI_PREV_PIPELINE_EVENT` | `config, runtime` | previous pipeline event (see [`event`](../20-usage/20-workflow-syntax.md#event)) | `push`<br/>`pull_request`<br/>`pull_request_closed`<br/>`pull_request_metadata`<br/>`tag`<br/>`release`<br/>`manual`<br/>`cron` |
|
||||
| `CI_PREV_PIPELINE_EVENT_REASON` | `config, runtime` | previous exact reason `pull_request_metadata` event was send. it is forge instance specific and can change | `label_updated`<br/>`milestoned`<br/>`demilestoned`<br/>`assigned`<br/>`edited`<br/>... |
|
||||
| `CI_PREV_PIPELINE_URL` | `config, runtime` | previous pipeline link in CI | `https://ci.example.com/repos/7/pipeline/7` |
|
||||
| `CI_PREV_PIPELINE_FORGE_URL` | `config, runtime` | previous pipeline link to event in forge | `https://git.example.com/john-doe/my-repo/commit/deadbee...` |
|
||||
| `CI_PREV_PIPELINE_DEPLOY_TARGET` | `config, runtime` | previous pipeline deploy target for `deployment` events | `production` |
|
||||
| `CI_PREV_PIPELINE_DEPLOY_TASK` | `config, runtime` | previous pipeline deploy task for `deployment` events | `migration` |
|
||||
| `CI_PREV_PIPELINE_STATUS` | `config, runtime` | previous pipeline status | `success`, `failure` |
|
||||
| `CI_PREV_PIPELINE_CREATED` | `config, runtime` | previous pipeline created UNIX timestamp | `1722610173` |
|
||||
| `CI_PREV_PIPELINE_STARTED` | `config, runtime` | previous pipeline started UNIX timestamp | `1722610173` |
|
||||
| `CI_PREV_PIPELINE_FINISHED` | `config, runtime` | previous pipeline finished UNIX timestamp | `1722610383` |
|
||||
| `CI_PREV_PIPELINE_AUTHOR` | `config, runtime` | previous pipeline author username | `octocat` |
|
||||
| `CI_PREV_PIPELINE_AVATAR` | `config, runtime` | previous pipeline author avatar | `https://git.example.com/avatars/5dcbcadbce6f87f8abef` |
|
||||
| | |   | |
|
||||
| `CI_WORKSPACE` | `runtime` | Path of the workspace where source code gets cloned to | `/woodpecker/src/git.example.com/john-doe/my-repo` |
|
||||
| | | **System** | |
|
||||
| `CI_SYSTEM_NAME` | `config, runtime` | name of the CI system | `woodpecker` |
|
||||
| `CI_SYSTEM_URL` | `config, runtime` | link to CI system | `https://ci.example.com` |
|
||||
| `CI_SYSTEM_HOST` | `config, runtime` | hostname of CI server | `ci.example.com` |
|
||||
| `CI_SYSTEM_VERSION` | `config, runtime` | version of the server | `2.7.0` |
|
||||
| | | **Forge** | |
|
||||
| `CI_FORGE_TYPE` | `config, runtime` | name of forge | `bitbucket`<br/>`bitbucket_dc`<br/>`forgejo`<br/>`gitea`<br/>`github`<br/>`gitlab` |
|
||||
| `CI_FORGE_URL` | `config, runtime` | root URL of configured forge | `https://git.example.com` |
|
||||
| | | **Internal** - Please don't use! | |
|
||||
| `CI_SCRIPT` | `runtime` | Internal script path. Used to call pipeline step commands. | |
|
||||
| `CI_NETRC_USERNAME` | `runtime` | Credentials for private repos to be able to clone data. (Only available for specific images) | |
|
||||
| `CI_NETRC_PASSWORD` | `runtime` | Credentials for private repos to be able to clone data. (Only available for specific images) | |
|
||||
| `CI_NETRC_MACHINE` | `runtime` | Credentials for private repos to be able to clone data. (Only available for specific images) | |
|
||||
|
||||
## Global environment variables
|
||||
|
||||
If you want specific environment variables to be available in all of your pipelines use the `WOODPECKER_ENVIRONMENT` setting on the Woodpecker server. Note that these can't overwrite any existing, built-in variables.
|
||||
|
||||
```ini
|
||||
WOODPECKER_ENVIRONMENT=first_var:value1,second_var:value2
|
||||
```
|
||||
|
||||
These can be used, for example, to manage the image tag used by multiple projects.
|
||||
|
||||
```ini
|
||||
WOODPECKER_ENVIRONMENT=GOLANG_VERSION:1.18
|
||||
```
|
||||
|
||||
```diff
|
||||
steps:
|
||||
- name: build
|
||||
- image: golang:1.18
|
||||
+ image: golang:${GOLANG_VERSION}
|
||||
commands:
|
||||
- [...]
|
||||
```
|
||||
|
||||
## String Substitution
|
||||
|
||||
Woodpecker provides the ability to substitute environment variables at runtime. This gives us the ability to use dynamic settings, commands and filters in our pipeline configuration.
|
||||
|
||||
Example commit substitution:
|
||||
|
||||
```diff
|
||||
steps:
|
||||
- name: s3
|
||||
image: woodpeckerci/plugin-s3
|
||||
settings:
|
||||
+ target: /target/${CI_COMMIT_SHA}
|
||||
```
|
||||
|
||||
Example tag substitution:
|
||||
|
||||
```diff
|
||||
steps:
|
||||
- name: s3
|
||||
image: woodpeckerci/plugin-s3
|
||||
settings:
|
||||
+ target: /target/${CI_COMMIT_TAG}
|
||||
```
|
||||
|
||||
## String Operations
|
||||
|
||||
Woodpecker also emulates bash string operations. This gives us the ability to manipulate the strings prior to substitution. Example use cases might include substring and stripping prefix or suffix values.
|
||||
|
||||
| OPERATION | DESCRIPTION |
|
||||
| ------------------ | ------------------------------------------------ |
|
||||
| `${param}` | parameter substitution |
|
||||
| `${param,}` | parameter substitution with lowercase first char |
|
||||
| `${param,,}` | parameter substitution with lowercase |
|
||||
| `${param^}` | parameter substitution with uppercase first char |
|
||||
| `${param^^}` | parameter substitution with uppercase |
|
||||
| `${param:pos}` | parameter substitution with substring |
|
||||
| `${param:pos:len}` | parameter substitution with substring and length |
|
||||
| `${param=default}` | parameter substitution with default |
|
||||
| `${param##prefix}` | parameter substitution with prefix removal |
|
||||
| `${param%%suffix}` | parameter substitution with suffix removal |
|
||||
| `${param/old/new}` | parameter substitution with find and replace |
|
||||
|
||||
Example variable substitution with substring:
|
||||
|
||||
```diff
|
||||
steps:
|
||||
- name: s3
|
||||
image: woodpeckerci/plugin-s3
|
||||
settings:
|
||||
+ target: /target/${CI_COMMIT_SHA:0:8}
|
||||
```
|
||||
|
||||
Example variable substitution strips `v` prefix from `v.1.0.0`:
|
||||
|
||||
```diff
|
||||
steps:
|
||||
- name: s3
|
||||
image: woodpeckerci/plugin-s3
|
||||
settings:
|
||||
+ target: /target/${CI_COMMIT_TAG##v}
|
||||
```
|
||||
|
||||
## `CI_COMMIT_PULL_REQUEST_DRAFT` forge support
|
||||
|
||||
For pull request events, `CI_COMMIT_PULL_REQUEST_DRAFT` is set to `true` or `false` depending on whether the pull request is a draft.
|
||||
|
||||
| Forge | Supported | Notes |
|
||||
| -------------------- | ------------------ | ----------------------------------------------------------------- |
|
||||
| GitHub | :white_check_mark: | |
|
||||
| Gitea | :white_check_mark: | |
|
||||
| GitLab | :white_check_mark: | Uses `draft`; falls back to legacy `work_in_progress` when needed |
|
||||
| Forgejo | :x: | Webhook payloads include draft status, but it is not exposed yet |
|
||||
| Bitbucket | :x: | Webhook payloads include draft status, but it is not exposed yet |
|
||||
| Bitbucket Datacenter | :x: | Webhook payloads include draft status, but it is not exposed yet |
|
||||
|
||||
On unsupported forges the variable is still set to `false`.
|
||||
|
||||
## `pull_request_metadata` specific event reason values
|
||||
|
||||
For the `pull_request_metadata` event, the exact reason a metadata change was detected is passe through in `CI_PIPELINE_EVENT_REASON`.
|
||||
|
||||
**GitLab** merges metadata updates into one webhook. Event reasons are separated by `,` as a list.
|
||||
|
||||
:::note
|
||||
Event reason values are forge-specific and may change between versions.
|
||||
:::
|
||||
|
||||
| Event | GitHub | Gitea | Forgejo | GitLab | Bitbucket | Bitbucket Datacenter | Description |
|
||||
| -------------------- | ------------------ | ------------------ | ------------------ | ------------------ | --------- | -------------------- | ------------------------------------------------------------------------------ |
|
||||
| `assigned` | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | Pull request was assigned to a user |
|
||||
| `converted_to_draft` | :white_check_mark: | :x: | :x: | :x: | :x: | :x: | Pull request was converted to a draft |
|
||||
| `demilestoned` | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | Pull request was removed from a milestone |
|
||||
| `description_edited` | :x: | :x: | :x: | :white_check_mark: | :x: | :x: | Description edited |
|
||||
| `edited` | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | :x: | The title or body of a pull request was edited, or the base branch was changed |
|
||||
| `label_added` | :x: | :x: | :x: | :white_check_mark: | :x: | :x: | Pull had no labels and now got label(s) added |
|
||||
| `label_cleared` | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | All labels removed |
|
||||
| `label_updated` | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | New label(s) added / label(s) changed |
|
||||
| `locked` | :white_check_mark: | :x: | :x: | :x: | :x: | :x: | Conversation on a pull request was locked |
|
||||
| `milestoned` | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | Pull request was added to a milestone |
|
||||
| `ready_for_review` | :white_check_mark: | :x: | :x: | :x: | :x: | :x: | Draft pull request was marked as ready for review |
|
||||
| `review_requested` | :x: | :x: | :x: | :white_check_mark: | :x: | :x: | New review was requested |
|
||||
| `title_edited` | :x: | :x: | :x: | :white_check_mark: | :x: | :x: | Title edited |
|
||||
| `unassigned` | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | User was unassigned from a pull request |
|
||||
| `unlabeled` | :white_check_mark: | :x: | :x: | :x: | :x: | :x: | Label was removed from a pull request |
|
||||
| `unlocked` | :white_check_mark: | :x: | :x: | :x: | :x: | :x: | Conversation on a pull request was unlocked |
|
||||
|
||||
**Bitbucket** and **Bitbucket Datacenter** [are not supported at the moment](https://github.com/woodpecker-ci/woodpecker/pull/5214).
|
||||
@@ -164,3 +164,11 @@ Example response:
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## 3rd Party Extensions
|
||||
|
||||
:::danger
|
||||
These extensions are neither developed nor verified by Woodpecker CI. Make sure you trust them before using.
|
||||
:::
|
||||
|
||||
_Add your extension here!_
|
||||
@@ -8,6 +8,10 @@ There is currently one type of extension available:
|
||||
- [Registry extension](./50-registry-extension.md) to get registry credentials from the extension.
|
||||
- [Secret extension](./55-secret-extension.md) to get secrets from an external service.
|
||||
|
||||
:::note
|
||||
Woodpecker's permission handling is linked to the forge. A user on your forge that has admin access to the repo will also get admin permissions for the repository in Woodpecker and can then change the configured extensions. This could be used to get credentials of the forge user. Make sure you trust the repo admins that can sign in to Woodpecker.
|
||||
:::
|
||||
|
||||
## Security
|
||||
|
||||
:::warning
|
||||
@@ -0,0 +1,91 @@
|
||||
# Local pipeline execution
|
||||
|
||||
`woodpecker-cli exec` runs workflow files from your local checkout. Use it to test pipeline changes before pushing them, to debug a workflow without waiting for a server run, or to replay a server pipeline with downloaded metadata.
|
||||
|
||||
## Requirements
|
||||
|
||||
- Install `woodpecker-cli` from the [distribution packages](../30-administration/05-installation/30-packages.md) or a release archive.
|
||||
- Run the command from the repository checkout, or pass `--repo-path` to point at it.
|
||||
- Make sure the backend you want to use is available locally. The Docker backend needs access to a Docker daemon. The local backend runs commands directly on your host and does not reproduce the container image environment.
|
||||
|
||||
## Run a workflow file
|
||||
|
||||
Create or edit a workflow file, then run it directly:
|
||||
|
||||
```shell
|
||||
woodpecker-cli exec .woodpecker/my-first-workflow.yaml
|
||||
```
|
||||
|
||||
You can also run every `.yaml` and `.yml` file in a workflow directory:
|
||||
|
||||
```shell
|
||||
woodpecker-cli exec .woodpecker/
|
||||
```
|
||||
|
||||
By default, Woodpecker auto-detects a backend. Select one explicitly when you want the local run to match a specific agent backend:
|
||||
|
||||
```shell
|
||||
woodpecker-cli exec --backend-engine docker .woodpecker/my-first-workflow.yaml
|
||||
woodpecker-cli exec --backend-engine local .woodpecker/my-first-workflow.yaml
|
||||
```
|
||||
|
||||
## Pass metadata
|
||||
|
||||
Metadata values are set automatically, but you can override them to test conditions such as branches, pull requests, tags, and events:
|
||||
|
||||
```shell
|
||||
woodpecker-cli exec \
|
||||
--pipeline-event push \
|
||||
--commit-branch main \
|
||||
--commit-sha "$(git rev-parse HEAD)" \
|
||||
--repo octocat/hello-world \
|
||||
.woodpecker/my-first-workflow.yaml
|
||||
```
|
||||
|
||||
If you downloaded pipeline metadata from the Woodpecker UI, pass it with `--metadata-file` and adjust individual values with other flags when needed:
|
||||
|
||||
```shell
|
||||
woodpecker-cli exec \
|
||||
--metadata-file pipeline-metadata.json \
|
||||
--pipeline-event pull_request \
|
||||
.woodpecker/my-first-workflow.yaml
|
||||
```
|
||||
|
||||
:::warning
|
||||
The metadata file is not a stable, portable API: its format is only guaranteed for the same server and CLI version it came from. Use it to replay against a matching version, and re-download after upgrades instead of reusing old files.
|
||||
:::
|
||||
|
||||
## Pass environment variables and secrets
|
||||
|
||||
Use `--env` for regular environment variables:
|
||||
|
||||
```shell
|
||||
woodpecker-cli exec \
|
||||
--env GOFLAGS=-mod=readonly \
|
||||
.woodpecker/test.yaml
|
||||
```
|
||||
|
||||
Secrets are not downloaded from the server. Pass the values needed for local debugging explicitly:
|
||||
|
||||
```shell
|
||||
woodpecker-cli exec \
|
||||
--secrets deploy_token="$DEPLOY_TOKEN" \
|
||||
.woodpecker/deploy.yaml
|
||||
```
|
||||
|
||||
For multiple secrets, keep them in a local YAML file that is ignored by Git:
|
||||
|
||||
```yaml title=".woodpecker/local-secrets.yaml"
|
||||
deploy_token: ghp_example
|
||||
registry_password: example-password
|
||||
```
|
||||
|
||||
```shell
|
||||
woodpecker-cli exec \
|
||||
--secrets-file .woodpecker/local-secrets.yaml \
|
||||
.woodpecker/deploy.yaml
|
||||
```
|
||||
|
||||
## More options
|
||||
|
||||
See the generated [CLI reference](../40-cli.md#exec) for the full list of `exec` flags.
|
||||
@@ -4,6 +4,10 @@ As the owner of a project in Woodpecker you can change project related settings
|
||||
|
||||

|
||||
|
||||
:::note
|
||||
Woodpecker's permission handling is linked to the forge. A user on your forge that has admin access to the repo will also get admin permissions for the repository in Woodpecker and can then change the settings here.
|
||||
:::
|
||||
|
||||
## Pipeline path
|
||||
|
||||
The path to the pipeline config file or folder. By default it is left empty which will use the following configuration resolution `.woodpecker/*.{yaml,yml}` -> `.woodpecker.yaml` -> `.woodpecker.yml`. If you set a custom path Woodpecker tries to load your configuration or fails if no configuration could be found at the specified location. To use a [multiple workflows](./25-workflows.md) with a custom path you have to change it to a folder path ending with a `/` like `.woodpecker/`.
|
||||
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 113 KiB After Width: | Height: | Size: 113 KiB |
|
Before Width: | Height: | Size: 430 KiB After Width: | Height: | Size: 430 KiB |
|
Before Width: | Height: | Size: 353 KiB After Width: | Height: | Size: 353 KiB |
|
Before Width: | Height: | Size: 351 KiB After Width: | Height: | Size: 351 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 29 KiB |
@@ -41,3 +41,5 @@ Images are pushed to DockerHub and Quay.
|
||||
- woodpecker-agent ([DockerHub](https://hub.docker.com/r/woodpeckerci/woodpecker-agent) or [Quay](https://quay.io/repository/woodpeckerci/woodpecker-agent))
|
||||
- woodpecker-cli ([DockerHub](https://hub.docker.com/r/woodpeckerci/woodpecker-cli) or [Quay](https://quay.io/repository/woodpeckerci/woodpecker-cli))
|
||||
- woodpecker-autoscaler ([DockerHub](https://hub.docker.com/r/woodpeckerci/autoscaler))
|
||||
|
||||
For the full list of operating systems and architectures each component is built for, along with which execution backends are supported on each platform, see [Supported platforms](./05-installation/05-supported-platforms.md).
|
||||
@@ -0,0 +1,57 @@
|
||||
# Supported platforms
|
||||
|
||||
Woodpecker is shipped as container images and as pre-built binaries on the [GitHub releases](https://github.com/woodpecker-ci/woodpecker/releases/latest) page. Not every component is available for every platform: the server and the Docker/Kubernetes backends are Linux-centric, while the agent and CLI run on a wider set of operating systems via the Local backend.
|
||||
|
||||
## Components
|
||||
|
||||
| Component | Purpose |
|
||||
| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `woodpecker-server` | Web UI, API, webhook receiver, pipeline scheduler. |
|
||||
| `woodpecker-agent` | Executes pipeline workflows via a backend ([Docker](../10-configuration/11-backends/10-docker.md), [Kubernetes](../10-configuration/11-backends/20-kubernetes.md), [Local](../10-configuration/11-backends/30-local.md)). |
|
||||
| `woodpecker-cli` | Command-line utility for interacting with the server. |
|
||||
| `plugin-git` | Default clone plugin, invoked automatically by the agent at the start of every workflow. Distributed as a container image; binaries are also published for use with the Local backend. |
|
||||
|
||||
## Component / platform matrix
|
||||
|
||||
The table lists what is officially built and published by the Woodpecker project. "Image" means a container image is pushed to DockerHub and Quay. "Binary" means a pre-built tarball or `.exe` is attached to the GitHub release.
|
||||
|
||||
| OS / Architecture | server | agent | cli | plugin-git |
|
||||
| ------------------------------------ | -------------- | -------------- | -------------- | -------------- |
|
||||
| linux / amd64 | Image + Binary | Image + Binary | Image + Binary | Image + Binary |
|
||||
| linux / arm64 (arm64/v8) | Image + Binary | Image + Binary | Image + Binary | Image + Binary |
|
||||
| linux / arm/v7 | Image | Image + Binary | Image + Binary | Image + Binary |
|
||||
| linux / arm/v6 | Image | Image | Image | Image |
|
||||
| linux / 386 | Image | Image | Image | Image |
|
||||
| linux / ppc64le | Image | Image | Image | Image |
|
||||
| linux / riscv64 | Image + Binary | Image + Binary | Image + Binary | Image |
|
||||
| linux / s390x | Image | Image | Image | Image |
|
||||
| windows / amd64 | Binary | Binary | Binary | Binary |
|
||||
| windows / arm64 | – | – | – | Binary |
|
||||
| darwin / amd64 (macOS Intel) | – | Binary | Binary | Binary |
|
||||
| darwin / arm64 (macOS Apple Silicon) | – | Binary | Binary | Binary |
|
||||
| freebsd / amd64 | Image + Binary | Image + Binary | Image + Binary | Binary |
|
||||
| freebsd / arm64 | – | Image + Binary | Image + Binary | Binary |
|
||||
| openbsd / amd64 | – | Binary | Binary | Binary |
|
||||
| openbsd / arm64 | – | Binary | Binary | Binary |
|
||||
|
||||
DEB and RPM packages are produced for `linux/amd64` and `linux/arm64`; see the [Distribution packages](./30-packages.md) page for download links and systemd unit examples.
|
||||
|
||||
## Backend support per platform
|
||||
|
||||
The agent can run on any platform listed above, but the available execution backends depend on the host operating system.
|
||||
|
||||
| Backend | Linux | Windows | macOS | FreeBSD | OpenBSD |
|
||||
| -------------------------------------------------------------- | --------- | ---------------------- | --------- | ---------------------- | --------- |
|
||||
| [Docker](../10-configuration/11-backends/10-docker.md) | Supported | Supported[^win-docker] | – | [WIP][^freebsd-docker] | – |
|
||||
| [Kubernetes](../10-configuration/11-backends/20-kubernetes.md) | Supported | – | – | – | – |
|
||||
| [Local](../10-configuration/11-backends/30-local.md) | Supported | Supported | Supported | Supported | Supported |
|
||||
|
||||
[^win-docker]: Works through WSL2 with Docker Desktop, and with native Windows containers.
|
||||
|
||||
[^freebsd-docker]: FreeBSD Docker backend support is a work in progress; see [woodpecker-ci/woodpecker#6655](https://github.com/woodpecker-ci/woodpecker/issues/6655).
|
||||
|
||||
Notes:
|
||||
|
||||
- The **Docker** and **Kubernetes** backends require a Linux host on the agent because they rely on Linux container runtimes. On Windows, Docker is available via WSL2 or Windows containers (see footnote above). Running the agent on macOS or OpenBSD restricts you to the Local backend.
|
||||
- The **Local** backend runs pipeline commands directly on the agent host with no isolation. It is the only backend available on macOS and OpenBSD, and is intended for trusted, private setups only. See the [Local backend documentation](../10-configuration/11-backends/30-local.md) for the full security notes.
|
||||
- `plugin-git` is invoked as a container by default. On hosts where the Docker and Kubernetes backends are unavailable, configure the Local backend to use the [`plugin-git` binary](https://github.com/woodpecker-ci/plugin-git/releases/latest) instead, or disable the clone step and clone manually in the pipeline.
|
||||
@@ -1,10 +1,16 @@
|
||||
# Distribution packages
|
||||
|
||||
:::tip
|
||||
For a full list of operating systems and architectures that Woodpecker is built for, including which components are available on each, see [Supported platforms](./05-supported-platforms.md).
|
||||
:::
|
||||
|
||||
## Official packages
|
||||
|
||||
- DEB
|
||||
- RPM
|
||||
|
||||
DEB and RPM packages are built for `linux/amd64` and `linux/arm64`. For other architectures, use the binary tarballs or container images linked from the [Supported platforms](./05-supported-platforms.md) page.
|
||||
|
||||
The pre-built packages are available on the [GitHub releases](https://github.com/woodpecker-ci/woodpecker/releases/latest) page. The packages can be installed using the package manager of your distribution.
|
||||
|
||||
```Shell
|
||||
@@ -400,8 +400,27 @@ woodpecker_waiting_steps 0
|
||||
# HELP woodpecker_worker_count Total number of workers.
|
||||
# TYPE woodpecker_worker_count gauge
|
||||
woodpecker_worker_count 4
|
||||
# HELP woodpecker_step_failures_total Total number of pipeline step failures.
|
||||
# TYPE woodpecker_step_failures_total counter
|
||||
woodpecker_step_failures_total{repo="woodpecker-ci/woodpecker",step="deploy",workflow="woodpecker"} 1
|
||||
# HELP woodpecker_step_duration_seconds Step duration in seconds.
|
||||
# TYPE woodpecker_step_duration_seconds histogram
|
||||
woodpecker_step_duration_seconds_bucket{repo="woodpecker-ci/woodpecker",step="deploy",workflow="woodpecker",le="1"} 0
|
||||
woodpecker_step_duration_seconds_bucket{repo="woodpecker-ci/woodpecker",step="deploy",workflow="woodpecker",le="5"} 0
|
||||
woodpecker_step_duration_seconds_bucket{repo="woodpecker-ci/woodpecker",step="deploy",workflow="woodpecker",le="10"} 0
|
||||
woodpecker_step_duration_seconds_bucket{repo="woodpecker-ci/woodpecker",step="deploy",workflow="woodpecker",le="30"} 1
|
||||
woodpecker_step_duration_seconds_bucket{repo="woodpecker-ci/woodpecker",step="deploy",workflow="woodpecker",le="60"} 1
|
||||
woodpecker_step_duration_seconds_bucket{repo="woodpecker-ci/woodpecker",step="deploy",workflow="woodpecker",le="300"} 1
|
||||
woodpecker_step_duration_seconds_bucket{repo="woodpecker-ci/woodpecker",step="deploy",workflow="woodpecker",le="600"} 1
|
||||
woodpecker_step_duration_seconds_bucket{repo="woodpecker-ci/woodpecker",step="deploy",workflow="woodpecker",le="1800"} 1
|
||||
woodpecker_step_duration_seconds_bucket{repo="woodpecker-ci/woodpecker",step="deploy",workflow="woodpecker",le="3600"} 1
|
||||
woodpecker_step_duration_seconds_bucket{repo="woodpecker-ci/woodpecker",step="deploy",workflow="woodpecker",le="+Inf"} 1
|
||||
woodpecker_step_duration_seconds_sum{repo="woodpecker-ci/woodpecker",step="deploy",workflow="woodpecker"} 12
|
||||
woodpecker_step_duration_seconds_count{repo="woodpecker-ci/woodpecker",step="deploy",workflow="woodpecker"} 1
|
||||
```
|
||||
|
||||
Step-level metrics are exported as long as `WOODPECKER_STEP_LEVEL_METRICS` is not disabled.
|
||||
|
||||
#### Example response structure
|
||||
|
||||
```json
|
||||
@@ -558,7 +577,7 @@ Examples:
|
||||
- Name: `WOODPECKER_SERVER_ADDR`
|
||||
- Default: `:8000`
|
||||
|
||||
Configures the HTTP listener port.
|
||||
Configures the HTTP listener, supports unix socket via unix:// prefix".
|
||||
|
||||
---
|
||||
|
||||
@@ -624,16 +643,27 @@ Example: `WOODPECKER_CUSTOM_JS_FILE=/usr/local/www/woodpecker.js`
|
||||
- Name: `WOODPECKER_GRPC_ADDR`
|
||||
- Default: `:9000`
|
||||
|
||||
Configures the gRPC listener port.
|
||||
Configures the gRPC listener. Use `localhost:9000` or any IP address to bind it to a specific interface.
|
||||
If you want an unix socket use `unix://` prefix, for example `unix:///run/woodpecker-grcp.sock`.
|
||||
|
||||
---
|
||||
|
||||
### GRPC_SECRET
|
||||
|
||||
- Name: `WOODPECKER_GRPC_SECRET`
|
||||
- Default: `secret`
|
||||
- Default: none
|
||||
|
||||
Configures the gRPC JWT secret.
|
||||
Configures the secret used to sign JWTs for gRPC connections.
|
||||
|
||||
If this setting is empty, the server generates a secure temporary secret and logs a warning. The generated secret is not persisted and changes each time the server starts. Configure and persist a secret to keep it stable across restarts. Setting this explicitly is important for high availability (HA) setups with multiple server replicas: each replica would otherwise generate its own secret and reject the gRPC tokens issued by the other replicas. Generate a secure secret with:
|
||||
|
||||
```shell
|
||||
openssl rand -hex 32
|
||||
```
|
||||
|
||||
Store the generated value securely and provide it through `WOODPECKER_GRPC_SECRET` or `WOODPECKER_GRPC_SECRET_FILE`.
|
||||
|
||||
After this secret is rotated, connected agents reauthenticate when the server rejects their old token. Agents do not need to be restarted as long as `WOODPECKER_AGENT_SECRET` remains unchanged.
|
||||
|
||||
---
|
||||
|
||||
@@ -642,7 +672,7 @@ Configures the gRPC JWT secret.
|
||||
- Name: `WOODPECKER_GRPC_SECRET_FILE`
|
||||
- Default: none
|
||||
|
||||
Read the value for `WOODPECKER_GRPC_SECRET` from the specified filepath.
|
||||
Read the value for `WOODPECKER_GRPC_SECRET` from the specified filepath. The file should be stored persistently and only be readable by the Woodpecker server.
|
||||
|
||||
---
|
||||
|
||||
@@ -657,6 +687,15 @@ Example: `:9001`
|
||||
|
||||
---
|
||||
|
||||
### STEP_LEVEL_METRICS
|
||||
|
||||
- Name: `WOODPECKER_STEP_LEVEL_METRICS`
|
||||
- Default: `true`
|
||||
|
||||
Enable step-level metrics, including failed step counters and step duration histograms.
|
||||
|
||||
---
|
||||
|
||||
### ADMIN
|
||||
|
||||
- Name: `WOODPECKER_ADMIN`
|
||||
@@ -708,6 +747,19 @@ Always use authentication to clone repositories even if they are public. Needed
|
||||
|
||||
---
|
||||
|
||||
### ASYNC_REPOSITORY_UPDATE
|
||||
|
||||
- Name: `WOODPECKER_ASYNC_REPOSITORY_UPDATE`
|
||||
- Default: `false`
|
||||
|
||||
Enable asynchronous fetching user permissions for repositories. Will drastically improve login speed for user login if the organisation has many git repositories.
|
||||
|
||||
When disabled (default) users will have to wait for all repository access information before being redirected to the Woodpecker homepage. Choose this for strong consistency.
|
||||
|
||||
When enabled users will immediately be redirected to the Woodpecker homepage, but might see outdated information if repository access changed or new repositories were added. Choose this for eventual consistency.
|
||||
|
||||
---
|
||||
|
||||
### DEFAULT_ALLOW_PULL_REQUESTS
|
||||
|
||||
- Name: `WOODPECKER_DEFAULT_ALLOW_PULL_REQUESTS`
|
||||
@@ -980,6 +1032,24 @@ Specify a configuration extension endpoint, see [Configuration Extension](../../
|
||||
|
||||
---
|
||||
|
||||
### DEFAULT_PIPELINE_CONFIGS
|
||||
|
||||
- Name: `WOODPECKER_DEFAULT_PIPELINE_CONFIGS`
|
||||
- Default: `.woodpecker/`, `.woodpecker.yaml`, `.woodpecker.yml`
|
||||
|
||||
Specify the default pipeline config paths.
|
||||
|
||||
---
|
||||
|
||||
### DEFAULT_PIPELINE_CONFIG_EXTENSIONS
|
||||
|
||||
- Name: `WOODPECKER_DEFAULT_PIPELINE_CONFIG_EXTENSIONS`
|
||||
- Default: `.yaml`, `.yml`
|
||||
|
||||
Specify the default pipeline config extensions when scanning a pipeline config directory.
|
||||
|
||||
---
|
||||
|
||||
### CONFIG_EXTENSION_EXCLUSIVE
|
||||
|
||||
- Name: `CONFIG_EXTENSION_EXCLUSIVE`
|
||||
@@ -95,6 +95,15 @@ certificates installed on host and host timezone use `/etc/ssl/certs:/etc/ssl/ce
|
||||
|
||||
---
|
||||
|
||||
### BACKEND_DOCKER_APPARMOR_PROFILE
|
||||
|
||||
- Name: `WOODPECKER_BACKEND_DOCKER_APPARMOR_PROFILE`
|
||||
- Default: none
|
||||
|
||||
Set an AppArmor profile for pipeline containers (steps). If unset, Docker applies its default AppArmor behavior.
|
||||
|
||||
---
|
||||
|
||||
### BACKEND_DOCKER_LIMIT_MEM_SWAP
|
||||
|
||||
- Name: `WOODPECKER_BACKEND_DOCKER_LIMIT_MEM_SWAP`
|
||||
@@ -81,6 +81,51 @@ steps:
|
||||
|
||||
To give steps access to the Kubernetes API via service account, take a look at [RBAC Authorization](https://kubernetes.io/docs/reference/access-authn-authz/rbac/)
|
||||
|
||||
By default, setting `serviceAccountName` from a step's backend options is **not allowed** for security reasons, as it would let any user with push access run pipeline pods under an arbitrary service account and inherit its permissions. To enable it, set [`WOODPECKER_BACKEND_K8S_SERVICE_ACCOUNT_NAME_ALLOW_FROM_STEP`](#backend_k8s_service_account_name_allow_from_step) on the agent.
|
||||
|
||||
:::warning
|
||||
Enabling `WOODPECKER_BACKEND_K8S_SERVICE_ACCOUNT_NAME_ALLOW_FROM_STEP` in multi-tenant environments allows pipeline authors to run pods as any service account in the namespace, which may lead to privilege escalation. Only enable it if you trust everyone with push access.
|
||||
:::
|
||||
|
||||
### Workspace volume
|
||||
|
||||
`workspaceVolume` controls whether the default workspace volume is mounted into a service Pod. It only affects service
|
||||
containers and does not disable explicitly configured service volumes.
|
||||
|
||||
If unset, the default workspace volume is mounted.
|
||||
|
||||
```yaml
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:16
|
||||
backend_options:
|
||||
kubernetes:
|
||||
workspaceVolume: false
|
||||
```
|
||||
|
||||
### User namespaces
|
||||
|
||||
`hostUsers` controls whether the Pod uses the host's user namespace. When set to `false`, Kubernetes runs the Pod in a dedicated user namespace where UID 0 inside the container maps to a non-root UID on the host, providing an additional layer of isolation.
|
||||
|
||||
See the [Kubernetes documentation](https://kubernetes.io/docs/concepts/workloads/pods/user-namespaces/) for more information on user namespaces.
|
||||
|
||||
```yaml
|
||||
steps:
|
||||
- name: build
|
||||
image: alpine
|
||||
commands:
|
||||
- whoami
|
||||
backend_options:
|
||||
kubernetes:
|
||||
hostUsers: false
|
||||
securityContext:
|
||||
runAsUser: 0
|
||||
```
|
||||
|
||||
:::note
|
||||
User namespaces require Kubernetes v1.25+ with the `UserNamespacesSupport` feature gate enabled, and a compatible container runtime (e.g. CRI-O, containerd v2.0+).
|
||||
:::
|
||||
|
||||
### Node selector
|
||||
|
||||
`nodeSelector` specifies the labels which are used to select the node on which the step will be executed.
|
||||
@@ -562,6 +607,15 @@ Additional node selector to apply to worker pods. Must be a YAML object, e.g. `{
|
||||
|
||||
---
|
||||
|
||||
### BACKEND_K8S_POD_NODE_SELECTOR_ALLOW_FROM_STEP
|
||||
|
||||
- Name: `WOODPECKER_BACKEND_K8S_POD_NODE_SELECTOR_ALLOW_FROM_STEP`
|
||||
- Default: `false`
|
||||
|
||||
Determines if the Pod `nodeSelector` can be defined from a step's backend options. Disabled by default, as it would otherwise let any user with push access pin pipeline pods onto chosen nodes.
|
||||
|
||||
---
|
||||
|
||||
### BACKEND_K8S_SECCTX_NONROOT <!-- cspell:ignore SECCTX NONROOT -->
|
||||
|
||||
- Name: `WOODPECKER_BACKEND_K8S_SECCTX_NONROOT`
|
||||
@@ -586,3 +640,21 @@ Secret names to pull images from private repositories. See, how to [Pull an Imag
|
||||
- Default: none, which will use the default priority class configured in Kubernetes
|
||||
|
||||
Which [Kubernetes PriorityClass](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/priority-class-v1/) to assign to created job pods.
|
||||
|
||||
---
|
||||
|
||||
### BACKEND_K8S_PERMISSION_INIT_IMAGE
|
||||
|
||||
- Name: `WOODPECKER_BACKEND_K8S_PERMISSION_INIT_IMAGE`
|
||||
- Default: 'busybox:stable-musl'
|
||||
|
||||
Container image used for the workspace permission init container, which is used to create the workspace directory and ensure correct permissions when running steps as non-root users.
|
||||
|
||||
---
|
||||
|
||||
### BACKEND_K8S_SERVICE_ACCOUNT_NAME_ALLOW_FROM_STEP
|
||||
|
||||
- Name: `WOODPECKER_BACKEND_K8S_SERVICE_ACCOUNT_NAME_ALLOW_FROM_STEP`
|
||||
- Default: `false`
|
||||
|
||||
Determines if the Pod `serviceAccountName` can be defined from a step's backend options. Disabled by default, as it would otherwise allow any user with push access to run pods under an arbitrary service account and escalate privileges.
|
||||
@@ -27,6 +27,8 @@ code and execute commands.
|
||||
In order to use this backend, you need to download (or build) the
|
||||
[agent](https://github.com/woodpecker-ci/woodpecker/releases/latest), configure it and run it on the host machine.
|
||||
|
||||
The local backend is supported on Windows, macOS, FreeBSD and OpenBSD; see [Supported platforms](../../05-installation/05-supported-platforms.md) for the full component and backend matrix.
|
||||
|
||||
## Step specific configuration
|
||||
|
||||
### Shell
|
||||
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 129 KiB After Width: | Height: | Size: 129 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
@@ -63,7 +63,7 @@ To get an _agent token_ you have to register the agent manually in the server us
|
||||
- Name: `WOODPECKER_SERVER`
|
||||
- Default: `localhost:9000`
|
||||
|
||||
Configures gRPC address of the server.
|
||||
Configures gRPC address to the server. If you want to use an unix socket add `unix://` prefix and the path.
|
||||
|
||||
---
|
||||
|
||||
@@ -215,7 +215,7 @@ After pinging for a keepalive check, the agent waits for a duration of this time
|
||||
- Name: `WOODPECKER_GRPC_SECURE`
|
||||
- Default: `false`
|
||||
|
||||
Configures if the connection to `WOODPECKER_SERVER` should be made using a secure transport.
|
||||
Configures if the connection to `WOODPECKER_SERVER` should be made using a secure transport (tls).
|
||||
|
||||
---
|
||||
|
||||
@@ -241,6 +241,20 @@ If set to 0 we retry forever.
|
||||
|
||||
---
|
||||
|
||||
## LOG_ENTRY_STREAM_BUFFER_SIZE
|
||||
|
||||
- Name: `WOODPECKER_LOG_ENTRY_STREAM_BUFFER_SIZE`
|
||||
- Default: `100`
|
||||
|
||||
Set how many log lines an agent can buffer before it blocks io.Pipe, expect logentries to reach 1 MB in worst case.
|
||||
If used with local backend, tis can increase your performance in special cases significantly.
|
||||
|
||||
:::warning
|
||||
If set to 0 we are always blocking.
|
||||
:::
|
||||
|
||||
---
|
||||
|
||||
### BACKEND
|
||||
|
||||
- Name: `WOODPECKER_BACKEND`
|
||||
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
@@ -1,5 +1,48 @@
|
||||
# CLI
|
||||
|
||||
# CONFIGURATION
|
||||
|
||||
woodpecker-cli stores named contexts in a `contexts.json` file under the user's configuration directory. `XDG_CONFIG_HOME` overrides the base directory. The default paths are:
|
||||
|
||||
| Platform | Path |
|
||||
| --- | --- |
|
||||
| Linux and other Unix systems | `~/.config/woodpecker/contexts.json` |
|
||||
| macOS | `~/Library/Application Support/woodpecker/contexts.json` |
|
||||
| Windows | `C:\Users\<user>\AppData\Local\woodpecker\contexts.json` |
|
||||
|
||||
The file records the selected context and its non-secret connection settings:
|
||||
|
||||
```json
|
||||
{
|
||||
"current_context": "production",
|
||||
"contexts": {
|
||||
"production": {
|
||||
"name": "production",
|
||||
"server_url": "https://ci.example.test",
|
||||
"log_level": "info"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
`current_context` must name an entry in `contexts`. The `woodpecker-cli context use` command changes that selection. Authentication tokens are never written to this JSON file; they are stored in the operating system's keyring and looked up by server URL.
|
||||
|
||||
## Legacy configuration
|
||||
|
||||
If no usable current context can be loaded, woodpecker-cli falls back to the legacy `config.json` file in the same configuration directory. `--config` or `WOODPECKER_CONFIG` selects a different legacy file. The legacy JSON accepts `server_url` and `log_level`; its token is also read from the operating system's keyring, not from JSON.
|
||||
|
||||
## Precedence
|
||||
|
||||
Command-line flags take precedence over their matching environment variables, and either source takes precedence over stored context or legacy values:
|
||||
|
||||
| Flag | Environment variable |
|
||||
| --- | --- |
|
||||
| `--server` | `WOODPECKER_SERVER` |
|
||||
| `--token` | `WOODPECKER_TOKEN` |
|
||||
| `--log-level` | `WOODPECKER_LOG_LEVEL` |
|
||||
|
||||
The `--config` flag and `WOODPECKER_CONFIG` only choose the legacy configuration file; they do not replace or select a context.
|
||||
|
||||
# NAME
|
||||
|
||||
woodpecker-cli - command line utility
|
||||
@@ -227,6 +270,8 @@ execute a local pipeline
|
||||
|
||||
**--backend-docker-api-version**="": the version of the API to reach, leave empty for latest.
|
||||
|
||||
**--backend-docker-apparmor-profile**="": AppArmor profile applied to backend Docker containers
|
||||
|
||||
**--backend-docker-cert**="": path to load the TLS certificates for connecting to docker server
|
||||
|
||||
**--backend-docker-host**="": path to docker socket or url to the docker server
|
||||
@@ -265,6 +310,8 @@ execute a local pipeline
|
||||
|
||||
**--backend-k8s-namespace-per-org**: Whether to enable namespace segregation per organization feature. When enabled, Woodpecker will create the Kubernetes resources to separated Kubernetes namespaces per Woodpecker organization. (default: false)
|
||||
|
||||
**--backend-k8s-permission-init-image**="": image used by the workspace permission init container (default: busybox:stable-musl)
|
||||
|
||||
**--backend-k8s-pod-affinity**="": backend k8s Agent-wide worker pod affinity, in YAML format
|
||||
|
||||
**--backend-k8s-pod-affinity-allow-from-step**: whether to allow using affinity from step's backend options (default: false)
|
||||
@@ -281,6 +328,8 @@ execute a local pipeline
|
||||
|
||||
**--backend-k8s-pod-node-selector**="": backend k8s Agent-wide worker pod node selector
|
||||
|
||||
**--backend-k8s-pod-node-selector-allow-from-step**: whether to allow using node selector from step's backend options (default: false)
|
||||
|
||||
**--backend-k8s-pod-tolerations**="": backend k8s Agent-wide worker pod tolerations
|
||||
|
||||
**--backend-k8s-pod-tolerations-allow-from-step**: whether to allow using tolerations from step's backend options (default: true)
|
||||
@@ -289,6 +338,8 @@ execute a local pipeline
|
||||
|
||||
**--backend-k8s-secctx-nonroot**: `run as non root` Kubernetes security context option (default: false)
|
||||
|
||||
**--backend-k8s-service-account-name-allow-from-step**: whether to allow using service account name from step's backend options (default: false)
|
||||
|
||||
**--backend-k8s-stop-timeout**="": seconds Woodpecker waits for pods to stop gracefully before forcefully killing them (default: 20)
|
||||
|
||||
**--backend-k8s-storage-class**="": backend k8s storage class
|
||||
@@ -313,6 +364,8 @@ execute a local pipeline
|
||||
|
||||
**--commit-message**="": Set the metadata environment variable "CI_COMMIT_MESSAGE".
|
||||
|
||||
**--commit-pull-draft**: Set the metadata environment variable "CI_COMMIT_PULL_REQUEST_DRAFT". (default: false)
|
||||
|
||||
**--commit-pull-labels**="": Set the metadata environment variable "CI_COMMIT_PULL_REQUEST_LABELS".
|
||||
|
||||
**--commit-pull-milestone**="": Set the metadata environment variable "CI_COMMIT_PULL_REQUEST_MILESTONE".
|
||||
@@ -321,10 +374,12 @@ execute a local pipeline
|
||||
|
||||
**--commit-refspec**="": Set the metadata environment variable "CI_COMMIT_REFSPEC".
|
||||
|
||||
**--commit-release-is-pre**: Set the metadata environment variable "CI_COMMIT_PRERELEASE". (default: false)
|
||||
**--commit-release-is-pre**: Set the metadata environment variable "CI_PIPELINE_RELEASE_PRE". (default: false)
|
||||
|
||||
**--commit-sha**="": Set the metadata environment variable "CI_COMMIT_SHA".
|
||||
|
||||
**--commit-timestamp**="": Set the metadata environment variable "CI_COMMIT_TIMESTAMP". (default: 0)
|
||||
|
||||
**--env**="": Set the metadata environment variable "CI_ENV".
|
||||
|
||||
**--forge-type**="": Set the metadata environment variable "CI_FORGE_TYPE".
|
||||
@@ -333,7 +388,7 @@ execute a local pipeline
|
||||
|
||||
**--local**: run from local directory (default: true)
|
||||
|
||||
**--metadata-file**="": path to pipeline metadata file (normally downloaded from UI). Parameters can be adjusted by applying additional cli flags
|
||||
**--metadata-file**="": path to pipeline metadata file (normally downloaded from UI). Parameters can be adjusted by applying additional cli flags. The metadata format is only expected to work with the same Woodpecker version it was downloaded from and is not intended to be portable between versions
|
||||
|
||||
**--netrc-machine**="":
|
||||
|
||||
@@ -357,6 +412,8 @@ execute a local pipeline
|
||||
|
||||
**--pipeline-parent**="": Set the metadata environment variable "CI_PIPELINE_PARENT". (default: 0)
|
||||
|
||||
**--pipeline-release**="": Set the metadata environment variable "CI_PIPELINE_RELEASE_TITLE".
|
||||
|
||||
**--pipeline-started**="": Set the metadata environment variable "CI_PIPELINE_STARTED". (default: 0)
|
||||
|
||||
**--pipeline-url**="": Set the metadata environment variable "CI_PIPELINE_FORGE_URL".
|
||||
@@ -373,6 +430,8 @@ execute a local pipeline
|
||||
|
||||
**--prev-commit-message**="": Set the metadata environment variable "CI_PREV_COMMIT_MESSAGE".
|
||||
|
||||
**--prev-commit-message**="": Set the metadata environment variable "CI_PREV_COMMIT_TIMESTAMP". (default: 0)
|
||||
|
||||
**--prev-commit-ref**="": Set the metadata environment variable "CI_PREV_COMMIT_REF".
|
||||
|
||||
**--prev-commit-refspec**="": Set the metadata environment variable "CI_PREV_COMMIT_REFSPEC".
|
||||
@@ -455,7 +514,7 @@ lint a pipeline configuration file
|
||||
|
||||
**--plugins-privileged**="": allow plugins to run in privileged mode, if set empty, there is no
|
||||
|
||||
**--plugins-trusted-clone**="": plugins that are trusted to handle Git credentials in cloning steps (default: "docker.io/woodpeckerci/plugin-git:2.9.0", "docker.io/woodpeckerci/plugin-git", "quay.io/woodpeckerci/plugin-git")
|
||||
**--plugins-trusted-clone**="": plugins that are trusted to handle Git credentials in cloning steps (default: "docker.io/woodpeckerci/plugin-git:2.9.2", "docker.io/woodpeckerci/plugin-git", "quay.io/woodpeckerci/plugin-git")
|
||||
|
||||
**--strict**: treat warnings as errors (default: false)
|
||||
|
||||
|
Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 7.5 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
@@ -81,15 +81,16 @@ digraph WoodpeckerArchitecture {
|
||||
fontcolor="black"
|
||||
style="rounded,filled"
|
||||
|
||||
srv_cmd [label="cmd/server/"]
|
||||
srv_router [label="server/router/"]
|
||||
srv_api [label="server/api/"]
|
||||
srv_grpc [label="server/rpc/"]
|
||||
srv_queue [label="server/queue/"]
|
||||
srv_pubsub [label="server/pubsub/"]
|
||||
srv_store [label="server/store/"]
|
||||
srv_model [label="server/model/"]
|
||||
srv_forge [label="server/forge/"]
|
||||
srv_cmd [label="cmd/server/"]
|
||||
srv_router [label="server/router/"]
|
||||
srv_api [label="server/api/"]
|
||||
srv_grpc [label="server/rpc/"]
|
||||
srv_scheduler [label="server/scheduler/"]
|
||||
srv_queue [label="server/queue/"]
|
||||
srv_pubsub [label="server/pubsub/"]
|
||||
srv_store [label="server/store/"]
|
||||
srv_model [label="server/model/"]
|
||||
srv_forge [label="server/forge/"]
|
||||
}
|
||||
|
||||
/* ===================== Shared Libs ===================== */
|
||||
@@ -137,13 +138,14 @@ digraph WoodpeckerArchitecture {
|
||||
pipe_core -> pipe_backend
|
||||
|
||||
/* Server internal flow */
|
||||
srv_cmd -> srv_router
|
||||
srv_router -> srv_api
|
||||
srv_api -> srv_store
|
||||
srv_api -> srv_pubsub
|
||||
srv_api -> srv_queue
|
||||
srv_grpc -> srv_queue
|
||||
srv_store -> srv_model
|
||||
srv_cmd -> srv_router
|
||||
srv_router -> srv_api
|
||||
srv_api -> srv_store
|
||||
srv_api -> srv_scheduler
|
||||
srv_grpc -> srv_scheduler
|
||||
srv_scheduler -> srv_queue
|
||||
srv_scheduler -> srv_pubsub
|
||||
srv_store -> srv_model
|
||||
|
||||
/* External integrations */
|
||||
srv_forge -> ext_scm [xlabel="SCM API"]
|
||||
@@ -0,0 +1,364 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<!-- Generated by graphviz version 12.2.1 (0)
|
||||
-->
|
||||
<!-- Title: WoodpeckerArchitecture Pages: 1 -->
|
||||
<svg width="1490pt" height="577pt"
|
||||
viewBox="0.00 0.00 1490.00 576.75" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 572.75)">
|
||||
<title>WoodpeckerArchitecture</title>
|
||||
<polygon fill="white" stroke="none" points="-4,4 -4,-572.75 1486,-572.75 1486,4 -4,4"/>
|
||||
<g id="clust1" class="cluster">
|
||||
<title>cluster_ui</title>
|
||||
<path fill="#c7efe9" stroke="black" d="M20,-391C20,-391 66,-391 66,-391 72,-391 78,-397 78,-403 78,-403 78,-454.75 78,-454.75 78,-460.75 72,-466.75 66,-466.75 66,-466.75 20,-466.75 20,-466.75 14,-466.75 8,-460.75 8,-454.75 8,-454.75 8,-403 8,-403 8,-397 14,-391 20,-391"/>
|
||||
<text text-anchor="middle" x="43" y="-449.45" font-family="Helvetica,sans-Serif" font-size="14.00">UI</text>
|
||||
</g>
|
||||
<g id="clust2" class="cluster">
|
||||
<title>cluster_sdk</title>
|
||||
<path fill="#e8f5e9" stroke="black" d="M1192,-295.25C1192,-295.25 1316,-295.25 1316,-295.25 1322,-295.25 1328,-301.25 1328,-307.25 1328,-307.25 1328,-359 1328,-359 1328,-365 1322,-371 1316,-371 1316,-371 1192,-371 1192,-371 1186,-371 1180,-365 1180,-359 1180,-359 1180,-307.25 1180,-307.25 1180,-301.25 1186,-295.25 1192,-295.25"/>
|
||||
<text text-anchor="middle" x="1254" y="-353.7" font-family="Helvetica,sans-Serif" font-size="14.00">SDK (woodpecker-go)</text>
|
||||
</g>
|
||||
<g id="clust3" class="cluster">
|
||||
<title>cluster_cli</title>
|
||||
<path fill="#bfe9e0" stroke="black" d="M1204,-391C1204,-391 1286,-391 1286,-391 1292,-391 1298,-397 1298,-403 1298,-403 1298,-548.75 1298,-548.75 1298,-554.75 1292,-560.75 1286,-560.75 1286,-560.75 1204,-560.75 1204,-560.75 1198,-560.75 1192,-554.75 1192,-548.75 1192,-548.75 1192,-403 1192,-403 1192,-397 1198,-391 1204,-391"/>
|
||||
<text text-anchor="middle" x="1245" y="-543.45" font-family="Helvetica,sans-Serif" font-size="14.00">woodpecker-cli</text>
|
||||
</g>
|
||||
<g id="clust4" class="cluster">
|
||||
<title>cluster_agent</title>
|
||||
<path fill="#ffe0c7" stroke="black" d="M1057,-295.25C1057,-295.25 1160,-295.25 1160,-295.25 1166,-295.25 1172,-301.25 1172,-307.25 1172,-307.25 1172,-454.75 1172,-454.75 1172,-460.75 1166,-466.75 1160,-466.75 1160,-466.75 1057,-466.75 1057,-466.75 1051,-466.75 1045,-460.75 1045,-454.75 1045,-454.75 1045,-307.25 1045,-307.25 1045,-301.25 1051,-295.25 1057,-295.25"/>
|
||||
<text text-anchor="middle" x="1108.5" y="-449.45" font-family="Helvetica,sans-Serif" font-size="14.00">woodpecker-agent</text>
|
||||
</g>
|
||||
<g id="clust5" class="cluster">
|
||||
<title>cluster_pipelines</title>
|
||||
<path fill="#ffe8d6" stroke="black" d="M1348,-102C1348,-102 1462,-102 1462,-102 1468,-102 1474,-108 1474,-114 1474,-114 1474,-360.75 1474,-360.75 1474,-366.75 1468,-372.75 1462,-372.75 1462,-372.75 1348,-372.75 1348,-372.75 1342,-372.75 1336,-366.75 1336,-360.75 1336,-360.75 1336,-114 1336,-114 1336,-108 1342,-102 1348,-102"/>
|
||||
<text text-anchor="middle" x="1405" y="-355.45" font-family="Helvetica,sans-Serif" font-size="14.00">Pipelines</text>
|
||||
</g>
|
||||
<g id="clust6" class="cluster">
|
||||
<title>cluster_server</title>
|
||||
<path fill="#dbe9ff" stroke="black" d="M98,-8C98,-8 464,-8 464,-8 470,-8 476,-14 476,-20 476,-20 476,-454.75 476,-454.75 476,-460.75 470,-466.75 464,-466.75 464,-466.75 98,-466.75 98,-466.75 92,-466.75 86,-460.75 86,-454.75 86,-454.75 86,-20 86,-20 86,-14 92,-8 98,-8"/>
|
||||
<text text-anchor="middle" x="281" y="-449.45" font-family="Helvetica,sans-Serif" font-size="14.00">woodpecker-server</text>
|
||||
</g>
|
||||
<g id="clust7" class="cluster">
|
||||
<title>cluster_shared</title>
|
||||
<path fill="#eeeeee" stroke="black" d="M496,-103.75C496,-103.75 982,-103.75 982,-103.75 988,-103.75 994,-109.75 994,-115.75 994,-115.75 994,-167.5 994,-167.5 994,-173.5 988,-179.5 982,-179.5 982,-179.5 496,-179.5 496,-179.5 490,-179.5 484,-173.5 484,-167.5 484,-167.5 484,-115.75 484,-115.75 484,-109.75 490,-103.75 496,-103.75"/>
|
||||
<text text-anchor="middle" x="739" y="-162.2" font-family="Helvetica,sans-Serif" font-size="14.00">Shared Libs</text>
|
||||
</g>
|
||||
<g id="clust8" class="cluster">
|
||||
<title>cluster_external</title>
|
||||
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M694,-8C694,-8 904,-8 904,-8 910,-8 916,-14 916,-20 916,-20 916,-71.75 916,-71.75 916,-77.75 910,-83.75 904,-83.75 904,-83.75 694,-83.75 694,-83.75 688,-83.75 682,-77.75 682,-71.75 682,-71.75 682,-20 682,-20 682,-14 688,-8 694,-8"/>
|
||||
<text text-anchor="middle" x="799" y="-66.45" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">External Systems</text>
|
||||
</g>
|
||||
<!-- ui_web -->
|
||||
<g id="node1" class="node">
|
||||
<title>ui_web</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M58,-435C58,-435 28,-435 28,-435 22,-435 16,-429 16,-423 16,-423 16,-411 16,-411 16,-405 22,-399 28,-399 28,-399 58,-399 58,-399 64,-399 70,-405 70,-411 70,-411 70,-423 70,-423 70,-429 64,-435 58,-435"/>
|
||||
<text text-anchor="middle" x="43" y="-411.57" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">web/</text>
|
||||
</g>
|
||||
<!-- srv_router -->
|
||||
<g id="node11" class="node">
|
||||
<title>srv_router</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M337.12,-339.25C337.12,-339.25 264.88,-339.25 264.88,-339.25 258.88,-339.25 252.88,-333.25 252.88,-327.25 252.88,-327.25 252.88,-315.25 252.88,-315.25 252.88,-309.25 258.88,-303.25 264.88,-303.25 264.88,-303.25 337.12,-303.25 337.12,-303.25 343.12,-303.25 349.12,-309.25 349.12,-315.25 349.12,-315.25 349.12,-327.25 349.12,-327.25 349.12,-333.25 343.12,-339.25 337.12,-339.25"/>
|
||||
<text text-anchor="middle" x="301" y="-315.82" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">server/router/</text>
|
||||
</g>
|
||||
<!-- ui_web->srv_router -->
|
||||
<g id="edge1" class="edge">
|
||||
<title>ui_web->srv_router</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M52,-398.94C52,-371.13 52,-321 52,-321 52,-321 243.89,-321 243.89,-321"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="243.89,-323.45 250.89,-321 243.89,-318.55 243.89,-323.45"/>
|
||||
<text text-anchor="middle" x="92.1" y="-324.2" font-family="Times,serif" font-size="14.00">HTTP</text>
|
||||
</g>
|
||||
<!-- srv_api -->
|
||||
<g id="node12" class="node">
|
||||
<title>srv_api</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M332.5,-243.5C332.5,-243.5 277.5,-243.5 277.5,-243.5 271.5,-243.5 265.5,-237.5 265.5,-231.5 265.5,-231.5 265.5,-219.5 265.5,-219.5 265.5,-213.5 271.5,-207.5 277.5,-207.5 277.5,-207.5 332.5,-207.5 332.5,-207.5 338.5,-207.5 344.5,-213.5 344.5,-219.5 344.5,-219.5 344.5,-231.5 344.5,-231.5 344.5,-237.5 338.5,-243.5 332.5,-243.5"/>
|
||||
<text text-anchor="middle" x="305" y="-220.07" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">server/api/</text>
|
||||
</g>
|
||||
<!-- ui_web->srv_api -->
|
||||
<g id="edge2" class="edge">
|
||||
<title>ui_web->srv_api</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M34,-398.69C34,-350.88 34,-226 34,-226 34,-226 256.5,-226 256.5,-226"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="256.5,-228.45 263.5,-226 256.5,-223.55 256.5,-228.45"/>
|
||||
<text text-anchor="middle" x="30.03" y="-229.2" font-family="Times,serif" font-size="14.00">REST API</text>
|
||||
</g>
|
||||
<!-- sdk -->
|
||||
<g id="node2" class="node">
|
||||
<title>sdk</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M1284.12,-339.25C1284.12,-339.25 1199.88,-339.25 1199.88,-339.25 1193.88,-339.25 1187.88,-333.25 1187.88,-327.25 1187.88,-327.25 1187.88,-315.25 1187.88,-315.25 1187.88,-309.25 1193.88,-303.25 1199.88,-303.25 1199.88,-303.25 1284.12,-303.25 1284.12,-303.25 1290.12,-303.25 1296.12,-309.25 1296.12,-315.25 1296.12,-315.25 1296.12,-327.25 1296.12,-327.25 1296.12,-333.25 1290.12,-339.25 1284.12,-339.25"/>
|
||||
<text text-anchor="middle" x="1242" y="-315.82" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">woodpecker-go</text>
|
||||
</g>
|
||||
<!-- sdk->srv_api -->
|
||||
<g id="edge5" class="edge">
|
||||
<title>sdk->srv_api</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M1242,-303.01C1242,-289.35 1242,-273 1242,-273 1242,-273 318.17,-273 318.17,-273 318.17,-273 318.17,-252.24 318.17,-252.24"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="320.62,-252.24 318.17,-245.24 315.72,-252.24 320.62,-252.24"/>
|
||||
<text text-anchor="middle" x="755.83" y="-276.2" font-family="Times,serif" font-size="14.00">REST API</text>
|
||||
</g>
|
||||
<!-- cli_cmd -->
|
||||
<g id="node3" class="node">
|
||||
<title>cli_cmd</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M1261.25,-529C1261.25,-529 1222.75,-529 1222.75,-529 1216.75,-529 1210.75,-523 1210.75,-517 1210.75,-517 1210.75,-505 1210.75,-505 1210.75,-499 1216.75,-493 1222.75,-493 1222.75,-493 1261.25,-493 1261.25,-493 1267.25,-493 1273.25,-499 1273.25,-505 1273.25,-505 1273.25,-517 1273.25,-517 1273.25,-523 1267.25,-529 1261.25,-529"/>
|
||||
<text text-anchor="middle" x="1242" y="-505.57" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">cmd/cli/</text>
|
||||
</g>
|
||||
<!-- cli_core -->
|
||||
<g id="node4" class="node">
|
||||
<title>cli_core</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M1257,-435C1257,-435 1227,-435 1227,-435 1221,-435 1215,-429 1215,-423 1215,-423 1215,-411 1215,-411 1215,-405 1221,-399 1227,-399 1227,-399 1257,-399 1257,-399 1263,-399 1269,-405 1269,-411 1269,-411 1269,-423 1269,-423 1269,-429 1263,-435 1257,-435"/>
|
||||
<text text-anchor="middle" x="1242" y="-411.57" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">cli/</text>
|
||||
</g>
|
||||
<!-- cli_cmd->cli_core -->
|
||||
<g id="edge3" class="edge">
|
||||
<title>cli_cmd->cli_core</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M1242,-492.88C1242,-492.88 1242,-443.9 1242,-443.9"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="1244.45,-443.9 1242,-436.9 1239.55,-443.9 1244.45,-443.9"/>
|
||||
</g>
|
||||
<!-- cli_core->sdk -->
|
||||
<g id="edge4" class="edge">
|
||||
<title>cli_core->sdk</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M1242,-398.54C1242,-398.54 1242,-348.17 1242,-348.17"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="1244.45,-348.17 1242,-341.17 1239.55,-348.17 1244.45,-348.17"/>
|
||||
</g>
|
||||
<!-- agent_cmd -->
|
||||
<g id="node5" class="node">
|
||||
<title>agent_cmd</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M1144.75,-435C1144.75,-435 1085.25,-435 1085.25,-435 1079.25,-435 1073.25,-429 1073.25,-423 1073.25,-423 1073.25,-411 1073.25,-411 1073.25,-405 1079.25,-399 1085.25,-399 1085.25,-399 1144.75,-399 1144.75,-399 1150.75,-399 1156.75,-405 1156.75,-411 1156.75,-411 1156.75,-423 1156.75,-423 1156.75,-429 1150.75,-435 1144.75,-435"/>
|
||||
<text text-anchor="middle" x="1115" y="-411.57" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">cmd/agent/</text>
|
||||
</g>
|
||||
<!-- agent_core -->
|
||||
<g id="node6" class="node">
|
||||
<title>agent_core</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M1130,-339.25C1130,-339.25 1100,-339.25 1100,-339.25 1094,-339.25 1088,-333.25 1088,-327.25 1088,-327.25 1088,-315.25 1088,-315.25 1088,-309.25 1094,-303.25 1100,-303.25 1100,-303.25 1130,-303.25 1130,-303.25 1136,-303.25 1142,-309.25 1142,-315.25 1142,-315.25 1142,-327.25 1142,-327.25 1142,-333.25 1136,-339.25 1130,-339.25"/>
|
||||
<text text-anchor="middle" x="1115" y="-315.82" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">agent/</text>
|
||||
</g>
|
||||
<!-- agent_cmd->agent_core -->
|
||||
<g id="edge6" class="edge">
|
||||
<title>agent_cmd->agent_core</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M1115,-398.54C1115,-398.54 1115,-348.17 1115,-348.17"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="1117.45,-348.17 1115,-341.17 1112.55,-348.17 1117.45,-348.17"/>
|
||||
</g>
|
||||
<!-- pipe_backend -->
|
||||
<g id="node9" class="node">
|
||||
<title>pipe_backend</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M1453.5,-149.5C1453.5,-149.5 1356.5,-149.5 1356.5,-149.5 1350.5,-149.5 1344.5,-143.5 1344.5,-137.5 1344.5,-137.5 1344.5,-122 1344.5,-122 1344.5,-116 1350.5,-110 1356.5,-110 1356.5,-110 1453.5,-110 1453.5,-110 1459.5,-110 1465.5,-116 1465.5,-122 1465.5,-122 1465.5,-137.5 1465.5,-137.5 1465.5,-143.5 1459.5,-149.5 1453.5,-149.5"/>
|
||||
<text text-anchor="middle" x="1405" y="-132.2" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">pipeline/backend/</text>
|
||||
<text text-anchor="middle" x="1405" y="-116.45" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">(exec engines)</text>
|
||||
</g>
|
||||
<!-- agent_core->pipe_backend -->
|
||||
<g id="edge9" class="edge">
|
||||
<title>agent_core->pipe_backend</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M1128.5,-302.91C1128.5,-255.04 1128.5,-130 1128.5,-130 1128.5,-130 1335.81,-130 1335.81,-130"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="1335.81,-132.45 1342.81,-130 1335.81,-127.55 1335.81,-132.45"/>
|
||||
<text text-anchor="middle" x="1109.7" y="-133.2" font-family="Times,serif" font-size="14.00">execute steps</text>
|
||||
</g>
|
||||
<!-- srv_grpc -->
|
||||
<g id="node13" class="node">
|
||||
<title>srv_grpc</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M455.88,-243.5C455.88,-243.5 400.12,-243.5 400.12,-243.5 394.12,-243.5 388.12,-237.5 388.12,-231.5 388.12,-231.5 388.12,-219.5 388.12,-219.5 388.12,-213.5 394.12,-207.5 400.12,-207.5 400.12,-207.5 455.88,-207.5 455.88,-207.5 461.88,-207.5 467.88,-213.5 467.88,-219.5 467.88,-219.5 467.88,-231.5 467.88,-231.5 467.88,-237.5 461.88,-243.5 455.88,-243.5"/>
|
||||
<text text-anchor="middle" x="428" y="-220.07" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">server/rpc/</text>
|
||||
</g>
|
||||
<!-- agent_core->srv_grpc -->
|
||||
<g id="edge7" class="edge">
|
||||
<title>agent_core->srv_grpc</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M1101.5,-302.96C1101.5,-277.64 1101.5,-235 1101.5,-235 1101.5,-235 476.88,-235 476.88,-235"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="476.88,-232.55 469.88,-235 476.88,-237.45 476.88,-232.55"/>
|
||||
<text text-anchor="middle" x="784.17" y="-238.2" font-family="Times,serif" font-size="14.00">gRPC connect</text>
|
||||
</g>
|
||||
<!-- srv_queue -->
|
||||
<g id="node15" class="node">
|
||||
<title>srv_queue</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M456.25,-52C456.25,-52 381.75,-52 381.75,-52 375.75,-52 369.75,-46 369.75,-40 369.75,-40 369.75,-28 369.75,-28 369.75,-22 375.75,-16 381.75,-16 381.75,-16 456.25,-16 456.25,-16 462.25,-16 468.25,-22 468.25,-28 468.25,-28 468.25,-40 468.25,-40 468.25,-46 462.25,-52 456.25,-52"/>
|
||||
<text text-anchor="middle" x="419" y="-28.57" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">server/queue/</text>
|
||||
</g>
|
||||
<!-- agent_core->srv_queue -->
|
||||
<g id="edge8" class="edge">
|
||||
<title>agent_core->srv_queue</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M1115,-302.8C1115,-248.16 1115,-91 1115,-91 1115,-91 461.81,-91 461.81,-91 461.81,-91 461.81,-60.86 461.81,-60.86"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="464.26,-60.86 461.81,-53.86 459.36,-60.86 464.26,-60.86"/>
|
||||
<text text-anchor="middle" x="852.99" y="-94.2" font-family="Times,serif" font-size="14.00">poll work</text>
|
||||
</g>
|
||||
<!-- pipe_core -->
|
||||
<g id="node7" class="node">
|
||||
<title>pipe_core</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M1425.12,-243.5C1425.12,-243.5 1382.88,-243.5 1382.88,-243.5 1376.88,-243.5 1370.88,-237.5 1370.88,-231.5 1370.88,-231.5 1370.88,-219.5 1370.88,-219.5 1370.88,-213.5 1376.88,-207.5 1382.88,-207.5 1382.88,-207.5 1425.12,-207.5 1425.12,-207.5 1431.12,-207.5 1437.12,-213.5 1437.12,-219.5 1437.12,-219.5 1437.12,-231.5 1437.12,-231.5 1437.12,-237.5 1431.12,-243.5 1425.12,-243.5"/>
|
||||
<text text-anchor="middle" x="1404" y="-220.07" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">pipeline/</text>
|
||||
</g>
|
||||
<!-- pipe_core->pipe_backend -->
|
||||
<g id="edge11" class="edge">
|
||||
<title>pipe_core->pipe_backend</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M1404,-207.04C1404,-207.04 1404,-158.32 1404,-158.32"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="1406.45,-158.32 1404,-151.32 1401.55,-158.32 1406.45,-158.32"/>
|
||||
</g>
|
||||
<!-- shared_util -->
|
||||
<g id="node20" class="node">
|
||||
<title>shared_util</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M974,-147.75C974,-147.75 916,-147.75 916,-147.75 910,-147.75 904,-141.75 904,-135.75 904,-135.75 904,-123.75 904,-123.75 904,-117.75 910,-111.75 916,-111.75 916,-111.75 974,-111.75 974,-111.75 980,-111.75 986,-117.75 986,-123.75 986,-123.75 986,-135.75 986,-135.75 986,-141.75 980,-147.75 974,-147.75"/>
|
||||
<text text-anchor="middle" x="945" y="-124.33" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">shared/util/</text>
|
||||
</g>
|
||||
<!-- pipe_core->shared_util -->
|
||||
<g id="edge25" class="edge">
|
||||
<title>pipe_core->shared_util</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M1370.62,-226C1265,-226 945,-226 945,-226 945,-226 945,-156.37 945,-156.37"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="947.45,-156.37 945,-149.37 942.55,-156.37 947.45,-156.37"/>
|
||||
</g>
|
||||
<!-- pipe_frontend -->
|
||||
<g id="node8" class="node">
|
||||
<title>pipe_frontend</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M1451.75,-341C1451.75,-341 1356.25,-341 1356.25,-341 1350.25,-341 1344.25,-335 1344.25,-329 1344.25,-329 1344.25,-313.5 1344.25,-313.5 1344.25,-307.5 1350.25,-301.5 1356.25,-301.5 1356.25,-301.5 1451.75,-301.5 1451.75,-301.5 1457.75,-301.5 1463.75,-307.5 1463.75,-313.5 1463.75,-313.5 1463.75,-329 1463.75,-329 1463.75,-335 1457.75,-341 1451.75,-341"/>
|
||||
<text text-anchor="middle" x="1404" y="-323.7" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">pipeline/frontend/</text>
|
||||
<text text-anchor="middle" x="1404" y="-307.95" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">(yaml)</text>
|
||||
</g>
|
||||
<!-- pipe_frontend->pipe_core -->
|
||||
<g id="edge10" class="edge">
|
||||
<title>pipe_frontend->pipe_core</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M1404,-301.41C1404,-301.41 1404,-252.21 1404,-252.21"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="1406.45,-252.21 1404,-245.21 1401.55,-252.21 1406.45,-252.21"/>
|
||||
</g>
|
||||
<!-- srv_cmd -->
|
||||
<g id="node10" class="node">
|
||||
<title>srv_cmd</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M327.62,-435C327.62,-435 264.38,-435 264.38,-435 258.38,-435 252.38,-429 252.38,-423 252.38,-423 252.38,-411 252.38,-411 252.38,-405 258.38,-399 264.38,-399 264.38,-399 327.62,-399 327.62,-399 333.62,-399 339.62,-405 339.62,-411 339.62,-411 339.62,-423 339.62,-423 339.62,-429 333.62,-435 327.62,-435"/>
|
||||
<text text-anchor="middle" x="296" y="-411.57" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">cmd/server/</text>
|
||||
</g>
|
||||
<!-- srv_cmd->srv_router -->
|
||||
<g id="edge12" class="edge">
|
||||
<title>srv_cmd->srv_router</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M296.25,-398.54C296.25,-398.54 296.25,-348.17 296.25,-348.17"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="298.7,-348.17 296.25,-341.17 293.8,-348.17 298.7,-348.17"/>
|
||||
</g>
|
||||
<!-- srv_router->srv_api -->
|
||||
<g id="edge13" class="edge">
|
||||
<title>srv_router->srv_api</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M291.83,-302.79C291.83,-302.79 291.83,-252.42 291.83,-252.42"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="294.28,-252.42 291.83,-245.42 289.38,-252.42 294.28,-252.42"/>
|
||||
</g>
|
||||
<!-- shared_token -->
|
||||
<g id="node21" class="node">
|
||||
<title>shared_token</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M855.88,-147.75C855.88,-147.75 782.12,-147.75 782.12,-147.75 776.12,-147.75 770.12,-141.75 770.12,-135.75 770.12,-135.75 770.12,-123.75 770.12,-123.75 770.12,-117.75 776.12,-111.75 782.12,-111.75 782.12,-111.75 855.88,-111.75 855.88,-111.75 861.88,-111.75 867.88,-117.75 867.88,-123.75 867.88,-123.75 867.88,-135.75 867.88,-135.75 867.88,-141.75 861.88,-147.75 855.88,-147.75"/>
|
||||
<text text-anchor="middle" x="819" y="-124.33" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">shared/token/</text>
|
||||
</g>
|
||||
<!-- srv_router->shared_token -->
|
||||
<g id="edge22" class="edge">
|
||||
<title>srv_router->shared_token</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M349.27,-321C477.86,-321 819,-321 819,-321 819,-321 819,-156.6 819,-156.6"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="821.45,-156.6 819,-149.6 816.55,-156.6 821.45,-156.6"/>
|
||||
</g>
|
||||
<!-- srv_scheduler -->
|
||||
<g id="node14" class="node">
|
||||
<title>srv_scheduler</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M443.75,-147.75C443.75,-147.75 348.25,-147.75 348.25,-147.75 342.25,-147.75 336.25,-141.75 336.25,-135.75 336.25,-135.75 336.25,-123.75 336.25,-123.75 336.25,-117.75 342.25,-111.75 348.25,-111.75 348.25,-111.75 443.75,-111.75 443.75,-111.75 449.75,-111.75 455.75,-117.75 455.75,-123.75 455.75,-123.75 455.75,-135.75 455.75,-135.75 455.75,-141.75 449.75,-147.75 443.75,-147.75"/>
|
||||
<text text-anchor="middle" x="396" y="-124.33" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">server/scheduler/</text>
|
||||
</g>
|
||||
<!-- srv_api->srv_scheduler -->
|
||||
<g id="edge15" class="edge">
|
||||
<title>srv_api->srv_scheduler</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M341.75,-207.04C341.75,-207.04 341.75,-156.67 341.75,-156.67"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="344.2,-156.67 341.75,-149.67 339.3,-156.67 344.2,-156.67"/>
|
||||
</g>
|
||||
<!-- srv_store -->
|
||||
<g id="node17" class="node">
|
||||
<title>srv_store</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M288.5,-147.75C288.5,-147.75 221.5,-147.75 221.5,-147.75 215.5,-147.75 209.5,-141.75 209.5,-135.75 209.5,-135.75 209.5,-123.75 209.5,-123.75 209.5,-117.75 215.5,-111.75 221.5,-111.75 221.5,-111.75 288.5,-111.75 288.5,-111.75 294.5,-111.75 300.5,-117.75 300.5,-123.75 300.5,-123.75 300.5,-135.75 300.5,-135.75 300.5,-141.75 294.5,-147.75 288.5,-147.75"/>
|
||||
<text text-anchor="middle" x="255" y="-124.33" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">server/store/</text>
|
||||
</g>
|
||||
<!-- srv_api->srv_store -->
|
||||
<g id="edge14" class="edge">
|
||||
<title>srv_api->srv_store</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M283,-207.04C283,-207.04 283,-156.67 283,-156.67"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="285.45,-156.67 283,-149.67 280.55,-156.67 285.45,-156.67"/>
|
||||
</g>
|
||||
<!-- shared_http -->
|
||||
<g id="node22" class="node">
|
||||
<title>shared_http</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M584.25,-147.75C584.25,-147.75 503.75,-147.75 503.75,-147.75 497.75,-147.75 491.75,-141.75 491.75,-135.75 491.75,-135.75 491.75,-123.75 491.75,-123.75 491.75,-117.75 497.75,-111.75 503.75,-111.75 503.75,-111.75 584.25,-111.75 584.25,-111.75 590.25,-111.75 596.25,-117.75 596.25,-123.75 596.25,-123.75 596.25,-135.75 596.25,-135.75 596.25,-141.75 590.25,-147.75 584.25,-147.75"/>
|
||||
<text text-anchor="middle" x="544" y="-124.33" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">shared/httputil/</text>
|
||||
</g>
|
||||
<!-- srv_api->shared_http -->
|
||||
<g id="edge23" class="edge">
|
||||
<title>srv_api->shared_http</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M339,-207.12C339,-194.12 339,-179 339,-179 339,-179 544,-179 544,-179 544,-179 544,-156.6 544,-156.6"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="546.45,-156.6 544,-149.6 541.55,-156.6 546.45,-156.6"/>
|
||||
</g>
|
||||
<!-- srv_grpc->srv_scheduler -->
|
||||
<g id="edge16" class="edge">
|
||||
<title>srv_grpc->srv_scheduler</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M421.94,-207.04C421.94,-207.04 421.94,-156.67 421.94,-156.67"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="424.39,-156.67 421.94,-149.67 419.49,-156.67 424.39,-156.67"/>
|
||||
</g>
|
||||
<!-- shared_log -->
|
||||
<g id="node23" class="node">
|
||||
<title>shared_log</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M722.12,-147.75C722.12,-147.75 643.88,-147.75 643.88,-147.75 637.88,-147.75 631.88,-141.75 631.88,-135.75 631.88,-135.75 631.88,-123.75 631.88,-123.75 631.88,-117.75 637.88,-111.75 643.88,-111.75 643.88,-111.75 722.12,-111.75 722.12,-111.75 728.12,-111.75 734.12,-117.75 734.12,-123.75 734.12,-123.75 734.12,-135.75 734.12,-135.75 734.12,-141.75 728.12,-147.75 722.12,-147.75"/>
|
||||
<text text-anchor="middle" x="683" y="-124.33" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">shared/logger/</text>
|
||||
</g>
|
||||
<!-- srv_grpc->shared_log -->
|
||||
<g id="edge24" class="edge">
|
||||
<title>srv_grpc->shared_log</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M468.12,-217C539.94,-217 683,-217 683,-217 683,-217 683,-156.34 683,-156.34"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="685.45,-156.34 683,-149.34 680.55,-156.34 685.45,-156.34"/>
|
||||
</g>
|
||||
<!-- srv_scheduler->srv_queue -->
|
||||
<g id="edge17" class="edge">
|
||||
<title>srv_scheduler->srv_queue</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M412.75,-111.29C412.75,-111.29 412.75,-60.92 412.75,-60.92"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="415.2,-60.92 412.75,-53.92 410.3,-60.92 415.2,-60.92"/>
|
||||
</g>
|
||||
<!-- srv_pubsub -->
|
||||
<g id="node16" class="node">
|
||||
<title>srv_pubsub</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M321.62,-52C321.62,-52 240.38,-52 240.38,-52 234.38,-52 228.38,-46 228.38,-40 228.38,-40 228.38,-28 228.38,-28 228.38,-22 234.38,-16 240.38,-16 240.38,-16 321.62,-16 321.62,-16 327.62,-16 333.62,-22 333.62,-28 333.62,-28 333.62,-40 333.62,-40 333.62,-46 327.62,-52 321.62,-52"/>
|
||||
<text text-anchor="middle" x="281" y="-28.57" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">server/pubsub/</text>
|
||||
</g>
|
||||
<!-- srv_scheduler->srv_pubsub -->
|
||||
<g id="edge18" class="edge">
|
||||
<title>srv_scheduler->srv_pubsub</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M335.77,-130C324.97,-130 317.06,-130 317.06,-130 317.06,-130 317.06,-60.57 317.06,-60.57"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="319.51,-60.57 317.06,-53.57 314.61,-60.57 319.51,-60.57"/>
|
||||
</g>
|
||||
<!-- srv_model -->
|
||||
<g id="node18" class="node">
|
||||
<title>srv_model</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M180.25,-52C180.25,-52 105.75,-52 105.75,-52 99.75,-52 93.75,-46 93.75,-40 93.75,-40 93.75,-28 93.75,-28 93.75,-22 99.75,-16 105.75,-16 105.75,-16 180.25,-16 180.25,-16 186.25,-16 192.25,-22 192.25,-28 192.25,-28 192.25,-40 192.25,-40 192.25,-46 186.25,-52 180.25,-52"/>
|
||||
<text text-anchor="middle" x="143" y="-28.57" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">server/model/</text>
|
||||
</g>
|
||||
<!-- srv_store->srv_model -->
|
||||
<g id="edge19" class="edge">
|
||||
<title>srv_store->srv_model</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M218.94,-111.29C218.94,-83.46 218.94,-34 218.94,-34 218.94,-34 200.89,-34 200.89,-34"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="200.89,-31.55 193.89,-34 200.89,-36.45 200.89,-31.55"/>
|
||||
</g>
|
||||
<!-- ext_db -->
|
||||
<g id="node25" class="node">
|
||||
<title>ext_db</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M763.88,-48.73C763.88,-50.53 747.35,-52 727,-52 706.65,-52 690.12,-50.53 690.12,-48.73 690.12,-48.73 690.12,-19.27 690.12,-19.27 690.12,-17.47 706.65,-16 727,-16 747.35,-16 763.88,-17.47 763.88,-19.27 763.88,-19.27 763.88,-48.73 763.88,-48.73"/>
|
||||
<path fill="none" stroke="black" d="M763.88,-48.73C763.88,-46.92 747.35,-45.45 727,-45.45 706.65,-45.45 690.12,-46.92 690.12,-48.73"/>
|
||||
<text text-anchor="middle" x="727" y="-28.57" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">Database</text>
|
||||
</g>
|
||||
<!-- srv_store->ext_db -->
|
||||
<g id="edge21" class="edge">
|
||||
<title>srv_store->ext_db</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M264.44,-111.48C264.44,-94.24 264.44,-71 264.44,-71 264.44,-71 712.12,-71 712.12,-71 712.12,-71 712.12,-61.01 712.12,-61.01"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="714.58,-61.01 712.13,-54.01 709.68,-61.01 714.58,-61.01"/>
|
||||
<text text-anchor="middle" x="460.28" y="-74.2" font-family="Times,serif" font-size="14.00">SQL</text>
|
||||
</g>
|
||||
<!-- srv_forge -->
|
||||
<g id="node19" class="node">
|
||||
<title>srv_forge</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M455.88,-435C455.88,-435 388.12,-435 388.12,-435 382.12,-435 376.12,-429 376.12,-423 376.12,-423 376.12,-411 376.12,-411 376.12,-405 382.12,-399 388.12,-399 388.12,-399 455.88,-399 455.88,-399 461.88,-399 467.88,-405 467.88,-411 467.88,-411 467.88,-423 467.88,-423 467.88,-429 461.88,-435 455.88,-435"/>
|
||||
<text text-anchor="middle" x="422" y="-411.57" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">server/forge/</text>
|
||||
</g>
|
||||
<!-- ext_scm -->
|
||||
<g id="node24" class="node">
|
||||
<title>ext_scm</title>
|
||||
<path fill="#2b2b2b" stroke="black" d="M895.75,-52C895.75,-52 812.25,-52 812.25,-52 806.25,-52 800.25,-46 800.25,-40 800.25,-40 800.25,-28 800.25,-28 800.25,-22 806.25,-16 812.25,-16 812.25,-16 895.75,-16 895.75,-16 901.75,-16 907.75,-22 907.75,-28 907.75,-28 907.75,-40 907.75,-40 907.75,-46 901.75,-52 895.75,-52"/>
|
||||
<text text-anchor="middle" x="854" y="-28.57" font-family="Helvetica,sans-Serif" font-size="14.00" fill="white">SCM Providers</text>
|
||||
</g>
|
||||
<!-- srv_forge->ext_scm -->
|
||||
<g id="edge20" class="edge">
|
||||
<title>srv_forge->ext_scm</title>
|
||||
<path fill="none" stroke="#bdbdbd" d="M468.18,-417C585.53,-417 885.94,-417 885.94,-417 885.94,-417 885.94,-60.99 885.94,-60.99"/>
|
||||
<polygon fill="#bdbdbd" stroke="#bdbdbd" points="888.39,-60.99 885.94,-53.99 883.49,-60.99 888.39,-60.99"/>
|
||||
<text text-anchor="middle" x="828.07" y="-420.2" font-family="Times,serif" font-size="14.00">SCM API</text>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 28 KiB |
@@ -1 +1 @@
|
||||
["3.16", "3.15", "3.14", "2.8"]
|
||||
["3.17", "3.16", "3.15", "2.8"]
|
||||
|
||||