Full Code of laszlocph/woodpecker for AI

main f36a8272be5e cached
1510 files
7.4 MB
2.0M tokens
5948 symbols
1 requests
Download .txt
Showing preview only (8,103K chars total). Download the full file or copy to clipboard to get everything.
Repository: laszlocph/woodpecker
Branch: main
Commit: f36a8272be5e
Files: 1510
Total size: 7.4 MB

Directory structure:
gitextract_g04cg062/

├── .cspell.json
├── .ecrc
├── .editorconfig
├── .gitattributes
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yaml
│   │   ├── config.yml
│   │   └── feature_request.yaml
│   ├── pull_request_template.md
│   ├── release_template.md
│   └── renovate.json
├── .gitignore
├── .gitpod.yml
├── .golangci.yaml
├── .hadolint.yaml
├── .lycheeignore
├── .markdownlint.yaml
├── .mockery.yaml
├── .pre-commit-config.yaml
├── .prettierignore
├── .prettierrc.json
├── .vscode/
│   ├── extensions.json
│   ├── launch.json
│   └── settings.json
├── .woodpecker/
│   ├── binaries.yaml
│   ├── check-feature-docs.sh
│   ├── docker.yaml
│   ├── docs.yaml
│   ├── links.yaml
│   ├── release-helper.yaml
│   ├── securityscan.yaml
│   ├── social.yaml
│   ├── static.yaml
│   ├── test.yaml
│   └── web.yaml
├── .yamllint.yaml
├── CHANGELOG.md
├── LICENSE
├── Makefile
├── README.md
├── agent/
│   ├── log/
│   │   ├── line_writer.go
│   │   └── line_writer_test.go
│   ├── logger.go
│   ├── rpc/
│   │   ├── auth_client_grpc.go
│   │   ├── auth_client_grpc_test.go
│   │   ├── auth_interceptor.go
│   │   └── client_grpc.go
│   ├── runner.go
│   ├── state.go
│   └── tracer.go
├── checkmake.ini
├── cli/
│   ├── README.md
│   ├── admin/
│   │   ├── admin.go
│   │   ├── loglevel/
│   │   │   └── loglevel.go
│   │   ├── org/
│   │   │   └── org_list.go
│   │   ├── registry/
│   │   │   ├── registry.go
│   │   │   ├── registry_add.go
│   │   │   ├── registry_list.go
│   │   │   ├── registry_rm.go
│   │   │   ├── registry_set.go
│   │   │   └── registry_show.go
│   │   ├── secret/
│   │   │   ├── secret.go
│   │   │   ├── secret_add.go
│   │   │   ├── secret_list.go
│   │   │   ├── secret_rm.go
│   │   │   ├── secret_set.go
│   │   │   └── secret_show.go
│   │   └── user/
│   │       ├── user.go
│   │       ├── user_add.go
│   │       ├── user_list.go
│   │       ├── user_rm.go
│   │       └── user_show.go
│   ├── common/
│   │   ├── flags.go
│   │   ├── hooks.go
│   │   ├── pipeline.go
│   │   └── zerologger.go
│   ├── context/
│   │   └── context.go
│   ├── exec/
│   │   ├── dummy.go
│   │   ├── exec.go
│   │   ├── flags.go
│   │   ├── line.go
│   │   ├── metadata.go
│   │   └── metadata_test.go
│   ├── info/
│   │   └── info.go
│   ├── internal/
│   │   ├── config/
│   │   │   ├── config.go
│   │   │   ├── config_test.go
│   │   │   ├── context.go
│   │   │   └── context_test.go
│   │   ├── util.go
│   │   └── util_test.go
│   ├── lint/
│   │   ├── lint.go
│   │   └── utils.go
│   ├── org/
│   │   ├── org.go
│   │   ├── registry/
│   │   │   ├── registry.go
│   │   │   ├── registry_add.go
│   │   │   ├── registry_list.go
│   │   │   ├── registry_rm.go
│   │   │   ├── registry_set.go
│   │   │   └── registry_show.go
│   │   └── secret/
│   │       ├── secret.go
│   │       ├── secret_add.go
│   │       ├── secret_list.go
│   │       ├── secret_rm.go
│   │       ├── secret_set.go
│   │       └── secret_show.go
│   ├── output/
│   │   ├── output.go
│   │   ├── output_test.go
│   │   ├── table.go
│   │   └── table_test.go
│   ├── pipeline/
│   │   ├── approve.go
│   │   ├── create.go
│   │   ├── decline.go
│   │   ├── deploy/
│   │   │   └── deploy.go
│   │   ├── kill.go
│   │   ├── last.go
│   │   ├── list.go
│   │   ├── list_test.go
│   │   ├── log/
│   │   │   ├── log.go
│   │   │   ├── log_purge.go
│   │   │   └── log_show.go
│   │   ├── pipeline.go
│   │   ├── pipeline_test.go
│   │   ├── ps.go
│   │   ├── purge.go
│   │   ├── purge_test.go
│   │   ├── queue.go
│   │   ├── show.go
│   │   ├── start.go
│   │   └── stop.go
│   ├── repo/
│   │   ├── cron/
│   │   │   ├── cron.go
│   │   │   ├── cron_add.go
│   │   │   ├── cron_list.go
│   │   │   ├── cron_rm.go
│   │   │   ├── cron_show.go
│   │   │   └── cron_update.go
│   │   ├── registry/
│   │   │   ├── registry.go
│   │   │   ├── registry_add.go
│   │   │   ├── registry_list.go
│   │   │   ├── registry_rm.go
│   │   │   ├── registry_set.go
│   │   │   └── registry_show.go
│   │   ├── repo.go
│   │   ├── repo_add.go
│   │   ├── repo_chown.go
│   │   ├── repo_list.go
│   │   ├── repo_repair.go
│   │   ├── repo_rm.go
│   │   ├── repo_show.go
│   │   ├── repo_show_test.go
│   │   ├── repo_sync.go
│   │   ├── repo_test.go
│   │   ├── repo_update.go
│   │   └── secret/
│   │       ├── secret.go
│   │       ├── secret_add.go
│   │       ├── secret_list.go
│   │       ├── secret_rm.go
│   │       ├── secret_set.go
│   │       └── secret_show.go
│   ├── setup/
│   │   ├── setup.go
│   │   ├── token_fetcher.go
│   │   └── ui/
│   │       ├── ask.go
│   │       └── confirm.go
│   └── update/
│       ├── command.go
│       ├── tar.go
│       ├── types.go
│       ├── updater.go
│       └── updater_test.go
├── cmd/
│   ├── agent/
│   │   ├── core/
│   │   │   ├── agent.go
│   │   │   ├── agent_test.go
│   │   │   ├── config.go
│   │   │   ├── config_test.go
│   │   │   ├── flags.go
│   │   │   ├── health.go
│   │   │   ├── health_test.go
│   │   │   └── run.go
│   │   ├── dummy.go
│   │   ├── main.go
│   │   └── man.go
│   ├── cli/
│   │   ├── app.go
│   │   ├── docs.go
│   │   ├── main.go
│   │   └── man.go
│   └── server/
│       ├── app.go
│       ├── flags.go
│       ├── grpc_server.go
│       ├── health.go
│       ├── main.go
│       ├── man.go
│       ├── metrics_server.go
│       ├── openapi/
│       │   └── docs.go
│       ├── openapi.go
│       ├── openapi_json_gen.go
│       ├── openapi_test.go
│       ├── server.go
│       └── setup.go
├── codecov.yaml
├── contrib/
│   └── woodpecker-test-repo/
│       └── .woodpecker/
│           ├── demo.yaml
│           └── test.yaml
├── docker/
│   ├── Dockerfile.agent.alpine.multiarch
│   ├── Dockerfile.agent.multiarch
│   ├── Dockerfile.cli.alpine.multiarch.rootless
│   ├── Dockerfile.cli.multiarch.rootless
│   ├── Dockerfile.make
│   ├── Dockerfile.server.alpine.multiarch.rootless
│   └── Dockerfile.server.multiarch.rootless
├── docker-compose.example.yaml
├── docker-compose.gitpod.yaml
├── docs/
│   ├── .gitignore
│   ├── .prettierignore
│   ├── .prettierrc.js
│   ├── LICENSE
│   ├── README.md
│   ├── blog/
│   │   ├── 2023-06-11-hello-blog/
│   │   │   └── index.md
│   │   ├── 2023-07-28-release-v1.0.0/
│   │   │   └── index.md
│   │   ├── 2023-11-09-release-v2.0.0/
│   │   │   └── index.md
│   │   ├── 2023-12-12-podman-image-builds/
│   │   │   └── index.md
│   │   ├── 2023-12-13-debug-pipeline-steps/
│   │   │   └── index.md
│   │   ├── 2023-12-15-podman-sigstore/
│   │   │   └── index.md
│   │   ├── 2024-01-01-continuous-deployment/
│   │   │   └── index.md
│   │   ├── 2024-05-27-release-v2.5.0/
│   │   │   └── index.md
│   │   └── 2024-12-28-release-v3.0.0/
│   │       └── index.md
│   ├── docs/
│   │   ├── 10-intro/
│   │   │   └── index.md
│   │   ├── 20-usage/
│   │   │   ├── 10-intro.md
│   │   │   ├── 100-troubleshooting.md
│   │   │   ├── 15-terminology/
│   │   │   │   ├── architecture.excalidraw
│   │   │   │   ├── index.md
│   │   │   │   └── pipeline-workflow-step.excalidraw
│   │   │   ├── 20-workflow-syntax.md
│   │   │   ├── 25-workflows.md
│   │   │   ├── 30-matrix-workflows.md
│   │   │   ├── 40-secrets.md
│   │   │   ├── 41-registries.md
│   │   │   ├── 45-cron.md
│   │   │   ├── 50-environment.md
│   │   │   ├── 51-plugins/
│   │   │   │   ├── 20-creating-plugins.md
│   │   │   │   ├── 51-overview.md
│   │   │   │   └── _category_.yaml
│   │   │   ├── 60-services.md
│   │   │   ├── 70-volumes.md
│   │   │   ├── 72-extensions/
│   │   │   │   ├── 40-configuration-extension.md
│   │   │   │   ├── 50-registry-extension.md
│   │   │   │   ├── 55-secret-extension.md
│   │   │   │   ├── _category_.yaml
│   │   │   │   └── index.md
│   │   │   ├── 72-linter.md
│   │   │   ├── 75-project-settings.md
│   │   │   ├── 80-badges.md
│   │   │   ├── 90-advanced-usage.md
│   │   │   └── _category_.yaml
│   │   ├── 30-administration/
│   │   │   ├── 00-general.md
│   │   │   ├── 05-installation/
│   │   │   │   ├── 10-docker-compose.md
│   │   │   │   ├── 20-helm-chart.md
│   │   │   │   ├── 30-packages.md
│   │   │   │   └── _category_.yaml
│   │   │   ├── 10-configuration/
│   │   │   │   ├── 10-server.md
│   │   │   │   ├── 100-addons.md
│   │   │   │   ├── 11-backends/
│   │   │   │   │   ├── 10-docker.md
│   │   │   │   │   ├── 20-kubernetes.md
│   │   │   │   │   ├── 30-local.md
│   │   │   │   │   ├── 50-custom.md
│   │   │   │   │   └── _category_.yaml
│   │   │   │   ├── 12-forges/
│   │   │   │   │   ├── 11-overview.md
│   │   │   │   │   ├── 20-github.md
│   │   │   │   │   ├── 30-gitea.md
│   │   │   │   │   ├── 35-forgejo.md
│   │   │   │   │   ├── 40-gitlab.md
│   │   │   │   │   ├── 50-bitbucket.md
│   │   │   │   │   ├── 60-bitbucket_datacenter.md
│   │   │   │   │   └── _category_.yaml
│   │   │   │   ├── 30-agent.md
│   │   │   │   ├── 40-autoscaler.md
│   │   │   │   └── _category_.yaml
│   │   │   └── _category_.yaml
│   │   └── 92-development/
│   │       ├── 01-getting-started.md
│   │       ├── 02-core-ideas.md
│   │       ├── 03-ui.md
│   │       ├── 04-docs.md
│   │       ├── 05-architecture.md
│   │       ├── 06-conventions.md
│   │       ├── 07-guides.md
│   │       ├── 08-translations.md
│   │       ├── 09-openapi.md
│   │       ├── 09-testing.md
│   │       ├── 10-packaging.md
│   │       ├── 100-addons.md
│   │       ├── 40-deprecations.md
│   │       ├── _category_.yaml
│   │       └── woodpecker-architecture.dot
│   ├── docusaurus.config.ts
│   ├── package.json
│   ├── plugins/
│   │   └── woodpecker-plugins/
│   │       ├── .gitignore
│   │       ├── package.json
│   │       ├── plugins.json
│   │       ├── src/
│   │       │   ├── index.ts
│   │       │   ├── markdown.ts
│   │       │   ├── theme/
│   │       │   │   ├── Icons.tsx
│   │       │   │   ├── WoodpeckerPlugin.tsx
│   │       │   │   ├── WoodpeckerPluginList.tsx
│   │       │   │   └── style.css
│   │       │   └── types.ts
│   │       ├── tsconfig.json
│   │       └── tsconfig.jsx.json
│   ├── pnpm-workspace.yaml
│   ├── sidebars.js
│   ├── src/
│   │   ├── components/
│   │   │   ├── HomepageFeatures.js
│   │   │   └── HomepageFeatures.module.css
│   │   ├── css/
│   │   │   └── custom.css
│   │   └── pages/
│   │       ├── about.md
│   │       ├── awesome.md
│   │       ├── index.module.css
│   │       ├── index.tsx
│   │       ├── migrations.md
│   │       └── versions.md
│   ├── tsconfig.json
│   ├── versioned_docs/
│   │   ├── version-2.8/
│   │   │   ├── 10-intro/
│   │   │   │   └── index.md
│   │   │   ├── 20-usage/
│   │   │   │   ├── 10-intro.md
│   │   │   │   ├── 100-troubleshooting.md
│   │   │   │   ├── 15-terminology/
│   │   │   │   │   ├── architecture.excalidraw
│   │   │   │   │   ├── index.md
│   │   │   │   │   └── pipeline-workflow-step.excalidraw
│   │   │   │   ├── 20-workflow-syntax.md
│   │   │   │   ├── 25-workflows.md
│   │   │   │   ├── 30-matrix-workflows.md
│   │   │   │   ├── 40-secrets.md
│   │   │   │   ├── 41-registries.md
│   │   │   │   ├── 45-cron.md
│   │   │   │   ├── 50-environment.md
│   │   │   │   ├── 51-plugins/
│   │   │   │   │   ├── 20-creating-plugins.md
│   │   │   │   │   ├── 51-overview.md
│   │   │   │   │   └── _category_.yaml
│   │   │   │   ├── 60-services.md
│   │   │   │   ├── 70-volumes.md
│   │   │   │   ├── 72-linter.md
│   │   │   │   ├── 75-project-settings.md
│   │   │   │   ├── 80-badges.md
│   │   │   │   ├── 90-advanced-usage.md
│   │   │   │   └── _category_.yaml
│   │   │   ├── 30-administration/
│   │   │   │   ├── 00-getting-started.md
│   │   │   │   ├── 05-deployment-methods/
│   │   │   │   │   ├── 10-docker-compose.md
│   │   │   │   │   ├── 20-kubernetes.md
│   │   │   │   │   ├── 30-third-party.md
│   │   │   │   │   ├── 40-nixos.md
│   │   │   │   │   └── _category_.yaml
│   │   │   │   ├── 10-database.md
│   │   │   │   ├── 10-server-config.md
│   │   │   │   ├── 11-forges/
│   │   │   │   │   ├── 100-addon.md
│   │   │   │   │   ├── 11-overview.md
│   │   │   │   │   ├── 20-github.md
│   │   │   │   │   ├── 30-gitea.md
│   │   │   │   │   ├── 35-forgejo.md
│   │   │   │   │   ├── 40-gitlab.md
│   │   │   │   │   ├── 50-bitbucket.md
│   │   │   │   │   ├── 60-bitbucket_datacenter.md
│   │   │   │   │   └── _category_.yaml
│   │   │   │   ├── 15-agent-config.md
│   │   │   │   ├── 22-backends/
│   │   │   │   │   ├── 10-docker.md
│   │   │   │   │   ├── 20-local.md
│   │   │   │   │   ├── 40-kubernetes.md
│   │   │   │   │   ├── 50-custom-backends.md
│   │   │   │   │   └── _category_.yaml
│   │   │   │   ├── 40-advanced/
│   │   │   │   │   ├── 10-proxy.md
│   │   │   │   │   ├── 100-external-configuration-api.md
│   │   │   │   │   ├── 20-ssl.md
│   │   │   │   │   ├── 30-autoscaler.md
│   │   │   │   │   ├── 40-advanced.md
│   │   │   │   │   ├── 90-prometheus.md
│   │   │   │   │   └── _category_.yaml
│   │   │   │   └── _category_.yaml
│   │   │   ├── 40-cli.md
│   │   │   ├── 50-about.md
│   │   │   ├── 91-migrations.md
│   │   │   ├── 92-awesome.md
│   │   │   └── 92-development/
│   │   │       ├── 01-getting-started.md
│   │   │       ├── 02-core-ideas.md
│   │   │       ├── 03-ui.md
│   │   │       ├── 04-docs.md
│   │   │       ├── 05-architecture.md
│   │   │       ├── 06-conventions.md
│   │   │       ├── 07-guides.md
│   │   │       ├── 08-translations.md
│   │   │       ├── 09-swagger.md
│   │   │       ├── 09-testing.md
│   │   │       └── _category_.yaml
│   │   ├── version-3.12/
│   │   │   ├── 10-intro/
│   │   │   │   └── index.md
│   │   │   ├── 20-usage/
│   │   │   │   ├── 10-intro.md
│   │   │   │   ├── 100-troubleshooting.md
│   │   │   │   ├── 15-terminology/
│   │   │   │   │   ├── architecture.excalidraw
│   │   │   │   │   ├── index.md
│   │   │   │   │   └── pipeline-workflow-step.excalidraw
│   │   │   │   ├── 20-workflow-syntax.md
│   │   │   │   ├── 25-workflows.md
│   │   │   │   ├── 30-matrix-workflows.md
│   │   │   │   ├── 40-secrets.md
│   │   │   │   ├── 41-registries.md
│   │   │   │   ├── 45-cron.md
│   │   │   │   ├── 50-environment.md
│   │   │   │   ├── 51-plugins/
│   │   │   │   │   ├── 20-creating-plugins.md
│   │   │   │   │   ├── 51-overview.md
│   │   │   │   │   └── _category_.yaml
│   │   │   │   ├── 60-services.md
│   │   │   │   ├── 70-volumes.md
│   │   │   │   ├── 72-extensions/
│   │   │   │   │   ├── 40-configuration-extension.md
│   │   │   │   │   ├── _category_.yaml
│   │   │   │   │   └── index.md
│   │   │   │   ├── 72-linter.md
│   │   │   │   ├── 75-project-settings.md
│   │   │   │   ├── 80-badges.md
│   │   │   │   ├── 90-advanced-usage.md
│   │   │   │   └── _category_.yaml
│   │   │   ├── 30-administration/
│   │   │   │   ├── 00-general.md
│   │   │   │   ├── 05-installation/
│   │   │   │   │   ├── 10-docker-compose.md
│   │   │   │   │   ├── 20-helm-chart.md
│   │   │   │   │   ├── 30-packages.md
│   │   │   │   │   └── _category_.yaml
│   │   │   │   ├── 10-configuration/
│   │   │   │   │   ├── 10-server.md
│   │   │   │   │   ├── 100-addons.md
│   │   │   │   │   ├── 11-backends/
│   │   │   │   │   │   ├── 10-docker.md
│   │   │   │   │   │   ├── 20-kubernetes.md
│   │   │   │   │   │   ├── 30-local.md
│   │   │   │   │   │   ├── 50-custom.md
│   │   │   │   │   │   └── _category_.yaml
│   │   │   │   │   ├── 12-forges/
│   │   │   │   │   │   ├── 11-overview.md
│   │   │   │   │   │   ├── 20-github.md
│   │   │   │   │   │   ├── 30-gitea.md
│   │   │   │   │   │   ├── 35-forgejo.md
│   │   │   │   │   │   ├── 40-gitlab.md
│   │   │   │   │   │   ├── 50-bitbucket.md
│   │   │   │   │   │   ├── 60-bitbucket_datacenter.md
│   │   │   │   │   │   └── _category_.yaml
│   │   │   │   │   ├── 30-agent.md
│   │   │   │   │   ├── 40-autoscaler.md
│   │   │   │   │   └── _category_.yaml
│   │   │   │   └── _category_.yaml
│   │   │   ├── 40-cli.md
│   │   │   └── 92-development/
│   │   │       ├── 01-getting-started.md
│   │   │       ├── 02-core-ideas.md
│   │   │       ├── 03-ui.md
│   │   │       ├── 04-docs.md
│   │   │       ├── 05-architecture.md
│   │   │       ├── 06-conventions.md
│   │   │       ├── 07-guides.md
│   │   │       ├── 08-translations.md
│   │   │       ├── 09-openapi.md
│   │   │       ├── 09-testing.md
│   │   │       ├── 100-addons.md
│   │   │       └── _category_.yaml
│   │   ├── version-3.13/
│   │   │   ├── 10-intro/
│   │   │   │   └── index.md
│   │   │   ├── 20-usage/
│   │   │   │   ├── 10-intro.md
│   │   │   │   ├── 100-troubleshooting.md
│   │   │   │   ├── 15-terminology/
│   │   │   │   │   ├── architecture.excalidraw
│   │   │   │   │   ├── index.md
│   │   │   │   │   └── pipeline-workflow-step.excalidraw
│   │   │   │   ├── 20-workflow-syntax.md
│   │   │   │   ├── 25-workflows.md
│   │   │   │   ├── 30-matrix-workflows.md
│   │   │   │   ├── 40-secrets.md
│   │   │   │   ├── 41-registries.md
│   │   │   │   ├── 45-cron.md
│   │   │   │   ├── 50-environment.md
│   │   │   │   ├── 51-plugins/
│   │   │   │   │   ├── 20-creating-plugins.md
│   │   │   │   │   ├── 51-overview.md
│   │   │   │   │   └── _category_.yaml
│   │   │   │   ├── 60-services.md
│   │   │   │   ├── 70-volumes.md
│   │   │   │   ├── 72-extensions/
│   │   │   │   │   ├── 40-configuration-extension.md
│   │   │   │   │   ├── _category_.yaml
│   │   │   │   │   └── index.md
│   │   │   │   ├── 72-linter.md
│   │   │   │   ├── 75-project-settings.md
│   │   │   │   ├── 80-badges.md
│   │   │   │   ├── 90-advanced-usage.md
│   │   │   │   └── _category_.yaml
│   │   │   ├── 30-administration/
│   │   │   │   ├── 00-general.md
│   │   │   │   ├── 05-installation/
│   │   │   │   │   ├── 10-docker-compose.md
│   │   │   │   │   ├── 20-helm-chart.md
│   │   │   │   │   ├── 30-packages.md
│   │   │   │   │   └── _category_.yaml
│   │   │   │   ├── 10-configuration/
│   │   │   │   │   ├── 10-server.md
│   │   │   │   │   ├── 100-addons.md
│   │   │   │   │   ├── 11-backends/
│   │   │   │   │   │   ├── 10-docker.md
│   │   │   │   │   │   ├── 20-kubernetes.md
│   │   │   │   │   │   ├── 30-local.md
│   │   │   │   │   │   ├── 50-custom.md
│   │   │   │   │   │   └── _category_.yaml
│   │   │   │   │   ├── 12-forges/
│   │   │   │   │   │   ├── 11-overview.md
│   │   │   │   │   │   ├── 20-github.md
│   │   │   │   │   │   ├── 30-gitea.md
│   │   │   │   │   │   ├── 35-forgejo.md
│   │   │   │   │   │   ├── 40-gitlab.md
│   │   │   │   │   │   ├── 50-bitbucket.md
│   │   │   │   │   │   ├── 60-bitbucket_datacenter.md
│   │   │   │   │   │   └── _category_.yaml
│   │   │   │   │   ├── 30-agent.md
│   │   │   │   │   ├── 40-autoscaler.md
│   │   │   │   │   └── _category_.yaml
│   │   │   │   └── _category_.yaml
│   │   │   ├── 40-cli.md
│   │   │   └── 92-development/
│   │   │       ├── 01-getting-started.md
│   │   │       ├── 02-core-ideas.md
│   │   │       ├── 03-ui.md
│   │   │       ├── 04-docs.md
│   │   │       ├── 05-architecture.md
│   │   │       ├── 06-conventions.md
│   │   │       ├── 07-guides.md
│   │   │       ├── 08-translations.md
│   │   │       ├── 09-openapi.md
│   │   │       ├── 09-testing.md
│   │   │       ├── 10-packaging.md
│   │   │       ├── 100-addons.md
│   │   │       └── _category_.yaml
│   │   └── version-3.14/
│   │       ├── 10-intro/
│   │       │   └── index.md
│   │       ├── 20-usage/
│   │       │   ├── 10-intro.md
│   │       │   ├── 100-troubleshooting.md
│   │       │   ├── 15-terminology/
│   │       │   │   ├── architecture.excalidraw
│   │       │   │   ├── index.md
│   │       │   │   └── pipeline-workflow-step.excalidraw
│   │       │   ├── 20-workflow-syntax.md
│   │       │   ├── 25-workflows.md
│   │       │   ├── 30-matrix-workflows.md
│   │       │   ├── 40-secrets.md
│   │       │   ├── 41-registries.md
│   │       │   ├── 45-cron.md
│   │       │   ├── 50-environment.md
│   │       │   ├── 51-plugins/
│   │       │   │   ├── 20-creating-plugins.md
│   │       │   │   ├── 51-overview.md
│   │       │   │   └── _category_.yaml
│   │       │   ├── 60-services.md
│   │       │   ├── 70-volumes.md
│   │       │   ├── 72-extensions/
│   │       │   │   ├── 40-configuration-extension.md
│   │       │   │   ├── 50-registry-extension.md
│   │       │   │   ├── 55-secret-extension.md
│   │       │   │   ├── _category_.yaml
│   │       │   │   └── index.md
│   │       │   ├── 72-linter.md
│   │       │   ├── 75-project-settings.md
│   │       │   ├── 80-badges.md
│   │       │   ├── 90-advanced-usage.md
│   │       │   └── _category_.yaml
│   │       ├── 30-administration/
│   │       │   ├── 00-general.md
│   │       │   ├── 05-installation/
│   │       │   │   ├── 10-docker-compose.md
│   │       │   │   ├── 20-helm-chart.md
│   │       │   │   ├── 30-packages.md
│   │       │   │   └── _category_.yaml
│   │       │   ├── 10-configuration/
│   │       │   │   ├── 10-server.md
│   │       │   │   ├── 100-addons.md
│   │       │   │   ├── 11-backends/
│   │       │   │   │   ├── 10-docker.md
│   │       │   │   │   ├── 20-kubernetes.md
│   │       │   │   │   ├── 30-local.md
│   │       │   │   │   ├── 50-custom.md
│   │       │   │   │   └── _category_.yaml
│   │       │   │   ├── 12-forges/
│   │       │   │   │   ├── 11-overview.md
│   │       │   │   │   ├── 20-github.md
│   │       │   │   │   ├── 30-gitea.md
│   │       │   │   │   ├── 35-forgejo.md
│   │       │   │   │   ├── 40-gitlab.md
│   │       │   │   │   ├── 50-bitbucket.md
│   │       │   │   │   ├── 60-bitbucket_datacenter.md
│   │       │   │   │   └── _category_.yaml
│   │       │   │   ├── 30-agent.md
│   │       │   │   ├── 40-autoscaler.md
│   │       │   │   └── _category_.yaml
│   │       │   └── _category_.yaml
│   │       ├── 40-cli.md
│   │       └── 92-development/
│   │           ├── 01-getting-started.md
│   │           ├── 02-core-ideas.md
│   │           ├── 03-ui.md
│   │           ├── 04-docs.md
│   │           ├── 05-architecture.md
│   │           ├── 06-conventions.md
│   │           ├── 07-guides.md
│   │           ├── 08-translations.md
│   │           ├── 09-openapi.md
│   │           ├── 09-testing.md
│   │           ├── 10-packaging.md
│   │           ├── 100-addons.md
│   │           ├── 40-deprecations.md
│   │           ├── _category_.yaml
│   │           └── woodpecker-architecture.dot
│   ├── versioned_sidebars/
│   │   ├── version-2.8-sidebars.json
│   │   ├── version-3.12-sidebars.json
│   │   ├── version-3.13-sidebars.json
│   │   └── version-3.14-sidebars.json
│   └── versions.json
├── e2e/
│   ├── scenarios/
│   │   ├── agent_routing_test.go
│   │   ├── cancel_test.go
│   │   ├── fixtures/
│   │   │   ├── 01_simple_success.json
│   │   │   ├── 01_simple_success.yaml
│   │   │   ├── 02_step_failure.json
│   │   │   ├── 02_step_failure.yaml
│   │   │   ├── 03_failure_ignore.json
│   │   │   ├── 03_failure_ignore.yaml
│   │   │   ├── 04_on_failure_notify.json
│   │   │   ├── 04_on_failure_notify.yaml
│   │   │   ├── 05_service.json
│   │   │   ├── 05_service.yaml
│   │   │   ├── 06_parallel_steps.json
│   │   │   ├── 06_parallel_steps.yaml
│   │   │   ├── 07_oom_killed.json
│   │   │   ├── 07_oom_killed.yaml
│   │   │   ├── 08_multi_step_on_failure.json
│   │   │   ├── 08_multi_step_on_failure.yaml
│   │   │   ├── 09_multi_workflow_parallel/
│   │   │   │   ├── build.yaml
│   │   │   │   ├── lint.yaml
│   │   │   │   └── scenario.json
│   │   │   ├── 10_multi_workflow_failure/
│   │   │   │   ├── failing.yaml
│   │   │   │   ├── passing.yaml
│   │   │   │   └── scenario.json
│   │   │   ├── 11_multi_workflow_failure_ignore/
│   │   │   │   ├── flaky.yaml
│   │   │   │   ├── main.yaml
│   │   │   │   └── scenario.json
│   │   │   ├── 12_multi_workflow_depends_on/
│   │   │   │   ├── build.yaml
│   │   │   │   ├── deploy.yaml
│   │   │   │   ├── notify.yaml
│   │   │   │   └── scenario.json
│   │   │   └── 13_multi_workflow_depends_on_failure/
│   │   │       ├── build.yaml
│   │   │       ├── deploy.yaml
│   │   │       └── scenario.json
│   │   ├── fixtures.go
│   │   ├── infra_test.go
│   │   ├── matrix_test.go
│   │   ├── restart_test.go
│   │   └── suite_test.go
│   └── setup/
│       ├── agent.go
│       ├── forge.go
│       ├── server.go
│       ├── store.go
│       └── wait.go
├── flake.nix
├── go.mod
├── go.sum
├── nfpm/
│   ├── agent.yaml
│   ├── cli.yaml
│   ├── server.yaml
│   ├── woodpecker-agent.env.example
│   ├── woodpecker-agent.service
│   ├── woodpecker-server.env.example
│   ├── woodpecker-server.service
│   └── woodpecker-system-user.preinstall.sh
├── pipeline/
│   ├── backend/
│   │   ├── backend.go
│   │   ├── common/
│   │   │   ├── script.go
│   │   │   ├── script_posix.go
│   │   │   ├── script_posix_test.go
│   │   │   ├── script_test.go
│   │   │   ├── script_win.go
│   │   │   └── script_win_test.go
│   │   ├── docker/
│   │   │   ├── backend_options.go
│   │   │   ├── backend_options_test.go
│   │   │   ├── config.go
│   │   │   ├── convert.go
│   │   │   ├── convert_test.go
│   │   │   ├── convert_win.go
│   │   │   ├── convert_win_test.go
│   │   │   ├── docker.go
│   │   │   ├── errors.go
│   │   │   └── flags.go
│   │   ├── dummy/
│   │   │   ├── dummy.go
│   │   │   └── dummy_test.go
│   │   ├── kubernetes/
│   │   │   ├── backend_options.go
│   │   │   ├── backend_options_test.go
│   │   │   ├── flags.go
│   │   │   ├── kubernetes.go
│   │   │   ├── kubernetes_test.go
│   │   │   ├── namespace.go
│   │   │   ├── namespace_test.go
│   │   │   ├── pod.go
│   │   │   ├── pod_test.go
│   │   │   ├── secrets.go
│   │   │   ├── secrets_test.go
│   │   │   ├── service.go
│   │   │   ├── service_test.go
│   │   │   ├── utils.go
│   │   │   ├── utils_test.go
│   │   │   ├── volume.go
│   │   │   └── volume_test.go
│   │   ├── local/
│   │   │   ├── clone.go
│   │   │   ├── command.go
│   │   │   ├── command_test.go
│   │   │   ├── const.go
│   │   │   ├── const_test.go
│   │   │   ├── errors.go
│   │   │   ├── flags.go
│   │   │   ├── local.go
│   │   │   ├── local_test.go
│   │   │   └── plugin.go
│   │   └── types/
│   │       ├── auth.go
│   │       ├── backend.go
│   │       ├── config.go
│   │       ├── conn.go
│   │       ├── errors.go
│   │       ├── mocks/
│   │       │   └── mock_Backend.go
│   │       ├── network.go
│   │       ├── secret.go
│   │       ├── stage.go
│   │       ├── state.go
│   │       └── step.go
│   ├── const.go
│   ├── errors/
│   │   ├── linter.go
│   │   ├── linter_test.go
│   │   ├── pipeline.go
│   │   └── runtime.go
│   ├── frontend/
│   │   ├── metadata/
│   │   │   ├── const.go
│   │   │   ├── drone_compatibility.go
│   │   │   ├── drone_compatibility_test.go
│   │   │   ├── environment.go
│   │   │   ├── environment_test.go
│   │   │   ├── substitution.go
│   │   │   ├── substitution_test.go
│   │   │   └── types.go
│   │   └── yaml/
│   │       ├── compiler/
│   │       │   ├── compiler.go
│   │       │   ├── compiler_test.go
│   │       │   ├── convert.go
│   │       │   ├── convert_test.go
│   │       │   ├── dag.go
│   │       │   ├── dag_test.go
│   │       │   ├── errors.go
│   │       │   ├── option.go
│   │       │   ├── option_test.go
│   │       │   └── settings/
│   │       │       ├── params.go
│   │       │       └── params_test.go
│   │       ├── constraint/
│   │       │   ├── constraint.go
│   │       │   ├── constraint_test.go
│   │       │   ├── list.go
│   │       │   ├── list_test.go
│   │       │   ├── map.go
│   │       │   ├── map_test.go
│   │       │   ├── path.go
│   │       │   ├── path_test.go
│   │       │   └── skip.go
│   │       ├── linter/
│   │       │   ├── error.go
│   │       │   ├── linter.go
│   │       │   ├── linter_test.go
│   │       │   ├── option.go
│   │       │   └── schema/
│   │       │       ├── .woodpecker/
│   │       │       │   ├── test-array-syntax.yaml
│   │       │       │   ├── test-backend-options.yaml
│   │       │       │   ├── test-broken-plugin.yaml
│   │       │       │   ├── test-broken-plugin2.yaml
│   │       │       │   ├── test-broken.yaml
│   │       │       │   ├── test-clone-skip.yaml
│   │       │       │   ├── test-clone.yaml
│   │       │       │   ├── test-custom-backend.yaml
│   │       │       │   ├── test-dag.yaml
│   │       │       │   ├── test-kubernetes-backend-tolerations.yaml
│   │       │       │   ├── test-labels.yaml
│   │       │       │   ├── test-matrix.yaml
│   │       │       │   ├── test-merge-map-and-sequence.yaml
│   │       │       │   ├── test-multi.yaml
│   │       │       │   ├── test-pipeline-when.yaml
│   │       │       │   ├── test-plugin.yaml
│   │       │       │   ├── test-run-on.yaml
│   │       │       │   ├── test-service.yaml
│   │       │       │   ├── test-step.yaml
│   │       │       │   ├── test-when.yaml
│   │       │       │   └── test-workspace.yaml
│   │       │       ├── schema.go
│   │       │       ├── schema.json
│   │       │       └── schema_test.go
│   │       ├── matrix/
│   │       │   ├── matrix.go
│   │       │   └── matrix_test.go
│   │       ├── parse.go
│   │       ├── parse_test.go
│   │       ├── types/
│   │       │   ├── base/
│   │       │   │   ├── int.go
│   │       │   │   ├── int_test.go
│   │       │   │   ├── slice.go
│   │       │   │   └── slice_test.go
│   │       │   ├── container.go
│   │       │   ├── container_list.go
│   │       │   ├── container_test.go
│   │       │   ├── network.go
│   │       │   ├── network_test.go
│   │       │   ├── volume.go
│   │       │   ├── volume_test.go
│   │       │   └── workflow.go
│   │       └── utils/
│   │           ├── image.go
│   │           └── image_test.go
│   ├── logging/
│   │   └── logger.go
│   ├── runtime/
│   │   ├── helpers_test.go
│   │   ├── option.go
│   │   ├── runtime.go
│   │   ├── runtime_test.go
│   │   ├── shutdown.go
│   │   ├── step.go
│   │   ├── step_test.go
│   │   ├── workflow.go
│   │   └── workflow_test.go
│   ├── shared/
│   │   ├── replace_secrets.go
│   │   └── replace_secrets_test.go
│   ├── state/
│   │   └── state.go
│   ├── tracing/
│   │   ├── mocks/
│   │   │   └── mock_Tracer.go
│   │   └── tracer.go
│   └── utils/
│       ├── copy_line_by_line.go
│       └── copy_line_by_line_test.go
├── release-config.ts
├── rpc/
│   ├── log_entry.go
│   ├── log_entry_test.go
│   ├── mocks/
│   │   └── mock_Peer.go
│   ├── peer.go
│   ├── proto/
│   │   ├── generate.go
│   │   ├── version.go
│   │   ├── woodpecker.pb.go
│   │   ├── woodpecker.proto
│   │   └── woodpecker_grpc.pb.go
│   └── types.go
├── server/
│   ├── api/
│   │   ├── agent.go
│   │   ├── agent_test.go
│   │   ├── badge.go
│   │   ├── cron.go
│   │   ├── debug/
│   │   │   └── debug.go
│   │   ├── forge.go
│   │   ├── global_registry.go
│   │   ├── global_secret.go
│   │   ├── helper.go
│   │   ├── helper_test.go
│   │   ├── hook.go
│   │   ├── hook_test.go
│   │   ├── login.go
│   │   ├── login_test.go
│   │   ├── metrics/
│   │   │   └── prometheus.go
│   │   ├── org.go
│   │   ├── org_registry.go
│   │   ├── org_secret.go
│   │   ├── pipeline.go
│   │   ├── pipeline_test.go
│   │   ├── queue.go
│   │   ├── registry.go
│   │   ├── repo.go
│   │   ├── repo_secret.go
│   │   ├── repo_test.go
│   │   ├── signature_public_key.go
│   │   ├── stream.go
│   │   ├── stream_test.go
│   │   ├── user.go
│   │   ├── users.go
│   │   └── z.go
│   ├── badges/
│   │   ├── badges.go
│   │   ├── badges_test.go
│   │   ├── color.go
│   │   ├── drawer.go
│   │   ├── fonts/
│   │   │   └── dejavusans.go
│   │   └── style.go
│   ├── cache/
│   │   └── membership.go
│   ├── ccmenu/
│   │   ├── cc.go
│   │   └── cc_test.go
│   ├── config.go
│   ├── cron/
│   │   ├── cron.go
│   │   └── cron_test.go
│   ├── forge/
│   │   ├── addon/
│   │   │   ├── args.go
│   │   │   ├── client.go
│   │   │   ├── plugin.go
│   │   │   └── server.go
│   │   ├── bitbucket/
│   │   │   ├── bitbucket.go
│   │   │   ├── bitbucket_test.go
│   │   │   ├── convert.go
│   │   │   ├── convert_test.go
│   │   │   ├── fixtures/
│   │   │   │   ├── HookPull.json
│   │   │   │   ├── HookPullRequestDeclined.json
│   │   │   │   ├── HookPullRequestMerged.json
│   │   │   │   ├── HookPush.json
│   │   │   │   ├── handler.go
│   │   │   │   └── hooks.go
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   └── types.go
│   │   │   ├── parse.go
│   │   │   └── parse_test.go
│   │   ├── bitbucketdatacenter/
│   │   │   ├── bitbucketdatacenter.go
│   │   │   ├── bitbucketdatacenter_test.go
│   │   │   ├── convert.go
│   │   │   ├── convert_test.go
│   │   │   ├── fixtures/
│   │   │   │   ├── HookPullRequestMerged.json
│   │   │   │   ├── HookPullRequestOpened.json
│   │   │   │   ├── HookPullRequestOpenedFromFork.json
│   │   │   │   ├── HookPush.json
│   │   │   │   ├── expected/
│   │   │   │   │   └── PostBuildStatus.json
│   │   │   │   ├── handler.go
│   │   │   │   └── hooks.go
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   └── client_test.go
│   │   │   ├── parse.go
│   │   │   └── parse_test.go
│   │   ├── common/
│   │   │   ├── event_normalize.go
│   │   │   ├── status.go
│   │   │   ├── status_test.go
│   │   │   ├── utils.go
│   │   │   └── utils_test.go
│   │   ├── forge.go
│   │   ├── forgejo/
│   │   │   ├── fixtures/
│   │   │   │   ├── HookPullRequest.json
│   │   │   │   ├── HookPullRequestAssigneeCleared.json
│   │   │   │   ├── HookPullRequestAssigneesAdded.json
│   │   │   │   ├── HookPullRequestClosed.json
│   │   │   │   ├── HookPullRequestEdited.json
│   │   │   │   ├── HookPullRequestLabelAdded.json
│   │   │   │   ├── HookPullRequestLabelsCleared.json
│   │   │   │   ├── HookPullRequestLabelsUpdated.json
│   │   │   │   ├── HookPullRequestMerged.json
│   │   │   │   ├── HookPullRequestMilestoneAdded.json
│   │   │   │   ├── HookPullRequestMilestoneChanged.json
│   │   │   │   ├── HookPullRequestMilestoneCleared.json
│   │   │   │   ├── HookPullRequestReopened.json
│   │   │   │   ├── HookPullRequestUpdated.json
│   │   │   │   ├── HookPush.json
│   │   │   │   ├── HookPushBranch.json
│   │   │   │   ├── HookPushMulti.json
│   │   │   │   ├── HookRelease.json
│   │   │   │   ├── HookTag.json
│   │   │   │   ├── handler.go
│   │   │   │   └── hooks.go
│   │   │   ├── forgejo.go
│   │   │   ├── forgejo_test.go
│   │   │   ├── helper.go
│   │   │   ├── helper_test.go
│   │   │   ├── parse.go
│   │   │   ├── parse_test.go
│   │   │   └── types.go
│   │   ├── gitea/
│   │   │   ├── fixtures/
│   │   │   │   ├── HookPullRequest.json
│   │   │   │   ├── HookPullRequestAddLabel.json
│   │   │   │   ├── HookPullRequestAddMile.json
│   │   │   │   ├── HookPullRequestAddReviewRequest.json
│   │   │   │   ├── HookPullRequestAssigneesAdded.json
│   │   │   │   ├── HookPullRequestAssigneesRemoved.json
│   │   │   │   ├── HookPullRequestChangeBody.json
│   │   │   │   ├── HookPullRequestChangeLabel.json
│   │   │   │   ├── HookPullRequestChangeMile.json
│   │   │   │   ├── HookPullRequestChangeTitle.json
│   │   │   │   ├── HookPullRequestClosed.json
│   │   │   │   ├── HookPullRequestMerged.json
│   │   │   │   ├── HookPullRequestRemoveLabel.json
│   │   │   │   ├── HookPullRequestRemoveMile.json
│   │   │   │   ├── HookPullRequestReopened.json
│   │   │   │   ├── HookPullRequestReviewAck.json
│   │   │   │   ├── HookPullRequestReviewComment.json
│   │   │   │   ├── HookPullRequestReviewDeny.json
│   │   │   │   ├── HookPullRequestUpdated.json
│   │   │   │   ├── HookPush.json
│   │   │   │   ├── HookPushBranch.json
│   │   │   │   ├── HookPushMulti.json
│   │   │   │   ├── HookRelease.json
│   │   │   │   ├── HookTag.json
│   │   │   │   ├── handler.go
│   │   │   │   └── hooks.go
│   │   │   ├── gitea.go
│   │   │   ├── gitea_test.go
│   │   │   ├── helper.go
│   │   │   ├── helper_test.go
│   │   │   ├── parse.go
│   │   │   ├── parse_test.go
│   │   │   └── types.go
│   │   ├── github/
│   │   │   ├── convert.go
│   │   │   ├── convert_test.go
│   │   │   ├── fixtures/
│   │   │   │   ├── HookDeploy.json
│   │   │   │   ├── HookPullRequest.json
│   │   │   │   ├── HookPullRequestAssigneeAdded.json
│   │   │   │   ├── HookPullRequestAssigneeRemoved.json
│   │   │   │   ├── HookPullRequestClosed.json
│   │   │   │   ├── HookPullRequestEdited.json
│   │   │   │   ├── HookPullRequestLabelAdded.json
│   │   │   │   ├── HookPullRequestLabelRemoved.json
│   │   │   │   ├── HookPullRequestLabelsCleared.json
│   │   │   │   ├── HookPullRequestMerged.json
│   │   │   │   ├── HookPullRequestMilestoneAdded.json
│   │   │   │   ├── HookPullRequestMilestoneRemoved.json
│   │   │   │   ├── HookPullRequestReopened.json
│   │   │   │   ├── HookPullRequestReviewRequested.json
│   │   │   │   ├── HookPush.json
│   │   │   │   ├── HookRelease.json
│   │   │   │   ├── HookTag.json
│   │   │   │   ├── handler.go
│   │   │   │   ├── hooks.go
│   │   │   │   └── mock_server.go
│   │   │   ├── github.go
│   │   │   ├── github_test.go
│   │   │   ├── parse.go
│   │   │   └── parse_test.go
│   │   ├── gitlab/
│   │   │   ├── convert.go
│   │   │   ├── fixtures/
│   │   │   │   ├── HookPullRequestApproved.json
│   │   │   │   ├── HookPullRequestAssigned.json
│   │   │   │   ├── HookPullRequestClosed.json
│   │   │   │   ├── HookPullRequestDemilestoned.json
│   │   │   │   ├── HookPullRequestEdited.json
│   │   │   │   ├── HookPullRequestLabelsAdded.json
│   │   │   │   ├── HookPullRequestLabelsCleared.json
│   │   │   │   ├── HookPullRequestLabelsUpdated.json
│   │   │   │   ├── HookPullRequestMerged.json
│   │   │   │   ├── HookPullRequestMilestoned.json
│   │   │   │   ├── HookPullRequestOpened.json
│   │   │   │   ├── HookPullRequestReopened.json
│   │   │   │   ├── HookPullRequestReviewRequestDel.json
│   │   │   │   ├── HookPullRequestReviewRequested.json
│   │   │   │   ├── HookPullRequestUnapproved.json
│   │   │   │   ├── HookPullRequestUnassigned.json
│   │   │   │   ├── HookPullRequestUnsupportedAction.json
│   │   │   │   ├── HookPullRequestUpdated.json
│   │   │   │   ├── HookPullRequestWithoutChanges.json
│   │   │   │   ├── HookPush.json
│   │   │   │   ├── HookTag.json
│   │   │   │   ├── WebhookReleaseBody.json
│   │   │   │   ├── hooks.go
│   │   │   │   ├── oauth.go
│   │   │   │   ├── projects.go
│   │   │   │   ├── testdata.go
│   │   │   │   └── users.go
│   │   │   ├── gitlab.go
│   │   │   ├── gitlab_test.go
│   │   │   ├── helper.go
│   │   │   └── status.go
│   │   ├── mocks/
│   │   │   ├── mock_Forge.go
│   │   │   └── mock_Refresher.go
│   │   ├── refresh.go
│   │   ├── refresh_test.go
│   │   ├── setup/
│   │   │   └── setup.go
│   │   └── types/
│   │       ├── errors.go
│   │       ├── meta.go
│   │       ├── meta_test.go
│   │       └── oauth.go
│   ├── logging/
│   │   ├── LICENSE
│   │   ├── log.go
│   │   ├── log_test.go
│   │   └── logging.go
│   ├── model/
│   │   ├── agent.go
│   │   ├── agent_test.go
│   │   ├── commit.go
│   │   ├── config.go
│   │   ├── const.go
│   │   ├── cron.go
│   │   ├── environ.go
│   │   ├── event.go
│   │   ├── feed.go
│   │   ├── forge.go
│   │   ├── log.go
│   │   ├── netrc.go
│   │   ├── org.go
│   │   ├── pagination.go
│   │   ├── pagination_test.go
│   │   ├── perm.go
│   │   ├── pipeline.go
│   │   ├── pull_request.go
│   │   ├── queue.go
│   │   ├── redirection.go
│   │   ├── registry.go
│   │   ├── repo.go
│   │   ├── repo_test.go
│   │   ├── secret.go
│   │   ├── secret_test.go
│   │   ├── server_config.go
│   │   ├── step.go
│   │   ├── step_test.go
│   │   ├── task.go
│   │   ├── task_test.go
│   │   ├── team.go
│   │   ├── user.go
│   │   ├── user_test.go
│   │   └── workflow.go
│   ├── pipeline/
│   │   ├── approve.go
│   │   ├── cancel.go
│   │   ├── config.go
│   │   ├── create.go
│   │   ├── decline.go
│   │   ├── errors.go
│   │   ├── gated.go
│   │   ├── gated_test.go
│   │   ├── helper.go
│   │   ├── items.go
│   │   ├── items_test.go
│   │   ├── pipeline_status.go
│   │   ├── pipeline_status_test.go
│   │   ├── queue.go
│   │   ├── restart.go
│   │   ├── start.go
│   │   ├── status.go
│   │   ├── status_test.go
│   │   ├── step_builder/
│   │   │   ├── metadata.go
│   │   │   ├── metadata_test.go
│   │   │   ├── step_builder.go
│   │   │   └── step_builder_test.go
│   │   ├── step_status.go
│   │   ├── step_status_test.go
│   │   ├── topic.go
│   │   ├── workflow_status.go
│   │   └── workflow_status_test.go
│   ├── pubsub/
│   │   ├── memory/
│   │   │   ├── pub.go
│   │   │   └── pub_test.go
│   │   ├── pubsub.go
│   │   └── pubsub_test.go
│   ├── queue/
│   │   ├── fifo.go
│   │   ├── fifo_test.go
│   │   ├── mocks/
│   │   │   └── mock_Queue.go
│   │   ├── persistent.go
│   │   └── queue.go
│   ├── router/
│   │   ├── api.go
│   │   ├── middleware/
│   │   │   ├── header/
│   │   │   │   └── header.go
│   │   │   ├── logger.go
│   │   │   ├── session/
│   │   │   │   ├── agent.go
│   │   │   │   ├── org.go
│   │   │   │   ├── pagination.go
│   │   │   │   ├── repo.go
│   │   │   │   └── user.go
│   │   │   ├── store.go
│   │   │   ├── token/
│   │   │   │   └── token.go
│   │   │   └── version.go
│   │   └── router.go
│   ├── rpc/
│   │   ├── auth_server.go
│   │   ├── auth_server_test.go
│   │   ├── authorizer.go
│   │   ├── authorizer_test.go
│   │   ├── errors.go
│   │   ├── filter.go
│   │   ├── filter_test.go
│   │   ├── jwt_manager.go
│   │   ├── jwt_manager_test.go
│   │   ├── rpc.go
│   │   ├── rpc_integration_test.go
│   │   ├── rpc_test.go
│   │   ├── sanitize.go
│   │   ├── sanitize_test.go
│   │   └── server.go
│   ├── scheduler/
│   │   ├── proxy.go
│   │   └── scheduler.go
│   ├── services/
│   │   ├── config/
│   │   │   ├── combined.go
│   │   │   ├── combined_test.go
│   │   │   ├── forge.go
│   │   │   ├── forge_test.go
│   │   │   ├── http.go
│   │   │   ├── mocks/
│   │   │   │   └── mock_Service.go
│   │   │   └── service.go
│   │   ├── encryption/
│   │   │   ├── aes.go
│   │   │   ├── aes_builder.go
│   │   │   ├── aes_encryption.go
│   │   │   ├── aes_state.go
│   │   │   ├── aes_test.go
│   │   │   ├── constants.go
│   │   │   ├── encryption.go
│   │   │   ├── encryption_builder.go
│   │   │   ├── no_encryption.go
│   │   │   ├── tink.go
│   │   │   ├── tink_builder.go
│   │   │   ├── tink_keyset.go
│   │   │   ├── tink_keyset_watcher.go
│   │   │   ├── tink_state.go
│   │   │   ├── types/
│   │   │   │   └── encryption.go
│   │   │   └── wrapper/
│   │   │       └── store/
│   │   │           ├── constants.go
│   │   │           ├── secret_store.go
│   │   │           └── secret_store_wrapper.go
│   │   ├── environment/
│   │   │   ├── mocks/
│   │   │   │   └── mock_Service.go
│   │   │   ├── parse.go
│   │   │   ├── parse_test.go
│   │   │   └── service.go
│   │   ├── log/
│   │   │   ├── addon/
│   │   │   │   ├── client.go
│   │   │   │   ├── plugin.go
│   │   │   │   └── server.go
│   │   │   ├── file/
│   │   │   │   └── file.go
│   │   │   ├── mocks/
│   │   │   │   └── mock_Service.go
│   │   │   └── service.go
│   │   ├── manager.go
│   │   ├── mocks/
│   │   │   └── mock_Manager.go
│   │   ├── permissions/
│   │   │   ├── admins.go
│   │   │   ├── admins_test.go
│   │   │   ├── orgs.go
│   │   │   ├── orgs_test.go
│   │   │   ├── repo_owners.go
│   │   │   └── repo_owners_test.go
│   │   ├── registry/
│   │   │   ├── combined.go
│   │   │   ├── combined_test.go
│   │   │   ├── db.go
│   │   │   ├── filesystem.go
│   │   │   ├── http.go
│   │   │   ├── mocks/
│   │   │   │   ├── mock_ReadOnlyService.go
│   │   │   │   └── mock_Service.go
│   │   │   ├── service.go
│   │   │   ├── with_extension.go
│   │   │   └── with_extension_test.go
│   │   ├── secret/
│   │   │   ├── combined.go
│   │   │   ├── combined_test.go
│   │   │   ├── db.go
│   │   │   ├── db_test.go
│   │   │   ├── http.go
│   │   │   ├── mocks/
│   │   │   │   └── mock_Service.go
│   │   │   └── service.go
│   │   ├── setup.go
│   │   └── utils/
│   │       ├── hostmatcher/
│   │       │   ├── hostmatcher.go
│   │       │   ├── hostmatcher_test.go
│   │       │   └── http.go
│   │       ├── http.go
│   │       └── http_test.go
│   ├── store/
│   │   ├── common.go
│   │   ├── context.go
│   │   ├── datastore/
│   │   │   ├── agent.go
│   │   │   ├── agent_test.go
│   │   │   ├── config.go
│   │   │   ├── config_test.go
│   │   │   ├── cron.go
│   │   │   ├── cron_test.go
│   │   │   ├── engine.go
│   │   │   ├── engine_test.go
│   │   │   ├── errors.go
│   │   │   ├── feed.go
│   │   │   ├── feed_test.go
│   │   │   ├── forge.go
│   │   │   ├── forge_test.go
│   │   │   ├── helper.go
│   │   │   ├── helper_test.go
│   │   │   ├── init.go
│   │   │   ├── init_cgo.go
│   │   │   ├── log.go
│   │   │   ├── log_test.go
│   │   │   ├── migration/
│   │   │   │   ├── 000_legacy_to_xormigrate.go
│   │   │   │   ├── 001_add_org_id.go
│   │   │   │   ├── 002_task_data_type.go
│   │   │   │   ├── 003_config_data_type.go
│   │   │   │   ├── 004_remove_secrets_plugin_only_col.go
│   │   │   │   ├── 005_convert_to_new_pipeline_errors_format.go
│   │   │   │   ├── 006_link_to_url.go
│   │   │   │   ├── 007_clean_registry_pipeline.go
│   │   │   │   ├── 008_set_default_forge_id.go
│   │   │   │   ├── 009_unify_columns_tables.go
│   │   │   │   ├── 010_registries_add_user.go
│   │   │   │   ├── 011_cron_without_sec.go
│   │   │   │   ├── 012_rename_start_end_time.go
│   │   │   │   ├── 013_fix_v31_registries.go
│   │   │   │   ├── 014_remove_old_migrations_of_v1.go
│   │   │   │   ├── 015_add_org_agents.go
│   │   │   │   ├── 016_add_custom_labels_to_agent.go
│   │   │   │   ├── 017_split_trusted.go
│   │   │   │   ├── 018_fix_orgs_users_match.go
│   │   │   │   ├── 019_gated_to_require_approval.go
│   │   │   │   ├── 020_remove_repo_netrc_only_trusted.go
│   │   │   │   ├── 021_rename_token_fields.go
│   │   │   │   ├── 022_set_new_defaults_for_require_approval.go
│   │   │   │   ├── 023_remove_repo_scm.go
│   │   │   │   ├── 024_unsanitize_org_and_user_names.go
│   │   │   │   ├── 025_fix_zero_forge_id_ref.go
│   │   │   │   ├── 026_fix_forge_columns.go
│   │   │   │   ├── 027_add_cron_field.go
│   │   │   │   ├── common.go
│   │   │   │   ├── common_test.go
│   │   │   │   ├── logger.go
│   │   │   │   ├── migration.go
│   │   │   │   ├── migration_test.go
│   │   │   │   └── test-files/
│   │   │   │       ├── .gitignore
│   │   │   │       └── postgres.sql
│   │   │   ├── org.go
│   │   │   ├── org_test.go
│   │   │   ├── permission.go
│   │   │   ├── permission_test.go
│   │   │   ├── pipeline.go
│   │   │   ├── pipeline_test.go
│   │   │   ├── redirection.go
│   │   │   ├── redirection_test.go
│   │   │   ├── registry.go
│   │   │   ├── registry_test.go
│   │   │   ├── repo.go
│   │   │   ├── repo_test.go
│   │   │   ├── secret.go
│   │   │   ├── secret_test.go
│   │   │   ├── server_config.go
│   │   │   ├── server_config_test.go
│   │   │   ├── step.go
│   │   │   ├── step_test.go
│   │   │   ├── task.go
│   │   │   ├── task_test.go
│   │   │   ├── user.go
│   │   │   ├── user_test.go
│   │   │   ├── workflow.go
│   │   │   ├── workflow_test.go
│   │   │   └── xorm.go
│   │   ├── mocks/
│   │   │   └── mock_Store.go
│   │   ├── store.go
│   │   └── types/
│   │       └── errors.go
│   └── web/
│       ├── config.go
│       ├── web.go
│       └── web_test.go
├── shared/
│   ├── constant/
│   │   └── constant.go
│   ├── httputil/
│   │   ├── http_error.go
│   │   ├── http_error_test.go
│   │   ├── httputil.go
│   │   ├── useragent.go
│   │   └── useragent_test.go
│   ├── logger/
│   │   ├── addon_logger.go
│   │   ├── logger.go
│   │   └── terminal.go
│   ├── optional/
│   │   ├── option.go
│   │   ├── option_test.go
│   │   ├── serialization.go
│   │   ├── serialization_json_test.go
│   │   ├── serialization_test.go
│   │   └── serialization_yaml_test.go
│   ├── token/
│   │   ├── token.go
│   │   └── token_test.go
│   └── utils/
│       ├── context.go
│       ├── paginate.go
│       ├── paginate_test.go
│       ├── protected.go
│       ├── slices.go
│       ├── slices_test.go
│       ├── strings.go
│       └── strings_test.go
├── tools/
│   └── tools.go
├── version/
│   └── version.go
├── web/
│   ├── .gitignore
│   ├── .prettierignore
│   ├── .prettierrc.js
│   ├── .yamlignore
│   ├── LICENSE
│   ├── components.d.ts
│   ├── eslint.config.js
│   ├── index.html
│   ├── package.json
│   ├── src/
│   │   ├── App.vue
│   │   ├── assets/
│   │   │   └── locales/
│   │   │       ├── bar.json
│   │   │       ├── cs.json
│   │   │       ├── de.json
│   │   │       ├── en.json
│   │   │       ├── eo.json
│   │   │       ├── es.json
│   │   │       ├── fi.json
│   │   │       ├── fr.json
│   │   │       ├── hu.json
│   │   │       ├── id.json
│   │   │       ├── it.json
│   │   │       ├── lv.json
│   │   │       ├── nb-NO.json
│   │   │       ├── nl.json
│   │   │       ├── pl.json
│   │   │       ├── pt.json
│   │   │       ├── ru.json
│   │   │       ├── uk.json
│   │   │       ├── zh-Hans.json
│   │   │       └── zh-Hant.json
│   │   ├── components/
│   │   │   ├── FileTree.vue
│   │   │   ├── admin/
│   │   │   │   └── settings/
│   │   │   │       ├── forges/
│   │   │   │       │   └── AdminForgeForm.vue
│   │   │   │       └── queue/
│   │   │   │           └── AdminQueueStats.vue
│   │   │   ├── agent/
│   │   │   │   ├── AgentForm.vue
│   │   │   │   ├── AgentList.vue
│   │   │   │   └── AgentManager.vue
│   │   │   ├── atomic/
│   │   │   │   ├── Badge.vue
│   │   │   │   ├── Button.vue
│   │   │   │   ├── CountBadge.vue
│   │   │   │   ├── DocsLink.vue
│   │   │   │   ├── Error.vue
│   │   │   │   ├── Icon.vue
│   │   │   │   ├── IconButton.vue
│   │   │   │   ├── ListItem.vue
│   │   │   │   ├── RenderMarkdown.vue
│   │   │   │   ├── SvgIcon.vue
│   │   │   │   ├── SyntaxHighlight.ts
│   │   │   │   └── Warning.vue
│   │   │   ├── form/
│   │   │   │   ├── Checkbox.vue
│   │   │   │   ├── CheckboxesField.vue
│   │   │   │   ├── InputField.vue
│   │   │   │   ├── KeyValueEditor.vue
│   │   │   │   ├── NumberField.vue
│   │   │   │   ├── RadioField.vue
│   │   │   │   ├── SelectField.vue
│   │   │   │   ├── TextField.vue
│   │   │   │   └── form.types.ts
│   │   │   ├── layout/
│   │   │   │   ├── Container.vue
│   │   │   │   ├── Panel.vue
│   │   │   │   ├── Popup.vue
│   │   │   │   ├── Settings.vue
│   │   │   │   ├── header/
│   │   │   │   │   ├── ActivePipelines.vue
│   │   │   │   │   └── Navbar.vue
│   │   │   │   ├── popups/
│   │   │   │   │   └── DeployPipelinePopup.vue
│   │   │   │   └── scaffold/
│   │   │   │       ├── Header.vue
│   │   │   │       ├── Scaffold.vue
│   │   │   │       ├── Tab.vue
│   │   │   │       └── Tabs.vue
│   │   │   ├── pipeline-feed/
│   │   │   │   ├── PipelineFeedItem.vue
│   │   │   │   └── PipelineFeedSidebar.vue
│   │   │   ├── registry/
│   │   │   │   ├── RegistryEdit.vue
│   │   │   │   └── RegistryList.vue
│   │   │   ├── repo/
│   │   │   │   ├── RepoItem.vue
│   │   │   │   └── pipeline/
│   │   │   │       ├── PipelineItem.vue
│   │   │   │       ├── PipelineList.vue
│   │   │   │       ├── PipelineLog.vue
│   │   │   │       ├── PipelineRunningIcon.vue
│   │   │   │       ├── PipelineStatusIcon.vue
│   │   │   │       ├── PipelineStepDuration.vue
│   │   │   │       ├── PipelineStepList.vue
│   │   │   │       └── pipeline-status.ts
│   │   │   └── secrets/
│   │   │       ├── SecretEdit.vue
│   │   │       └── SecretList.vue
│   │   ├── compositions/
│   │   │   ├── useApiClient.ts
│   │   │   ├── useAsyncAction.ts
│   │   │   ├── useAuthentication.ts
│   │   │   ├── useConfig.ts
│   │   │   ├── useDate.ts
│   │   │   ├── useElapsedTime.ts
│   │   │   ├── useEvents.ts
│   │   │   ├── useFavicon.ts
│   │   │   ├── useForgeStore.ts
│   │   │   ├── useI18n.ts
│   │   │   ├── useInjectProvide.ts
│   │   │   ├── useInterval.ts
│   │   │   ├── useNotifications.ts
│   │   │   ├── usePaginate.test.ts
│   │   │   ├── usePaginate.ts
│   │   │   ├── usePipeline.ts
│   │   │   ├── usePipelineFeed.ts
│   │   │   ├── useRepoSearch.ts
│   │   │   ├── useRepos.ts
│   │   │   ├── useRouteBack.ts
│   │   │   ├── useTabs.ts
│   │   │   ├── useTheme.ts
│   │   │   ├── useUserConfig.ts
│   │   │   ├── useVersion.ts
│   │   │   └── useWPTitle.ts
│   │   ├── lib/
│   │   │   ├── api/
│   │   │   │   ├── client.ts
│   │   │   │   ├── index.ts
│   │   │   │   └── types/
│   │   │   │       ├── agent.ts
│   │   │   │       ├── cron.ts
│   │   │   │       ├── forge.ts
│   │   │   │       ├── index.ts
│   │   │   │       ├── org.ts
│   │   │   │       ├── pipeline.ts
│   │   │   │       ├── pipelineConfig.ts
│   │   │   │       ├── pull_request.ts
│   │   │   │       ├── queue.ts
│   │   │   │       ├── registry.ts
│   │   │   │       ├── repo.ts
│   │   │   │       ├── secret.ts
│   │   │   │       ├── user.ts
│   │   │   │       └── webhook.ts
│   │   │   ├── utils/
│   │   │   │   └── index.ts
│   │   │   └── utils.test.ts
│   │   ├── main.ts
│   │   ├── router.ts
│   │   ├── store/
│   │   │   ├── pipelines.ts
│   │   │   └── repos.ts
│   │   ├── style/
│   │   │   ├── console.css
│   │   │   └── prism.css
│   │   ├── style.css
│   │   ├── tailwind.css
│   │   ├── views/
│   │   │   ├── Login.vue
│   │   │   ├── NotFound.vue
│   │   │   ├── RepoAdd.vue
│   │   │   ├── Repos.vue
│   │   │   ├── RouterView.vue
│   │   │   ├── admin/
│   │   │   │   ├── AdminAgents.vue
│   │   │   │   ├── AdminInfo.vue
│   │   │   │   ├── AdminOrgs.vue
│   │   │   │   ├── AdminQueue.vue
│   │   │   │   ├── AdminRegistries.vue
│   │   │   │   ├── AdminRepos.vue
│   │   │   │   ├── AdminSecrets.vue
│   │   │   │   ├── AdminSettingsWrapper.vue
│   │   │   │   ├── AdminUsers.vue
│   │   │   │   └── forges/
│   │   │   │       ├── AdminForge.vue
│   │   │   │       ├── AdminForgeCreate.vue
│   │   │   │       └── AdminForges.vue
│   │   │   ├── cli/
│   │   │   │   └── Auth.vue
│   │   │   ├── org/
│   │   │   │   ├── OrgDeprecatedRedirect.vue
│   │   │   │   ├── OrgRepos.vue
│   │   │   │   ├── OrgWrapper.vue
│   │   │   │   └── settings/
│   │   │   │       ├── OrgAgents.vue
│   │   │   │       ├── OrgRegistries.vue
│   │   │   │       ├── OrgSecrets.vue
│   │   │   │       └── OrgSettingsWrapper.vue
│   │   │   ├── repo/
│   │   │   │   ├── RepoBranch.vue
│   │   │   │   ├── RepoBranches.vue
│   │   │   │   ├── RepoDeprecatedRedirect.vue
│   │   │   │   ├── RepoManualPipeline.vue
│   │   │   │   ├── RepoPipelines.vue
│   │   │   │   ├── RepoPullRequest.vue
│   │   │   │   ├── RepoPullRequests.vue
│   │   │   │   ├── RepoWrapper.vue
│   │   │   │   ├── pipeline/
│   │   │   │   │   ├── Pipeline.vue
│   │   │   │   │   ├── PipelineChangedFiles.vue
│   │   │   │   │   ├── PipelineConfig.vue
│   │   │   │   │   ├── PipelineDebug.vue
│   │   │   │   │   ├── PipelineErrors.vue
│   │   │   │   │   └── PipelineWrapper.vue
│   │   │   │   └── settings/
│   │   │   │       ├── Actions.vue
│   │   │   │       ├── Badge.vue
│   │   │   │       ├── Crons.vue
│   │   │   │       ├── Extensions.vue
│   │   │   │       ├── General.vue
│   │   │   │       ├── Registries.vue
│   │   │   │       ├── RepoSettings.vue
│   │   │   │       └── Secrets.vue
│   │   │   └── user/
│   │   │       ├── UserAgents.vue
│   │   │       ├── UserCLIAndAPI.vue
│   │   │       ├── UserGeneral.vue
│   │   │       ├── UserRegistries.vue
│   │   │       ├── UserSecrets.vue
│   │   │       └── UserWrapper.vue
│   │   └── vite-env.d.ts
│   ├── tsconfig.json
│   ├── vite.config.ts
│   ├── web.go
│   └── web_external.go
└── woodpecker-go/
    ├── LICENSE
    ├── README.md
    └── woodpecker/
        ├── agent.go
        ├── agent_test.go
        ├── client.go
        ├── client_test.go
        ├── const.go
        ├── global_registry.go
        ├── global_secret.go
        ├── httputil/
        │   ├── useragent.go
        │   └── useragent_test.go
        ├── interface.go
        ├── list_options.go
        ├── list_options_test.go
        ├── mocks/
        │   └── mock_Client.go
        ├── org.go
        ├── pipeline.go
        ├── queue.go
        ├── queue_test.go
        ├── repo.go
        ├── repo_test.go
        ├── types.go
        ├── user.go
        └── user_test.go

================================================
FILE CONTENTS
================================================

================================================
FILE: .cspell.json
================================================
{
  "version": "0.2",
  "language": "en",
  "dictionaries": [
    // language
    "en_us",
    // code
    "go",
    "node"
  ],
  "words": [
    "abool",
    "addgroup",
    "adduser",
    "agentscan",
    "anbraten",
    "antfu",
    "apimachinery",
    "appleboy",
    "aquasec",
    "Archlinux",
    "autoincr",
    "automerge",
    "autoscaler",
    "backporting",
    "backports",
    "binutils",
    "bitbucketdatacenter",
    "Bluesky",
    "Boguslawski",
    "bradrydzewski",
    "buildkit",
    "BUILDPLATFORM",
    "buildx",
    "caddyfile",
    "ccmenu",
    "CERTDIR",
    "certmagic",
    "charmbracelet",
    "checkmake",
    "cicd",
    "ciphertext",
    "Cloudron",
    "Codeberg",
    "compatiblelicenses",
    "corepack",
    "cpuset",
    "creativecommons",
    "Curr",
    "datacenter",
    "DATASOURCE",
    "Debugf",
    "dejavusans",
    "Demilestoned",
    "desaturate",
    "devx",
    "dind",
    "Dockle",
    "doublestar",
    "emojify",
    "envsubst",
    "errgroup",
    "estree",
    "evenodd",
    "excalidraw",
    "favicons",
    "Fediverse",
    "Feishu",
    "Fogas",
    "forbidigo",
    "Forgejo",
    "fsnotify",
    "Geeklab",
    "Georgiana",
    "gitea",
    "gitmodules",
    "GOARCH",
    "GOBIN",
    "gocritic",
    "GODEBUG",
    "godoc",
    "Gogs",
    "golangci",
    "gomod",
    "gonic",
    "GOPATH",
    "Gource",
    "handlebargh",
    "HEALTHCHECK",
    "healthz",
    "Hetzner",
    "HETZNERCLOUD",
    "homelab",
    "hostmatcher",
    "HTMLURL",
    "HTTPFS",
    "httpsign",
    "HTTPURL",
    "httputil",
    "ianvs",
    "iconify",
    "inetutils",
    "Infima",
    "Infof",
    "Informatyka",
    "intlify",
    "Ionescu",
    "Jetpack",
    "Kaniko",
    "Keyfunc",
    "kyvg",
    "lafriks",
    "LASTEXITCODE",
    "Laszlo",
    "laszlocph",
    "letsencrypt",
    "loadbalancer",
    "logfile",
    "loglevel",
    "LONGBLOB",
    "LONGTEXT",
    "lonix1",
    "mapstructure",
    "markdownlint",
    "mdbook",
    "memswap",
    "Metas",
    "mhmxs",
    "Milestoned",
    "moby",
    "Msgf",
    "mstruebing",
    "multiarch",
    "multierr",
    "narqo",
    "netdns",
    "Netrc",
    "Nextcloud",
    "nfpm",
    "nixos",
    "nixpkgs",
    "nocolor",
    "nolint",
    "nologin",
    "norunningpipelines",
    "nosniff",
    "ntfy",
    "octocat",
    "openapi",
    "opensource",
    "opentype",
    "Pacman",
    "picus",
    "Pinia",
    "pkce",
    "pnpx",
    "Polyform",
    "posix",
    "ppid",
    "Println",
    "prismjs",
    "promauto",
    "promhttp",
    "proto",
    "protobuf",
    "protoc",
    "PROTOC",
    "protoimpl",
    "protoreflect",
    "pullrequest",
    "pullrequests",
    "pwsh",
    "Redirections",
    "Refspec",
    "regcred",
    "repology",
    "reslimit",
    "Reviewdog",
    "Rieter",
    "riscv",
    "rundll32",
    "Rydzewski",
    "seccomp",
    "secprofile",
    "selfhosted",
    "sess",
    "sfnt",
    "shellescape",
    "shopt",
    "sigstore",
    "Sonatype",
    "SSHURL",
    "sslmode",
    "stepbuilder",
    "stretchr",
    "structs",
    "sublicensable",
    "swaggo",
    "syscalls",
    "TARGETARCH",
    "TARGETOS",
    "techknowlogick",
    "termenv",
    "testdata",
    "threadcreate",
    "tink",
    "tinycolor",
    "tmole",
    "tmpfs",
    "tmpl",
    "tolerations",
    "Traefik",
    "tseslint",
    "ttlcache",
    "TUNEIT",
    "Tunnelmole",
    "typecheck",
    "Typeflag",
    "unplugin",
    "unsanitize",
    "Upsert",
    "urfave",
    "usecase",
    "useragent",
    "varchar",
    "varz",
    "vcsurl",
    "Vieter",
    "virtualisation",
    "visualisation",
    "vite",
    "vueuse",
    "waivable",
    "Warnf",
    "webhookd",
    "Weblate",
    "windi",
    "windicss",
    "woodpeckerci",
    "WORKDIR",
    "Wrapf",
    "x-enum-varnames",
    "xlink",
    "xlog",
    "xorm",
    "xormigrate",
    "xoxys",
    "xyaml",
    "yamls",
    "Yuno",
    "zerolog",
    "zerologger"
  ],
  "ignorePaths": [
    ".cspell.json",
    "e2e/**",
    ".git/**/*",
    ".gitignore",
    ".golangci.yaml",
    ".vscode/extensions.json",
    "*_test.go",
    "*.excalidraw",
    "*.svg",
    "**/*.pb.go",
    "**/fixtures/**",
    "**/testdata/**",
    "CHANGELOG.md",
    "docs/versioned_docs/",
    "flake.nix",
    "go.mod",
    "Makefile",
    "package.json",
    "server/store/datastore/migration/**/*",
    "web/components.d.ts",
    "web/src/assets/locales/**/*",
    // generated
    "**/mocks/**",
    "**/node_modules/**/*",
    "cmd/server/openapi/docs.go",
    "flake.lock",
    "go.sum",
    "pnpm-lock.yaml",
    "renovate.json",
    // TODO: remove the following
    "docs/**/*.js",
    "docs/**/*.ts"
  ],
  // Exclude imports, because they are also strings.
  "ignoreRegExpList": [
    // ignore mulltiline imports
    "import\\s*\\((.|[\r\n])*?\\)",
    // ignore single line imports
    "import\\s*.*\".*?\"",
    // ignore go generate directive
    "//\\s*go:generate.*",
    // ignore nolint directive
    "//\\s*nolint:.*",
    // ignore docker image names
    "\\s*docker\\.io/.*",
    // ignore inline svg in css
    "\\s*url\\(\"data:image/svg\\+xml.*"
  ],
  "enableFiletypes": ["dockercompose"]
}


================================================
FILE: .ecrc
================================================
{
  "Exclude": [
    ".git",
    "go.mod",
    "go.sum",
    "vendor",
    "fixtures",
    "LICENSE",
    "node_modules",
    "server/store/datastore/migration/test-files/sqlite.db",
    "server/store/datastore/migration/test-files/postgres.sql",
    "server/store/datastore/feed.go",
    "cmd/server/openapi/docs.go",
    "_test.go",
    "Makefile"
  ]
}


================================================
FILE: .editorconfig
================================================
root = true

[*]
indent_style = space
indent_size = 2
tab_width = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true

[*.go]
indent_style = tab

[*.md]
trim_trailing_whitespace = false
indent_size = 1

[Makefile]
indent_style = tab


================================================
FILE: .gitattributes
================================================
* text=auto eol=lf


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yaml
================================================
# Credits to: https://github.com/vitejs/vite/blob/main/.github/ISSUE_TEMPLATE/bug_report.yml
name: "\U0001F41E Bug report"
description: Report an issue with Woodpecker
labels: ['bug']
body:
  - type: markdown
    attributes:
      value: |
        Thanks for taking the time to fill out this bug report!
  - type: dropdown
    id: component
    attributes:
      label: Component
      description: Which component of Woodpecker is affected by the issue?
      multiple: true
      options:
        - server
        - agent
        - cli
        - web-ui
        - other
    validations:
      required: true
  - type: textarea
    id: bug-description
    attributes:
      label: Describe the bug
      description: A clear and concise description of what the bug is. If you intend to submit a PR for this issue, tell us in the description. Thanks!
      placeholder: Bug description
    validations:
      required: true
  - type: textarea
    id: steps-to-reproduce
    attributes:
      label: Steps to reproduce
      description: Steps to reproduce the behavior.
      placeholder: |
        1. Install Woodpecker Server with the following configuration: ...
        2. Install Woodpecker Agent with the configuration below: ...
        3. Besides, set some settings in the forge: ...
        4. Run them all by the commands: ...
        5. Go to ..., click here and there, see next error: ...
        6. Also, check the logs and find this: ...
    validations:
      required: true
  - type: textarea
    id: expected-behavior
    attributes:
      label: Expected behavior
      description: A clear and concise description of what you expected to happen.
      placeholder: |
        When I click here and there, there should not be an error, but a successful operation.
        There should not be the errors in the logs, but the messages, that indicate a process: ...
    validations:
      required: false
  - type: textarea
    id: system-info
    attributes:
      label: System Info
      description: Output of `https://<your-woodpecker-instance>/version`
      render: shell
      placeholder: Version info, docker-compose config, Kubernetes manifests
    validations:
      required: true
  - type: textarea
    id: additional-context
    attributes:
      label: Additional context
      description: |
        Logs? Screenshots? Anything that will give us more context about the issue you are encountering!
        Sometimes a picture is worth a thousand words, but please try not to insert an image of logs / text
        and copy paste the text instead.

        Tip: You can attach images by clicking this area to highlight it and then dragging files in.
    validations:
      required: false
  - type: checkboxes
    id: checkboxes
    attributes:
      label: Validations
      description: Before submitting the issue, please make sure you do the following
      options:
        - label: Read the [docs](https://woodpecker-ci.org/docs/intro).
          required: true
        - label: Check that there isn't [already an issue](https://github.com/woodpecker-ci/woodpecker/issues) that reports the same bug to avoid creating a duplicate.
          required: true
        - label: Checked that the bug isn't fixed in the `next` version already [https://woodpecker-ci.org/versions]
          required: true


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: true
contact_links:
  - name: Start a discussion
    about: Our preferred starting point if you have any questions, suggestions or feature proposals.
    url: https://github.com/woodpecker-ci/woodpecker/discussions/new/choose
  - name: Frequently Asked Questions
    url: https://woodpecker-ci.org/faq
    about: Check the FAQs for common questions.
  - name: Support
    url: https://github.com/woodpecker-ci/.github/blob/main/SUPPORT.md
    about: Information about how you can get support.


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yaml
================================================
# Credits to: https://github.com/vitejs/vite/blob/main/.github/ISSUE_TEMPLATE/feature_request.yml
name: "\U0001F680 New feature proposal"
description: Propose a new feature to be added to Woodpecker
labels: ['feature']
body:
  - type: markdown
    attributes:
      value: |
        Thanks for your interest in the project and taking the time to fill out this feature report!
  - type: textarea
    id: feature-description
    attributes:
      label: Clear and concise description of the problem
      description: 'As a user of Woodpecker I want [goal / wish] so that [benefit]. If you intend to submit a PR for this issue, tell us in the description.'
    validations:
      required: true
  - type: textarea
    id: suggested-solution
    attributes:
      label: Suggested solution
      description: 'In web-ui / config we could provide following functionality...'
    validations:
      required: true
  - type: textarea
    id: alternative
    attributes:
      label: Alternative
      description: Clear and concise description of any alternative solutions or features you've considered.
  - type: textarea
    id: additional-context
    attributes:
      label: Additional context
      description: Any other context or screenshots about the feature request here.
  - type: checkboxes
    id: checkboxes
    attributes:
      label: Validations
      description: Before submitting the issue, please make sure you do the following
      options:
        - label: Checked that the feature isn't part of the `next` version already [https://woodpecker-ci.org/versions]
          required: true
        - label: Read the [docs](https://woodpecker-ci.org/docs/intro).
          required: true
        - label: Check that there isn't already an [issue](https://github.com/woodpecker-ci/woodpecker/issues) that request the same feature to avoid creating a duplicate.
          required: true


================================================
FILE: .github/pull_request_template.md
================================================
<!--

Please check the following tips:
1. Avoid using force-push and commands that require it (such as `commit --amend` and `rebase origin/main`). This makes it more difficult for the maintainers to review your work. Add new commits on top of the current branch, and merge the new state of `main` into your branch with plain `merge`.
2. Provide a meaningful title for this pull request. It will be used as the commit message when this pull request is merged. Add as many commits as you like with any messages you like, they will be squashed into one commit.
3. If this pull request fixes an issue, refer to the issue with messages like `Closes #1234`, or `Fixes #1234` in the pull description.
4. Please check that you are targeting the `main` branch. Pull requests on release branches are only allowed for backports.
5. Make sure you have read contribution guidelines: https://woodpecker-ci.org/docs/development/getting-started
6. It is recommended to enable "Allow edits by maintainers", so maintainers can help you more easily.

-->


================================================
FILE: .github/release_template.md
================================================
<!-- markdownlint-disable MD041 -->

### Prerequisites

- [ ] MAJOR: Check `docs/src/pages/migrations.md`
  - [ ] Check whether it contains all the necessary migration steps and recommended actions for users and administrators
  - [ ] Check whether the steps refer to the associated pull requests or issues
  - [ ] Ensure that the steps are clear and describe the actions required for the migration
    - Good: "Rename your `branch` configuration option to `when.branch` (PR#123)"
    - Bad: "Remove the `branch` configuration option in favor of `when.branch`"
    - If possible, provide background information so users can understand the change
- [ ] MAJOR: Create a blog entry in `docs/blog/` that highlights the most important changes and includes a link to the release notes.
- [ ] Prepare docs PR for new version and delete old versions (keep only the last three minor versions for the current major version)
  - [ ] Run `make generate` locally to update the automatically generated CLI documentation
  - [ ] Copy `docs/docs` to `docs/versioned_docs/version-<version>` and delete old versions
  - [ ] Create `docs/versioned_sidebars/version-<version>-sidebars.json` and delete old ones
  - [ ] Add new version to `docs/versions.json` and delete old versions
  - [ ] Add new version to the version list in `docs/src/pages/versions.md`
- [ ] Announce the release in the maintainer chat and ask for pending blockers

### Release

- [ ] Test the latest container images to make sure they work as expected
- [ ] Update `https://ci.woodpecker.org` to the latest version of `next` and verify that it works as expected
- [ ] Merge documentation PR (shortly before release)
- [ ] Merge the release PR to start the release pipeline

### Post-release

- [ ] Release the Helm Chart. If renovate has not created the upgrade PR already, manually trigger it from the Dependency Dashboard.
- [ ] Announce release in relevant chats and on social media platforms
  - [ ] Mastodon (check if already posted from the release pipeline)
  - [ ] Bluesky (check if already posted from the release pipeline)
  - [ ] Matrix


================================================
FILE: .github/renovate.json
================================================
{
  "$schema": "https://docs.renovatebot.com/renovate-schema.json",
  "extends": ["github>woodpecker-ci/renovate-config"],
  "automergeType": "pr",
  "customManagers": [
    {
      "customType": "regex",
      "managerFilePatterns": ["/^shared/constant/constant.go$/"],
      "matchStrings": [
        "//\\s*renovate:\\s*datasource=(?<datasource>.*?) depName=(?<depName>.*?)( versioning=(?<versioning>.*?))?\\s+DefaultClonePlugin = \"docker.io/woodpeckerci/plugin-git:(?<currentValue>.*)\""
      ],
      "versioningTemplate": "{{#if versioning}}{{{versioning}}}{{else}}semver{{/if}}"
    }
  ],
  "packageRules": [
    {
      "matchCurrentVersion": "<1.0.0",
      "matchPackageNames": ["github.com/distribution/reference"],
      "matchUpdateTypes": ["major", "minor"],
      "dependencyDashboardApproval": true
    },
    {
      "matchPackageNames": ["github.com/charmbracelet/huh/spinner"],
      "enabled": false
    },
    {
      "matchManagers": ["docker-compose"],
      "matchFileNames": ["docker-compose.gitpod.yaml"],
      "addLabels": ["devx"]
    },
    {
      "groupName": "golang-lang",
      "matchUpdateTypes": ["minor", "patch"],
      "matchPackageNames": ["/^golang$/", "/xgo/"]
    },
    {
      "groupName": "golang-packages",
      "matchManagers": ["gomod"],
      "matchUpdateTypes": ["minor", "patch"]
    },
    {
      "matchManagers": ["npm"],
      "matchFileNames": ["web/package.json"],
      "addLabels": ["ui"]
    },
    {
      "matchManagers": ["npm"],
      "matchFileNames": ["docs/**/package.json"],
      "addLabels": ["documentation"]
    },
    {
      "groupName": "web npm deps non-major",
      "matchManagers": ["npm"],
      "matchUpdateTypes": ["minor", "patch"],
      "matchFileNames": ["web/package.json"]
    },
    {
      "groupName": "docs npm deps non-major",
      "matchManagers": ["npm"],
      "matchUpdateTypes": ["minor", "patch"],
      "matchFileNames": ["docs/**/package.json"]
    },
    {
      "description": "Extract version from xgo container tags",
      "matchDatasources": ["docker"],
      "versioning": "regex:^go-(?<major>\\d+)\\.(?<minor>\\d+)\\.x$",
      "matchPackageNames": ["/techknowlogick/xgo/"]
    }
  ]
}


================================================
FILE: .gitignore
================================================
### IDEs ###
.idea/
.vscode/*
!.vscode/settings.json
!.vscode/launch.json
!.vscode/extensions.json

### GO ###
# Binaries for programs and plugins
*.exe
*.exe~
*.dll
*.so
*.dylib
vendor/
__debug_bin*

# Test binary, built with `go test -c`
*.test

# Output of the go coverage tool, specifically when used with LiteIDE
*.out

### Frontend ###
web/dist/**
!web/dist/.gitkeep
web/node_modules/
web/*.log
web/.env
.pnpm-store

### Docker ###
docker-compose.yml

### Other ##
# runetime or build relicts
*.sqlite
*.out
/.env
/.direnv
/.envrc
extras/
/build/
/dist/
/data/
datastore/migration/testfiles/

docs/venv

# helm charts
.cr-index/
.cr-release-packages/

### Generated by CI ###
docs/docs/40-cli.md
docs/openapi.json

# Removed once v3.0.x is minimum version to be touched
docs/swagger.json


================================================
FILE: .gitpod.yml
================================================
tasks:
  - name: Server
    env:
      WOODPECKER_OPEN: true
      WOODPECKER_ADMIN: woodpecker
      WOODPECKER_EXPERT_WEBHOOK_HOST: http://host.docker.internal:8000
      WOODPECKER_AGENT_SECRET: '1234'
      WOODPECKER_GITEA: true
      WOODPECKER_DEV_WWW_PROXY: http://localhost:8010
      WOODPECKER_BACKEND_DOCKER_NETWORK: ci_default
    init: |
      # renovate: datasource=golang-version depName=golang
      GO_VERSION=1.26.3
      rm -rf ~/go
      curl -fsSL https://dl.google.com/go/go$GO_VERSION.linux-amd64.tar.gz | tar xzs -C ~/
      go mod tidy
      mkdir -p web/dist
      touch web/dist/index.html
      make build-server
    command: |
      grep "WOODPECKER_GITEA_URL=" .env \
        && sed "s,^WOODPECKER_GITEA_URL=.*,WOODPECKER_GITEA_URL=$(gp url 3000)," .env \
        || echo WOODPECKER_GITEA_URL=$(gp url 3000) >> .env
      grep "WOODPECKER_HOST=" .env \
        && sed "s,^WOODPECKER_HOST=.*,WOODPECKER_HOST=$(gp url 8000)," .env \
        || echo WOODPECKER_HOST=$(gp url 8000) >> .env
      gp sync-await gitea
      gp sync-done woodpecker-server
      go run go.woodpecker-ci.org/woodpecker/v3/cmd/server
  - name: Agent
    env:
      WOODPECKER_SERVER: localhost:9000
      WOODPECKER_AGENT_SECRET: '1234'
      WOODPECKER_MAX_WORKFLOWS: 1
      WOODPECKER_HEALTHCHECK: false
    command: |
      gp sync-await woodpecker-server
      go run go.woodpecker-ci.org/woodpecker/v3/cmd/agent
  - name: Gitea
    command: |
      export DOCKER_COMPOSE_CMD="docker-compose -f docker-compose.gitpod.yaml -p woodpecker"
      export GITEA_CLI_CMD="$DOCKER_COMPOSE_CMD exec -u git gitea gitea"
      $DOCKER_COMPOSE_CMD up -d
      until curl --output /dev/null --silent --head --fail http://localhost:3000; do printf '.'; sleep 1; done
      $GITEA_CLI_CMD admin user create --username woodpecker --password password --email woodpecker@localhost --admin
      export GITEA_TOKEN=$($GITEA_CLI_CMD admin user generate-access-token -u woodpecker --scopes write:repository,write:user --raw | tail -n 1 | awk 'NF{ print $NF }')
      GITEA_OAUTH_APP=$(curl -X 'POST' 'http://localhost:3000/api/v1/user/applications/oauth2' \
        -H 'accept: application/json' -H 'Content-Type: application/json' -H "Authorization: token ${GITEA_TOKEN}" \
        -d "{ \"name\": \"Woodpecker CI\", \"confidential_client\": true, \"redirect_uris\": [ \"https://8000-${GITPOD_WORKSPACE_ID}.${GITPOD_WORKSPACE_CLUSTER_HOST}/authorize\" ] }")
      touch .env
      grep "WOODPECKER_GITEA_CLIENT=" .env \
        && sed "s,^WOODPECKER_GITEA_CLIENT=.*,WOODPECKER_GITEA_CLIENT=$(echo $GITEA_OAUTH_APP | jq -r .client_id)," .env \
        || echo WOODPECKER_GITEA_CLIENT=$(echo $GITEA_OAUTH_APP | jq -r .client_id) >> .env
      grep "WOODPECKER_GITEA_SECRET=" .env \
        && sed "s,^WOODPECKER_GITEA_SECRET=.*,WOODPECKER_GITEA_SECRET=$(echo $GITEA_OAUTH_APP | jq -r .client_secret)," .env \
        || echo WOODPECKER_GITEA_SECRET=$(echo $GITEA_OAUTH_APP | jq -r .client_secret) >> .env
      curl -X 'POST' \
        'http://localhost:3000/api/v1/user/repos' \
        -H 'accept: application/json' \
        -H 'Content-Type: application/json' \
        -H "Authorization: token ${GITEA_TOKEN}" \
        -d '{ "auto_init": false, "name": "woodpecker-test", "private": true, "template": false, "trust_model": "default" }'
      cd contrib/woodpecker-test-repo
      git init
      git checkout -b main
      git remote add origin http://woodpecker:${GITEA_TOKEN}@localhost:3000/woodpecker/woodpecker-test.git
      git add .
      git commit -m "Initial commit"
      git push -u origin main
      cd ../..
      gp sync-done gitea
      $DOCKER_COMPOSE_CMD logs -f
  - name: App
    before: |
      cd web/
    init: |
      pnpm install
    command: |
      pnpm start
  - name: Docs
    before: |
      cd docs/
    init: |
      pnpm install
      pnpm build:woodpecker-plugins
    command: |
      pnpm start --port 4000

ports:
  - port: 3000
    name: Gitea
    onOpen: ignore
    visibility: public # TODO: https://github.com/woodpecker-ci/woodpecker/issues/856
  - port: 8000
    name: Woodpecker
    onOpen: notify
    visibility: public # TODO: https://github.com/woodpecker-ci/woodpecker/issues/856
  - port: 9000
    name: Woodpecker GRPC
    onOpen: ignore
  - port: 8010
    description: Do not use! Access woodpecker on port 8000
    onOpen: ignore
  - port: 4000
    name: Docs
    onOpen: notify

vscode:
  extensions:
    # cSpell:disable
    - 'golang.go'
    - 'EditorConfig.EditorConfig'
    - 'dbaeumer.vscode-eslint'
    - 'esbenp.prettier-vscode'
    - 'bradlc.vscode-tailwindcss'
    - 'Vue.volar'
    - 'redhat.vscode-yaml'
    - 'davidanson.vscode-markdownlint'
    - 'streetsidesoftware.code-spell-checker'
    - 'stivo.tailwind-fold'
    # cSpell:enable


================================================
FILE: .golangci.yaml
================================================
version: '2'
run:
  timeout: 15m
  build-tags:
    - test
linters:
  default: none
  enable:
    - asciicheck
    - bidichk
    - bodyclose
    - contextcheck
    - depguard
    - dogsled
    - durationcheck
    - errcheck
    - errchkjson
    - errorlint
    - forbidigo
    - forcetypeassert
    - gochecknoinits
    - gocritic
    - godot
    - goheader
    - gomoddirectives
    - gomodguard_v2
    - goprintffuncname
    - govet
    - importas
    - ineffassign
    - makezero
    - misspell
    - mnd
    - nolintlint
    - revive
    - rowserrcheck
    - sqlclosecheck
    - staticcheck
    - unconvert
    - unparam
    - unused
    - usetesting
    - wastedassign
    - whitespace
    - zerologlint
  settings:
    depguard:
      rules:
        agent:
          list-mode: lax
          files:
            - '**/agent/*.go'
            - '**/agent/**/*.go'
            - '**/cmd/agent/*.go'
            - '**/cmd/agent/**/*.go'
          deny:
            - pkg: go.woodpecker-ci.org/woodpecker/v3/cli
            - pkg: go.woodpecker-ci.org/woodpecker/v3/cmd/cli
            - pkg: go.woodpecker-ci.org/woodpecker/v3/cmd/server
            - pkg: go.woodpecker-ci.org/woodpecker/v3/server
            - pkg: go.woodpecker-ci.org/woodpecker/v3/web
            - pkg: go.woodpecker-ci.org/woodpecker/v3/woodpecker-go/woodpecker
        cli:
          list-mode: lax
          files:
            - '**/cli/*.go'
            - '**/cli/**/*.go'
            - '**/cmd/cli/*.go'
            - '**/cmd/cli/**/*.go'
          deny:
            - pkg: go.woodpecker-ci.org/woodpecker/v3/agent
            - pkg: go.woodpecker-ci.org/woodpecker/v3/cmd/agent
            - pkg: go.woodpecker-ci.org/woodpecker/v3/cmd/server
            - pkg: go.woodpecker-ci.org/woodpecker/v3/rpc
            - pkg: go.woodpecker-ci.org/woodpecker/v3/server
            - pkg: go.woodpecker-ci.org/woodpecker/v3/web
        pipeline:
          list-mode: lax
          files:
            - '!**/cli/pipeline/*.go'
            - '!**/cli/pipeline/**/*.go'
            - '!**/server/pipeline/*.go'
            - '!**/server/pipeline/**/*.go'
            - '**/pipeline/*.go'
            - '**/pipeline/**/*.go'
          deny:
            - pkg: go.woodpecker-ci.org/woodpecker/v3/agent
            - pkg: go.woodpecker-ci.org/woodpecker/v3/cli
            - pkg: go.woodpecker-ci.org/woodpecker/v3/cmd
            - pkg: go.woodpecker-ci.org/woodpecker/v3/rpc
            - pkg: go.woodpecker-ci.org/woodpecker/v3/server
            - pkg: go.woodpecker-ci.org/woodpecker/v3/web
        server:
          list-mode: lax
          files:
            - '**/cmd/server/*.go'
            - '**/cmd/server/**/*.go'
            - '**/server/*.go'
            - '**/server/**/*.go'
            - '**/web/*.go'
            - '**/web/**/*.go'
          deny:
            - pkg: go.woodpecker-ci.org/woodpecker/v3/agent
            - pkg: go.woodpecker-ci.org/woodpecker/v3/cli
            - pkg: go.woodpecker-ci.org/woodpecker/v3/cmd/agent
            - pkg: go.woodpecker-ci.org/woodpecker/v3/cmd/cli
            - pkg: go.woodpecker-ci.org/woodpecker/v3/woodpecker-go/woodpecker
        rpc:
          list-mode: lax
          files:
            - '!**/agent/rpc/*.go'
            - '!**/agent/rpc/**/*.go'
            - '!**/server/rpc/*.go'
            - '!**/server/rpc/**/*.go'
            - '**/rpc/*.go'
            - '**/rpc/**/*.go'
          deny:
            - pkg: go.woodpecker-ci.org/woodpecker/v3/agent
            - pkg: go.woodpecker-ci.org/woodpecker/v3/cli
            - pkg: go.woodpecker-ci.org/woodpecker/v3/cmd
            - pkg: go.woodpecker-ci.org/woodpecker/v3/server
            - pkg: go.woodpecker-ci.org/woodpecker/v3/web
        shared:
          list-mode: lax
          files:
            - '!**/pipeline/shared/*.go'
            - '!**/pipeline/shared/**/*.go'
            - '**/shared/*.go'
            - '**/shared/**/*.go'
          deny:
            - pkg: go.woodpecker-ci.org/woodpecker/v3/agent
            - pkg: go.woodpecker-ci.org/woodpecker/v3/cli
            - pkg: go.woodpecker-ci.org/woodpecker/v3/cmd
            - pkg: go.woodpecker-ci.org/woodpecker/v3/pipeline
            - pkg: go.woodpecker-ci.org/woodpecker/v3/rpc
            - pkg: go.woodpecker-ci.org/woodpecker/v3/server
            - pkg: go.woodpecker-ci.org/woodpecker/v3/web
        woodpecker-go:
          list-mode: lax
          files:
            - '**/woodpecker-go/woodpecker/*.go'
            - '**/woodpecker-go/woodpecker/**/*.go'
          deny:
            - pkg: go.woodpecker-ci.org/woodpecker/v3/agent
            - pkg: go.woodpecker-ci.org/woodpecker/v3/cli
            - pkg: go.woodpecker-ci.org/woodpecker/v3/cmd
            - pkg: go.woodpecker-ci.org/woodpecker/v3/pipeline
            - pkg: go.woodpecker-ci.org/woodpecker/v3/rpc
            - pkg: go.woodpecker-ci.org/woodpecker/v3/server
            - pkg: go.woodpecker-ci.org/woodpecker/v3/shared
            - pkg: go.woodpecker-ci.org/woodpecker/v3/web
    errorlint:
      errorf-multi: true
    forbidigo:
      forbid:
        - pattern: context\.WithCancel$
        - pattern: ^print.*$
        - pattern: panic
        - pattern: ^log.Fatal().*$
    godot:
      scope: toplevel
      exclude:
        - '^\s*cSpell:'
        - '^\s*TODO:'
      capital: true
      period: true
    importas:
      no-extra-aliases: true
      alias:
        # stdlib
        - pkg: log
          alias: std_log

        # grpc / protobuf
        - pkg: google.golang.org/grpc/metadata
          alias: grpc_metadata
        - pkg: google.golang.org/grpc/credentials
          alias: grpc_credentials
        - pkg: google.golang.org/protobuf/proto
          alias: grpc_proto

        # woodpecker internal
        - pkg: go.woodpecker-ci.org/woodpecker/v3/pipeline/backend/types
          alias: backend_types
        - pkg: go.woodpecker-ci.org/woodpecker/v3/pipeline/errors
          alias: pipeline_errors
        - pkg: go.woodpecker-ci.org/woodpecker/v3/pipeline/runtime
          alias: pipeline_runtime
        - pkg: go.woodpecker-ci.org/woodpecker/v3/pipeline/utils
          alias: pipeline_utils
        - pkg: go.woodpecker-ci.org/woodpecker/v3/server/store/types
          alias: store_types
        - pkg: go.woodpecker-ci.org/woodpecker/v3/server/forge/types
          alias: forge_types
        - pkg: go.woodpecker-ci.org/woodpecker/v3/server/services/log
          alias: service_log
        - pkg: go.woodpecker-ci.org/woodpecker/v3/server/rpc
          alias: server_rpc
        - pkg: go.woodpecker-ci.org/woodpecker/v3/agent/rpc
          alias: agent_rpc
        - pkg: go.woodpecker-ci.org/woodpecker/v3/shared/utils
          alias: shared_utils
        - pkg: go.woodpecker-ci.org/woodpecker/v3/pipeline/frontend/metadata
          alias: pipeline_metadata
        - pkg: go.woodpecker-ci.org/woodpecker/v3/pipeline/frontend/yaml/types/base
          alias: yaml_base_types
        - pkg: go.woodpecker-ci.org/woodpecker/v3/pipeline/frontend/yaml/types
          alias: yaml_types
        - pkg: go.woodpecker-ci.org/woodpecker/v3/server/cron
          alias: cron_scheduler

        # mocks
        - pkg: go.woodpecker-ci.org/woodpecker/v3/server/services/secret/mocks
          alias: secret_service_mocks
        - pkg: go.woodpecker-ci.org/woodpecker/v3/server/services/registry/mocks
          alias: registry_service_mocks
        - pkg: go.woodpecker-ci.org/woodpecker/v3/server/services/mocks
          alias: manager_mocks
        - pkg: go.woodpecker-ci.org/woodpecker/v3/server/forge/mocks
          alias: forge_mocks
        - pkg: go.woodpecker-ci.org/woodpecker/v3/pipeline/tracing/mocks
          alias: tracer_mocks
        - pkg: go.woodpecker-ci.org/woodpecker/v3/server/queue/mocks
          alias: queue_mocks
        - pkg: go.woodpecker-ci.org/woodpecker/v3/server/store/mocks
          alias: store_mocks
        - pkg: go.woodpecker-ci.org/woodpecker/v3/server/services/config/mocks
          alias: config_service_mocks
        - pkg: go.woodpecker-ci.org/woodpecker/v3/server/services/log/mocks
          alias: log_mocks

        # kubernetes
        - pkg: k8s.io/api/core/v1
          alias: kube_core_v1
        - pkg: k8s.io/apimachinery/pkg/apis/meta/v1
          alias: kube_meta_v1
        - pkg: k8s.io/apimachinery/pkg/api/errors
          alias: kube_errors
        - pkg: k8s.io/client-go/tools/clientcmd
          alias: kube_client_cmd

        # docker
        - pkg: github.com/docker/cli/cli/config/types
          alias: docker_config_types

        # misc third-party
        - pkg: github.com/swaggo/files
          alias: swaggo_files
        - pkg: github.com/swaggo/gin-swagger
          alias: swaggo_gin_swagger
        - pkg: xorm.io/xorm/log
          alias: xlog
        - pkg: github.com/tink-crypto/tink-go/v2/insecurecleartextkeyset
          alias: insecure_clear_text_keyset
        - pkg: github.com/migueleliasweb/go-github-mock/src/mock
          alias: github_mock
        - pkg: gitlab.com/gitlab-org/api/client-go/v2
          alias: gitlab
    misspell:
      locale: US
    mnd:
      ignored-numbers:
        - '0o600'
        - '0o660'
        - '0o644'
        - '0o755'
        - '0o700'
      ignored-functions:
        - make
        - time.*
        - strings.Split
        - callerName
        - random.GetRandomBytes
    revive:
      rules:
        - name: var-naming
          arguments:
            - []
            - []
            - - skipPackageNameChecks: true
  exclusions:
    generated: lax
    presets:
      - comments
      - common-false-positives
      - legacy
      - std-error-handling
    rules:
      - linters:
          - mnd
        path: fixtures|cmd/agent/flags.go|cmd/server/flags.go|pipeline/backend/kubernetes/flags.go|_test.go
    paths:
      - third_party$
      - builtin$
      - examples$
formatters:
  enable:
    - gci
    - gofmt
    - gofumpt
  settings:
    gci:
      sections:
        - standard
        - default
        - prefix(go.woodpecker-ci.org/woodpecker)
      custom-order: true
    gofmt:
      simplify: true
      rewrite-rules:
        - pattern: interface{}
          replacement: any
    gofumpt:
      extra-rules: true
  exclusions:
    generated: lax
    paths:
      - third_party$
      - builtin$
      - examples$


================================================
FILE: .hadolint.yaml
================================================
ignored:
  - DL3018 # pin versions in Dockerfile


================================================
FILE: .lycheeignore
================================================
https://stackoverflow.com/*


================================================
FILE: .markdownlint.yaml
================================================
# markdownlint YAML configuration
# https://github.com/DavidAnson/markdownlint/blob/main/schema/.markdownlint.yaml

# Default state for all rules
default: true

# Path to configuration file to extend
extends: null

# MD003/heading-style/header-style - Heading style
MD003:
  # Heading style
  style: 'atx'

# MD004/ul-style - Unordered list style
MD004:
  style: 'dash'

# MD007/ul-indent - Unordered list indentation
MD007:
  # Spaces for indent
  indent: 2
  # Whether to indent the first level of the list
  start_indented: false

# MD009/no-trailing-spaces - Trailing spaces
MD009:
  # Spaces for line break
  br_spaces: 2
  # Allow spaces for empty lines in list items
  list_item_empty_lines: false
  # Include unnecessary breaks
  strict: false

# MD010/no-hard-tabs - Hard tabs
MD010:
  # Include code blocks
  code_blocks: true

# MD012/no-multiple-blanks - Multiple consecutive blank lines
MD012:
  # Consecutive blank lines
  maximum: 1

# MD013/line-length - Line length
MD013:
  # Number of characters
  line_length: 500
  # Number of characters for headings
  heading_line_length: 100
  # Number of characters for code blocks
  code_block_line_length: 80
  # Include code blocks
  code_blocks: false
  # Include tables
  tables: false
  # Include headings
  headings: true
  # Strict length checking
  strict: false
  # Stern length checking
  stern: false

# MD022/blanks-around-headings/blanks-around-headers - Headings should be surrounded by blank lines
MD022:
  # Blank lines above heading
  lines_above: 1
  # Blank lines below heading
  lines_below: 1

# MD024/no-duplicate-heading/no-duplicate-header - Multiple headings with the same content
MD024:
  # Only check sibling headings
  siblings_only: true

# MD025/single-title/single-h1 - Multiple top-level headings in the same document
MD025:
  # Heading level
  level: 1
  # RegExp for matching title in front matter
  front_matter_title: "^\\s*title\\s*[:=]"

# MD026/no-trailing-punctuation - Trailing punctuation in heading
MD026:
  # Punctuation characters
  punctuation: '.,;:!。,;:!'

# MD029/ol-prefix - Ordered list item prefix
MD029:
  # List style
  style: 'one_or_ordered'

# MD030/list-marker-space - Spaces after list markers
MD030:
  # Spaces for single-line unordered list items
  ul_single: 1
  # Spaces for single-line ordered list items
  ol_single: 1
  # Spaces for multi-line unordered list items
  ul_multi: 1
  # Spaces for multi-line ordered list items
  ol_multi: 1

# MD033/no-inline-html - Inline HTML
MD033:
  # Allowed elements
  allowed_elements: [details, summary, img, a, br, p]

# MD035/hr-style - Horizontal rule style
MD035:
  # Horizontal rule style
  style: '---'

# MD036/no-emphasis-as-heading/no-emphasis-as-header - Emphasis used instead of a heading
MD036:
  # Punctuation characters
  punctuation: '.,;:!?。,;:!?'

# MD041/first-line-heading/first-line-h1 - First line in a file should be a top-level heading
MD041:
  # Heading level
  level: 1
  # RegExp for matching title in front matter
  front_matter_title: "^\\s*title\\s*[:=]"

# MD044/proper-names - Proper names should have the correct capitalization
MD044:
  # List of proper names
  # names:
  # Include code blocks
  code_blocks: false

# MD046/code-block-style - Code block style
MD046:
  # Block style
  style: 'fenced'

# MD048/code-fence-style - Code fence style
MD048:
  # Code fence style
  style: 'backtick'

MD059: false


================================================
FILE: .mockery.yaml
================================================
---
all: true
dir: '{{.InterfaceDir}}/mocks'
filename: mock_{{.InterfaceName}}.go
pkgname: mocks
recursive: true
packages:
  go.woodpecker-ci.org/woodpecker/v3/rpc:
    config:
      recursive: false
  go.woodpecker-ci.org/woodpecker/v3/server/forge:
  go.woodpecker-ci.org/woodpecker/v3/server/queue:
  go.woodpecker-ci.org/woodpecker/v3/server/services:
    config:
      exclude-subpkg-regex:
        - types
  go.woodpecker-ci.org/woodpecker/v3/server/services/config:
  go.woodpecker-ci.org/woodpecker/v3/server/services/environment:
  go.woodpecker-ci.org/woodpecker/v3/server/services/registry:
  go.woodpecker-ci.org/woodpecker/v3/server/services/secret:
  go.woodpecker-ci.org/woodpecker/v3/server/store:
  go.woodpecker-ci.org/woodpecker/v3/woodpecker-go/woodpecker:
  go.woodpecker-ci.org/woodpecker/v3/pipeline/tracing:
  go.woodpecker-ci.org/woodpecker/v3/pipeline/backend/types:


================================================
FILE: .pre-commit-config.yaml
================================================
# cSpell:ignore checkmake hadolint autofix autoupdate
repos:
  - repo: meta
    hooks:
      - id: check-hooks-apply
      - id: check-useless-excludes
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v6.0.0
    hooks:
      - id: end-of-file-fixer
        exclude: '\.sql$'
      - id: trailing-whitespace
        exclude: ^docs/versioned_docs/.+/40-cli.md$
  - repo: https://github.com/golangci/golangci-lint
    rev: v2.12.2
    hooks:
      - id: golangci-lint
  - repo: https://github.com/igorshubovych/markdownlint-cli
    rev: v0.48.0
    hooks:
      - id: markdownlint
        exclude: '^(docs/versioned_docs/.*|CHANGELOG.md)$'
        language_version: 24.14.0
  - repo: https://github.com/mrtazz/checkmake
    rev: v0.3.2
    hooks:
      - id: checkmake
        exclude: '^docker/Dockerfile.make$' # actually a Dockerfile and not a makefile
  - repo: https://github.com/hadolint/hadolint
    rev: v2.14.0
    hooks:
      - id: hadolint
  - repo: https://github.com/rbubley/mirrors-prettier
    rev: v3.8.3
    hooks:
      - id: prettier
  - repo: https://github.com/adrienverge/yamllint.git
    rev: v1.38.0
    hooks:
      - id: yamllint
        args: [--strict, -c=.yamllint.yaml]
  - repo: local
    hooks:
      - id: yaml-file-extension
        name: Check if YAML files has *.yaml extension.
        entry: YAML filenames must have .yaml extension.
        language: fail
        files: .yml$
        exclude: '^(.gitpod.yml|.github/ISSUE_TEMPLATE/config.yml)$'

ci:
  autofix_commit_msg: |
    [pre-commit.ci] auto fixes from pre-commit.com hooks [CI SKIP]

    for more information, see https://pre-commit.ci
  autofix_prs: true
  autoupdate_branch: ''
  autoupdate_commit_msg: '[pre-commit.ci] pre-commit autoupdate'
  autoupdate_schedule: quarterly
  # NB: hadolint not included in pre-commit.ci
  skip: [check-hooks-apply, check-useless-excludes, hadolint, prettier, golangci-lint]
  submodules: false


================================================
FILE: .prettierignore
================================================
build/
dist/
CHANGELOG.md

# web/ and docs/ must be directly formatted from there
# to prevent conflicts with different prettier version
web/
docs/


================================================
FILE: .prettierrc.json
================================================
{
  "semi": true,
  "trailingComma": "all",
  "singleQuote": true,
  "printWidth": 120,
  "tabWidth": 2,
  "endOfLine": "lf"
}


================================================
FILE: .vscode/extensions.json
================================================
{
  // List of extensions which should be recommended for users of this workspace.
  "recommendations": [
    "golang.go",
    "EditorConfig.EditorConfig",
    "dbaeumer.vscode-eslint",
    "esbenp.prettier-vscode",
    "bradlc.vscode-tailwindcss",
    "Vue.volar",
    "redhat.vscode-yaml",
    "davidanson.vscode-markdownlint",
    "stivo.tailwind-fold"
  ],
  // List of extensions recommended by VS Code that should not be recommended for users of this workspace.
  "unwantedRecommendations": []
}


================================================
FILE: .vscode/launch.json
================================================
{
  "version": "0.2.0",
  "compounds": [
    {
      "name": "Woodpecker CI",
      "configurations": ["Woodpecker UI", "Woodpecker server", "Woodpecker agent"],
      "stopAll": true
    }
  ],
  "configurations": [
    {
      "name": "Woodpecker server",
      "type": "go",
      "request": "launch",
      "mode": "debug",
      "program": "${workspaceFolder}/cmd/server/",
      "cwd": "${workspaceFolder}"
    },
    {
      "name": "Woodpecker agent",
      "type": "go",
      "request": "launch",
      "mode": "debug",
      "program": "${workspaceFolder}/cmd/agent/",
      "cwd": "${workspaceFolder}"
    },
    {
      "name": "Go: current file",
      "type": "go",
      "request": "launch",
      "mode": "debug",
      "console": "integratedTerminal",
      "envFile": "${workspaceFolder}/.env",
      "cwd": "${workspaceFolder}",
      "program": "${file}"
    },
    {
      "name": "Woodpecker UI",
      "type": "node",
      "request": "launch",
      "runtimeExecutable": "pnpm",
      "runtimeArgs": ["start"],
      "cwd": "${workspaceFolder}/web",
      "resolveSourceMapLocations": ["${workspaceFolder}/web/**", "!**/node_modules/**"],
      "envFile": "${workspaceFolder}/.env",
      "skipFiles": ["<node_internals>/**"]
    }
  ]
}


================================================
FILE: .vscode/settings.json
================================================
{
  "git.ignoreLimitWarning": true,
  "search.exclude": {
    "**/node_modules": true,
    "**/bower_components": true,
    "**/*.code-search": true,
    "vendor/": true
  },
  "go.lintTool": "golangci-lint",
  "go.lintFlags": ["--fast"],
  "go.buildTags": "test",
  "eslint.workingDirectories": ["./web"],
  "prettier.ignorePath": "./web/.prettierignore",
  // Auto fix
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": "explicit",
    "source.organizeImports": "never"
  }
}


================================================
FILE: .woodpecker/binaries.yaml
================================================
when:
  - event: tag
  - event: pull_request
    branch: ${CI_REPO_DEFAULT_BRANCH}
    path:
      - Makefile
      - .woodpecker/binaries.yaml

variables:
  - &golang_image 'docker.io/golang:1.26'
  - &node_image 'docker.io/node:24-alpine'
  - &xgo_image 'docker.io/techknowlogick/xgo:go-1.26.x'

# cspell:words bindata netgo

steps:
  build-web:
    image: *node_image
    directory: web/
    commands:
      - corepack enable
      - pnpm install --frozen-lockfile
      - pnpm build

  vendor:
    image: *golang_image
    commands:
      - go mod vendor

  cross-compile-server:
    depends_on:
      - vendor
      - build-web
    image: *xgo_image
    pull: true
    commands:
      - apt update
      - apt install -y tree
      - make cross-compile-server
    environment:
      PLATFORMS: linux|arm64/v8;linux|amd64;linux|riscv64;windows|amd64
      TAGS: bindata sqlite sqlite_unlock_notify netgo
      ARCHIVE_IT: '1'

  build-tarball:
    depends_on:
      - vendor
      - build-web
    image: *golang_image
    commands:
      - make build-tarball

  build-agent:
    depends_on:
      - vendor
    image: *golang_image
    commands:
      - apt update
      - apt install -y zip
      - make release-agent

  build-cli:
    depends_on:
      - vendor
    image: *golang_image
    commands:
      - apt update
      - apt install -y zip
      - make release-cli

  build-deb-rpm:
    depends_on:
      - cross-compile-server
      - build-agent
      - build-cli
    image: *golang_image
    commands:
      - make bundle

  checksums:
    depends_on:
      - cross-compile-server
      - build-agent
      - build-cli
      - build-deb-rpm
      - build-tarball
    image: *golang_image
    commands:
      - make release-checksums

  release-dryrun:
    depends_on:
      - checksums
    image: *golang_image
    commands:
      - ls -la dist/*.*
      - cat dist/checksums.txt

  release:
    depends_on:
      - checksums
    image: woodpeckerci/plugin-release:0.3.1
    settings:
      api_key:
        from_secret: github_token
      files:
        - dist/*.tar.gz
        - dist/*.zip
        - dist/*.deb
        - dist/*.rpm
        - dist/checksums.txt
      title: ${CI_COMMIT_TAG##v}
    when:
      event: tag


================================================
FILE: .woodpecker/check-feature-docs.sh
================================================
#!/bin/sh
DOCS_CHANGED=$(echo "$CI_PIPELINE_FILES" | jq -r '.[]' | grep -c '^docs/docs/' || true)
if [ "$DOCS_CHANGED" -gt 0 ]; then
  echo "✅ OK: docs/docs/ has changes"
  exit 0
fi
NON_CLI=$(echo "$CI_PIPELINE_FILES" | jq -r '.[]' | grep -v '^cli/' | grep -v '^cmd/cli/' | grep -v '^docs/' || true)
if [ -z "$NON_CLI" ]; then
  echo "✅ OK: CLI-only feature, docs are auto-generated"
  exit 0
fi
echo "🚨 ERROR: PR has 'feature' label but no changes in docs/docs/"
echo "Please add documentation for the new feature."
exit 1


================================================
FILE: .woodpecker/docker.yaml
================================================
variables:
  - &golang_image 'docker.io/golang:1.26'
  - &node_image 'docker.io/node:24-alpine'
  - &xgo_image 'docker.io/techknowlogick/xgo:go-1.26.x'
  - &buildx_plugin 'docker.io/woodpeckerci/plugin-docker-buildx:6.1.0'
  - &platforms_release 'linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/386,linux/amd64,linux/ppc64le,linux/riscv64,linux/s390x,freebsd/arm64,freebsd/amd64,openbsd/arm64,openbsd/amd64'
  - &platforms_server 'linux/arm/v7,linux/arm64/v8,linux/amd64,linux/ppc64le,linux/riscv64'
  - &platforms_preview 'linux/amd64'
  - &platforms_alpine 'linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/amd64,linux/ppc64le'
  - &build_args 'CI_COMMIT_SHA=${CI_COMMIT_SHA},CI_COMMIT_BRANCH=${CI_COMMIT_BRANCH},CI_COMMIT_TAG=${CI_COMMIT_TAG}'

  # cspell:words woodpeckerbot netgo

  # vars used on push / tag events only
  - publish_logins: &publish_logins # Default DockerHub login
      - registry: https://index.docker.io/v1/
        username: woodpeckerbot
        password:
          from_secret: docker_password
      # Additional Quay.IO login
      - registry: https://quay.io
        username: 'woodpeckerci+wp_ci'
        password:
          from_secret: QUAY_IO_TOKEN
  - &publish_repos_server 'woodpeckerci/woodpecker-server,quay.io/woodpeckerci/woodpecker-server'
  - &publish_repos_agent 'woodpeckerci/woodpecker-agent,quay.io/woodpeckerci/woodpecker-agent'
  - &publish_repos_cli 'woodpeckerci/woodpecker-cli,quay.io/woodpeckerci/woodpecker-cli'
  - path: &when_path # web source code
      - 'web/**'
      # api source code
      - 'server/api/**'
      # go source code
      - '**/*.go'
      - 'go.*'
      # schema changes
      - 'pipeline/schema/**'
      # Dockerfile changes
      - 'docker/**'
      # pipeline config changes
      - '.woodpecker/docker.yaml'

when:
  - event: [pull_request, tag]
  - event: push
    branch: ${CI_REPO_DEFAULT_BRANCH}
    path: *when_path
  - event: pull_request_metadata
    evaluate: 'CI_COMMIT_PULL_REQUEST_LABELS contains "build_pr_images"'

steps:
  vendor:
    image: *golang_image
    pull: true
    commands:
      - go mod vendor
    when:
      - event: [pull_request, pull_request_metadata]
        evaluate: 'CI_COMMIT_PULL_REQUEST_LABELS contains "build_pr_images"'
      - event: pull_request
        path: *when_path
      - branch:
          - ${CI_REPO_DEFAULT_BRANCH}
        event: [push, tag]
        path: *when_path

  ###############
  # S e r v e r #
  ###############
  build-web:
    image: *node_image
    directory: web/
    commands:
      - corepack enable
      - pnpm install --frozen-lockfile
      - pnpm build
    when:
      - event: [pull_request, pull_request_metadata]
        evaluate: 'CI_COMMIT_PULL_REQUEST_LABELS contains "build_pr_images"'
      - event: pull_request
        path: *when_path
      - branch:
          - ${CI_REPO_DEFAULT_BRANCH}
        event: [push, tag]
        path: *when_path

  cross-compile-server-preview:
    depends_on:
      - vendor
      - build-web
    image: *xgo_image
    pull: true
    commands:
      - apt update
      - apt install -y tree
      - make cross-compile-server
    environment:
      PLATFORMS: linux|amd64
      TAGS: sqlite sqlite_unlock_notify netgo
    when:
      - event: [pull_request, pull_request_metadata]
        evaluate: 'CI_COMMIT_PULL_REQUEST_LABELS contains "build_pr_images"'
      - event: pull_request
        path: *when_path

  cross-compile-server:
    depends_on:
      - vendor
      - build-web
    image: *xgo_image
    pull: true
    commands:
      - apt update
      - apt install -y tree
      - make cross-compile-server
    environment:
      PLATFORMS: linux|arm/v7;linux|arm64/v8;linux|amd64;linux|ppc64le;linux|riscv64
      TAGS: sqlite sqlite_unlock_notify netgo
    when:
      branch:
        - ${CI_REPO_DEFAULT_BRANCH}
      event: [push, tag]
      path: *when_path

  publish-server-alpine-preview:
    depends_on:
      - cross-compile-server-preview
    image: *buildx_plugin
    settings:
      repo: woodpeckerci/woodpecker-server
      dockerfile: docker/Dockerfile.server.alpine.multiarch.rootless
      platforms: *platforms_preview
      tag: pull_${CI_COMMIT_PULL_REQUEST}-alpine
      logins: *publish_logins
    when: &when-preview
      evaluate: 'CI_COMMIT_PULL_REQUEST_LABELS contains "build_pr_images"'
      event: [pull_request, pull_request_metadata]

  build-server-dryrun:
    depends_on:
      - vendor
      - build-web
      - cross-compile-server-preview
    image: *buildx_plugin
    settings:
      dry_run: true
      repo: woodpeckerci/woodpecker-server
      dockerfile: docker/Dockerfile.server.multiarch.rootless
      platforms: *platforms_preview
      tag: pull_${CI_COMMIT_PULL_REQUEST}
    when: &when-dryrun
      - evaluate: 'not (CI_COMMIT_PULL_REQUEST_LABELS contains "build_pr_images")'
        event: pull_request
        path: *when_path

  publish-next-server:
    depends_on:
      - cross-compile-server
    image: *buildx_plugin
    settings:
      repo: *publish_repos_server
      dockerfile: docker/Dockerfile.server.multiarch.rootless
      platforms: *platforms_server
      tag: [next, 'next-${CI_COMMIT_SHA:0:10}']
      logins: *publish_logins
    when: &when-publish-next
      branch: ${CI_REPO_DEFAULT_BRANCH}
      event: push
      path: *when_path

  publish-next-server-alpine:
    depends_on:
      - cross-compile-server
    image: *buildx_plugin
    settings:
      repo: *publish_repos_server
      dockerfile: docker/Dockerfile.server.alpine.multiarch.rootless
      platforms: *platforms_alpine
      tag: [next-alpine, 'next-${CI_COMMIT_SHA:0:10}-alpine']
      logins: *publish_logins
    when: *when-publish-next

  release-server:
    depends_on:
      - cross-compile-server
    image: *buildx_plugin
    settings:
      repo: *publish_repos_server
      dockerfile: docker/Dockerfile.server.multiarch.rootless
      platforms: *platforms_server
      tag: ['${CI_COMMIT_TAG%%.*}', '${CI_COMMIT_TAG%.*}', '${CI_COMMIT_TAG}']
      logins: *publish_logins
    when: &when-release
      event: tag

  release-server-alpine:
    depends_on:
      - cross-compile-server
    image: *buildx_plugin
    settings:
      repo: *publish_repos_server
      dockerfile: docker/Dockerfile.server.alpine.multiarch.rootless
      platforms: *platforms_alpine
      tag: ['${CI_COMMIT_TAG%%.*}-alpine', '${CI_COMMIT_TAG%.*}-alpine', '${CI_COMMIT_TAG}-alpine']
      logins: *publish_logins
    when: *when-release

  #############
  # A g e n t #
  #############

  publish-agent-preview-alpine:
    depends_on:
      - vendor
    image: *buildx_plugin
    settings:
      repo: woodpeckerci/woodpecker-agent
      dockerfile: docker/Dockerfile.agent.alpine.multiarch
      platforms: *platforms_preview
      tag: pull_${CI_COMMIT_PULL_REQUEST}-alpine
      build_args: *build_args
      logins: *publish_logins
    when: *when-preview

  build-agent-dryrun:
    depends_on:
      - vendor
    image: *buildx_plugin
    settings:
      dry_run: true
      repo: woodpeckerci/woodpecker-agent
      dockerfile: docker/Dockerfile.agent.multiarch
      platforms: *platforms_preview
      tag: pull_${CI_COMMIT_PULL_REQUEST}
      build_args: *build_args
    when: *when-dryrun

  publish-next-agent:
    depends_on:
      - vendor
      # we also depend on cross-compile-server as we would have to hight
      # ram usage otherwise
      - cross-compile-server
    image: *buildx_plugin
    settings:
      repo: *publish_repos_agent
      dockerfile: docker/Dockerfile.agent.multiarch
      platforms: *platforms_release
      buildkit_oci_max_parallelism: 6
      tag: [next, 'next-${CI_COMMIT_SHA:0:10}']
      logins: *publish_logins
      build_args: *build_args
    when:
      branch: ${CI_REPO_DEFAULT_BRANCH}
      event: push
      path: *when_path

  publish-next-agent-alpine:
    depends_on:
      - vendor
      # we also depend on cross-compile-server as we would have to hight
      # ram usage otherwise
      - cross-compile-server
    image: *buildx_plugin
    settings:
      repo: *publish_repos_agent
      dockerfile: docker/Dockerfile.agent.alpine.multiarch
      platforms: *platforms_alpine
      tag: [next-alpine, 'next-${CI_COMMIT_SHA:0:10}-alpine']
      logins: *publish_logins
      build_args: *build_args
    when: *when-publish-next

  release-agent:
    depends_on:
      - vendor
      # we also depend on cross-compile-server as we would have to hight
      # ram usage otherwise
      - cross-compile-server
    image: *buildx_plugin
    settings:
      repo: *publish_repos_agent
      dockerfile: docker/Dockerfile.agent.multiarch
      platforms: *platforms_release
      buildkit_oci_max_parallelism: 6
      tag: ['${CI_COMMIT_TAG%%.*}', '${CI_COMMIT_TAG%.*}', '${CI_COMMIT_TAG}']
      logins: *publish_logins
      build_args: *build_args
    when: *when-release

  release-agent-alpine:
    depends_on:
      - vendor
      # we also depend on cross-compile-server as we would have to hight
      # ram usage otherwise
      - cross-compile-server
    image: *buildx_plugin
    settings:
      repo: *publish_repos_agent
      dockerfile: docker/Dockerfile.agent.alpine.multiarch
      platforms: *platforms_alpine
      tag: ['${CI_COMMIT_TAG%%.*}-alpine', '${CI_COMMIT_TAG%.*}-alpine', '${CI_COMMIT_TAG}-alpine']
      logins: *publish_logins
      build_args: *build_args
    when: *when-release

  #########
  # C L I #
  #########

  build-cli-alpine-preview:
    depends_on:
      - vendor
    image: *buildx_plugin
    settings:
      repo: woodpeckerci/woodpecker-cli
      dockerfile: docker/Dockerfile.cli.alpine.multiarch.rootless
      platforms: *platforms_preview
      tag: pull_${CI_COMMIT_PULL_REQUEST}-alpine
      build_args: *build_args
      logins: *publish_logins
    when: *when-preview

  build-cli-dryrun:
    depends_on:
      - vendor
    image: *buildx_plugin
    settings:
      dry_run: true
      repo: woodpeckerci/woodpecker-cli
      dockerfile: docker/Dockerfile.cli.multiarch.rootless
      platforms: *platforms_preview
      tag: pull_${CI_COMMIT_PULL_REQUEST}
      build_args: *build_args
    when: *when-dryrun

  publish-next-cli:
    depends_on:
      - vendor
      # we also depend on publish-next-agent as we would have to hight
      # ram usage otherwise
      - publish-next-agent
    image: *buildx_plugin
    settings:
      repo: *publish_repos_cli
      dockerfile: docker/Dockerfile.cli.multiarch.rootless
      platforms: *platforms_release
      buildkit_oci_max_parallelism: 6
      tag: [next, 'next-${CI_COMMIT_SHA:0:10}']
      logins: *publish_logins
      build_args: *build_args
    when: *when-publish-next

  publish-next-cli-alpine:
    depends_on:
      - vendor
      # we also depend on publish-next-agent as we would have to hight
      # ram usage otherwise
      - publish-next-agent
    image: *buildx_plugin
    settings:
      repo: *publish_repos_cli
      dockerfile: docker/Dockerfile.cli.alpine.multiarch.rootless
      platforms: *platforms_alpine
      tag: [next-alpine, 'next-${CI_COMMIT_SHA:0:10}-alpine']
      logins: *publish_logins
      build_args: *build_args
    when: *when-publish-next

  release-cli:
    depends_on:
      - vendor
      # we also depend on release-agent as we would have to hight
      # ram usage otherwise
      - release-agent
    image: *buildx_plugin
    settings:
      repo: *publish_repos_cli
      dockerfile: docker/Dockerfile.cli.multiarch.rootless
      platforms: *platforms_release
      buildkit_oci_max_parallelism: 6
      tag: ['${CI_COMMIT_TAG%%.*}', '${CI_COMMIT_TAG%.*}', '${CI_COMMIT_TAG}']
      logins: *publish_logins
      build_args: *build_args
    when: *when-release

  release-cli-alpine:
    depends_on:
      - vendor
      # we also depend on release-agent as we would have to hight
      # ram usage otherwise
      - release-agent
    image: *buildx_plugin
    settings:
      repo: *publish_repos_cli
      dockerfile: docker/Dockerfile.cli.alpine.multiarch.rootless
      platforms: *platforms_alpine
      tag: ['${CI_COMMIT_TAG%%.*}-alpine', '${CI_COMMIT_TAG%.*}-alpine', '${CI_COMMIT_TAG}-alpine']
      logins: *publish_logins
      build_args: *build_args
    when: *when-release


================================================
FILE: .woodpecker/docs.yaml
================================================
variables:
  - &golang_image 'docker.io/golang:1.26'
  - &node_image 'docker.io/node:24-alpine'
  - &alpine_image 'docker.io/alpine:3.23'
  - path: &when_path
      - 'docs/**'
      - '.woodpecker/docs.yaml'
      # since we generate docs for cli tool we have to watch this too
      - 'cli/**'
      - 'cmd/cli/**'
      # api docs
      - 'server/api/**'
  - path: &docker_path # web source code
      - 'web/**'
      # api source code
      - 'server/api/**'
      # go source code
      - '**/*.go'
      - 'go.*'
      # schema changes
      - 'pipeline/schema/**'
      # Dockerfile changes
      - 'docker/**'

when:
  - event: tag
  - event: pull_request
  - event: push
    path:
      - <<: *when_path
      - <<: *docker_path
    branch:
      - ${CI_REPO_DEFAULT_BRANCH}
  - event: pull_request_closed
    path: *when_path
  - event: manual
    evaluate: 'TASK == "docs"'

steps:
  - name: install-dependencies
    image: *node_image
    directory: docs/
    commands:
      - corepack enable
      - pnpm install --frozen-lockfile
    when:
      - path: *when_path
        event: [tag, pull_request, push]
      - event: manual

  - name: format-check
    image: *node_image
    directory: docs/
    commands:
      - corepack enable
      - pnpm format:check
    when:
      - path: *when_path
        event: pull_request

  - name: build-cli
    image: *golang_image
    commands:
      - make generate-docs
    when:
      - path: *when_path
        event: [tag, pull_request, push]
      - event: manual

  - name: build
    image: *node_image
    directory: docs/
    commands:
      - corepack enable
      - pnpm build
    when:
      - path: *when_path
        event: [tag, pull_request, push]
      - event: manual

  - name: deploy-preview
    image: docker.io/woodpeckerci/plugin-surge-preview:1.4.2
    settings:
      path: 'docs/build/'
      surge_token:
        from_secret: SURGE_TOKEN
      forge_repo_token:
        from_secret: GITHUB_TOKEN_SURGE
    failure: ignore
    when:
      - event: [pull_request, pull_request_closed]
        path: *when_path

  - name: deploy-prepare
    image: *alpine_image
    environment:
      BOT_PRIVATE_KEY:
        from_secret: BOT_PRIVATE_KEY
    commands:
      - apk add openssh-client git
      - mkdir -p $HOME/.ssh
      - ssh-keyscan -t rsa github.com >> $HOME/.ssh/known_hosts
      - echo "$BOT_PRIVATE_KEY" > $HOME/.ssh/id_rsa
      - chmod 0600 $HOME/.ssh/id_rsa
      - git clone --depth 1 --single-branch git@github.com:woodpecker-ci/woodpecker-ci.github.io.git ./docs_repo
    when:
      - event: push
        path:
          - <<: *when_path
          - <<: *docker_path
        branch: ${CI_REPO_DEFAULT_BRANCH}
      - event: [manual, tag]

  # update latest and next version
  - name: version-next
    image: *alpine_image
    commands:
      - apk add jq
      - jq '.next = "next-${CI_COMMIT_SHA:0:10}"' ./docs_repo/version.json > ./docs_repo/version.json.tmp
      - mv ./docs_repo/version.json.tmp ./docs_repo/version.json
    when:
      - event: push
        path: *docker_path
        branch: ${CI_REPO_DEFAULT_BRANCH}

  - name: version-release
    image: *alpine_image
    commands:
      - apk add jq
      - if [[ "${CI_COMMIT_TAG}" != *"rc"* ]] ; then jq '.latest = "${CI_COMMIT_TAG}"' ./docs_repo/version.json > ./docs_repo/version.json.tmp && mv ./docs_repo/version.json.tmp ./docs_repo/version.json ; fi
      - jq '.rc = "${CI_COMMIT_TAG}"' ./docs_repo/version.json > ./docs_repo/version.json.tmp
      - mv ./docs_repo/version.json.tmp ./docs_repo/version.json
    when:
      - event: tag

  - name: copy-files
    image: *alpine_image
    commands:
      - apk add rsync
      # copy all docs files and delete all old ones, but leave CNAME, index.yaml and version.json untouched
      - rsync -r --exclude .git --exclude CNAME --exclude index.yaml --exclude README.md --exclude version.json --delete docs/build/ ./docs_repo
    when:
      - event: push
        path: *when_path
        branch: ${CI_REPO_DEFAULT_BRANCH}
      - event: manual

  - name: deploy
    image: *alpine_image
    environment:
      BOT_PRIVATE_KEY:
        from_secret: BOT_PRIVATE_KEY
    commands:
      - apk add openssh-client rsync git
      - mkdir -p $HOME/.ssh
      - ssh-keyscan -t rsa github.com >> $HOME/.ssh/known_hosts
      - echo "$BOT_PRIVATE_KEY" > $HOME/.ssh/id_rsa
      - chmod 0600 $HOME/.ssh/id_rsa
      - git config --global user.email "woodpecker-bot@obermui.de"
      - git config --global user.name "woodpecker-bot"
      - cd ./docs_repo
      - git add .
      # exit successfully if nothing changed
      - test -n "$(git status --porcelain)" || exit 0
      - git commit -m "Deploy website - based on ${CI_COMMIT_SHA}"
      - git push
    when:
      - event: push
        path:
          - <<: *when_path
          - <<: *docker_path
        branch: ${CI_REPO_DEFAULT_BRANCH}
      - event: [manual, tag]


================================================
FILE: .woodpecker/links.yaml
================================================
when:
  - event: cron
    cron: links

steps:
  - name: links
    image: docker.io/lycheeverse/lychee:0.24.2
    failure: ignore
    depends_on: []
    commands:
      - lychee pipeline/frontend/yaml/linter/schema/schema.json > links.md
      - lychee --exclude localhost docs/docs/ >> links.md
      - lychee --exclude localhost docs/src/pages/ >> links.md
      - echo -e "\nLast checked:$(date)" >> links.md

  - name: Update issue
    image: docker.io/alpine:3.23
    depends_on: links
    environment:
      GITHUB_TOKEN:
        from_secret: github_token
    commands:
      - apk add -q --no-cache jq curl
      - export ISSUE_NUMBER=5326
      - export DESCRIPTION=$(cat links.md)
      - |
        curl -X PATCH \
          -H "Authorization: token $GITHUB_TOKEN" \
          -H "Accept: application/vnd.github.v3+json" \
          https://api.github.com/repos/${CI_REPO}/issues/$ISSUE_NUMBER \
          -d "$(jq -n --arg body "$DESCRIPTION" '{body: $body}')"


================================================
FILE: .woodpecker/release-helper.yaml
================================================
when:
  - event: push
    branch:
      - ${CI_REPO_DEFAULT_BRANCH}
      - release/*

steps:
  - name: release-helper
    image: docker.io/woodpeckerci/plugin-ready-release-go:4.1.1
    settings:
      release_branch: ${CI_COMMIT_BRANCH}
      forge_type: github
      git_email: woodpecker-bot@obermui.de
      github_token:
        from_secret: GITHUB_TOKEN


================================================
FILE: .woodpecker/securityscan.yaml
================================================
when:
  - event: [pull_request]
  - event: push
    branch:
      - ${CI_REPO_DEFAULT_BRANCH}

variables:
  - &trivy_plugin docker.io/woodpeckerci/plugin-trivy:1.4.5

steps:
  backend:
    depends_on: []
    image: *trivy_plugin
    settings:
      server: server
      skip-dirs: web/,docs/

  docs:
    depends_on: []
    image: *trivy_plugin
    settings:
      server: server
      skip-dirs: node_modules/,plugins/woodpecker-plugins/node_modules/
      dir: docs/

  web:
    depends_on: []
    image: *trivy_plugin
    settings:
      server: server
      skip-dirs: node_modules/
      dir: web/

services:
  server:
    image: *trivy_plugin
    failure: ignore # as we don't care about the exit code
    settings:
      service: true
      db-repository: mirror.gcr.io/aquasec/trivy-db:2
    ports:
      - 10000


================================================
FILE: .woodpecker/social.yaml
================================================
depends_on:
  - docker
  - binaries

when:
  - event: tag
    evaluate: 'CI_COMMIT_TAG matches "^v?[0-9]+\\\\.[0-9]+\\\\.[0-9]+$"'

steps:
  - name: mastodon-toot
    image: docker.io/woodpeckerci/plugin-mastodon-post
    settings:
      server_url: https://floss.social
      access_token:
        from_secret: mastodon_token
      visibility: public
      ai_token:
        from_secret: openai_token
      ai_prompt: |
        We want to present the next version of our app on Mastodon.
        Therefore we want to post a catching text, so users will know why they should
        update to the newest version. Highlight the most special features. If there is no special feature
        included just summarize the changes in a few sentences. The whole text should not be longer than 240
        characters. Avoid naming contributors from. Use #WoodpeckerCI, #release and
        additional fitting hashtags and emojis to make the post more appealing

        The changelog entry: {{ changelog }}

  - name: bluesky-post
    image: docker.io/woodpeckerci/plugin-bluesky-post
    settings:
      app_password:
        from_secret: bluesky_token
      identifier: woodpecker-ci.org
      ai_token:
        from_secret: openai_token
      ai_prompt: |
        We want to present the next version of our app on Mastodon.
        Therefore we want to post a catching text, so users will know why they should
        update to the newest version. Highlight the most special features. If there is no special feature
        included just summarize the changes in a few sentences. The whole text should not be longer than 240
        characters. Avoid naming contributors from. Use #WoodpeckerCI, #release and
        additional fitting hashtags and emojis to make the post more appealing

        The changelog entry: {{ changelog }}


================================================
FILE: .woodpecker/static.yaml
================================================
when:
  - event: pull_request

steps:
  - name: lint-editorconfig
    image: docker.io/woodpeckerci/plugin-editorconfig-checker:0.3.3
    depends_on: []
    when:
      - event: pull_request

  - name: spellcheck
    image: docker.io/node:24-alpine
    depends_on: []
    commands:
      - corepack enable
      - pnpx cspell lint --no-progress --gitignore '{**,.*}/{*,.*}'
      - apk add --no-cache -U tree # busybox tree don't understand "-I"
      # cspell:disable-next-line
      - tree --gitignore -I 012_columns_rename_procs_to_steps.go -I versioned_docs -I '*opensource.svg'| pnpx cspell lint --no-progress stdin

  - name: prettier
    image: docker.io/woodpeckerci/plugin-prettier:next
    pull: true
    depends_on: []
    settings:
      version: 3.6.2

  - name: check-feature-docs
    image: docker.io/alpine:3.23
    depends_on: []
    commands:
      - apk add --no-cache -q jq && ./.woodpecker/check-feature-docs.sh
    when:
      - event: pull_request
        evaluate: 'CI_COMMIT_PULL_REQUEST_LABELS contains "feature"'

  - name: agentscan
    image: docker.io/woodpeckerci/plugin-agentscan:latest
    pull: true
    depends_on: []
    settings:
      github_token:
        from_secret: GITHUB_TOKEN_SURGE
      allowlist:
        - woodpecker-bot
        - 'renovate[bot]'
        - 6543
        - anbraten
        - lafriks
        - qwerty287
        - xoxys
    when:
      - event: pull_request


================================================
FILE: .woodpecker/test.yaml
================================================
variables:
  - &golang_image 'docker.io/golang:1.26'
  - &when
    - path: &when_path # related config files
        - '.woodpecker/test.yaml'
        - '.golangci.yaml'
        # go source code
        - '**/*.go'
        - 'go.*'
        # schema changes
        - 'pipeline/schema/**'
        # tools updates
        - Makefile
        - 'codecov.yaml'
      event: pull_request

when:
  - event: pull_request
  - event: push
    branch: ${CI_REPO_DEFAULT_BRANCH}
    path: *when_path

steps:
  vendor:
    image: *golang_image
    commands:
      - go mod vendor
    when:
      path:
        - <<: *when_path
        - '.woodpecker/**'

  lint-pipeline:
    depends_on:
      - vendor
    image: *golang_image
    commands:
      - go run go.woodpecker-ci.org/woodpecker/v3/cmd/cli lint
    environment:
      WOODPECKER_DISABLE_UPDATE_CHECK: true
      WOODPECKER_LINT_STRICT: true
      WOODPECKER_PLUGINS_PRIVILEGED: 'docker.io/woodpeckerci/plugin-docker-buildx'
    when:
      - event: pull_request
        path:
          - '.woodpecker/**'

  dummy-web:
    image: *golang_image
    commands:
      - mkdir -p web/dist/
      - echo "test" > web/dist/index.html
    when:
      - path: *when_path

  lint:
    depends_on:
      - vendor
    image: golangci/golangci-lint:v2.12.2
    commands:
      - make lint
    when: *when

  check-openapi:
    depends_on:
      - vendor
    image: *golang_image
    commands:
      - 'make generate-openapi'
      - 'DIFF=$(git diff | head)'
      - '[ -n "$DIFF" ] && { echo "openapi not up to date, exec `make generate-openapi` and commit"; exit 1; } || true'
    when: *when

  lint-license-header:
    image: *golang_image
    commands:
      - make install-addlicense # cspell:words addlicense
      - bash -c 'shopt -s globstar; addlicense -check -ignore "vendor/**" -ignore cmd/server/openapi/docs.go **/*.go'
    when: *when

  test:
    depends_on:
      - vendor
    image: *golang_image
    commands:
      - make test-agent
      - make test-server
      - make test-cli
      - make test-lib
    when:
      - path: *when_path

  test-e2e:
    depends_on:
      - vendor
    image: *golang_image
    commands:
      - make test-e2e
    when:
      - path: *when_path

  sqlite:
    depends_on:
      - vendor
    image: *golang_image
    environment:
      WOODPECKER_DATABASE_DRIVER: sqlite3
    commands:
      - make test-server-datastore-coverage
    when:
      - path: *when_path

  postgres:
    depends_on:
      - vendor
    image: *golang_image
    environment:
      WOODPECKER_DATABASE_DRIVER: postgres
      WOODPECKER_DATABASE_DATASOURCE: 'host=postgres user=postgres dbname=postgres sslmode=disable' # cspell:disable-line
    commands:
      - make test-server-datastore
    when: *when

  mysql:
    depends_on:
      - vendor
    image: *golang_image
    environment:
      WOODPECKER_DATABASE_DRIVER: mysql
      WOODPECKER_DATABASE_DATASOURCE: root@tcp(mysql:3306)/test?parseTime=true
    commands:
      - make test-server-datastore
    when: *when

  codecov:
    depends_on:
      - test
      - sqlite
    pull: true
    image: docker.io/woodpeckerci/plugin-codecov:2.3.1
    settings:
      files:
        - agent-coverage.out
        - cli-coverage.out
        - coverage.out
        - server-coverage.out
        - datastore-coverage.out
        - e2e-coverage.out
      token:
        from_secret: codecov_token
    when:
      - path: *when_path
    failure: ignore

services:
  postgres:
    image: docker.io/postgres:18
    ports: ['5432']
    environment:
      POSTGRES_USER: postgres
      POSTGRES_HOST_AUTH_METHOD: trust
    when: *when

  mysql:
    image: docker.io/mysql:9.7.0
    ports: ['3306']
    environment:
      MYSQL_DATABASE: test
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
    when: *when


================================================
FILE: .woodpecker/web.yaml
================================================
when:
  - event: pull_request
  - event: push
    branch:
      - release/*

variables:
  - &node_image 'docker.io/node:24-alpine'
  - &when
    path:
      # related config files
      - '.woodpecker/web.yaml'
      # web source code
      - 'web/**'
      # api source code
      - 'server/api/**'

steps:
  install-dependencies:
    image: *node_image
    directory: web/
    commands:
      - corepack enable
      - pnpm install --frozen-lockfile
    when: *when

  lint:
    depends_on:
      - install-dependencies
    image: *node_image
    directory: web/
    commands:
      - corepack enable
      - pnpm lint
    when: *when

  format-check:
    depends_on:
      - install-dependencies
    image: *node_image
    directory: web/
    commands:
      - corepack enable
      - pnpm format:check
    when: *when

  typecheck:
    depends_on:
      - install-dependencies
    image: *node_image
    directory: web/
    commands:
      - corepack enable
      - pnpm typecheck
    when: *when

  test:
    depends_on:
      - install-dependencies
      - format-check # wait for it else test artifacts are falsely detected as wrong
    image: *node_image
    directory: web/
    commands:
      - corepack enable
      - pnpm test
    when: *when


================================================
FILE: .yamllint.yaml
================================================
extends: default

ignore-from-file:
  - docs/.gitignore
  - docs/plugins/woodpecker-plugins/.gitignore
  - .gitignore
  - server/store/datastore/migration/test-files/.gitignore
  - web/.gitignore
  - web/.yamlignore

rules:
  line-length: disable
  document-start: disable
  comments: disable


================================================
FILE: CHANGELOG.md
================================================
# Changelog

## [3.14.1](https://github.com/woodpecker-ci/woodpecker/releases/tag/v3.14.1) - 2026-05-12

### ❤️ Special thanks the security researchers and those who fixed them ❤️

- Thanks to **Shivam Kumar ([@shivamkumarcyber](https://github.com/shivamkumarcyber))** and
  **Ranganatha Rao Sridhar (Praetorian)** _independently finding and reporting the bug_
- And [@6543](https://github.com/6543) _fixing the bugs and orchestrating the communication_

### 🔒 Security

- Server: make sure agent_id can not be spoofed by agent [[#6567](https://github.com/woodpecker-ci/woodpecker/pull/6567)]

## [3.14.0](https://github.com/woodpecker-ci/woodpecker/releases/tag/v3.14.0) - 2026-05-01

### ❤️ Thanks to all contributors! ❤️

@6543, @Aex12, @AhmadNajiKam, @CrimsonFez, @LUKIEYF, @LoricAndre, @M31ancholy, @MartinSchmidt, @Pnkcaht, @Sim-hu, @TumbleOwlee, @api2062, @bclermont, @brainbaking, @cliffmccarthy, @confusedsushi, @dccdis, @hhamalai, @hnb2, @lephuongbg, @mehrdadbn9, @mofr93, @myers, @myselfghost, @njaaazi, @packrat386, @paulovitorbal, @qwerty287, @rfinnie, @rhafer, @samoli, @savv, @stardothosting, @utafrali, @wucm667

### 🔒 Security

- docs: bump follow-redirects [[#6441](https://github.com/woodpecker-ci/woodpecker/pull/6441)]
- chore(deps): update dependency axios to v1.15.0 [security] [[#6417](https://github.com/woodpecker-ci/woodpecker/pull/6417)]
- fix(deps): update go.opentelemetry.io/otel to v1.43.0 [[#6416](https://github.com/woodpecker-ci/woodpecker/pull/6416)]
- WebUI: remove "lodash" dep [[#6369](https://github.com/woodpecker-ci/woodpecker/pull/6369)]
- Sanitize agent introduced pipeline/workflow/step state changes and log streaming [[#6308](https://github.com/woodpecker-ci/woodpecker/pull/6308)]
- Send 404 if logs are not allowed to access [[#6349](https://github.com/woodpecker-ci/woodpecker/pull/6349)]
- Prevent registering as arbitrary agents with system token [[#6283](https://github.com/woodpecker-ci/woodpecker/pull/6283)]
- Update `fast-xml-parser` [[#6258](https://github.com/woodpecker-ci/woodpecker/pull/6258)]
- Update `dompurify` and `svgo` [[#6198](https://github.com/woodpecker-ci/woodpecker/pull/6198)]
- Update edwards25519 [[#6143](https://github.com/woodpecker-ci/woodpecker/pull/6143)]

### ✨ Features

- Support one-shot agent execution mode [[#6150](https://github.com/woodpecker-ci/woodpecker/pull/6150)]
- Add external secret extension implementation [[#6252](https://github.com/woodpecker-ci/woodpecker/pull/6252)]
- Allow disabling isolated home directory for local agents [[#6251](https://github.com/woodpecker-ci/woodpecker/pull/6251)]
- Add Container Registry credential extension [[#5993](https://github.com/woodpecker-ci/woodpecker/pull/5993)]
- Support exclusive config extensions [[#5978](https://github.com/woodpecker-ci/woodpecker/pull/5978)]

### 📈 Enhancement

- Kubernetes: precreate workingDir as nonroot when required [[#6322](https://github.com/woodpecker-ci/woodpecker/pull/6322)]
- Kubernetes: Support allowPrivilegeEscalation and capabilities backend_options [[#6307](https://github.com/woodpecker-ci/woodpecker/pull/6307)]
- Refactor: remove Auth() from Forge interface [[#6505](https://github.com/woodpecker-ci/woodpecker/pull/6505)]
- Move wait for log uploads logic out of logger and tracer into pipeline runtime [[#6471](https://github.com/woodpecker-ci/woodpecker/pull/6471)]
- Make agent reconnect retry timeout configurable [[#6470](https://github.com/woodpecker-ci/woodpecker/pull/6470)]
- Handle re-created forge repos gracefully [[#6370](https://github.com/woodpecker-ci/woodpecker/pull/6370)]
- Cleanup server store step interface [[#6476](https://github.com/woodpecker-ci/woodpecker/pull/6476)]
- Docker/K8s: add config for stop timeout [[#6445](https://github.com/woodpecker-ci/woodpecker/pull/6445)]
- Docker backend should retry to delete volume on "in use" error [[#6381](https://github.com/woodpecker-ci/woodpecker/pull/6381)]
- Move skip pipeline by commit message into pipeline/frontend package [[#6437](https://github.com/woodpecker-ci/woodpecker/pull/6437)]
- Init `server/scheduler` package and use it as proxy for queue & pubsub [[#6418](https://github.com/woodpecker-ci/woodpecker/pull/6418)]
- Unify server API parameters to snake_case [[#6404](https://github.com/woodpecker-ci/woodpecker/pull/6404)]
- Add netrc option for config/registry extension [[#6333](https://github.com/woodpecker-ci/woodpecker/pull/6333)]
- Docker backend: replace docker SDK with moby SDK [[#6357](https://github.com/woodpecker-ci/woodpecker/pull/6357)]
- Deprecate commit avatar envs [[#6356](https://github.com/woodpecker-ci/woodpecker/pull/6356)]
- Refactor server/pubsub into interface [[#6318](https://github.com/woodpecker-ci/woodpecker/pull/6318)]
- Separate cron field [[#6346](https://github.com/woodpecker-ci/woodpecker/pull/6346)]
- Refactor pipeline runtime code [[#6166](https://github.com/woodpecker-ci/woodpecker/pull/6166)]
- Show Woodpecker version on pipeline details [[#6316](https://github.com/woodpecker-ci/woodpecker/pull/6316)]
- Unify import aliases [[#6328](https://github.com/woodpecker-ci/woodpecker/pull/6328)]
- Improve linter warning when step has no when block [[#6314](https://github.com/woodpecker-ci/woodpecker/pull/6314)]
- Improve error message when no workflows for manual were found [[#6313](https://github.com/woodpecker-ci/woodpecker/pull/6313)]
- Server return conflict status when stale repo causes duplicate insert [[#6276](https://github.com/woodpecker-ci/woodpecker/pull/6276)]
- Show global/org registries in org/repo registries tab [[#6291](https://github.com/woodpecker-ci/woodpecker/pull/6291)]
- Report skipped step state as soon as it's determined [[#6295](https://github.com/woodpecker-ci/woodpecker/pull/6295)]
- Only add compatibility environment variables for drone-ci to plugins [[#6271](https://github.com/woodpecker-ci/woodpecker/pull/6271)]
- Refactor: pass backend explicitly when creating pipeline engine runtime [[#6268](https://github.com/woodpecker-ci/woodpecker/pull/6268)]
- Compare admins case-insensitively [[#6261](https://github.com/woodpecker-ci/woodpecker/pull/6261)]
- Allow to cancel on failure [[#6158](https://github.com/woodpecker-ci/woodpecker/pull/6158)]
- Refactor so storage detects if Insert fails because of unique constraint [[#6259](https://github.com/woodpecker-ci/woodpecker/pull/6259)]
- Add server config for maximum log lines shown in web UI [[#6250](https://github.com/woodpecker-ci/woodpecker/pull/6250)]
- Add "Load more" pagination to pipeline list [[#6200](https://github.com/woodpecker-ci/woodpecker/pull/6200)]
- Use upstream slices.Concat and remove utils.MergeSlices [[#6185](https://github.com/woodpecker-ci/woodpecker/pull/6185)]
- Add enhanced function for error message handling in http request for configuration fetching [[#5712](https://github.com/woodpecker-ci/woodpecker/pull/5712)]
- Remove fixed badge width in UI [[#6157](https://github.com/woodpecker-ci/woodpecker/pull/6157)]
- Improve Debian packages [[#6085](https://github.com/woodpecker-ci/woodpecker/pull/6085)]
- Refactor pipeline engine [[#6073](https://github.com/woodpecker-ci/woodpecker/pull/6073)]
- Show cancellation reason in pipeline details [[#6072](https://github.com/woodpecker-ci/woodpecker/pull/6072)]
- Document required forge methods [[#6049](https://github.com/woodpecker-ci/woodpecker/pull/6049)]
- Dynamic log following [[#6036](https://github.com/woodpecker-ci/woodpecker/pull/6036)]
- Per-Workflow and Per-Workflow-Step badge generation [[#5977](https://github.com/woodpecker-ci/woodpecker/pull/5977)]
- Render MD in pipeline titles [[#5999](https://github.com/woodpecker-ci/woodpecker/pull/5999)]
- Simplify and Fix server task queue [[#6017](https://github.com/woodpecker-ci/woodpecker/pull/6017)]
- Update Architecture: move `pipeline/rpc` => `rpc` & `server/{grpc => rpc}` [[#6012](https://github.com/woodpecker-ci/woodpecker/pull/6012)]
- Implement retry logic in HTTP Send method [[#5857](https://github.com/woodpecker-ci/woodpecker/pull/5857)]
- CLI: Allow single output template [[#5882](https://github.com/woodpecker-ci/woodpecker/pull/5882)]
- Improve service syntax related docs and tests nits [[#5991](https://github.com/woodpecker-ci/woodpecker/pull/5991)]
- Remove deactivated secrets type from container definition [[#5983](https://github.com/woodpecker-ci/woodpecker/pull/5983)]

### 🐛 Bug Fixes

- fix(web): escape HTML in commit messages to prevent XSS [[#6523](https://github.com/woodpecker-ci/woodpecker/pull/6523)]
- fix(cli,server): fix trusted flags copy-paste bug and server nil pointer panic [[#6501](https://github.com/woodpecker-ci/woodpecker/pull/6501)]
- Add refname to bitbucket commit status [[#6482](https://github.com/woodpecker-ci/woodpecker/pull/6482)]
- Fix send on closed channel panic in SSE stream handlers [[#6456](https://github.com/woodpecker-ci/woodpecker/pull/6456)]
- Add `WOODPECKER_FORCE_IGNORE_SERVICE_FAILURE` config to preserve non-breaking behavior by default [[#6448](https://github.com/woodpecker-ci/woodpecker/pull/6448)]
- Fix race in pipeline runtime [[#6451](https://github.com/woodpecker-ci/woodpecker/pull/6451)]
- Fix race in server LogEntry logger [[#6449](https://github.com/woodpecker-ci/woodpecker/pull/6449)]
- Kubernetes: detached steps are no services [[#6435](https://github.com/woodpecker-ci/woodpecker/pull/6435)]
- Support dots in image names [[#6431](https://github.com/woodpecker-ci/woodpecker/pull/6431)]
- Fix erroneous linter error for plugin privileges [[#6424](https://github.com/woodpecker-ci/woodpecker/pull/6424)]
- Add connection timeout and graceful shutdown to agent RPC client [[#6414](https://github.com/woodpecker-ci/woodpecker/pull/6414)]
- Fix Windows container exit code handling and error checks [[#6411](https://github.com/woodpecker-ci/woodpecker/pull/6411)]
- Bitbucket: Remove usage of deprecated /user/permissions/repositories [[#6401](https://github.com/woodpecker-ci/woodpecker/pull/6401)]
- Bitbucket: Fix parsing /user/workspaces response [[#6396](https://github.com/woodpecker-ci/woodpecker/pull/6396)]
- Fix CLI exec with workflow matrix feature, where variables are not substituted. [[#6162](https://github.com/woodpecker-ci/woodpecker/pull/6162)]
- Fix enable repo with same name and owner on second forge [[#6375](https://github.com/woodpecker-ci/woodpecker/pull/6375)]
- Fix workflow being skipped and marked as failed when agent starts before server [[#6361](https://github.com/woodpecker-ci/woodpecker/pull/6361)]
- Only redirect after login [[#6348](https://github.com/woodpecker-ci/woodpecker/pull/6348)]
- Set workflow services stuck in running state to finished [[#6337](https://github.com/woodpecker-ci/woodpecker/pull/6337)]
- Fix bitbucket api deprecations [[#6324](https://github.com/woodpecker-ci/woodpecker/pull/6324)]
- Fix workflow serialize to omit skip_clone if false [[#6319](https://github.com/woodpecker-ci/woodpecker/pull/6319)]
- Fix build deb rpm packages [[#6309](https://github.com/woodpecker-ci/woodpecker/pull/6309)]
- Enable crons if created via CLI [[#6228](https://github.com/woodpecker-ci/woodpecker/pull/6228)]
- Fix message on gitlab tag event [[#6196](https://github.com/woodpecker-ci/woodpecker/pull/6196)]
- Bitbucket DC: resolve annotated tag SHA to commit SHA before posting build status [[#6203](https://github.com/woodpecker-ci/woodpecker/pull/6203)]
- Prevent leaking goroutines on canceled steps [[#6186](https://github.com/woodpecker-ci/woodpecker/pull/6186)]
- Fix `when.status` filter evaluation and add workflow-level support [[#6183](https://github.com/woodpecker-ci/woodpecker/pull/6183)]
- Fix status merging with skipped pipelines [[#6176](https://github.com/woodpecker-ci/woodpecker/pull/6176)]
- Update pipeline config schema [[#6156](https://github.com/woodpecker-ci/woodpecker/pull/6156)]
- Fix OAuth token refresh race condition with singleflight [[#6153](https://github.com/woodpecker-ci/woodpecker/pull/6153)]
- Use priority-based merging to determine pipeline and workflow status [[#6119](https://github.com/woodpecker-ci/woodpecker/pull/6119)]
- Only set tag env on tags [[#6142](https://github.com/woodpecker-ci/woodpecker/pull/6142)]
- Fix bitbucket email [[#6102](https://github.com/woodpecker-ci/woodpecker/pull/6102)]
- Report status for detached steps and services [[#6039](https://github.com/woodpecker-ci/woodpecker/pull/6039)]
- Don't propagate workflow error from agent back to agent [[#6056](https://github.com/woodpecker-ci/woodpecker/pull/6056)]
- Fix pipeline cancellation status handling and step state synchronization [[#6011](https://github.com/woodpecker-ci/woodpecker/pull/6011)]
- Add retry logic for CreatePipeline with backoff [[#6067](https://github.com/woodpecker-ci/woodpecker/pull/6067)]
- Fix OAuth token refresh in webhook handling for Bitbucket and GitHub [[#6059](https://github.com/woodpecker-ci/woodpecker/pull/6059)]
- Refresh token before forge calls [[#6035](https://github.com/woodpecker-ci/woodpecker/pull/6035)]
- Local backend: cleanup generated script for cmd.exe shell [[#6029](https://github.com/woodpecker-ci/woodpecker/pull/6029)]
- Local backend: setup clone step respects context [[#6030](https://github.com/woodpecker-ci/woodpecker/pull/6030)]
- Fix: Agent now gracefully handles running containers when killed [[#6018](https://github.com/woodpecker-ci/woodpecker/pull/6018)]
- Local backend: handle canceled steps case [[#6008](https://github.com/woodpecker-ci/woodpecker/pull/6008)]

### 🧪 Tests

- e2e test wait for grpc server teardown and stop agents [[#6479](https://github.com/woodpecker-ci/woodpecker/pull/6479)]
- Add more test cases for rpc label filter [[#6483](https://github.com/woodpecker-ci/woodpecker/pull/6483)]
- Fix flaky TestJWTManager [[#6478](https://github.com/woodpecker-ci/woodpecker/pull/6478)]
- Add e2e pipeline restart test [[#6469](https://github.com/woodpecker-ci/woodpecker/pull/6469)]
- Init minimal e2e tests [[#6391](https://github.com/woodpecker-ci/woodpecker/pull/6391)]
- Enhance datastore DB test setup [[#6450](https://github.com/woodpecker-ci/woodpecker/pull/6450)]
- Dummy backend support cancel [[#6390](https://github.com/woodpecker-ci/woodpecker/pull/6390)]
- Extend workflow integration tests [[#6272](https://github.com/woodpecker-ci/woodpecker/pull/6272)]
- Add registry service tests [[#6330](https://github.com/woodpecker-ci/woodpecker/pull/6330)]
- Add workflow integration test [[#6270](https://github.com/woodpecker-ci/woodpecker/pull/6270)]
- Increase timeout for migration tests [[#6206](https://github.com/woodpecker-ci/woodpecker/pull/6206)]
- Ignore fixtures for coverage [[#6197](https://github.com/woodpecker-ci/woodpecker/pull/6197)]
- Use tabs for indentation in embedded JSON [[#6103](https://github.com/woodpecker-ci/woodpecker/pull/6103)]
- Add tests for CLI output formatting and pipeline metadata environment variables [[#6076](https://github.com/woodpecker-ci/woodpecker/pull/6076)]
- Ignore mocks for coverage [[#6074](https://github.com/woodpecker-ci/woodpecker/pull/6074)]

### 📚 Documentation

- docs: better description for when.status filter [[#6517](https://github.com/woodpecker-ci/woodpecker/pull/6517)]
- docs: Add woodpecker-shellcheck lint to awesome list [[#6521](https://github.com/woodpecker-ci/woodpecker/pull/6521)]
- Lock file maintenance [[#6508](https://github.com/woodpecker-ci/woodpecker/pull/6508)]
- Update docs npm deps non-major [[#6496](https://github.com/woodpecker-ci/woodpecker/pull/6496)]
- Add Laravel Forge plugin [[#6491](https://github.com/woodpecker-ci/woodpecker/pull/6491)]
- Add 'entrypoint' property to service in schema [[#6487](https://github.com/woodpecker-ci/woodpecker/pull/6487)]
- Lock file maintenance [[#6472](https://github.com/woodpecker-ci/woodpecker/pull/6472)]
- Update dependency axios to v1.15.1 [[#6468](https://github.com/woodpecker-ci/woodpecker/pull/6468)]
- Update dependency marked to v18.0.2 [[#6465](https://github.com/woodpecker-ci/woodpecker/pull/6465)]
- Update docs npm deps non-major [[#6463](https://github.com/woodpecker-ci/woodpecker/pull/6463)]
- Update dependency marked to v18 [[#6425](https://github.com/woodpecker-ci/woodpecker/pull/6425)]
- Update docs npm deps non-major [[#6422](https://github.com/woodpecker-ci/woodpecker/pull/6422)]
- chore(deps): update dependency fuse.js to v7.3.0 [[#6382](https://github.com/woodpecker-ci/woodpecker/pull/6382)]
- chore(deps): update docs npm deps non-major [[#6376](https://github.com/woodpecker-ci/woodpecker/pull/6376)]
- chore(deps): update dependency typescript to v6 [[#6336](https://github.com/woodpecker-ci/woodpecker/pull/6336)]
- chore(deps): update docs npm deps non-major [[#6335](https://github.com/woodpecker-ci/woodpecker/pull/6335)]
- Add CI check for docs on feature PRs [[#6315](https://github.com/woodpecker-ci/woodpecker/pull/6315)]
- chore(deps): update dependency isomorphic-dompurify to v3.6.0 [[#6288](https://github.com/woodpecker-ci/woodpecker/pull/6288)]
- chore(deps): update dependency yaml to v2.8.3 [[#6287](https://github.com/woodpecker-ci/woodpecker/pull/6287)]
- Add agentscan to plugin docs [[#6285](https://github.com/woodpecker-ci/woodpecker/pull/6285)]
- Add opengrep plugin [[#6282](https://github.com/woodpecker-ci/woodpecker/pull/6282)]
- chore(deps): update docs npm deps non-major [[#6281](https://github.com/woodpecker-ci/woodpecker/pull/6281)]
- Sort glossary items alphabetically [[#6255](https://github.com/woodpecker-ci/woodpecker/pull/6255)]
- chore(deps): update docs npm deps non-major [[#6240](https://github.com/woodpecker-ci/woodpecker/pull/6240)]
- plugin: ascii junit report: renamed gh username [[#6232](https://github.com/woodpecker-ci/woodpecker/pull/6232)]
- chore(deps): update dependency svgo to v4 [[#6214](https://github.com/woodpecker-ci/woodpecker/pull/6214)]
- chore(deps): update docs npm deps non-major [[#6210](https://github.com/woodpecker-ci/woodpecker/pull/6210)]
- Update serialize-javascript [[#6182](https://github.com/woodpecker-ci/woodpecker/pull/6182)]
- chore(deps): update docs npm deps non-major [[#6173](https://github.com/woodpecker-ci/woodpecker/pull/6173)]
- chore(deps): update dependency isomorphic-dompurify to v3 [[#6147](https://github.com/woodpecker-ci/woodpecker/pull/6147)]
- chore(deps): update docs npm deps non-major [[#6137](https://github.com/woodpecker-ci/woodpecker/pull/6137)]
- Add deprecation policy [[#6068](https://github.com/woodpecker-ci/woodpecker/pull/6068)]
- fix(deps): update dependency @easyops-cn/docusaurus-search-local to ^0.55.0 [[#6125](https://github.com/woodpecker-ci/woodpecker/pull/6125)]
- Improve selinux docs [[#6066](https://github.com/woodpecker-ci/woodpecker/pull/6066)]
- Document how to ignore failure on services [[#6106](https://github.com/woodpecker-ci/woodpecker/pull/6106)]
- chore(deps): update docs npm deps non-major [[#6109](https://github.com/woodpecker-ci/woodpecker/pull/6109)]
- fix(deps): update dependency @easyops-cn/docusaurus-search-local to ^0.54.0 [[#6091](https://github.com/woodpecker-ci/woodpecker/pull/6091)]
- chore(deps): update dependency axios to v1.13.5 [[#6090](https://github.com/woodpecker-ci/woodpecker/pull/6090)]
- chore(deps): update docs npm deps non-major [[#6088](https://github.com/woodpecker-ci/woodpecker/pull/6088)]
- chore(deps): update dependency isomorphic-dompurify to v2.36.0 [[#6086](https://github.com/woodpecker-ci/woodpecker/pull/6086)]
- fix(deps): update docs npm deps non-major [[#6052](https://github.com/woodpecker-ci/woodpecker/pull/6052)]
- Update Module Interaction Diagram [[#6019](https://github.com/woodpecker-ci/woodpecker/pull/6019)]
- Add Buildah plugin link [[#6050](https://github.com/woodpecker-ci/woodpecker/pull/6050)]
- chore(deps): update docs npm deps non-major [[#6045](https://github.com/woodpecker-ci/woodpecker/pull/6045)]
- Add Homebrew package [[#6037](https://github.com/woodpecker-ci/woodpecker/pull/6037)]
- chore(deps): update dependency axios to v1.13.3 [[#6010](https://github.com/woodpecker-ci/woodpecker/pull/6010)]
- chore(deps): update docs npm deps non-major [[#6000](https://github.com/woodpecker-ci/woodpecker/pull/6000)]
- Fix docusaurus md link deprecation [[#5979](https://github.com/woodpecker-ci/woodpecker/pull/5979)]
- chore(deps): update docs npm deps non-major [[#5982](https://github.com/woodpecker-ci/woodpecker/pull/5982)]

### 📦️ Dependency

- Update golang-packages [[#6524](https://github.com/woodpecker-ci/woodpecker/pull/6524)]
- Update module github.com/google/go-github/v84 to v85 [[#6500](https://github.com/woodpecker-ci/woodpecker/pull/6500)]
- Update module github.com/getkin/kin-openapi to v0.136.0 [[#6503](https://github.com/woodpecker-ci/woodpecker/pull/6503)]
- Update woodpeckerci/plugin-git Docker tag to v2.9.0 [[#6499](https://github.com/woodpecker-ci/woodpecker/pull/6499)]
- Update docker.io/mysql Docker tag to v9.7.0 [[#6498](https://github.com/woodpecker-ci/woodpecker/pull/6498)]
- Update docker.io/lycheeverse/lychee Docker tag to v0.24.1 [[#6497](https://github.com/woodpecker-ci/woodpecker/pull/6497)]
- Update golang-packages to v0.36.0 [[#6485](https://github.com/woodpecker-ci/woodpecker/pull/6485)]
- Update golang-packages [[#6477](https://github.com/woodpecker-ci/woodpecker/pull/6477)]
- Update pre-commit hook rbubley/mirrors-prettier to v3.8.3 [[#6462](https://github.com/woodpecker-ci/woodpecker/pull/6462)]
- Update module k8s.io/client-go to v0.35.4 [[#6460](https://github.com/woodpecker-ci/woodpecker/pull/6460)]
- Update golang-packages [[#6459](https://github.com/woodpecker-ci/woodpecker/pull/6459)]
- Update docker.io/woodpeckerci/plugin-trivy Docker tag to v1.4.5 [[#6447](https://github.com/woodpecker-ci/woodpecker/pull/6447)]
- Update docker.io/woodpeckerci/plugin-ready-release-go Docker tag to v4.1.1 [[#6440](https://github.com/woodpecker-ci/woodpecker/pull/6440)]
- Update module gitlab.com/gitlab-org/api/client-go/v2 to v2.18.0 [[#6439](https://github.com/woodpecker-ci/woodpecker/pull/6439)]
- Update docker.io/woodpeckerci/plugin-codecov Docker tag to v2.3.1 [[#6438](https://github.com/woodpecker-ci/woodpecker/pull/6438)]
- Lock file maintenance [[#6430](https://github.com/woodpecker-ci/woodpecker/pull/6430)]
- Update dependency dotenv to v17.4.2 [[#6428](https://github.com/woodpecker-ci/woodpecker/pull/6428)]
- Update dependency simple-icons to v16.16.0 [[#6427](https://github.com/woodpecker-ci/woodpecker/pull/6427)]
- Update web npm deps non-major [[#6423](https://github.com/woodpecker-ci/woodpecker/pull/6423)]
- Update pre-commit hook rbubley/mirrors-prettier to v3.8.2 [[#6421](https://github.com/woodpecker-ci/woodpecker/pull/6421)]
- Update dependency golang to v1.26.2 [[#6420](https://github.com/woodpecker-ci/woodpecker/pull/6420)]
- fix(deps): update module github.com/docker/cli to v29.4.0+incompatible [[#6403](https://github.com/woodpecker-ci/woodpecker/pull/6403)]
- fix(deps): update module github.com/mattn/go-sqlite3 to v1.14.41 [[#6397](https://github.com/woodpecker-ci/woodpecker/pull/6397)]
- chore(deps): lock file maintenance [[#6392](https://github.com/woodpecker-ci/woodpecker/pull/6392)]
- chore(deps): update dependency dotenv to v17.4.1 [[#6389](https://github.com/woodpecker-ci/woodpecker/pull/6389)]
- chore(deps): update dependency marked to v17.0.6 [[#6387](https://github.com/woodpecker-ci/woodpecker/pull/6387)]
- chore(deps): update dependency simple-icons to v16.15.0 [[#6385](https://github.com/woodpecker-ci/woodpecker/pull/6385)]
- fix(deps): update golang-packages [[#6384](https://github.com/woodpecker-ci/woodpecker/pull/6384)]
- chore(deps): update dependency fuse.js to v7.3.0 [[#6383](https://github.com/woodpecker-ci/woodpecker/pull/6383)]
- chore(deps): update dependency @antfu/eslint-config to v8 [[#6378](https://github.com/woodpecker-ci/woodpecker/pull/6378)]
- chore(deps): update web npm deps non-major [[#6377](https://github.com/woodpecker-ci/woodpecker/pull/6377)]
- fix(deps): update module github.com/lib/pq to v1.12.2 [[#6371](https://github.com/woodpecker-ci/woodpecker/pull/6371)]
- fix(deps): update module google.golang.org/grpc to v1.80.0 [[#6363](https://github.com/woodpecker-ci/woodpecker/pull/6363)]
- fix(deps): update golang-packages [[#6343](https://github.com/woodpecker-ci/woodpecker/pull/6343)]
- chore(deps): lock file maintenance [[#6344](https://github.com/woodpecker-ci/woodpecker/pull/6344)]
- chore(deps): update dependency simple-icons to v16.14.0 [[#6341](https://github.com/woodpecker-ci/woodpecker/pull/6341)]
- chore(deps): update web npm deps non-major [[#6334](https://github.com/woodpecker-ci/woodpecker/pull/6334)]
- chore(deps): update docker.io/woodpeckerci/plugin-ready-release-go docker tag to v4.1.0 [[#6331](https://github.com/woodpecker-ci/woodpecker/pull/6331)]
- fix(deps): update module code.gitea.io/sdk/gitea to v0.24.1 [[#6321](https://github.com/woodpecker-ci/woodpecker/pull/6321)]
- chore(deps): lock file maintenance [[#6306](https://github.com/woodpecker-ci/woodpecker/pull/6306)]
- fix(deps): update module github.com/charmbracelet/huh to v2 [[#6243](https://github.com/woodpecker-ci/woodpecker/pull/6243)]
- chore(deps): update dependency golangci/golangci-lint to v2.11.4 [[#6301](https://github.com/woodpecker-ci/woodpecker/pull/6301)]
- chore(deps): update pre-commit hook golangci/golangci-lint to v2.11.4 [[#6302](https://github.com/woodpecker-ci/woodpecker/pull/6302)]
- chore(deps): update web npm deps non-major [[#6279](https://github.com/woodpecker-ci/woodpecker/pull/6279)]
- fix(deps): update module github.com/zalando/go-keyring to v0.2.7 [[#6280](https://github.com/woodpecker-ci/woodpecker/pull/6280)]
- fix(deps): update module github.com/mattn/go-sqlite3 to v1.14.37 [[#6253](https://github.com/woodpecker-ci/woodpecker/pull/6253)]
- chore(deps): update dependency jsdom to v29 [[#6246](https://github.com/woodpecker-ci/woodpecker/pull/6246)]
- chore(deps): update woodpeckerci/plugin-release docker tag to v0.3.0 [[#6241](https://github.com/woodpecker-ci/woodpecker/pull/6241)]
- chore(deps): update dependency vite to v8 [[#6242](https://github.com/woodpecker-ci/woodpecker/pull/6242)]
- chore(deps): update pre-commit non-major [[#6212](https://github.com/woodpecker-ci/woodpecker/pull/6212)]
- chore(deps): update dependency vue-i18n to v11.3.0 [[#6217](https://github.com/woodpecker-ci/woodpecker/pull/6217)]
- chore(deps): update dependency golang to v1.26.1 [[#6207](https://github.com/woodpecker-ci/woodpecker/pull/6207)]
- fix(deps): update module github.com/docker/cli to v29.3.0+incompatible [[#6201](https://github.com/woodpecker-ci/woodpecker/pull/6201)]
- fix(deps): update module github.com/yaronf/httpsign to v0.4.2 [[#6188](https://github.com/woodpecker-ci/woodpecker/pull/6188)]
- chore(deps): update dependency eslint-plugin-vue-scoped-css to v3 [[#6178](https://github.com/woodpecker-ci/woodpecker/pull/6178)]
- chore(deps): update dependency @intlify/eslint-plugin-vue-i18n to v4.3.0 [[#6177](https://github.com/woodpecker-ci/woodpecker/pull/6177)]
- fix(deps): update module github.com/google/go-github/v83 to v84 [[#6172](https://github.com/woodpecker-ci/woodpecker/pull/6172)]
- chore(deps): update postgres docker tag to v18.3 [[#6169](https://github.com/woodpecker-ci/woodpecker/pull/6169)]
- fix(deps): update golang-packages [[#6160](https://github.com/woodpecker-ci/woodpecker/pull/6160)]
- chore(deps): update dependency vue-tsc to v3.2.5 [[#6141](https://github.com/woodpecker-ci/woodpecker/pull/6141)]
- chore(deps): update docker.io/golang docker tag to v1.26 [[#6121](https://github.com/woodpecker-ci/woodpecker/pull/6121)]
- chore(deps): update docker.io/lycheeverse/lychee docker tag to v0.23.0 [[#6122](https://github.com/woodpecker-ci/woodpecker/pull/6122)]
- chore(deps): update dependency @types/node to v24.10.12 [[#6087](https://github.com/woodpecker-ci/woodpecker/pull/6087)]
- chore(deps): update eslint monorepo to v10 (major) [[#6083](https://github.com/woodpecker-ci/woodpecker/pull/6083)]
- chore(deps): update dependency @antfu/eslint-config to v7.3.0 [[#6084](https://github.com/woodpecker-ci/woodpecker/pull/6084)]
- chore(deps): update dependency @vueuse/core to v14.2.0 [[#6048](https://github.com/woodpecker-ci/woodpecker/pull/6048)]
- fix(deps): update dependency vue-router to v5 [[#6046](https://github.com/woodpecker-ci/woodpecker/pull/6046)]
- chore(deps): update woodpeckerci/plugin-git docker tag to v2.8.1 [[#6006](https://github.com/woodpecker-ci/woodpecker/pull/6006)]
- chore(deps): update docker.io/mysql docker tag to v9.6.0 [[#6002](https://github.com/woodpecker-ci/woodpecker/pull/6002)]
- fix(deps): update module github.com/urfave/cli/v3 to v3.6.2 [[#5989](https://github.com/woodpecker-ci/woodpecker/pull/5989)]

### Misc

- Add s3 cache plugin to docs [[#6467](https://github.com/woodpecker-ci/woodpecker/pull/6467)]
- Fix license headers [[#6205](https://github.com/woodpecker-ci/woodpecker/pull/6205)]
- Add agentscan plugin [[#6284](https://github.com/woodpecker-ci/woodpecker/pull/6284)]

## [3.13.0](https://github.com/woodpecker-ci/woodpecker/releases/tag/v3.13.0) - 2026-01-14

### ❤️ Thanks to all contributors! ❤️

@6543, @Javex, @KhalidAlansary, @MartinSchmidt, @abhiyerra, @anbraten, @bentasker, @gjuoun, @gsaslis, @henkka, @jolheiser, @mogsie, @qwerty287, @sloonz, @sugar700, @tuxmainy, @xoxys

### 🔒 Security

- Update quic-go/qpack & quic-go/quic-go [[#5885](https://github.com/woodpecker-ci/woodpecker/pull/5885)]
- fix: updateRepoPermissions to cleanup old permissions [[#5790](https://github.com/woodpecker-ci/woodpecker/pull/5790)]

### ✨ Features

- Add cli contexts [[#5929](https://github.com/woodpecker-ci/woodpecker/pull/5929)]

### 📈 Enhancement

- Allow to add a note to secrets [[#5898](https://github.com/woodpecker-ci/woodpecker/pull/5898)]
- Log addon errors [[#5923](https://github.com/woodpecker-ci/woodpecker/pull/5923)]
- Custom vars for crons [[#5897](https://github.com/woodpecker-ci/woodpecker/pull/5897)]
- Allow to disable a cron [[#5896](https://github.com/woodpecker-ci/woodpecker/pull/5896)]
- Add background to status icons [[#5880](https://github.com/woodpecker-ci/woodpecker/pull/5880)]
- Fix dead page and cleanup router [[#5519](https://github.com/woodpecker-ci/woodpecker/pull/5519)]
- feat(kubernetes): add support for pod affinity and anti-affinity configurations [[#5854](https://github.com/woodpecker-ci/woodpecker/pull/5854)]
- Public key endpoint [[#5860](https://github.com/woodpecker-ci/woodpecker/pull/5860)]
- Allow untrusted repo to still drop network for steps [[#5820](https://github.com/woodpecker-ci/woodpecker/pull/5820)]
- Add support for headless Kubernetes services [[#5764](https://github.com/woodpecker-ci/woodpecker/pull/5764)]
- server/forge: rename var to be more descriptive and test value [[#5806](https://github.com/woodpecker-ci/woodpecker/pull/5806)]
- add events query parameter to badge url [[#5728](https://github.com/woodpecker-ci/woodpecker/pull/5728)]
- Extract default step-builder options into server [[#5785](https://github.com/woodpecker-ci/woodpecker/pull/5785)]
- feat: include CI_COMMIT_TAG env in deployment events [[#5773](https://github.com/woodpecker-ci/woodpecker/pull/5773)]

### 🐛 Bug Fixes

- Use repo-user for api call of cron [[#5967](https://github.com/woodpecker-ci/woodpecker/pull/5967)]
- Close opened file on LogFind [[#5961](https://github.com/woodpecker-ci/woodpecker/pull/5961)]
- Delete/Deactivate repo ignores missing repo at forge [[#5953](https://github.com/woodpecker-ci/woodpecker/pull/5953)]
- Correctly update repo permissions [[#5928](https://github.com/woodpecker-ci/woodpecker/pull/5928)]
- Revert repos pagination for GH and BB [[#5924](https://github.com/woodpecker-ci/woodpecker/pull/5924)]
- fix: send correct argument to rpc call for name/url [[#5922](https://github.com/woodpecker-ci/woodpecker/pull/5922)]
- fix: secrets-file flag [[#5909](https://github.com/woodpecker-ci/woodpecker/pull/5909)]
- Do not run crons for disabled repos [[#5884](https://github.com/woodpecker-ci/woodpecker/pull/5884)]
- Show warning if there is no workflow to run [[#5883](https://github.com/woodpecker-ci/woodpecker/pull/5883)]
- fix(datastore): fix pagination bug in workflowsDelete skipping records [[#5881](https://github.com/woodpecker-ci/woodpecker/pull/5881)]
- Remove rounded corners in fullscreen log view [[#5879](https://github.com/woodpecker-ci/woodpecker/pull/5879)]
- Fix some ListItems and Queue view background in dark mode [[#5878](https://github.com/woodpecker-ci/woodpecker/pull/5878)]
- Make disabled checkboxes match overall style [[#5869](https://github.com/woodpecker-ci/woodpecker/pull/5869)]
- Fix CLI trusted updating [[#5861](https://github.com/woodpecker-ci/woodpecker/pull/5861)]
- Send configuration as part of the request for external configuration [[#5831](https://github.com/woodpecker-ci/woodpecker/pull/5831)]
- fix(bitbucketdatacenter): fix CI_COMMIT_PULL_REQUEST [[#5769](https://github.com/woodpecker-ci/woodpecker/pull/5769)]
- On set/get of repo make sure forge_id is set and on fetch respected [[#5717](https://github.com/woodpecker-ci/woodpecker/pull/5717)]
- Improve repair endpoints [[#5767](https://github.com/woodpecker-ci/woodpecker/pull/5767)]

### 📚 Documentation

- chore(deps): lock file maintenance [[#5963](https://github.com/woodpecker-ci/woodpecker/pull/5963)]
- chore(deps): update dependency @types/node to v24.10.7 [[#5954](https://github.com/woodpecker-ci/woodpecker/pull/5954)]
- chore(deps): update dependency @types/react to v19.2.8 [[#5941](https://github.com/woodpecker-ci/woodpecker/pull/5941)]
- chore(deps): update dependency @types/node to v24.10.6 [[#5935](https://github.com/woodpecker-ci/woodpecker/pull/5935)]
- chore(deps): update dependency @types/node to v24.10.5 [[#5933](https://github.com/woodpecker-ci/woodpecker/pull/5933)]
- fix(docs): update woodpecker-cli secret command [[#5927](https://github.com/woodpecker-ci/woodpecker/pull/5927)]
- Update Docs and nix-flake to reflect current dev environment [[#5926](https://github.com/woodpecker-ci/woodpecker/pull/5926)]
- Update Helm chart installation command [[#5872](https://github.com/woodpecker-ci/woodpecker/pull/5872)]
- docs: add BunnyCDN Cache Purge Plugin [[#5906](https://github.com/woodpecker-ci/woodpecker/pull/5906)]
- chore(deps): update dependency isomorphic-dompurify to v2.35.0 [[#5904](https://github.com/woodpecker-ci/woodpecker/pull/5904)]
- chore(deps): update dependency @types/node to v24.10.4 [[#5862](https://github.com/woodpecker-ci/woodpecker/pull/5862)]
- chore(deps): update docs npm deps non-major [[#5855](https://github.com/woodpecker-ci/woodpecker/pull/5855)]
- chore(deps): update docs npm deps non-major [[#5829](https://github.com/woodpecker-ci/woodpecker/pull/5829)]
- Update link for Codeberg Pages Deploy plugin [[#5811](https://github.com/woodpecker-ci/woodpecker/pull/5811)]
- chore(deps): update dependency yaml to v2.8.2 [[#5803](https://github.com/woodpecker-ci/woodpecker/pull/5803)]
- chore(deps): update dependency prettier to v3.7.3 [[#5799](https://github.com/woodpecker-ci/woodpecker/pull/5799)]
- chore(deps): update docs npm deps non-major [[#5791](https://github.com/woodpecker-ci/woodpecker/pull/5791)]
- chore(deps): update dependency isomorphic-dompurify to v2.33.0 [[#5778](https://github.com/woodpecker-ci/woodpecker/pull/5778)]
- chore(deps): update docs npm deps non-major [[#5774](https://github.com/woodpecker-ci/woodpecker/pull/5774)]

### 📦️ Dependency

- fix(deps): update module gitlab.com/gitlab-org/api/client-go to v1.14.0 [[#5969](https://github.com/woodpecker-ci/woodpecker/pull/5969)]
- fix(deps): update golang-packages [[#5966](https://github.com/woodpecker-ci/woodpecker/pull/5966)]
- fix(deps): update module gitlab.com/gitlab-org/api/client-go to v1.12.0 [[#5962](https://github.com/woodpecker-ci/woodpecker/pull/5962)]
- chore(deps): update dependency simple-icons to v16.5.0 [[#5957](https://github.com/woodpecker-ci/woodpecker/pull/5957)]
- fix(deps): update golang-packages [[#5956](https://github.com/woodpecker-ci/woodpecker/pull/5956)]
- chore(deps): update dependency @types/node to v24.10.7 [[#5955](https://github.com/woodpecker-ci/woodpecker/pull/5955)]
- fix(deps): update module github.com/google/go-github/v80 to v81 [[#5946](https://github.com/woodpecker-ci/woodpecker/pull/5946)]
- chore(deps): update woodpeckerci/plugin-git docker tag to v2.8.0 [[#5945](https://github.com/woodpecker-ci/woodpecker/pull/5945)]
- chore(deps): update golangci/golangci-lint docker tag to v2.8.0 [[#5944](https://github.com/woodpecker-ci/woodpecker/pull/5944)]
- chore(deps): update docker.io/woodpeckerci/plugin-codecov docker tag to v2.2.0 [[#5943](https://github.com/woodpecker-ci/woodpecker/pull/5943)]
- chore(deps): update web npm deps non-major [[#5942](https://github.com/woodpecker-ci/woodpecker/pull/5942)]
- chore(deps): update docker.io/woodpeckerci/plugin-surge-preview docker tag to v1.4.2 [[#5938](https://github.com/woodpecker-ci/woodpecker/pull/5938)]
- chore(deps): update docker.io/woodpeckerci/plugin-ready-release-go docker tag to v3.4.1 [[#5937](https://github.com/woodpecker-ci/woodpecker/pull/5937)]
- chore(deps): update docker.io/woodpeckerci/plugin-docker-buildx docker tag to v6.0.4 [[#5936](https://github.com/woodpecker-ci/woodpecker/pull/5936)]
- chore(deps): update docker.io/woodpeckerci/plugin-editorconfig-checker docker tag to v0.3.3 [[#5934](https://github.com/woodpecker-ci/woodpecker/pull/5934)]
- fix(deps): update module gitlab.com/gitlab-org/api/client-go to v1.11.0 [[#5919](https://github.com/woodpecker-ci/woodpecker/pull/5919)]
- chore(deps): lock file maintenance [[#5916](https://github.com/woodpecker-ci/woodpecker/pull/5916)]
- chore(deps): update dependency simple-icons to v16.4.0 [[#5915](https://github.com/woodpecker-ci/woodpecker/pull/5915)]
- fix(deps): update module github.com/mattn/go-sqlite3 to v1.14.33 [[#5910](https://github.com/woodpecker-ci/woodpecker/pull/5910)]
- chore(deps): lock file maintenance [[#5913](https://github.com/woodpecker-ci/woodpecker/pull/5913)]
- chore(deps): lock file maintenance [[#5907](https://github.com/woodpecker-ci/woodpecker/pull/5907)]
- chore(deps): update dependency simple-icons to v16.3.0 [[#5905](https://github.com/woodpecker-ci/woodpecker/pull/5905)]
- chore(deps): update web npm deps non-major [[#5903](https://github.com/woodpecker-ci/woodpecker/pull/5903)]
- fix(deps): update module google.golang.org/grpc to v1.78.0 [[#5901](https://github.com/woodpecker-ci/woodpecker/pull/5901)]
- chore(deps): lock file maintenance [[#5895](https://github.com/woodpecker-ci/woodpecker/pull/5895)]
- fix(deps): update module github.com/tink-crypto/tink-go/v2 to v2.6.0 [[#5894](https://github.com/woodpecker-ci/woodpecker/pull/5894)]
- chore(deps): update dependency @antfu/eslint-config to v6.7.2 [[#5893](https://github.com/woodpecker-ci/woodpecker/pull/5893)]
- chore(deps): update dependency vue-i18n to v11.2.7 [[#5892](https://github.com/woodpecker-ci/woodpecker/pull/5892)]
- chore(deps): update dependency vue-tsc to v3.2.0 [[#5891](https://github.com/woodpecker-ci/woodpecker/pull/5891)]
- Migrate to maintained tink-go [[#5886](https://github.com/woodpecker-ci/woodpecker/pull/5886)]
- chore(deps): update web npm deps non-major [[#5887](https://github.com/woodpecker-ci/woodpecker/pull/5887)]
- fix(deps): update module gitlab.com/gitlab-org/api/client-go to v1.10.0 [[#5888](https://github.com/woodpecker-ci/woodpecker/pull/5888)]
- fix(deps): update golang-packages [[#5877](https://github.com/woodpecker-ci/woodpecker/pull/5877)]
- fix(deps): update module gitlab.com/gitlab-org/api/client-go to v1.9.0 [[#5873](https://github.com/woodpecker-ci/woodpecker/pull/5873)]
- fix(deps): update golang-packages [[#5870](https://github.com/woodpecker-ci/woodpecker/pull/5870)]
- chore(deps): lock file maintenance [[#5868](https://github.com/woodpecker-ci/woodpecker/pull/5868)]
- fix(deps): update module github.com/gdgvda/cron to v0.6.0 [[#5867](https://github.com/woodpecker-ci/woodpecker/pull/5867)]
- chore(deps): update dependency @intlify/unplugin-vue-i18n to v11.0.3 [[#5866](https://github.com/woodpecker-ci/woodpecker/pull/5866)]
- chore(deps): update dependency @antfu/eslint-config to v6.7.1 [[#5865](https://github.com/woodpecker-ci/woodpecker/pull/5865)]
- chore(deps): update web npm deps non-major [[#5864](https://github.com/woodpecker-ci/woodpecker/pull/5864)]
- chore(deps): update dependency @types/node to v24.10.4 [[#5863](https://github.com/woodpecker-ci/woodpecker/pull/5863)]
- chore(deps): update web npm deps non-major [[#5859](https://github.com/woodpecker-ci/woodpecker/pull/5859)]
- chore(deps): update pre-commit hook igorshubovych/markdownlint-cli to v0.47.0 [[#5858](https://github.com/woodpecker-ci/woodpecker/pull/5858)]
- fix(deps): update golang-packages [[#5856](https://github.com/woodpecker-ci/woodpecker/pull/5856)]
- fix(deps): update golang-packages [[#5851](https://github.com/woodpecker-ci/woodpecker/pull/5851)]
- fix(deps): update golang-packages [[#5849](https://github.com/woodpecker-ci/woodpecker/pull/5849)]
- chore(deps): lock file maintenance [[#5847](https://github.com/woodpecker-ci/woodpecker/pull/5847)]
- chore(deps): update web npm deps non-major [[#5837](https://github.com/woodpecker-ci/woodpecker/pull/5837)]
- chore(deps): update dependency golangci/golangci-lint to v2.7.2 [[#5845](https://github.com/woodpecker-ci/woodpecker/pull/5845)]
- chore(deps): update pre-commit hook golangci/golangci-lint to v2.7.2 [[#5846](https://github.com/woodpecker-ci/woodpecker/pull/5846)]
- fix(deps): update module gitlab.com/gitlab-org/api/client-go to v1.7.0 [[#5840](https://github.com/woodpecker-ci/woodpecker/pull/5840)]
- fix(deps): update module github.com/google/go-github/v79 to v80 [[#5838](https://github.com/woodpecker-ci/woodpecker/pull/5838)]
- chore(deps): update pre-commit non-major [[#5836](https://github.com/woodpecker-ci/woodpecker/pull/5836)]
- chore(deps): update docker.io/lycheeverse/lychee docker tag to v0.22.0 [[#5833](https://github.com/woodpecker-ci/woodpecker/pull/5833)]
- chore(deps): update dependency golangci/golangci-lint to v2.7.1 [[#5832](https://github.com/woodpecker-ci/woodpecker/pull/5832)]
- chore(deps): update docker.io/alpine docker tag to v3.23 [[#5830](https://github.com/woodpecker-ci/woodpecker/pull/5830)]
- chore(deps): update docker.io/woodpeckerci/plugin-trivy docker tag to v1.4.4 [[#5828](https://github.com/woodpecker-ci/woodpecker/pull/5828)]
- chore(deps): update dependency golang to v1.25.5 [[#5827](https://github.com/woodpecker-ci/woodpecker/pull/5827)]
- fix(deps): update golang-packages [[#5816](https://github.com/woodpecker-ci/woodpecker/pull/5816)]
- fix(deps): update module gitlab.com/gitlab-org/api/client-go to v1.3.1 [[#5812](https://github.com/woodpecker-ci/woodpecker/pull/5812)]
- fix(deps): update module gitlab.com/gitlab-org/api/client-go to v1.3.0 [[#5807](https://github.com/woodpecker-ci/woodpecker/pull/5807)]
- chore(deps): lock file maintenance [[#5808](https://github.com/woodpecker-ci/woodpecker/pull/5808)]
- chore(deps): update pre-commit hook rbubley/mirrors-prettier to v3.7.3 [[#5804](https://github.com/woodpecker-ci/woodpecker/pull/5804)]
- fix(deps): update dependency simple-icons to v16 [[#5802](https://github.com/woodpecker-ci/woodpecker/pull/5802)]
- fix(deps): update module github.com/docker/cli to v29.1.1+incompatible [[#5801](https://github.com/woodpecker-ci/woodpecker/pull/5801)]
- chore(deps): update dependency prettier to v3.7.3 [[#5800](https://github.com/woodpecker-ci/woodpecker/pull/5800)]
- chore(deps): update pre-commit hook rbubley/mirrors-prettier to v3.7.2 [[#5795](https://github.com/woodpecker-ci/woodpecker/pull/5795)]
- fix(deps): update module gitlab.com/gitlab-org/api/client-go to v1 [[#5794](https://github.com/woodpecker-ci/woodpecker/pull/5794)]
- chore(deps): update web npm deps non-major [[#5792](https://github.com/woodpecker-ci/woodpecker/pull/5792)]
- chore(deps): update pre-commit hook rbubley/mirrors-prettier to v3.7.1 [[#5793](https://github.com/woodpecker-ci/woodpecker/pull/5793)]
- fix(deps): update module github.com/docker/cli to v29.1.0+incompatible [[#5789](https://github.com/woodpecker-ci/woodpecker/pull/5789)]
- fix(deps): update golang-packages [[#5787](https://github.com/woodpecker-ci/woodpecker/pull/5787)]
- chore(deps): lock file maintenance [[#5784](https://github.com/woodpecker-ci/woodpecker/pull/5784)]
- chore(deps): update dependency simple-icons to v15.22.0 [[#5782](https://github.com/woodpecker-ci/woodpecker/pull/5782)]
- chore(deps): update dependency vue-tsc to v3.1.5 [[#5781](https://github.com/woodpecker-ci/woodpecker/pull/5781)]
- chore(deps): update dependency @types/lodash to v4.17.21 [[#5780](https://github.com/woodpecker-ci/woodpecker/pull/5780)]
- chore(deps): update dependency vue-i18n to v11.2.1 [[#5779](https://github.com/woodpecker-ci/woodpecker/pull/5779)]
- chore(deps): update pre-commit hook igorshubovych/markdownlint-cli to v0.46.0 [[#5776](https://github.com/woodpecker-ci/woodpecker/pull/5776)]
- chore(deps): update web npm deps non-major [[#5775](https://github.com/woodpecker-ci/woodpecker/pull/5775)]
- fix(deps): update golang-packages [[#5770](https://github.com/woodpecker-ci/woodpecker/pull/5770)]
- fix(deps): update golang-packages [[#5765](https://github.com/woodpecker-ci/woodpecker/pull/5765)]

### Misc

- Revert "Send configuration as part of the request for external configuration" [[#5835](https://github.com/woodpecker-ci/woodpecker/pull/5835)]
- Allow packagers to set WebUI root to custom path [[#5809](https://github.com/woodpecker-ci/woodpecker/pull/5809)]
- fix(queue): force agent cancellation on lease expiration [[#5823](https://github.com/woodpecker-ci/woodpecker/pull/5823)]
- Extract interval into composition [[#5818](https://github.com/woodpecker-ci/woodpecker/pull/5818)]
- Fix outdated Makefile target [[#5817](https://github.com/woodpecker-ci/woodpecker/pull/5817)]
- Makefile: add target to generate man pages [[#5810](https://github.com/woodpecker-ci/woodpecker/pull/5810)]
- Split make install targets [[#5796](https://github.com/woodpecker-ci/woodpecker/pull/5796)]
- Use golangci docker image [[#5797](https://github.com/woodpecker-ci/woodpecker/pull/5797)]
- Clarify envvars documentation [[#5788](https://github.com/woodpecker-ci/woodpecker/pull/5788)]

## [3.12.0](https://github.com/woodpecker-ci/woodpecker/releases/tag/v3.12.0) - 2025-11-18

### ❤️ Thanks to all contributors! ❤️

@1001Josias, @6543, @JohnWalkerx, @LUKIEYF, @MeurillonGuillaume, @Utkarsh9571, @Xuxe, @anbraten, @chamburr, @henkka, @hhamalai, @marcusramberg, @pixelateapotato, @qwerty287, @yyewolf

### 🔒 Security

- chore(deps): update dependency vite to v7.1.11 [security] [[#5660](https://github.com/woodpecker-ci/woodpecker/pull/5660)]

### 📈 Enhancement

- feat(bitbucketserver): get changes from all commits in a single push event [[#5748](https://github.com/woodpecker-ci/woodpecker/pull/5748)]
- Support for file changes in Bitbucket Cloud [[#5730](https://github.com/woodpecker-ci/woodpecker/pull/5730)]
- feat(agent): log agent version on startup [[#5724](https://github.com/woodpecker-ci/woodpecker/pull/5724)]
- Add Header User-Agent for request client [[#5664](https://github.com/woodpecker-ci/woodpecker/pull/5664)]
- Switch from BoolTrue to optional.Option[bool] [[#5693](https://github.com/woodpecker-ci/woodpecker/pull/5693)]
- Enhancement log stream reading and writing and handle new lines and max-size [[#5683](https://github.com/woodpecker-ci/woodpecker/pull/5683)]
- Make local backend work with `cli exec` [[#4102](https://github.com/woodpecker-ci/woodpecker/pull/4102)]
- Make pipeline/frontend/yaml/* types able to be marshaled back to YAML [[#1835](https://github.com/woodpecker-ci/woodpecker/pull/1835)]
- Add log service addon [[#5507](https://github.com/woodpecker-ci/woodpecker/pull/5507)]
- Support multiple users with same login name but different forges [[#5612](https://github.com/woodpecker-ci/woodpecker/pull/5612)]
- Release linux/riscv64 binaries [[#5663](https://github.com/woodpecker-ci/woodpecker/pull/5663)]

### 🐛 Bug Fixes

- Fix crash when a HTTP/2 client goes away on SSE streams [[#5738](https://github.com/woodpecker-ci/woodpecker/pull/5738)]
- Add created icon [[#5747](https://github.com/woodpecker-ci/woodpecker/pull/5747)]
- Fix badge label padding [[#5725](https://github.com/woodpecker-ci/woodpecker/pull/5725)]
- Fix workflow path filter for GitHub [[#5721](https://github.com/woodpecker-ci/woodpecker/pull/5721)]
- Fix secret on new forge [[#5715](https://github.com/woodpecker-ci/woodpecker/pull/5715)]
- Revert to forge internal implementation of pagination for `Repos()` and `Teams()` for gitea/forgejo [[#5679](https://github.com/woodpecker-ci/woodpecker/pull/5679)]
- fix: panic due to an invalid memory address when injectSecretRecursive encounters nil values [[#5699](https://github.com/woodpecker-ci/woodpecker/pull/5699)]
- Fix so agents don't need to specify a required label twice [[#5684](https://github.com/woodpecker-ci/woodpecker/pull/5684)]
- Fix nil pointer dereference during GitHub Hook parsing [[#5681](https://github.com/woodpecker-ci/woodpecker/pull/5681)]
- Allow username to be used with multiple forges [[#5676](https://github.com/woodpecker-ci/woodpecker/pull/5676)]
- Create GitHub forge via WebUI fails to be loaded [[#5675](https://github.com/woodpecker-ci/woodpecker/pull/5675)]
- Bitbucket: ignore push hooks with no changes propperly [[#5672](https://github.com/woodpecker-ci/woodpecker/pull/5672)]
- fix(bitbucketdatacenter): prevent adding new repos with empty branch [[#5669](https://github.com/woodpecker-ci/woodpecker/pull/5669)]
- cli: show description of default value for `--backend-local-temp-dir` instead of value [[#5656](https://github.com/woodpecker-ci/woodpecker/pull/5656)]

### 📚 Documentation

- Add docs for 3.12 [[#5763](https://github.com/woodpecker-ci/woodpecker/pull/5763)]
- chore(deps): lock file maintenance [[#5760](https://github.com/woodpecker-ci/woodpecker/pull/5760)]
- chore(deps): update docs npm deps non-major [[#5752](https://github.com/woodpecker-ci/woodpecker/pull/5752)]
- chore(deps): update docs npm deps non-major [[#5733](https://github.com/woodpecker-ci/woodpecker/pull/5733)]
- Fix typo in about.md [[#5716](https://github.com/woodpecker-ci/woodpecker/pull/5716)]
- docs: add warning about 27-axis matrix limit [[#5700](https://github.com/woodpecker-ci/woodpecker/pull/5700)]
- chore(deps): update dependency isomorphic-dompurify to v2.31.0 [[#5709](https://github.com/woodpecker-ci/woodpecker/pull/5709)]
- chore(deps): update dependency @types/node to v24 [[#5706](https://github.com/woodpecker-ci/woodpecker/pull/5706)]
- chore(deps): update docs npm deps non-major [[#5701](https://github.com/woodpecker-ci/woodpecker/pull/5701)]
- Update path to plugins moved to woodpecker-community [[#5698](https://github.com/woodpecker-ci/woodpecker/pull/5698)]
- chore(deps): update docs npm deps non-major [[#5688](https://github.com/woodpecker-ci/woodpecker/pull/5688)]
- docs(plugins): add github-app-token and github-comment plugins to repository [[#5671](https://github.com/woodpecker-ci/woodpecker/pull/5671)]

### 📦️ Dependency

- fix(deps): update module github.com/urfave/cli/v3 to v3.6.1 [[#5759](https://github.com/woodpecker-ci/woodpecker/pull/5759)]
- chore(deps): update dependency vue-tsc to v3.1.4 [[#5758](https://github.com/woodpecker-ci/woodpecker/pull/5758)]
- fix(deps): update module github.com/google/go-github/v78 to v79 [[#5757](https://github.com/woodpecker-ci/woodpecker/pull/5757)]
- fix(deps): update module github.com/docker/cli to v29 [[#5756](https://github.com/woodpecker-ci/woodpecker/pull/5756)]
- chore(deps): update postgres docker tag to v18.1 [[#5755](https://github.com/woodpecker-ci/woodpecker/pull/5755)]
- chore(deps): update web npm deps non-major [[#5754](https://github.com/woodpecker-ci/woodpecker/pull/5754)]
- chore(deps): update pre-commit hook golangci/golangci-lint to v2.6.2 [[#5753](https://github.com/woodpecker-ci/woodpecker/pull/5753)]
- chore(deps): update dependency golangci/golangci-lint to v2.6.2 [[#5751](https://github.com/woodpecker-ci/woodpecker/pull/5751)]
- fix(deps): update golang-packages [[#5746](https://github.com/woodpecker-ci/woodpecker/pull/5746)]
- fix(deps): update golang-packages [[#5745](https://github.com/woodpecker-ci/woodpecker/pull/5745)]
- fix(deps): update module github.com/urfave/cli/v3 to v3.6.0 [[#5743](https://github.com/woodpecker-ci/woodpecker/pull/5743)]
- chore(deps): lock file maintenance [[#5744](https://github.com/woodpecker-ci/woodpecker/pull/5744)]
- fix(deps): update golang-packages [[#5741](https://github.com/woodpecker-ci/woodpecker/pull/5741)]
- chore(deps): update dependency simple-icons to v15.20.0 [[#5742](https://github.com/woodpecker-ci/woodpecker/pull/5742)]
- fix(deps): update module github.com/google/go-github/v77 to v78 [[#5739](https://github.com/woodpecker-ci/woodpecker/pull/5739)]
- fix(deps): update module github.com/google/go-github/v76 to v77 [[#5737](https://github.com/woodpecker-ci/woodpecker/pull/5737)]
- fix(deps): update dependency marked to v17 [[#5736](https://github.com/woodpecker-ci/woodpecker/pull/5736)]
- chore(deps): update web npm deps non-major [[#5735](https://github.com/woodpecker-ci/woodpecker/pull/5735)]
- chore(deps): update pre-commit hook golangci/golangci-lint to v2.6.1 [[#5734](https://github.com/woodpecker-ci/woodpecker/pull/5734)]
- chore(deps): update dependency golangci/golangci-lint to v2.6.1 [[#5732](https://github.com/woodpecker-ci/woodpecker/pull/5732)]
- chore(deps): update dependency golang to v1.25.4 [[#5731](https://github.com/woodpecker-ci/woodpecker/pull/5731)]
- fix(deps): update golang-packages to v28.5.2+incompatible [[#5723](https://github.com/woodpecker-ci/woodpecker/pull/5723)]
- fix(deps): update module gitlab.com/gitlab-org/api/client-go to v0.159.0 [[#5720](https://github.com/woodpecker-ci/woodpecker/pull/5720)]
- fix(deps): update module gitlab.com/gitlab-org/api/client-go to v0.158.0 [[#5718](https://github.com/woodpecker-ci/woodpecker/pull/5718)]
- chore(deps): lock file maintenance [[#5711](https://github.com/woodpecker-ci/woodpecker/pull/5711)]
- chore(deps): update dependency golangci/golangci-lint to v2.6.0 [[#5702](https://github.com/woodpecker-ci/woodpecker/pull/5702)]
- chore(deps): update web npm deps non-major [[#5705](https://github.com/woodpecker-ci/woodpecker/pull/5705)]
- fix(deps): update module github.com/yaronf/httpsign to v0.4.1 [[#5708](https://github.com/woodpecker-ci/woodpecker/pull/5708)]
- chore(deps): update node.js to v24 [[#5707](https://github.com/woodpecker-ci/woodpecker/pull/5707)]
- chore(deps): update pre-commit hook golangci/golangci-lint to v2.6.0 [[#5704](https://github.com/woodpecker-ci/woodpecker/pull/5704)]
- chore(deps): update gitea/gitea docker tag to v1.25 [[#5703](https://github.com/woodpecker-ci/woodpecker/pull/5703)]
- fix(deps): update module gitlab.com/gitlab-org/api/client-go to v0.157.1 [[#5697](https://github.com/woodpecker-ci/woodpecker/pull/5697)]
- chore(deps): lock file maintenance [[#5695](https://github.com/woodpecker-ci/woodpecker/pull/5695)]
- chore(deps): update web npm deps non-major [[#5694](https://github.com/woodpecker-ci/woodpecker/pull/5694)]
- fix(deps): update dependency @vueuse/core to v14 [[#5692](https://github.com/woodpecker-ci/woodpecker/pull/5692)]
- chore(deps): update dependency vitest to v4 [[#5691](https://github.com/woodpecker-ci/woodpecker/pull/5691)]
- chore(deps): update docker.io/mysql docker tag to v9.5.0 [[#5690](https://github.com/woodpecker-ci/woodpecker/pull/5690)]
- chore(deps): update web npm deps non-major [[#5689](https://github.com/woodpecker-ci/woodpecker/pull/5689)]
- chore(deps): update dependency mvdan/gofumpt to v0.9.2 [[#5687](https://github.com/woodpecker-ci/woodpecker/pull/5687)]
- fix(deps): update github.com/urfave/cli-docs/v3 digest to 72b87d1 [[#5686](https://github.com/woodpecker-ci/woodpecker/pull/5686)]
- fix(deps): update module code.gitea.io/sdk/gitea to v0.22.1 [[#5682](https://github.com/woodpecker-ci/woodpecker/pull/5682)]
- fix(deps): update module github.com/urfave/cli/v3 to v3.5.0 [[#5668](https://github.com/woodpecker-ci/woodpecker/pull/5668)]
- fix(deps): update module xorm.io/xorm to v1.3.11 [[#5662](https://github.com/woodpecker-ci/woodpecker/pull/5662)]
- chore(deps): lock file maintenance [[#5657](https://github.com/woodpecker-ci/woodpecker/pull/5657)]

### Misc

- Also create image preview on label change only [[#5673](https://github.com/woodpecker-ci/woodpecker/pull/5673)]
- Add migration tests for postgres [[#669](https://github.com/woodpecker-ci/woodpecker/pull/669)]

## [3.11.0](https://github.com/woodpecker-ci/woodpecker/releases/tag/v3.11.0) - 2025-10-19

### ❤️ Thanks to all contributors! ❤️

@6543, @Gusted, @MartinSchmidt, @anbraten, @eikemeier, @henkka, @joariasl, @marcusramberg, @qwerty287, @xoxys

### ✨ Features

- Allow to configure a config extension per repo [[#3349](https://github.com/woodpecker-ci/woodpecker/pull/3349)]

### 📈 Enhancement

- Improve log.CopyByLine to be more robust [[#5641](https://github.com/woodpecker-ci/woodpecker/pull/5641)]
- Add pagination for `Repos()` and `Teams()` in Forge interface [[#5638](https://github.com/woodpecker-ci/woodpecker/pull/5638)]
- Modernize a couple of loops, fix incorrect function docs [[#5637](https://github.com/woodpecker-ci/woodpecker/pull/5637)]
- Allow agents to require labels on workflows [[#5633](https://github.com/woodpecker-ci/woodpecker/pull/5633)]
- Add repo filter options to GetRepos api [[#5631](https://github.com/woodpecker-ci/woodpecker/pull/5631)]
- Add branch filter to cli pipeline purge [[#5616](https://github.com/woodpecker-ci/woodpecker/pull/5616)]
- Switch to GitHub REST API to load changed files [[#5618](https://github.com/woodpecker-ci/woodpecker/pull/5618)]
- Enhance Bitbucket Datacenter build status reporting [[#5611](https://github.com/woodpecker-ci/woodpecker/pull/5611)]
- List all repos in repository view if user is admin [[#5595](https://github.com/woodpecker-ci/woodpecker/pull/5595)]
- Add disabled badge to agents [[#5593](https://github.com/woodpecker-ci/woodpecker/pull/5593)]
- Improve error message when agent fails to connect [[#5587](https://github.com/woodpecker-ci/woodpecker/pull/5587)]
- local backend: test shells if unknown [[#5570](https://github.com/woodpecker-ci/woodpecker/pull/5570)]

### 🐛 Bug Fixes

- Fix missing background in pipeline deploy popup [[#5630](https://github.com/woodpecker-ci/woodpecker/pull/5630)]
- Support matrix environ badges only with no key-values [[#5578](https://github.com/woodpecker-ci/woodpecker/pull/5578)]
- local backend: fix steps having logs form other steps [[#5582](https://github.com/woodpecker-ci/woodpecker/pull/5582)]
- local backend: fix windows cmd.exe command escaping [[#5569](https://github.com/woodpecker-ci/woodpecker/pull/5569)]
- Bump buildx and limit max parallel builds [[#5579](https://github.com/woodpecker-ci/woodpecker/pull/5579)]
- Don't split language if not required [[#5576](https://github.com/woodpecker-ci/woodpecker/pull/5576)]

### 📚 Documentation

- chore(deps): update docs npm deps non-major [[#5649](https://github.com/woodpecker-ci/woodpecker/pull/5649)]
- Document Forge interface precisely [[#5636](https://github.com/woodpecker-ci/woodpecker/pull/5636)]
- chore(deps): update dependency @types/node to v22.18.10 [[#5624](https://github.com/woodpecker-ci/woodpecker/pull/5624)]
- chore(deps): update docs npm deps non-major [[#5622](https://github.com/woodpecker-ci/woodpecker/pull/5622)]
- chore(deps): lock file maintenance [[#5607](https://github.com/woodpecker-ci/woodpecker/pull/5607)]
- chore(deps): update dependency @tsconfig/docusaurus to v2.0.4 [[#5605](https://github.com/woodpecker-ci/woodpecker/pull/5605)]
- chore(deps): update docs npm deps non-major [[#5600](https://github.com/woodpecker-ci/woodpecker/pull/5600)]
- Fix Kubernetes install docs to use OCI artifacts instead of deprecated helm chart [[#5596](https://github.com/woodpecker-ci/woodpecker/pull/5596)]
- Document pipeline backend engine interface precisely [[#5583](https://github.com/woodpecker-ci/woodpecker/pull/5583)]

### 📦️ Dependency

- chore(deps): update dependency simple-icons to v15.17.0 [[#5655](https://github.com/woodpecker-ci/woodpecker/pull/5655)]
- chore(deps): update dependency jsdom to v27.0.1 [[#5653](https://github.com/woodpecker-ci/woodpecker/pull/5653)]
- fix(deps): update module github.com/google/go-github/v75 to v76 [[#5652](https://github.com/woodpecker-ci/woodpecker/pull/5652)]
- chore(deps): update dependency @antfu/eslint-config to v6 [[#5651](https://github.com/woodpecker-ci/woodpecker/pull/5651)]
- chore(deps): update web npm deps non-major [[#5650](https://github.com/woodpecker-ci/woodpecker/pull/5650)]
- chore(deps): update dependency golang to v1.25.3 [[#5648](https://github.com/woodpecker-ci/woodpecker/pull/5648)]
- fix(deps): update module github.com/yaronf/httpsign to v0.3.3 [[#5647](https://github.com/woodpecker-ci/woodpecker/pull/5647)]
- fix(deps): update module github.com/charmbracelet/huh to v0.8.0 [[#5643](https://github.com/woodpecker-ci/woodpecker/pull/5643)]
- fix(deps): update module gitlab.com/gitlab-org/api/client-go to v0.157.0 [[#5640](https://github.com/woodpecker-ci/woodpecker/pull/5640)]
- chore(deps): lock file maintenance [[#5634](https://github.com/woodpecker-ci/woodpecker/pull/5634)]
- fix(deps): update module gitlab.com/gitlab-org/api/client-go to v0.156.0 [[#5626](https://github.com/woodpecker-ci/woodpecker/pull/5626)]
- chore(deps): lock file maintenance [[#5627](https://github.com/woodpecker-ci/woodpecker/pull/5627)]
- chore(deps): update dependency @types/node to v22.18.10 [[#5625](https://github.com/woodpecker-ci/woodpecker/pull/5625)]
- chore(deps): update web npm deps non-major [[#5623](https://github.com/woodpecker-ci/woodpecker/pull/5623)]
- chore(deps): update docker.io/woodpeckerci/plugin-trivy docker tag to v1.4.3 [[#5621](https://github.com/woodpecker-ci/woodpecker/pull/5621)]
- chore(deps): update dependency golang to v1.25.2 [[#5620](https://github.com/woodpecker-ci/woodpecker/pull/5620)]
- fix(deps): update module gitlab.com/gitlab-org/api/client-go to v0.155.0 [[#5617](https://github.com/woodpecker-ci/woodpecker/pull/5617)]
- fix(deps): update golang-packages [[#5614](https://github.com/woodpecker-ci/woodpecker/pull/5614)]
- fix(deps): update golang-packages [[#5610](https://github.com/woodpecker-ci/woodpecker/pull/5610)]
- chore(deps): update dependency simple-icons to v15.16.1 [[#5606](https://github.com/woodpecker-ci/woodpecker/pull/5606)]
- fix(deps): update module gitlab.com/gitlab-org/api/client-go to v0.151.0 [[#5604](https://github.com/woodpecker-ci/woodpecker/pull/5604)]
- chore(deps): update woodpeckerci/plugin-git docker tag to v2.7.0 [[#5603](https://github.com/woodpecker-ci/woodpecker/pull/5603)]
- chore(deps): update web npm deps non-major [[#5602](https://github.com/woodpecker-ci/woodpecker/pull/5602)]
- chore(deps): update woodpeckerci/plugin-release docker tag to v0.2.6 [[#5601](https://github.com/woodpecker-ci/woodpecker/pull/5601)]
- chore(deps): update docker.io/woodpeckerci/plugin-surge-preview docker tag to v1.4.1 [[#5598](https://github.com/woodpecker-ci/woodpecker/pull/5598)]
- chore(deps): update docker.io/woodpeckerci/plugin-trivy docker tag to v1.4.2 [[#5599](https://github.com/woodpecker-ci/woodpecker/pull/5599)]
- fix(deps): update golang-packages [[#5594](https://github.com/woodpecker-ci/woodpecker/pull/5594)]
- chore(deps): update docker.io/woodpeckerci/plugin-editorconfig-checker docker tag to v0.3.2 [[#5577](https://github.com/woodpecker-ci/woodpecker/pull/5577)]
- chore(deps): lock file maintenance [[#5566](https://github.com/woodpecker-ci/woodpecker/pull/5566)]

### Misc

- flake.lock: Update [[#5635](https://github.com/woodpecker-ci/woodpecker/pull/5635)]
- chore(deps): drop `github.com/gorilla/securecookie` [[#5609](https://github.com/woodpecker-ci/woodpecker/pull/5609)]
- Announce only stable releases [[#5580](https://github.com/woodpecker-ci/woodpecker/pull/5580)]

## [3.10.0](https://github.com/woodpecker-ci/woodpecker/releases/tag/v3.10.0) - 2025-09-28

### ❤️ Thanks to all contributors! ❤️

@6543, @Gusted, @da-Kai, @henkka, @hhamalai, @j04n-f, @klausi85, @marcusramberg, @qwerty287, @xoxys, @zhedazijingang

### 🔒 Security

- chore(deps): update dependency vite to v7.1.5 [security] [[#5495](https://github.com/woodpecker-ci/woodpecker/pull/5495)]

### ✨ Features

- New event pull request metadata [[#5214](https://github.com/woodpecker-ci/woodpecker/pull/5214)]
- Add task UUID label to Kubernetes pods [[#5544](https://github.com/woodpecker-ci/woodpecker/pull/5544)]
- feat: expose listing available organizations via woodpecker-go / CLI [[#5481](https://github.com/woodpecker-ci/woodpecker/pull/5481)]
- Add milestone to metadata [[#5174](https://github.com/woodpecker-ci/woodpecker/pull/5174)]

### 📈 Enhancement

- Trace errors during SetupWorkflow, make service step setup errors visible to user [[#5559](https://github.com/woodpecker-ci/woodpecker/pull/5559)]
- Enable completion support for cli [[#5552](https://github.com/woodpecker-ci/woodpecker/pull/5552)]
- Add `StepFinished` to log service [[#5530](https://github.com/woodpecker-ci/woodpecker/pull/5530)]
- Migrate to mockery v3 [[#5547](https://github.com/woodpecker-ci/woodpecker/pull/5547)]
- Show human readable information in queue info [[#5516](https://github.com/woodpecker-ci/woodpecker/pull/5516)]
- feat(bitbucketdatacenter): Implement missing OrgMembership method [[#5476](https://github.com/woodpecker-ci/woodpecker/pull/5476)]
- Cleanup columns in forges table [[#5517](https://github.com/woodpecker-ci/woodpecker/pull/5517)]
- Allow to get secrets from file [[#5509](https://github.com/woodpecker-ci/woodpecker/pull/5509)]
- refactor: use slices.Contains to simplify [[#5468](https://github.com/woodpecker-ci/woodpecker/pull/5468)]
- Hide unsupported forge options [[#5465](https://github.com/woodpecker-ci/woodpecker/pull/5465)]
- Collapse changed files in file-tree [[#5451](https://github.com/woodpecker-ci/woodpecker/pull/5451)]
- Simplify queue interface [[#5449](https://github.com/woodpecker-ci/woodpecker/pull/5449)]

### 🐛 Bug Fixes

- Support for pull requests opened events from forked repositories [[#5536](https://github.com/woodpecker-ci/woodpecker/pull/5536)]
- Add back-off retry for pod log streaming to kubernetes backend [[#5550](https://github.com/woodpecker-ci/woodpecker/pull/5550)]
- Fix dir not found handling [[#5533](https://github.com/woodpecker-ci/woodpecker/pull/5533)]
- Show readable error [[#5501](https://github.com/woodpecker-ci/woodpecker/pull/5501)]
- fix: allow spaces in cli string slices [[#5494](https://github.com/woodpecker-ci/woodpecker/pull/5494)]
- fix: changed schema definition for "backend_options.kubernetes.tolerations" to accept an array of objects [[#5478](https://github.com/woodpecker-ci/woodpecker/pull/5478)]
- Print execution errors [[#5448](https://github.com/woodpecker-ci/woodpecker/pull/5448)]

### 📚 Documentation

- chore(deps): update dependency @types/react to v19.1.15 [[#5562](https://github.com/woodpecker-ci/woodpecker/pull/5562)]
- chore(deps): update docs npm deps non-major [[#5554](https://github.com/woodpecker-ci/woodpecker/pull/5554)]
- Add MCP tool to awesome docs [[#5546](https://github.com/woodpecker-ci/woodpecker/pull/5546)]
- chore(deps): update docs npm deps non-major [[#5527](https://github.com/woodpecker-ci/woodpecker/pull/5527)]
- chore(deps): update docs npm deps non-major [[#5512](https://github.com/woodpecker-ci/woodpecker/pull/5512)]
- Add a blog post [[#5510](https://github.com/woodpecker-ci/woodpecker/pull/5510)]
- chore(deps): update docs npm deps non-major [[#5503](https://github.com/woodpecker-ci/woodpecker/pull/5503)]
- docs: add SonarQube to plugins list [[#5502](https://github.com/woodpecker-ci/woodpecker/pull/5502)]
- Add Bitbucket key limit known issue [[#5497](https://github.com/woodpecker-ci/woodpecker/pull/5497)]
- chore(deps): update dependency @types/node to v22.18.1 [[#5484](https://github.com/woodpecker-ci/woodpecker/pull/5484)]
- chore(deps): update docs npm deps non-major [[#5472](https://github.com/woodpecker-ci/woodpecker/pull/5472)]
- Add ui proxy docs [[#5459](https://github.com/woodpecker-ci/woodpecker/pull/5459)]
- chore(deps): update dependency @types/react to v19.1.11 [[#5454](https://github.com/woodpecker-ci/woodpecker/pull/5454)]
- Add easypanel community package [[#5446](https://github.com/woodpecker-ci/woodpecker/pull/5446)]
- Add some blogs and videos [[#5445](https://github.com/woodpecker-ci/woodpecker/pull/5445)]

### 📦️ Dependency

- chore(deps): update dependency vue-tsc to v3.1.0 [[#5563](https://github.com/woodpecker-ci/woodpecker/pull/5563)]
- fix(deps): update golang-packages [[#5561](https://github.com/woodpecker-ci/woodpecker/pull/5561)]
- chore(deps): update postgres docker tag to v18 [[#5557](https://github.com/woodpecker-ci/woodpecker/pull/5557)]
- chore(deps): update docker.io/postgres docker tag to v18 [[#5556](https://github.com/woodpecker-ci/woodpecker/pull/5556)]
- chore(deps): update web npm deps non-major [[#5553](https://github.com/woodpecker-ci/woodpecker/pull/5553)]
- chore(deps): update pre-commit hook hadolint/hadolint to v2.14.0 [[#5555](https://github.com/woodpecker-ci/woodpecker/pull/5555)]
- fix(deps): update module gitlab.com/gitlab-org/api/client-go to v0.148.0 [[#5548](https://github.com/woodpecker-ci/woodpecker/pull/5548)]
- fix(deps): update module gitlab.com/gitlab-org/api/client-go to v0.147.1 [[#5541](https://github.com/woodpecker-ci/woodpecker/pull/5541)]
- chore(deps): update pre-commit hook golangci/golangci-lint to v2.5.0 [[#5535](https://github.com/woodpecker-ci/woodpecker/pull/5535)]
- fix(deps): update dependency simple-icons to v15.16.0 [[#5532](https://github.com/woodpecker-ci/woodpecker/pull/5532)]
- fix(deps): update module github.com/gin-gonic/gin to v1.11.0 [[#5531](https://github.com/woodpecker-ci/woodpecker/pull/5531)]
- fix(deps): update web npm deps non-major [[#5528](https://github.com/woodpecker-ci/woodpecker/pull/5528)]
- fix(deps): update module gitlab.com/gitlab-org/api/client-go to v0.146.0 [[#5524](https://github.com/woodpecker-ci/woodpecker/pull/5524)]
- fix(deps): update module gitlab.com/gitlab-org/api/client-go to v0.145.0 [[#5523](https://github.com/woodpecker-ci/woodpecker/pull/5523)]
- chore(deps): lock file maintenance [[#5514](https://github.com/woodpecker-ci/woodpecker/pull/5514)]
- fix(deps): update dependency marked to v16.3.0 [[#5513](https://github.com/woodpecker-ci/woodpecker/pull/5513)]
- fix(deps): update dependency simple-icons to v15.15.0 [[#5508](https://github.com/woodpecker-ci/woodpecker/pull/5508)]
- chore(deps): update dependency jsdom to v27 [[#5506](https://github.com/woodpecker-ci/woodpecker/pull/5506)]
- fix(deps): update module gitlab.com/gitlab-org/api/client-go to v0.144.1 [[#5505](https://github.com/woodpecker-ci/woodpecker/pull/5505)]
- chore(deps): update web npm deps non-major [[#5504](https://github.com/woodpecker-ci/woodpecker/pull/5504)]
- fix(deps): update golang-packages [[#5499](https://github.com/woodpecker-ci/woodpecker/pull/5499)]
- fix(deps): update golang-packages [[#5496](https://github.com/woodpecker-ci/woodpecker/pull/5496)]
- fix(deps): update golang-packages [[#5493](https://github.com/woodpecker-ci/woodpecker/pull/5493)]
- chore(deps): lock file maintenance [[#5492](https://github.com/woodpecker-ci/woodpecker/pull/5492)]
- fix(deps): update golang-packages [[#5491](https://github.com/woodpecker-ci/woodpecker/pull/5491)]
- fix(deps): update dependency simple-icons to v15.14.0 [[#5490](https://github.com/woodpecker-ci/woodpecker/pull/5490)]
- fix(deps): update module github.com/prometheus/client_golang to v1.23.2 [[#5489](https://github.com/woodpecker-ci/woodpecker/pull/5489)]
- chore(deps): update dependency @intlify/unplugin-vue-i18n to v11 [[#5487](https://github.com/woodpecker-ci/woodpecker/pull/5487)]
- fix(deps): update web npm deps non-major [[#5486](https://github.com/woodpecker-ci/woodpecker/pull/5486)]
- chore(deps): update dependency golang to v1.25.1 [[#5485](https://github.com/woodpecker-ci/woodpecker/pull/5485)]
- fix(deps): update module github.com/prometheus/client_golang to v1.23.1 [[#5483](https://github.com/woodpecker-ci/woodpecker/pull/5483)]
- fix(deps): update golang-packages to v28.4.0+incompatible [[#5480](https://github.com/woodpecker-ci/woodpecker/pull/5480)]
- fix(deps): update golang-packages [[#5479](https://github.com/woodpecker-ci/woodpecker/pull/5479)]
- fix(deps): update module gitlab.com/gitlab-org/api/client-go to v0.142.5 [[#5475](https://github.com/woodpecker-ci/woodpecker/pull/5475)]
- fix(deps): update web npm deps non-major [[#5473](https://github.com/woodpecker-ci/woodpecker/pull/5473)]
- fix(deps): update golang-packages [[#5467](https://github.com/woodpecker-ci/woodpecker/pull/5467)]
- fix(deps): update module gitlab.com/gitlab-org/api/client-go to v0.142.2 [[#5466](https://github.com/woodpecker-ci/woodpecker/pull/5466)]
- fix(deps): update golang-packages [[#5463](https://github.com/woodpecker-ci/woodpecker/pull/5463)]
- chore(deps): lock file maintenance [[#5458](https://github.com/woodpecker-ci/woodpecker/pull/5458)]
- fix(deps): update golang-packages [[#5457](https://github.com/woodpecker-ci/woodpecker/pull/5457)]
- fix(deps): update dependency simple-icons to v15.12.0 [[#5456](https://github.com/woodpecker-ci/woodpecker/pull/5456)]
- fix(deps): update web npm deps non-major [[#5455](https://github.com/woodpecker-ci/woodpecker/pull/5455)]
- fix(deps): update module gitlab.com/gitlab-org/api/client-go to v0.142.0 [[#5452](https://github.com/woodpecker-ci/woodpecker/pull/5452)]
- fix(deps): update golang-packages [[#5442](https://github.com/woodpecker-ci/woodpecker/pull/5442)]

### Misc

- Fix prettier configs [[#5529](https://github.com/woodpecker-ci/woodpecker/pull/5529)]
- eslint ignore html-indent in vue [[#5521](https://github.com/woodpecker-ci/woodpecker/pull/5521)]
- Remove twitter from release template [[#5447](https://github.com/woodpecker-ci/woodpecker/pull/5447)]

## [3.9.0](https://github.com/woodpecker-ci/woodpecker/releases/tag/v3.9.0) - 2025-08-20

### ❤️ Thanks to all contributors! ❤️

@6543, @anbraten, @clintonsteiner, @henkka, @hhamalai, @hrfee, @ivaltryek, @lilioid, @qwerty287, @scottshotgg, @wgroeneveld, @xoxys

### 🔒 Security

- Remediate webpack vulnerability in webpack-dev-server [[#5264](https://github.com/woodpecker-ci/woodpecker/pull/5264)]
- fix(deps): update module github.com/docker/docker to v28.3.3+incompatible [security] [[#5373](https://github.com/woodpecker-ci/woodpecker/pull/5373)]
- Prevent secrets from leaking to Kubernetes API Server logs [[#5305](https://github.com/woodpecker-ci/woodpecker/pull/5305)]

### ✨ Features

- feat(k8s): Kubernetes namespace per organization [[#5309](https://github.com/woodpecker-ci/woodpecker/pull/5309)]
- Add and edit additional forges in UI [[#5328](https://github.com/woodpecker-ci/woodpecker/pull/5328)]

### 📈 Enhancement

- Rename oauth variables [[#5435](https://github.com/woodpecker-ci/woodpecker/pull/5435)]
- Add `fsGroupChangePolicy` option to Kubernetes backend [[#5416](https://github.com/woodpecker-ci/woodpecker/pull/5416)]
- Rework background colors for light/dark theme [[#5411](https://github.com/woodpecker-ci/woodpecker/pull/5411)]
- Allow to set default approval mode [[#5406](https://github.com/woodpecker-ci/woodpecker/pull/5406)]
- Add Agent-level Tolerations setting [[#5266](https://github.com/woodpecker-ci/woodpecker/pull/5266)]
- feat(k8s): k8s priority class name config [[#5391](https://github.com/woodpecker-ci/woodpecker/pull/5391)]
- Count reopening an pull as opening an pull [[#5370](https://github.com/woodpecker-ci/woodpecker/pull/5370)]
- Add pipeline log fullscreen [[#5377](https://github.com/woodpecker-ci/woodpecker/pull/5377)]
- Show changed files as file-tree [[#5379](https://github.com/woodpecker-ci/woodpecker/pull/5379)]
- Replace header bg with border [[#5380](https://github.com/woodpecker-ci/woodpecker/pull/5380)]
- Prevent body jump when scrollbar appears [[#5381](https://github.com/woodpecker-ci/woodpecker/pull/5381)]
- Show oauth host and favicon on login [[#5376](https://github.com/woodpecker-ci/woodpecker/pull/5376)]
- Support secrets in `cli exec` [[#5374](https://github.com/woodpecker-ci/woodpecker/pull/5374)]
- Simplify backend types [[#5299](https://github.com/woodpecker-ci/woodpecker/pull/5299)]

### 🐛 Bug Fixes

- Handle empty url and oauth_host on login page [[#5434](https://github.com/woodpecker-ci/woodpecker/pull/5434)]
- Fix background color of pipeline step list [[#5431](https://github.com/woodpecker-ci/woodpecker/pull/5431)]
- Fix bitbucket status sending [[#5372](https://github.com/woodpecker-ci/woodpecker/pull/5372)]
- Correct OpenApi LookupOrg router path [[#5351](https://github.com/woodpecker-ci/woodpecker/pull/5351)]
- fix(agent): handle context cancellation [[#5323](https://github.com/woodpecker-ci/woodpecker/pull/5323)]
- woodpecker-go/types: fix time-related struct field tags [[#5343](https://github.com/woodpecker-ci/woodpecker/pull/5343)]
- Reload repo on hook [[#5324](https://github.com/woodpecker-ci/woodpecker/pull/5324)]
- Fix loading icons and add missing loading indicators [[#5329](https://github.com/woodpecker-ci/woodpecker/pull/5329)]
- Use correct parameter for forge selection on login [[#5325](https://github.com/woodpecker-ci/woodpecker/pull/5325)]

### 📚 Documentation

- chore(deps): lock file maintenance [[#5430](https://github.com/woodpecker-ci/woodpecker/pull/5430)]
- chore(deps): update docs npm deps non-major [[#5420](https://github.com/woodpecker-ci/woodpecker/pull/5420)]
- Remove X link [[#5412](https://github.com/woodpecker-ci/woodpecker/pull/5412)]
- fix(deps): update docs npm deps non-major [[#5395](https://github.com/woodpecker-ci/woodpecker/pull/5395)]
- fix(deps): update docs npm deps non-major [[#5384](https://github.com/woodpecker-ci/woodpecker/pull/5384)]
- Remove references of kaniko [[#5371](https://github.com/woodpecker-ci/woodpecker/pull/5371)]
- Add ASCII JUnit Test Report plugin [[#5355](https://github.com/woodpecker-ci/woodpecker/pull/5355)]
- fix(deps): update docs npm deps non-major [[#5340](https://github.com/woodpecker-ci/woodpecker/pull/5340)]
- chore(deps): update docs npm deps non-major [[#5316](https://github.com/woodpecker-ci/woodpecker/pull/5316)]

### 📦️ Dependency

- fix(deps): update module google.golang.org/grpc to v1.75.0 [[#5437](https://github.com/woodpecker-ci/woodpecker/pull/5437)]
- fix(deps): update module gitlab.com/gitlab-org/api/client-go to v0.141.1 [[#5432](https://github.com/woodpecker-ci/woodpecker/pull/5432)]
- chore(deps): update golang-lang [[#5423](https://github.com/woodpecker-ci/woodpecker/pull/5423)]
- chore(deps): update docker.io/golang docker tag to v1.25 [[#5422](https://github.com/woodpecker-ci/woodpecker/pull/5422)]
- fix(deps): update dependency simple-icons to v15.11.0 [[#5427](https://github.com/woodpecker-ci/woodpecker/pull/5427)]
- chore(deps): update pre-commit hook golangci/golangci-lint to v2.4.0 [[#5425](https://github.com/woodpecker-ci/woodpecker/pull/5425)]
- chore(deps): update postgres docker tag to v17.6 [[#5424](https://github.com/woodpecker-ci/woodpecker/pull/5424)]
- fix(deps): update web npm deps non-major [[#5421](https://github.com/woodpecker-ci/woodpecker/pull/5421)]
- fix(deps): update golang-packages [[#5415](https://github.com/woodpecker-ci/woodpecker/pull/5415)]
- fix(deps): update golang-packages [[#5413](https://github.com/woodpecker-ci/woodpecker/pull/5413)]
- fix(deps): update golang-packages [[#5407](https://github.com/woodpecker-ci/woodpecker/pull/5407)]
- chore(deps): lock file maintenance [[#5404](https://github.com/woodpecker-ci/woodpecker/pull/5404)]
- chore(deps): update pre-commit hook pre-commit/pre-commit-hooks to v6 [[#5399](https://github.com/woodpecker-ci/woodpecker/pull/5399)]
- fix(deps): update dependency simple-icons to v15.10.0 [[#5400](https://github.com/woodpecker-ci/woodpecker/pull/5400)]
- fix(deps): update web npm deps non-major [[#5396](https://github.com/woodpecker-ci/woodpecker/pull/5396)]
- chore(deps): update docker.io/woodpeckerci/plugin-ready-release-go docker tag to v3.4.0 [[#5394](https://github.com/woodpecker-ci/woodpecker/pull/5394)]
- chore(deps): update dependency golang to v1.24.6 [[#5393](https://github.com/woodpecker-ci/woodpecker/pull/5393)]
- fix(deps): update golang-packages [[#5392](https://github.com/woodpecker-ci/woodpecker/pull/5392)]
- chore(deps): lock file maintenance [[#5388](https://github.com/woodpecker-ci/woodpecker/pull/5388)]
- chore(deps): update pre-commit hook golangci/golangci-lint to v2.3.1 [[#5386](https://github.com/woodpecker-ci/woodpecker/pull/5386)]
- fix(deps): update web npm deps non-major [[#5385](https://github.com/woodpecker-ci/woodpecker/pull/5385)]
- fix(deps): update module github.com/prometheus/client_golang to v1.23.0 [[#5382](https://github.com/woodpecker-ci/woodpecker/pull/5382)]
- fix(deps): update golang-packages [[#5375](https://github.com/woodpecker-ci/woodpecker/pull/5375)]
- chore(deps): lock file maintenance [[#5369](https://github.com/woodpecker-ci/woodpecker/pull/5369)]
- fix(deps): update module github.com/bmatcuk/doublestar/v4 to v4.9.1 [[#5365](https://github.com/woodpecker-ci/woodpecker/pull/5365)]
- fix(deps): update module github.com/google/go-github/v73 to v74 [[#5363](https://github.com/woodpecker-ci/woodpecker/pull/5363)]
- chore(deps): update dependency @antfu/eslint-config to v5 [[#5362](https://github.com/woodpecker-ci/woodpecker/pull/5362)]
- chore(deps): update web npm deps non-major [[#5361](https://github.com/woodpecker-ci/woodpecker/pull/5361)]
- chore(deps): update docker.io/mysql docker tag to v9.4.0 [[#5359](https://github.com/woodpecker-ci/woodpecker/pull/5359)]
- fix(deps): update golang-packages [[#5356](https://github.com/woodpecker-ci/woodpecker/pull/5356)]
- 📦 update web dependencies [[#5352](https://github.com/woodpecker-ci/woodpecker/pull/5352)]
- chore(config): migrate renovate config [[#5350](https://github.com/woodpecker-ci/woodpecker/pull/5350)]
- chore(deps): lock file maintenance [[#5348](https://github.com/woodpecker-ci/woodpecker/pull/5348)]
- fix(deps): update golang-packages [[#5347](https://github.com/woodpecker-ci/woodpecker/pull/5347)]
- fix(deps): update golang-packages [[#5336](https://github.com/woodpecker-ci/woodpecker/pull/5336)]
- chore(deps): lock file maintenance [[#5344](https://github.com/woodpecker-ci/woodpecker/pull/5344)]
- fix(deps): update web npm deps non-major [[#5341](https://github.com/woodpecker-ci/woodpecker/pull/5341)]
- fix(deps): update dependency vue-i18n to v11.1.10 [security] [[#5335](https://github.com/woodpecker-ci/woodpecker/pull/5335)]
- fix(deps): update golang-packages [[#5333](https://github.com/woodpecker-ci/woodpecker/pull/5333)]
- chore(deps): lock file maintenance [[#5320](https://github.com/woodpecker-ci/woodpecker/pull/5320)]
- fix(deps): update web npm deps non-major [[#5317](https://github.com/woodpecker-ci/woodpecker/pull/5317)]
- fix(deps): update module github.com/bmatcuk/doublestar/v4 to v4.9.0 [[#5318](https://github.com/woodpecker-ci/woodpecker/pull/5318)]
- chore(deps): update dependency golang to v1.24.5 [[#5314](https://github.com/woodpecker-ci/woodpecker/pull/5314)]
- fix(deps): update golang-packages [[#5313](https://github.com/woodpecker-ci/woodpecker/pull/5313)]
- fix(deps): update golang-packages [[#5311](https://github.com/woodpecker-ci/woodpecker/pull/5311)]
- fix(deps): update module gitlab.com/gitlab-org/api/client-go to v0.134.0 [[#5308](https://github.com/woodpecker-ci/woodpecker/pull/5308)]
- chore(deps): lock file maintenance [[#5307](https://github.com/woodpecker-ci/woodpecker/pull/5307)]

### Misc

- 🧑‍💻 Add support for proxying to existing woodpecker server [[#5354](https://github.com/woodpecker-ci/woodpecker/pull/5354)]
- Update and improve nix flake [[#5349](https://github.com/woodpecker-ci/woodpecker/pull/5349)]
- Update issue number for link checker [[#5327](https://github.com/woodpecker-ci/woodpecker/pull/5327)]

## [3.8.0](https://github.com/woodpecker-ci/woodpecker/releases/tag/v3.8.0) - 2025-07-05

### ❤️ Thanks to all contributors! ❤️

@OCram85, @henkka, @johanvdw, @mmatous, @qwerty287

### 📚 Documentation

- chore(deps): lock file maintenance [[#5302](https://github.com/woodpecker-ci/woodpecker/pull/5302)]
- chore(deps): update dependency @types/node to v22.15.34 [[#5280](https://github.com/woodpecker-ci/woodpecker/pull/5280)]
- chore(deps): update dependency @types/node to v22.15.33 [[#5277](https://github.com/woodpecker-ci/woodpecker/pull/5277)]
- fix(deps): update docs npm deps non-major [[#5267](https://github.com/woodpecker-ci/woodpecker/pull/5267)]
- add Peckify plugin [[#5260](https://github.com/woodpecker-ci/woodpecker/pull/5260)]
- fix(deps): update docs npm deps non-major [[#5252](https://github.com/woodpecker-ci/woodpecker/pull/5252)]
- fix(deps): update docs npm deps non-major [[#5226](https://github.com/woodpecker-ci/woodpecker/pull/5226)]

### 🐛 Bug Fixes

- Fix gitlab MR fetching [[#5287](https://github.com/woodpecker-ci/woodpecker/pull/5287)]
- Use pipeline number in title [[#5275](https://github.com/woodpecker-ci/woodpecker/pull/5275)]
- Adjust documentation urls [[#5273](https://github.com/woodpecker-ci/woodpecker/pull/5273)]
- Fix doc links in agent settings [[#5251](https://github.com/woodpecker-ci/woodpecker/pull/5251)]

### 📈 Enhancement

- Add pipeline author and avatar env vars [[#5227](https://github.com/woodpecker-ci/woodpecker/pull/5227)]
- Support for pull request file changes in bitbucketdatacenter [[#5205](https://github.com/woodpecker-ci/woodpecker/pull/5205)]

### 📦️ Dependency

- chore(deps): update dependency vue-tsc to v3 [[#5301](https://github.com/woodpecker-ci/woodpecker/pull/5301)]
- chore(deps): update web npm deps non-major [[#5300](https://github.com/woodpecker-ci/woodpecker/pull/5300)]
- chore(deps): update docker.io/woodpeckerci/plugin-ready-release-go docker tag to v3.3.0 [[#5298](https://github.com/woodpecker-ci/woodpecker/pull/5298)]
- chore(deps): update docker.io/woodpeckerci/plugin-trivy docker tag to v1.4.1 [[#5297](https://github.com/woodpecker-ci/woodpecker/pull/5297)]
- chore(deps): update docker.io/woodpeckerci/plugin-docker-buildx docker tag to v6.0.2 [[#5295](https://github.com/woodpecker-ci/woodpecker/pull/5295)]
- chore(deps): update docker.io/woodpeckerci/plugin-editorconfig-checker docker tag to v0.3.1 [[#5296](https://github.com/woodpecker-ci/woodpecker/pull/5296)]
- chore(deps): lock file maintenance [[#5289](https://github.com/woodpecker-ci/woodpecker/pull/5289)]
- fix(deps): update web npm deps non-major [[#5281](https://github.com/woodpecker-ci/woodpecker/pull/5281)]
- fix(deps): update golang-packages [[#5291](https://github.com/woodpecker-ci/woodpecker/pull/5291)]
- chore(deps): update pre-commit hook golangci/golangci-lint to v2.2.1 [[#5288](https://github.com/woodpecker-ci/woodpecker/pull/5288)]
- fix(deps): update dependency marked to v16 [[#5284](https://github.com/woodpecker-ci/woodpecker/pull/5284)]
- chore(deps): update dependency @vitejs/plugin-vue to v6 [[#5282](https://github.com/woodpecker-ci/woodpecker/pull/5282)]
- chore(deps): update pre-commit hook golangci/golangci-lint to v2.2.0 [[#5286](https://github.com/woodpecker-ci/woodpecker/pull/5286)]
- chore(deps): update dependency vite to v7 [[#5283](https://github.com/woodpecker-ci/woodpecker/pull/5283)]
- fix(deps): update module github.com/google/go-github/v72 to v73 [[#5285](https://github.com/woodpecker-ci/woodpecker/pull/5285)]
- chore(deps): update pre-commit hook rbubley/mirrors-prettier to v3.6.2 [[#5278](https://github.com/woodpecker-ci/woodpecker/pull/5278)]
- fix(deps): update golang-packages to v28.3.0+incompatible [[#5274](https://github.com/woodpecker-ci/woodpecker/pull/5274)]
- chore(deps): lock file maintenance [[#5271](https://github.com/woodpecker-ci/woodpecker/pull/5271)]
- fix(deps): update dependency vue-i18n to v11.1.7 [[#5270](https://github.com/woodpecker-ci/woodpecker/pull/5270)]
- fix(deps): update dependency simple-icons to v15.3.0 [[#5269](https://github.com/woodpecker-ci/woodpecker/pull/5269)]
- fix(deps): update web npm deps non-major [[#5268](https://github.com/woodpecker-ci/woodpecker/pull/5268)]
- fix(deps): update golang-packages to v0.33.2 [[#5265](https://github.com/woodpecker-ci/woodpecker/pull/5265)]
- fix(deps): update golang-packages [[#5261](https://github.com/woodpecker-ci/woodpecker/pull/5261)]
- fix(deps): update module github.com/go-viper/mapstructure/v2 to v2.3.0 [[#5259](https://github.com/woodpecker-ci/woodpecker/pull/5259)]
- chore(deps): lock file maintenance [[#5257](https://github.com/woodpecker-ci/woodpecker/pull/5257)]
- fix(deps): update dependency simple-icons to v15.2.0 [[#5256](https://github.com/woodpecker-ci/woodpecker/pull/5256)]
- fix(deps): update web npm deps non-major [[#5254](https://github.com/woodpecker-ci/woodpecker/pull/5254)]
- chore(deps): update gitea/gitea docker tag to v1.24 [[#5253](https://github.com/woodpecker-ci/woodpecker/pull/5253)]
- fix(deps): update golang-packages [[#5250](https://github.com/woodpecker-ci/woodpecker/pull/5250)]
- chore(deps): lock file maintenance [[#5233](https://github.com/woodpecker-ci/woodpecker/pull/5233)]
- fix(deps): update dependency simple-icons to v15.1.0 [[#5246](https://github.com/woodpecker-ci/woodpecker/pull/5246)]
- fix(deps): update web npm deps non-major [[#5244](https://github.com/woodpecker-ci/woodpecker/pull/5244)]
- fix(deps): update golang-packages [[#5242](https://github.com/woodpecker-ci/woodpecker/pull/5242)]
- chore(deps): update dependency golang to v1.24.4 [[#5241](https://github.com/woodpecker-ci/woodpecker/pull/5241)]

### Misc

- Disable package name linting [[#5294](https://github.com/woodpecker-ci/woodpecker/pull/5294)]

## [3.7.0](https://github.com/woodpecker-ci/woodpecker/releases/tag/v3.7.0) - 2025-06-06

### ❤️ Thanks to all contributors! ❤️

@6543, @Epsilon02, @Levy-Tal, @OCram85, @Spiffyk, @SuperSandro2000, @deltamualpha, @qwerty287, @rruzicic, @sebastinez, @xoxys

### 📚 Documentation

- update docs-link for todo checker [[#5236](https://github.com/woodpecker-ci/woodpecker/pull/5236)]
- Add `sccache` plugin [[#5234](https://github.com/woodpecker-ci/woodpecker/pull/5234)]
- fix(deps): update dependency redocusaurus to v2.3.0 [[#5203](https://github.com/woodpecker-ci/woodpecker/pull/5203)]
- chore(deps): update docs npm deps non-major [[#5197](https://github.com/woodpecker-ci/woodpecker/pull/5197)]
- Add reference to woodpecker-community plugin org [[#5186](https://github.com/woodpecker-ci/woodpecker/pull/5186)]
- fix(deps): update docs npm deps non-major [[#5183](https://github.com/woodpecker-ci/woodpecker/pull/5183)]
- Move `gitea-package` plugin to codeberg [[#5175](https://github.com/woodpecker-ci/woodpecker/pull/5175)]
- add Portainer Service Update plugin [[#5172](https://github.com/woodpecker-ci/woodpecker/pull/5172)]
- Split 'pull' option docs from 'image' docs [[#5161](https://github.com/woodpecker-ci/woodpecker/pull/5161)]
- chore(deps): update docs npm deps non-major [[#5164](https://github.com/woodpecker-ci/woodpecker/pull/5164)]

### 📈 Enhancement

- Move forge webhook fixtures into own files [[#5216](https://github.com/woodpecker-ci/woodpecker/pull/5216)]
- Treat no available route in grpc as fatal error [[#5192](https://github.com/woodpecker-ci/woodpecker/pull/5192)]

### 🐛 Bug Fixes

- Always collect metrics (reverts #4667) [[#5213](https://github.com/woodpecker-ci/woodpecker/pull/5213)]
- fix(bitbucketDC): manual event has broken commit link [[#5160](https://github.com/woodpecker-ci/woodpecker/pull/5160)]
- fix(bitbucketdc): build status gets incorrectly reported on multi workflow builds [[#5178](https://github.com/woodpecker-ci/woodpecker/pull/5178)]
- fix(bitbucketdc): build status not reported on PR builds [[#5162](https://github.com/woodpecker-ci/woodpecker/pull/5162)]

### 📦️ Dependency

- fix(deps): update golang-packages to v28.2.1+incompatible [[#5217](https://github.com/woodpecker-ci/woodpecker/pull/5217)]
- fix(deps): update dependency simple-icons to v15 [[#5232](https://github.com/woodpecker-ci/woodpecker/pull/5232)]
- chore(deps): update woodpeckerci/plugin-git docker tag to v2.6.5 [[#5230](https://github.com/woodpecker-ci/woodpecker/pull/5230)]
- fix(deps): update web npm deps non-major [[#5228](https://github.com/woodpecker-ci/woodpecker/pull/5228)]
- chore(deps): update docker.io/woodpeckerci/plugin-surge-preview docker tag to v1.4.0 [[#5225](https://github.com/woodpecker-ci/woodpecker/pull/5225)]
- chore(deps): update docker.io/alpine docker tag to v3.22 [[#5224](https://github.com/woodpecker-ci/woodpecker/pull/5224)]
- fix(deps): update golang-packages [[#5209](https://github.com/woodpecker-ci/woodpecker/pull/5209)]
- chore(deps): lock file maintenance [[#5204](https://github.com/woodpecker-ci/woodpecker/pull/5204)]
- fix(deps): update dependency simple-icons to v14.15.0 [[#5202](https://github.com/woodpecker-ci/woodpecker/pull/5202)]
- fix(deps): update dependency vue-i18n to v11.1.4 [[#5201](https://github.com/woodpecker-ci/woodpecker/pull/5201)]
- chore(deps): update docker.io/woodpeckerci/plugin-surge-preview docker tag to v1.3.6 [[#5200](https://github.com/woodpecker-ci/woodpecker/pull/5200)]
- fix(deps): update web npm deps non-major [[#5198](https://github.com/woodpecker-ci/woodpecker/pull/5198)]
- fix(deps): update module github.com/oklog/ulid/v2 to v2.1.1 [[#5194](https://github.com/woodpecker-ci/woodpecker/pull/5194)]
- fix(deps): update module github.com/gin-gonic/gin to v1.10.1 [[#5193](https://github.com/woodpecker-ci/woodpecker/pull/5193)]
- fix(deps): update module gitlab.com/gitlab-org/api/client-go to v0.129.0 [[#5190](https://github.com/woodpecker-ci/woodpecker/pull/5190)]
- chore(deps): lock file maintenance [[#5189](https://github.com/woodpecker-ci/woodpecker/pull/5189)]
- chore(deps): update pre-commit hook igorshubovych/markdownlint-cli to v0.45.0 [[#5187](https://github.com/woodpecker-ci/woodpecker/pull/5187)]
- fix(deps): update dependency simple-icons to v14.14.0 [[#5188](https://github.com/woodpecker-ci/woodpecker/pull/5188)]
- fix(deps): update web npm deps non-major [[#5185](https://github.com/woodpecker-ci/woodpecker/pull/5185)]
- fix(deps): update golang-packages to v0.33.1 [[#5184](https://github.com/woodpecker-ci/woodpecker/pull/5184)]
- fix(deps): update golang-packages [[#5180](https://github.com/woodpecker-ci/woodpecker/pull/5180)]
- chore(deps): lock file maintenance [[#5171](https://github.com/woodpecker-ci/woodpecker/pull/5171)]
- fix(deps): update module github.com/google/go-github/v71 to v72 [[#5167](https://github.com/woodpecker-ci/woodpecker/pull/5167)]
- fix(deps): update dependency simple-icons to v14.13.0 [[#5170](https://github.com/woodpecker-ci/woodpecker/pull/5170)]
- fix(deps): update module github.com/urfave/cli/v3 to v3.3.3 [[#5169](https://github.com/woodpecker-ci/woodpecker/pull/5169)]
- fix(deps): update web npm deps non-major [[#5166](https://github.com/woodpecker-ci/woodpecker/pull/5166)]
- chore(deps): update postgres docker tag to v17.5 [[#5165](https://github.com/woodpecker-ci/woodpecker/pull/5165)]
- chore(deps): update dependency golang to v1.24.3 [[#5163](https://github.com/woodpecker-ci/woodpecker/pull/5163)]

### Misc

- Ignore direnv config and folder [[#5235](https://github.com/woodpecker-ci/woodpecker/pull/5235)]
- flake.lock: Update [[#5206](https://github.com/woodpecker-ci/woodpecker/pull/5206)]
- Add Bluesky post plugin [[#5156](https://github.com/woodpecker-ci/woodpecker/pull/5156)]

## [3.6.0](https://github.com/woodpecker-ci/woodpecker/releases/tag/v3.6.0) - 2025-05-06

### ❤️ Thanks to all contributors! ❤️

@Spiffyk, @SuperSandro2000, @gsaslis, @joshuachp, @lukashass, @maurerle, @pat-s, @qwerty287, @renich, @sp1thas, @xoxys

### ✨ Features

- Use docker go client directly [[#5134](https://github.com/woodpecker-ci/woodpecker/pull/5134)]

### 📚 Documentation

- Simplify NixOS docs [[#5120](https://github.com/woodpecker-ci/woodpecker/pull/5120)]
- chore(deps): lock file maintenance [[#5150](https://github.com/woodpecker-ci/woodpecker/pull/5150)]
- plugins: Add SSH/SCP plugin [[#4871](https://github.com/woodpecker-ci/woodpecker/pull/4871)]
- chore(deps): update dependency @types/node to v22.15.3 [[#5142](https://github.com/woodpecker-ci/woodpecker/pull/5142)]
- chore(deps): lock file maintenance [[#5136](https://github.com/woodpecker-ci/woodpecker/pull/5136)]
- Explain tasks [[#5129](https://github.com/woodpecker-ci/woodpecker/pull/5129)]
- Mention named volumes [[#5130](https://github.com/woodpecker-ci/woodpecker/pull/5130)]
- chore(deps): update docs npm deps non-major [[#5128](https://github.com/woodpecker-ci/woodpecker/pull/5128)]
- Fix link to agent configuration in `v3.5` docs [[#5122](https://github.com/woodpecker-ci/woodpecker/pull/5122)]
- Fix link to agent configuration in `next` docs [[#5119](https://github.com/woodpecker-ci/woodpecker/pull/5119)]
- Move `plugin-s3` to Codeberg [[#5118](https://github.com/woodpecker-ci/woodpecker/pull/5118)]
- Use slugified plugin urls in docs [[#5116](https://github.com/woodpecker-ci/woodpecker/pull/5116)]
- Fix example value for `WOODPECKER_GRPC_ADDR` in autoscaler docs [[#5102](https://github.com/woodpecker-ci/woodpecker/pull/5102)]
- .deb and .rpm installation commands fixed [[#5087](https://github.com/woodpecker-ci/woodpecker/pull/5087)]
- chore(deps): update dependency @types/react to v19.1.2 [[#5107](https://github.com/woodpecker-ci/woodpecker/pull/5107)]
- Slugify plugin names used for urls [[#5098](https://github.com/woodpecker-ci/woodpecker/pull/5098)]
- Mention `backend_options` in workflow syntax docs [[#5096](https://github.com/woodpecker-ci/woodpecker/pull/5096)]
- Document rootless container requirements for skip-clone [[#5056](https://github.com/woodpecker-ci/woodpecker/pull/5056)]

### 📈 Enhancement

- View full pipeline duration in tooltip [[#5123](https://github.com/woodpecker-ci/woodpecker/pull/5123)]
- Set dynamic page titles [[#5104](https://github.com/woodpecker-ci/woodpecker/pull/5104)]
- Use centrally typed inject provide in Vue [[#5113](https://github.com/woodpecker-ci/woodpecker/pull/5113)]
- Scroll to selected pipeline step [[#5103](https://github.com/woodpecker-ci/woodpecker/pull/5103)]

### 🐛 Bug Fixes

- Fix args docs for admin secrets [[#5127](https://github.com/woodpecker-ci/woodpecker/pull/5127)]
- Add name flag to admin secret add [[#5101](https://github.com/woodpecker-ci/woodpecker/pull/5101)]

### 📦️ Dependency

- fix(deps): update golang-packages [[#5152](https://github.com/woodpecker-ci/woodpecker/pull/5152)]
- chore(deps): update pre-commit hook golangci/golangci-lint to v2.1.6 [[#5149](https://github.com/woodpecker-ci/woodpecker/pull/5149)]
- chore(deps): update docker.io/woodpeckerci/plugin-docker-buildx docker tag to v6.0.1 [[#5147](https://github.com/woodpecker-ci/woodpecker/pull/5147)]
- chore(deps): update pre-commit hook adrienverge/yamllint to v1.37.1 [[#5148](https://github.com/woodpecker-ci/woodpecker/pull/5148)]
- chore(deps): update docker.io/woodpeckerci/plugin-docker-buildx docker tag to v6 [[#5144](https://github.com/woodpecker-ci/woodpecker/pull/5144)]
- fix(deps): update web npm deps non-major [[#5143](https://github.com/woodpecker-ci/woodpecker/pull/5143)]
- fix(deps): update module github.com/getkin/kin-openapi to v0.132.0 [[#5141](https://github.com/woodpecker-ci/woodpecker/pull/5141)]
- chore(deps): update dependency vite to v6.3.4 [security] [[#5139](https://github.com/woodpecker-ci/woodpecker/pull/5139)]
- fix(deps): update module github.com/urfave/cli/v3 to v3.3.2 [[#5137](https://github.com/woodpecker-ci/woodpecker/pull/5137)]
- fix(deps): update module github.com/urfave/cli/v3 to v3.3.1 [[#5135](https://github.com/woodpecker-ci/woodpecker/pull/5135)]
- fix(deps): update module github.com/docker/docker to v28 [[#5132](https://github.com/woodpecker-ci/woodpecker/pull/5132)]
- fix(deps): update module github.com/docker/cli to v28 [[#5131](https://github.com/woodpecker-ci/woodpecker/pull/5131)]
- fix(deps): update dependency vue-router to v4.5.1 [[#5126](https://github.com/woodpecker-ci/woodpecker/pull/5126)]
- chore(deps): update pre-commit hook golangci/golangci-lint to v2.1.5 [[#5125](https://github.com/woodpecker-ci/woodpecker/pull/5125)]
- fix(deps): update web npm deps non-major [[#5077](https://github.com/woodpecker-ci/woodpecker/pull/5077)]
- fix(deps): update golang-packages [[#5121](https://github.com/woodpecker-ci/woodpecker/pull/5121)]
- fix(deps): update golang-packages [[#5111](https://github.com/woodpecker-ci/woodpecker/pull/5111)]
- chore(deps): lock file maintenance [[#5112](https://github.com/woodpecker-ci/woodpecker/pull/5112)]
- chore(deps): update docker.io/mysql docker tag to v9.3.0 [[#5109](https://github.com/woodpecker-ci/woodpecker/pull/5109)]
- chore(deps): update docker.io/woodpeckerci/plugin-ready-release-go docker tag to v3.2.0 [[#5110](https://github.com/woodpecker-ci/woodpecker/pull/5110)]
- chore(deps): update pre-commit hook golangci/golangci-lint to v2.1.2 [[#5108](https://github.com/woodpecker-ci/woodpecker/pull/5108)]
- fix(deps): update golang-packages [[#5097](https://github.com/woodpecker-ci/woodpecker/pull/5097)]

### Misc

- Add pre-commit plugin [[#5146](https://github.com/woodpecker-ci/woodpecker/pull/5146)]
- Fix gitpod golang version [[#5093](https://github.com/woodpecker-ci/woodpecker/pull/5093)]

## [3.5.2](https://github.com/woodpecker-ci/woodpecker/releases/tag/v3.5.2) - 2025-04-15

### ❤️ Thanks to all contributors! ❤️

@xoxys

### 📚 Documentation

- chore(deps): lock file maintenance [[#5092](https://github.com/woodpecker-ci/woodpecker/pull/5092)]
- fix(deps): update docs npm deps non-major [[#5089](https://github.com/woodpecker-ci/woodpecker/pull/5089)]
- Move plugin-surge docs to codeberg [[#5086](https://github.com/woodpecker-ci/woodpecker/pull/5086)]
- chore(deps): lock file maintenance [[#5080](https://github.com/woodpecker-ci/woodpecker/pull/5080)]
- chore(deps): update docs npm deps non-major [[#5075](https://github.com/woodpecker-ci/woodpecker/pull/5075)]

### 🐛 Bug Fixes

- Avoid db errors while executing migrations check [[#5072](https://github.com/woodpecker-ci/woodpecker/pull/5072)]

### 📦️ Dependency

- fix(deps): update module github.com/google/go-github/v70 to v71 [[#5090](https://github.com/woodpecker-ci/woodpecker/pull/5090)]
- chore(deps): update pre-commit hook golangci/golangci-lint to v2.1.1 [[#5091](https://github.com/woodpecker-ci/woodpecker/pull/5091)]
- chore(deps): update dependency vite to v6.2.6 [security] [[#5088](https://github.com/woodpecker-ci/woodpecker/pull/5088)]
- fix(deps): update module github.com/prometheus/client_golang to v1.22.0 [[#5084](https://github.com/woodpecker-ci/woodpecker/pull/5084)]
- fix(deps): update golang-packages [[#5083](https://github.com/woodpecker-ci/woodpecker/pull/5083)]
- fix(deps): update module golang.org/x/crypto to v0.37.0 [[#5079](https://github.com/woodpecker-ci/woodpecker/pull/5079)]
- fix(deps): update golang-packages [[#5078](https://github.com/woodpecker-ci/woodpecker/pull/5078)]
- fix(deps): update module github.com/fsnotify/fsnotify to v1.9.0 [[#5076](https://github.com/woodpecker-ci/woodpecker/pull/5076)]
- chore(deps): update dependency vite to v6.2.5 [security] [[#5074](https://github.com/woodpecker-ci/woodpecker/pull/5074)]

### Misc

- Add markdown template for release umbrella issues [[#5055](https://github.com/woodpecker-ci/woodpecker/pull/5055)]

## [3.5.1](https://github.com/woodpecker-ci/woodpecker/releases/tag/v3.5.1) - 2025-04-04

### ❤️ Thanks to all contributors! ❤️

@xoxys

### 🐛 Bug Fixes

- Add missing icon for changes files tab [[#5068](https://github.com/woodpecker-ci/woodpecker/pull/5068)]
- Improve CLI info text and remove markdown [[#5069](https://github.com/woodpecker-ci/woodpecker/pull/5069)]
- Fix cli format flag fallback [[#5057](https://github.com/woodpecker-ci/woodpecker/pull/5057)]

### 📚 Documentation

- chore(deps): update docs npm deps non-major [[#5060](https://github.com/woodpecker-ci/woodpecker/pull/5060)]

### 📦️ Dependency

- fix(deps): update module code.gitea.io/sdk/gitea to v0.21.0 [[#5067](https://github.com/woodpecker-ci/woodpecker/pull/5067)]
- chore(deps): lock file maintenance [[#5062](https://github.com/woodpecker-ci/woodpecker/pull/5062)]
- fix(deps): update module github.com/mattn/go-sqlite3 to v1.14.27 [[#5058](https://github.com/woodpecker-ci/woodpecker/pull/5058)]

## [3.5.0](https://github.com/woodpecker-ci/woodpecker/releases/tag/v3.5.0) - 2025-04-02

### ❤️ Thanks to all contributors! ❤️

@6543, @Levy-Tal, @anbraten, @jenrik, @nekowinston, @qwerty287, @rhafer, @xoxys

### 🐛 Bug Fixes

- BitbucketDC: add event pull request opened [[#5048](https://github.com/woodpecker-ci/woodpecker/pull/5048)]
- Fix exclude path constraint behavior [[#5042](https://github.com/woodpecker-ci/woodpecker/pull/5042)]
- Use pointer cursor for icon buttons [[#5002](https://github.com/woodpecker-ci/woodpecker/pull/5002)]
- Add back cursor-pointer to pipeline step list buttons [[#4982](https://github.com/woodpecker-ci/woodpecker/pull/4982)]

### 📚 Documentation

- chore(deps): lock file maintenance [[#5044](https://github.com/woodpecker-ci/woodpecker/pull/5044)]
- chore(deps): lock file maintenance [[#5032](https://github.com/woodpecker-ci/woodpecker/pull/5032)]
- Print at which file docs parsing failed [[#5040](https://github.com/woodpecker-ci/woodpecker/pull/5040)]
- fix(deps): update dependency yaml to v2.7.1 [[#5029](https://github.com/woodpecker-ci/woodpecker/pull/5029)]
- fix(deps): update docs npm deps non-major [[#5026](https://github.com/woodpecker-ci/woodpecker/pull/5026)]
- Revert manual changes to changelog [[#5007](https://github.com/woodpecker-ci/woodpecker/pull/5007)]
- Add missing docs for 3.x minor versions [[#4992](https://github.com/woodpecker-ci/woodpecker/pull/4992)]
- chore(deps): lock file maintenance [[#5000](https://github.com/woodpecker-ci/woodpecker/pull/5000)]
- fix(deps): update dependency redocusaurus to v2.2.2 [[#4998](https://github.com/woodpecker-ci/woodpecker/pull/4998)]
- Add missing links to 3.x docs [[#4991](https://github.com/woodpecker-ci/woodpecker/pull/4991)]
- chore(deps): update docs npm deps non-major [[#4987](https://github.com/woodpecker-ci/woodpecker/pull/4987)]
- Rework secrets docs and document multiline secrets [[#4974](https://github.com/woodpecker-ci/woodpecker/pull/4974)]
- Add documentation for WOODPECKER_EXPERT env vars [[#4972](https://github.com/woodpecker-ci/woodpecker/pull/4972)]

### 📈 Enhancement

- add nushell support to local backend [[#5043](https://github.com/woodpecker-ci/woodpecker/pull/5043)]
- Style navbar login button as navbar-link [[#5033](https://github.com/woodpecker-ci/woodpecker/pull/5033)]
- Use xorm quoter for feed query [[#5018](https://github.com/woodpecker-ci/woodpecker/pull/5018)]
- Use badge value instead of label for single values [[#5010](https://github.com/woodpecker-ci/woodpecker/pull/5010)]
- Add icons to all tabs [[#4421](https://github.com/woodpecker-ci/woodpecker/pull/4421)]
- Tag pipeline with source information [[#4796](https://github.com/woodpecker-ci/woodpecker/pull/4796)]
- Add titles and descriptions to repos page [[#4981](https://github.com/woodpecker-ci/woodpecker/pull/4981)]

### 📦️ Dependency

- fix(deps): update golang-packages [[#5046](https://github.com/woodpecker-ci/woodpecker/pull/5046)]
- fix(deps): update module github.com/urfave/cli/v3 to v3.1.0 [[#5039](https://github.com/woodpecker-ci/woodpecker/pull/5039)]
- chore(deps): update dependency vite to v6.2.4 [security] [[#5036](https://github.com/woodpecker-ci/woodpecker/pull/5036)]
- fix(deps): update dependency simple-icons to v14.12.0 [[#5030](https://github.com/woodpecker-ci/woodpecker/pull/5030)]
- chore(deps): update pre-commit hook golangci/golangci-lint to v2 [[#5028](https://github.com/woodpecker-ci/woodpecker/pull/5028)]
- fix(deps): update web npm deps non-major [[#5027](https://github.com/woodpecker-ci/woodpecker/pull/5027)]
- chore(deps): update docker.io/woodpeckerci/plugin-ready-release-go docker tag to v3.1.4 [[#5025](https://github.com/woodpecker-ci/woodpecker/pull/5025)]
- fix(deps): update module golang.org/x/net to v0.38.0 [[#5024](https://github.com/woodpecker-ci/woodpecker/pull/5024)]
- chore(deps): update woodpeckerci/plugin-git docker tag to v2.6.3 [[#5021](https://github.com/woodpecker-ci/woodpecker/pull/5021)]
- chore(deps): update dependency vite to v6.2.3 [security] [[#5014](https://github.com/woodpecker-ci/woodpecker/pull/5014)]
- fix(deps): update golang-packages [[#5012](https://github.com/woodpecker-ci/woodpecker/pull/5012)]
- chore(deps): update docker.io/woodpeckerci/plugin-docker-buildx docker tag to v5.2.2 [[#4997](https://github.com/woodpecker-ci/woodpecker/pull/4997)]
- fix(deps): update dependency simple-icons to v14.11.1 [[#4999](https://github.com/woodpecker-ci/woodpecker/pull/4999)]
- chore(deps): update pre-commit hook adrienverge/yamllint to v1.37.0 [[#4996](https://github.com/woodpecker-ci/woodpecker/pull/4996)]
- fix(deps): update module github.com/rs/zerolog to v1.34.0 [[#4995](https://github.com/woodpecker-ci/woodpecker/pull/4995)]
- chore(deps): update dependency @antfu/eslint-config to v4.11.0 [[#4994](https://github.com/woodpecker-ci/woodpecker/pull/4994)]
- chore(deps): update woodpeckerci/plugin-release docker tag to v0.2.5 [[#4993](https://github.com/woodpecker-ci/woodpecker/pull/4993)]
- fix(deps): update module github.com/google/go-github/v69 to v70 [[#4990](https://github.com/woodpecker-ci/woodpecker/pull/4990)]
- fix(deps): update web npm deps non-major [[#4989](https://github.com/woodpecker-ci/woodpecker/pull/4989)]
- chore(deps): update pre-commit non-major [[#4988](https://github.com/woodpecker-ci/woodpecker/pull/4988)]
- fix(deps): update module github.com/golang-jwt/jwt/v5 to v5.2.2 [security] [[#4986](https://github.com/woodpecker-ci/woodpecker/pull/4986)]
- fix(deps): update module github.com/go-sql-driver/mysql to v1.9.1 [[#4985](https://github.com/woodpecker-ci/woodpecker/pull/4985)]
- fix(deps): update module github.com/getkin/kin-openapi to v0.131.0 [[#4984](https://github.com/woodpecker-ci/woodpecker/pull/4984)]
- fix(deps): update module github.com/expr-lang/expr to v1.17.1 [[#4983](https://github.com/woodpecker-ci/woodpecker/pull/4983)]
- fix(deps): update module gitlab.com/gitlab-org/api/client-go to v0.126.0 [[#4976](https://github.com/woodpecker-ci/woodpecker/pull/4976)]

### Misc

- Bump golangci-lint to v2 [[#5034](https://github.com/woodpecker-ci/woodpecker/pull/5034)]
- Update flake development environment [[#5022](https://github.com/woodpecker-ci/woodpecker/pull/5022)]

## [3.4.0](https://github.com/woodpecker-ci/woodpecker/releases/tag/v3.4.0) - 2025-03-17

### ❤️ Thanks to all contributors! ❤️

@qwerty287, @xoxys

### 📈 Enhancement

- Remove woodpecker prefix from env var title in docs [[#4968](https://github.com/woodpecker-ci/woodpecker/pull/4968)]
- Add backoff retry for store setup [[#4964](https://github.com/woodpecker-ci/woodpecker/pull/4964)]
- Migrate repo output format to customizable output [[#4888](https://github.com/woodpecker-ci/woodpecker/pull/4888)]

### 📚 Documentation

- chore(deps): lock file maintenance [[#4970](https://github.com/woodpecker-ci/woodpecker/pull/4970)]
- fix(deps): update docs npm deps non-major [[#4958](https://github.com/woodpecker-ci/woodpecker/pull/4958)]
- Add global var note [[#4956](https://github.com/woodpecker-ci/woodpecker/pull/4956)]
- chore(deps): lock file maintenance [[#4948](https://github.com/woodpecker-ci/woodpecker/pull/4948)]
- chore(deps): update dependency @types/node to v22.13.10 [[#4944](https://github.com/woodpecker-ci/woodpecker/pull/4944)]
- chore(deps): update dependency axios to v1.8.2 [security] [[#4941](https://github.com/woodpecker-ci/woodpecker/pull/4941)]
- Fix dockerhub links in docs [[#4931](https://github.com/woodpecker-ci/woodpecker/pull/4931)]

### 🐛 Bug Fixes

- Fix fs owner in scratch-based container images [[#4961](https://github.com/woodpecker-ci/woodpecker/pull/4961)]

### 📦️ Dependency

- fix(deps): update module github.com/expr-lang/expr to v1.17.0 [[#4969](https://github.com/woodpecker-ci/woodpecker/pull/4969)]
- fix(deps): update dependency simple-icons to v14.11.0 [[#4966](https://github.com/woodpecker-ci/woodpecker/pull/4966)]
- fix(deps): update golang-packages [[#4963](https://github.com/woodpecker-ci/woodpecker/pull/4963)]
- chore(deps): update pre-commit hook adrienverge/yamllint to v1.36.1 [[#4962](https://github.com/woodpecker-ci/woodpecker/pull/4962)]
- fix(deps): update dependency @vueuse/core to v13 [[#4960](https://github.com/woodpecker-ci/woodpecker/pull/4960)]
- fix(deps): update web npm deps non-major [[#4959](https://github.com/woodpecker-ci/woodpecker/pull/4959)]
- chore(deps): update pre-commit non-major [[#4957](https://github.com/woodpecker-ci/woodpecker/pull/4957)]
- fix(deps): update golang-packages to v0.32.3 [[#4953](https://github.com/woodpecker-ci/woodpecker/pull/4953)]
- fix(deps): update dependency prismjs to v1.30.0 [security] [[#4951](https://github.com/woodpecker-ci/woodpecker/pull/4951)]
- chore(deps): update dependency @intlify/eslint-plugin-vue-i18n to v4 [[#4943](https://github.com/woodpecker-ci/woodpecker/pull/4943)]
- fix(deps): update module al.essio.dev/pkg/shellescape to v1.6.0 [[#4947](https://github.com/woodpecker-ci/woodpecker/pull/4947)]
- fix(deps): update dependency simple-icons to v14.10.0 [[#4946](https://github.com/woodpecker-ci/woodpecker/pull/4946)]
- chore(deps): update dependency @types/node to v22.13.10 [[#4945](https://github.com/woodpecker-ci/woodpecker/pull/4945)]
- fix(deps): update web npm deps non-major [[#4942](https://github.com/woodpecker-ci/woodpecker/pull/4942)]
- fix(deps): update dependency vue-i18n to v11.1.2 [security] [[#4940](https://github.com/woodpecker-ci/woodpecker/pull/4940)]
- fix(deps): update golang-packages [[#4936](https://github.com/woodpecker-ci/woodpecker/pull/4936)]
- chore(deps): lock file maintenance [[#4933](https://github.com/woodpecker-ci/woodpecker/pull/4933)]
- fix(deps): update golang-packages [[#4929](https://github.com/woodpecker-ci/woodpecker/pull/4929)]

## [3.3.0](https://github.com/woodpecker-ci/woodpecker/releases/tag/v3.3.0) - 2025-03-04

### ❤️ Thanks to all contributors! ❤️

@Levy-Tal, @qwerty287, @xoxys

### 📚 Documentation

- Refactor admin docs [[#4899](https://github.com/woodpecker-ci/woodpecker/pull/4899)]
- chore(deps): lock file maintenance [[#4928](https://github.com/woodpecker-ci/woodpecker/pull/4928)]
- chore(deps): update dependency @types/node to v22.13.9 [[#4925](https://github.com/woodpecker-ci/woodpecker/pull/4925)]
- chore(deps): lock file maintenance [[#4922](https://github.com/woodpecker-ci/woodpecker/pull/4922)]
- Add some blog posts [[#4921](https://github.com/woodpecker-ci/woodpecker/pull/4921)]
- chore(deps): update dependency @types/node to v22.13.8 [[#4915](https://github.com/woodpecker-ci/woodpecker/pull/4915)]
- Remove Slack plugin from examples [[#4914](https://github.com/woodpecker-ci/woodpecker/pull/4914)]
- chore(deps): update docs npm deps non-major [[#4911](https://github.com/woodpecker-ci/woodpecker/pull/4911)]

### 🐛 Bug Fixes

- Add migration to fix zero forge_id in orgs table [[#4924](https://github.com/woodpecker-ci/woodpecker/pull/4924)]
- Fix unique constraint for orgs [[#4923](https://github.com/woodpecker-ci/woodpecker/pull/4923)]

### 📈 Enhancement

- BitbucketDC: optimize repository search [[#4919](https://github.com/woodpecker-ci/woodpecker/pull/4919)]
- Include forge type in netrc [[#4908](https://github.com/woodpecker-ci/woodpecker/pull/4908)]

### 📦️ Dependency

- chore(deps): update dependency @types/node to v22.13.9 [[#4926](https://github.com/woodpecker-ci/woodpecker/pull/4926)]
- chore(deps): update pre-commit non-major [[#4927](https://github.com/woodpecker-ci/woodpecker/pull/4927)]
- chore(deps): update dependency @antfu/eslint-config to v4.4.0 [[#4917](https://github.com/woodpecker-ci/woodpecker/pull/4917)]
- fix(deps): update module gitlab.com/gitlab-org/api/client-go to v0.124.0 [[#4920](https://github.com/woodpecker-ci/woodpecker/pull/4920)]
- chore(deps): update dependency @types/node to v22.13.8 [[#4916](https://github.com/woodpecker-ci/woodpecker/pull/4916)]
- chore(deps): update dependency @types/lodash to v4.17.16 [[#4913](https://github.com/woodpecker-ci/woodpecker/pull/4913)]
- chore(deps): update web npm deps non-major [[#4912](https://github.com/woodpecker-ci/woodpecker/pull/4912)]

## [3.2.0](https://github.com/woodpecker-ci/woodpecker/releases/tag/v3.2.0) - 2025-02-26

### ❤️ Thanks to all contributors! ❤️

@DHandspikerWade, @anbraten, @arthurpro, @hhomar, @jenrik, @jpgleeson, @mark-pitblado, @maurerle, @qwerty287, @xoxys

### 🔒 Security

- Fix approval requirement if PR is closed [[#4902](https://github.com/woodpecker-ci/woodpecker/pull/4902)]

### 📚 Documentation

- chore(deps): lock file maintenance [[#4906](https://github.com/woodpecker-ci/woodpecker/pull/4906)]
- chore(deps): update dependency axios to v1.8.1 [[#4905](https://github.com/woodpecker-ci/woodpecker/pull/4905)]
- Fix typo on forgejo/gitea documentation [[#4898](https://github.com/woodpecker-ci/woodpecker/pull/4898)]
- chore(deps): update docs npm deps non-major [[#4878](https://github.com/woodpecker-ci/woodpecker/pull/4878)]
- plugins: add Hugo plugin for woodpecker [[#4870](https://github.com/woodpecker-ci/woodpecker/pull/4870)]
- Add Microsoft Teams Notification (Advanced) plugin [[#4868](https://github.com/woodpecker-ci/woodpecker/pull/4868)]
- chore(deps): update dependency @types/react to v19.0.9 [[#4864](https://github.com/woodpecker-ci/woodpecker/pull/4864)]
- Drop versioned docs for v1 [[#4844](https://github.com/woodpecker-ci/woodpecker/pull/4844)]
- Add a Home Assistant notification plugin  [[#4841](https://github.com/woodpecker-ci/woodpecker/pull/4841)]

### 🐛 Bug Fixes

- Use forge IDs for hook tokens [[#4897](https://github.com/woodpecker-ci/woodpecker/pull/4897)]
- Fix nil dereference in Bitbucket webhook handling [[#4896](https://github.com/woodpecker-ci/woodpecker/pull/4896)]
- Fix org assign on login [[#4817](https://github.com/woodpecker-ci/woodpecker/pull/4817)]
- Directly fetch directory contents [[#4842](https://github.com/woodpecker-ci/woodpecker/pull/4842)]

### 📈 Enhancement

- Remove eslint types [[#4893](https://github.com/woodpecker-ci/woodpecker/pull/4893)]
- Add default option for allowing pull requests on repositories [[#4873](https://github.com/woodpecker-ci/woodpecker/pull/4873)]
- Replace deprecated linter [[#4843](https://github.com/woodpecker-ci/woodpecker/pull/4843)]

### 📦️ Dependency

- chore(deps): update woodpeckerci/plugin-git docker tag to v2.6.2 [[#4903](https://github.com/woodpecker-ci/woodpecker/pull/4903)]
- fix(deps): update web npm deps non-major [[#4904](https://github.com/woodpecker-ci/woodpecker/pull/4904)]
- fix(deps): update golang-packages [[#4900](https://github.com/woodpecker-ci/woodpecker/pull/4900)]
- chore(deps): lock file maintenance [[#4895](https://github.com/woodpecker-ci/woodpecker/pull/4895)]
- chore(deps): update dependency vue-tsc to v2.2.4 [[#4894](https://github.com/woodpecker-ci/woodpecker/pull/4894)]
- fix(deps): update dependency simple-icons to v14.8.0 [[#4891](https://github.com/woodpecker-ci/woodpecker/pull/4891)]
- fix(deps): update golang-packages [[#4890](https://github.com/woodpecker-ci/woodpecker/pull/4890)]
- chore(deps): update dependency @types/eslint__js to v9 [[#4884](https://github.com/woodpecker-ci/woodpecker/pull/4884)]
- chore(deps): update pre-commit hook rbubley/mirrors-prettier to v3.5.2 [[#4883](https://github.com/woodpecker-ci/woodpecker/pull/4883)]
- fix(deps): update module codeberg.org/mvdkleijn/forgejo-sdk/forgejo to v2 [[#4858](https://github.com/woodpecker-ci/woodpecker/pull/4858)]
- fix(deps): update web npm deps non-major [[#4882](https://github.com/woodpecker-ci/woodpecker/pull/4882)]
- chore(deps): update postgres docker tag to v17.4 [[#4881](https://github.com/woodpecker-ci/woodpecker/pull/4881)]
- chore(deps): update woodpeckerci/plugin-git docker tag to v2.6.1 [[#4879](https://github.com/woodpecker-ci/woodpecker/pull/4879)]
- chore(deps): update docker.io/woodpeckerci/plugin-editorconfig-checker docker tag to v0.3.0 [[#4880](https://github.com/woodpecker-ci/woodpecker/pull/4880)]
- chore(deps): update docker.io/woodpeckerci/plugin-surge-preview docker tag to v1.3.5 [[#4877](https://github.com/woodpecker-ci/woodpecker/pull/4877)]
- fix(deps): update module github.com/prometheus/client_golang to v1.21.0 [[#4874](https://github.com/woodpecker-ci/woodpecker/pull/4874)]
- fix(deps): update module github.com/go-sql-driver/mysql to v1.9.0 [[#4872](https://github.com/woodpecker-ci/woodpecker/pull/4872)]
- fix(deps): update module github.com/google/go-github/v69 to v69.2.0 [[#4869](https://github.com/woodpecker-ci/woodpecker/pull/4869)]
- chore(deps): lock file maintenance [[#4866](https://github.com/woodpecker-ci/woodpecker/pull/4866)]
- chore(deps): update docker.io/woodpeckerci/plugin-trivy docker tag to v1.4.0 [[#4865](https://github.com/woodpecker-ci/woodpecker/pull/4865)]
- fix(deps): update dependency simple-icons to v14.7.0 [[#4862](https://github.com/woodpecker-ci/woodpecker/pull/4862)]
- fix(deps): update dependency pinia to v3 [[#4856](https://github.com/woodpecker-ci/woodpecker/pull/4856)]
- fix(deps): update module gitlab.com/gitlab-org/api/client-go to v0.123.0 [[#4860](https://github.com/woodpecker-ci/woodpecker/pull/4860)]
- chore(deps): update dependency vue-tsc to v2.2.2 [[#4859](https://github.com/woodpecker-ci/woodpecker/pull/4859)]
- fix(deps): update web npm deps non-major [[#4857](https://github.com/woodpecker-ci/woodpecker/pull/4857)]
- chore(deps): update pre-commit non-major [[#4855](https://github.com/woodpecker-ci/woodpecker/pull/4855)]
- chore(deps): update postgres docker tag to v17.3 [[#4854](https://github.com/woodpecker-ci/woodpecker/pull/4854)]
- chore(deps): update docker.io/techknowlogick/xgo docker tag to go-1.24.x [[#4853](https://github.com/woodpecker-ci/woodpecker/pull/4853)]
- chore(deps): update docker.io/golang docker tag to v1.24 [[#4852](https://github.com/woodpecker-ci/woodpecker/pull/4852)]
- chore(deps): update woodpeckerci/plugin-release docker tag to v0.2.4 [[#4851](https://github.com/woodpecker-ci/woodpecker/pull/4851)]
- fix(deps): update dependency @tailwindcss/vite to v4.0.6 [[#4846](https://github.com/woodpecker-ci/woodpecker/pull/4846)]
- chore(deps): lock file maintenance [[#4845](https://github.com/woodpecker-ci/woodpecker/pull/4845)]
Download .txt
gitextract_g04cg062/

├── .cspell.json
├── .ecrc
├── .editorconfig
├── .gitattributes
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yaml
│   │   ├── config.yml
│   │   └── feature_request.yaml
│   ├── pull_request_template.md
│   ├── release_template.md
│   └── renovate.json
├── .gitignore
├── .gitpod.yml
├── .golangci.yaml
├── .hadolint.yaml
├── .lycheeignore
├── .markdownlint.yaml
├── .mockery.yaml
├── .pre-commit-config.yaml
├── .prettierignore
├── .prettierrc.json
├── .vscode/
│   ├── extensions.json
│   ├── launch.json
│   └── settings.json
├── .woodpecker/
│   ├── binaries.yaml
│   ├── check-feature-docs.sh
│   ├── docker.yaml
│   ├── docs.yaml
│   ├── links.yaml
│   ├── release-helper.yaml
│   ├── securityscan.yaml
│   ├── social.yaml
│   ├── static.yaml
│   ├── test.yaml
│   └── web.yaml
├── .yamllint.yaml
├── CHANGELOG.md
├── LICENSE
├── Makefile
├── README.md
├── agent/
│   ├── log/
│   │   ├── line_writer.go
│   │   └── line_writer_test.go
│   ├── logger.go
│   ├── rpc/
│   │   ├── auth_client_grpc.go
│   │   ├── auth_client_grpc_test.go
│   │   ├── auth_interceptor.go
│   │   └── client_grpc.go
│   ├── runner.go
│   ├── state.go
│   └── tracer.go
├── checkmake.ini
├── cli/
│   ├── README.md
│   ├── admin/
│   │   ├── admin.go
│   │   ├── loglevel/
│   │   │   └── loglevel.go
│   │   ├── org/
│   │   │   └── org_list.go
│   │   ├── registry/
│   │   │   ├── registry.go
│   │   │   ├── registry_add.go
│   │   │   ├── registry_list.go
│   │   │   ├── registry_rm.go
│   │   │   ├── registry_set.go
│   │   │   └── registry_show.go
│   │   ├── secret/
│   │   │   ├── secret.go
│   │   │   ├── secret_add.go
│   │   │   ├── secret_list.go
│   │   │   ├── secret_rm.go
│   │   │   ├── secret_set.go
│   │   │   └── secret_show.go
│   │   └── user/
│   │       ├── user.go
│   │       ├── user_add.go
│   │       ├── user_list.go
│   │       ├── user_rm.go
│   │       └── user_show.go
│   ├── common/
│   │   ├── flags.go
│   │   ├── hooks.go
│   │   ├── pipeline.go
│   │   └── zerologger.go
│   ├── context/
│   │   └── context.go
│   ├── exec/
│   │   ├── dummy.go
│   │   ├── exec.go
│   │   ├── flags.go
│   │   ├── line.go
│   │   ├── metadata.go
│   │   └── metadata_test.go
│   ├── info/
│   │   └── info.go
│   ├── internal/
│   │   ├── config/
│   │   │   ├── config.go
│   │   │   ├── config_test.go
│   │   │   ├── context.go
│   │   │   └── context_test.go
│   │   ├── util.go
│   │   └── util_test.go
│   ├── lint/
│   │   ├── lint.go
│   │   └── utils.go
│   ├── org/
│   │   ├── org.go
│   │   ├── registry/
│   │   │   ├── registry.go
│   │   │   ├── registry_add.go
│   │   │   ├── registry_list.go
│   │   │   ├── registry_rm.go
│   │   │   ├── registry_set.go
│   │   │   └── registry_show.go
│   │   └── secret/
│   │       ├── secret.go
│   │       ├── secret_add.go
│   │       ├── secret_list.go
│   │       ├── secret_rm.go
│   │       ├── secret_set.go
│   │       └── secret_show.go
│   ├── output/
│   │   ├── output.go
│   │   ├── output_test.go
│   │   ├── table.go
│   │   └── table_test.go
│   ├── pipeline/
│   │   ├── approve.go
│   │   ├── create.go
│   │   ├── decline.go
│   │   ├── deploy/
│   │   │   └── deploy.go
│   │   ├── kill.go
│   │   ├── last.go
│   │   ├── list.go
│   │   ├── list_test.go
│   │   ├── log/
│   │   │   ├── log.go
│   │   │   ├── log_purge.go
│   │   │   └── log_show.go
│   │   ├── pipeline.go
│   │   ├── pipeline_test.go
│   │   ├── ps.go
│   │   ├── purge.go
│   │   ├── purge_test.go
│   │   ├── queue.go
│   │   ├── show.go
│   │   ├── start.go
│   │   └── stop.go
│   ├── repo/
│   │   ├── cron/
│   │   │   ├── cron.go
│   │   │   ├── cron_add.go
│   │   │   ├── cron_list.go
│   │   │   ├── cron_rm.go
│   │   │   ├── cron_show.go
│   │   │   └── cron_update.go
│   │   ├── registry/
│   │   │   ├── registry.go
│   │   │   ├── registry_add.go
│   │   │   ├── registry_list.go
│   │   │   ├── registry_rm.go
│   │   │   ├── registry_set.go
│   │   │   └── registry_show.go
│   │   ├── repo.go
│   │   ├── repo_add.go
│   │   ├── repo_chown.go
│   │   ├── repo_list.go
│   │   ├── repo_repair.go
│   │   ├── repo_rm.go
│   │   ├── repo_show.go
│   │   ├── repo_show_test.go
│   │   ├── repo_sync.go
│   │   ├── repo_test.go
│   │   ├── repo_update.go
│   │   └── secret/
│   │       ├── secret.go
│   │       ├── secret_add.go
│   │       ├── secret_list.go
│   │       ├── secret_rm.go
│   │       ├── secret_set.go
│   │       └── secret_show.go
│   ├── setup/
│   │   ├── setup.go
│   │   ├── token_fetcher.go
│   │   └── ui/
│   │       ├── ask.go
│   │       └── confirm.go
│   └── update/
│       ├── command.go
│       ├── tar.go
│       ├── types.go
│       ├── updater.go
│       └── updater_test.go
├── cmd/
│   ├── agent/
│   │   ├── core/
│   │   │   ├── agent.go
│   │   │   ├── agent_test.go
│   │   │   ├── config.go
│   │   │   ├── config_test.go
│   │   │   ├── flags.go
│   │   │   ├── health.go
│   │   │   ├── health_test.go
│   │   │   └── run.go
│   │   ├── dummy.go
│   │   ├── main.go
│   │   └── man.go
│   ├── cli/
│   │   ├── app.go
│   │   ├── docs.go
│   │   ├── main.go
│   │   └── man.go
│   └── server/
│       ├── app.go
│       ├── flags.go
│       ├── grpc_server.go
│       ├── health.go
│       ├── main.go
│       ├── man.go
│       ├── metrics_server.go
│       ├── openapi/
│       │   └── docs.go
│       ├── openapi.go
│       ├── openapi_json_gen.go
│       ├── openapi_test.go
│       ├── server.go
│       └── setup.go
├── codecov.yaml
├── contrib/
│   └── woodpecker-test-repo/
│       └── .woodpecker/
│           ├── demo.yaml
│           └── test.yaml
├── docker/
│   ├── Dockerfile.agent.alpine.multiarch
│   ├── Dockerfile.agent.multiarch
│   ├── Dockerfile.cli.alpine.multiarch.rootless
│   ├── Dockerfile.cli.multiarch.rootless
│   ├── Dockerfile.make
│   ├── Dockerfile.server.alpine.multiarch.rootless
│   └── Dockerfile.server.multiarch.rootless
├── docker-compose.example.yaml
├── docker-compose.gitpod.yaml
├── docs/
│   ├── .gitignore
│   ├── .prettierignore
│   ├── .prettierrc.js
│   ├── LICENSE
│   ├── README.md
│   ├── blog/
│   │   ├── 2023-06-11-hello-blog/
│   │   │   └── index.md
│   │   ├── 2023-07-28-release-v1.0.0/
│   │   │   └── index.md
│   │   ├── 2023-11-09-release-v2.0.0/
│   │   │   └── index.md
│   │   ├── 2023-12-12-podman-image-builds/
│   │   │   └── index.md
│   │   ├── 2023-12-13-debug-pipeline-steps/
│   │   │   └── index.md
│   │   ├── 2023-12-15-podman-sigstore/
│   │   │   └── index.md
│   │   ├── 2024-01-01-continuous-deployment/
│   │   │   └── index.md
│   │   ├── 2024-05-27-release-v2.5.0/
│   │   │   └── index.md
│   │   └── 2024-12-28-release-v3.0.0/
│   │       └── index.md
│   ├── docs/
│   │   ├── 10-intro/
│   │   │   └── index.md
│   │   ├── 20-usage/
│   │   │   ├── 10-intro.md
│   │   │   ├── 100-troubleshooting.md
│   │   │   ├── 15-terminology/
│   │   │   │   ├── architecture.excalidraw
│   │   │   │   ├── index.md
│   │   │   │   └── pipeline-workflow-step.excalidraw
│   │   │   ├── 20-workflow-syntax.md
│   │   │   ├── 25-workflows.md
│   │   │   ├── 30-matrix-workflows.md
│   │   │   ├── 40-secrets.md
│   │   │   ├── 41-registries.md
│   │   │   ├── 45-cron.md
│   │   │   ├── 50-environment.md
│   │   │   ├── 51-plugins/
│   │   │   │   ├── 20-creating-plugins.md
│   │   │   │   ├── 51-overview.md
│   │   │   │   └── _category_.yaml
│   │   │   ├── 60-services.md
│   │   │   ├── 70-volumes.md
│   │   │   ├── 72-extensions/
│   │   │   │   ├── 40-configuration-extension.md
│   │   │   │   ├── 50-registry-extension.md
│   │   │   │   ├── 55-secret-extension.md
│   │   │   │   ├── _category_.yaml
│   │   │   │   └── index.md
│   │   │   ├── 72-linter.md
│   │   │   ├── 75-project-settings.md
│   │   │   ├── 80-badges.md
│   │   │   ├── 90-advanced-usage.md
│   │   │   └── _category_.yaml
│   │   ├── 30-administration/
│   │   │   ├── 00-general.md
│   │   │   ├── 05-installation/
│   │   │   │   ├── 10-docker-compose.md
│   │   │   │   ├── 20-helm-chart.md
│   │   │   │   ├── 30-packages.md
│   │   │   │   └── _category_.yaml
│   │   │   ├── 10-configuration/
│   │   │   │   ├── 10-server.md
│   │   │   │   ├── 100-addons.md
│   │   │   │   ├── 11-backends/
│   │   │   │   │   ├── 10-docker.md
│   │   │   │   │   ├── 20-kubernetes.md
│   │   │   │   │   ├── 30-local.md
│   │   │   │   │   ├── 50-custom.md
│   │   │   │   │   └── _category_.yaml
│   │   │   │   ├── 12-forges/
│   │   │   │   │   ├── 11-overview.md
│   │   │   │   │   ├── 20-github.md
│   │   │   │   │   ├── 30-gitea.md
│   │   │   │   │   ├── 35-forgejo.md
│   │   │   │   │   ├── 40-gitlab.md
│   │   │   │   │   ├── 50-bitbucket.md
│   │   │   │   │   ├── 60-bitbucket_datacenter.md
│   │   │   │   │   └── _category_.yaml
│   │   │   │   ├── 30-agent.md
│   │   │   │   ├── 40-autoscaler.md
│   │   │   │   └── _category_.yaml
│   │   │   └── _category_.yaml
│   │   └── 92-development/
│   │       ├── 01-getting-started.md
│   │       ├── 02-core-ideas.md
│   │       ├── 03-ui.md
│   │       ├── 04-docs.md
│   │       ├── 05-architecture.md
│   │       ├── 06-conventions.md
│   │       ├── 07-guides.md
│   │       ├── 08-translations.md
│   │       ├── 09-openapi.md
│   │       ├── 09-testing.md
│   │       ├── 10-packaging.md
│   │       ├── 100-addons.md
│   │       ├── 40-deprecations.md
│   │       ├── _category_.yaml
│   │       └── woodpecker-architecture.dot
│   ├── docusaurus.config.ts
│   ├── package.json
│   ├── plugins/
│   │   └── woodpecker-plugins/
│   │       ├── .gitignore
│   │       ├── package.json
│   │       ├── plugins.json
│   │       ├── src/
│   │       │   ├── index.ts
│   │       │   ├── markdown.ts
│   │       │   ├── theme/
│   │       │   │   ├── Icons.tsx
│   │       │   │   ├── WoodpeckerPlugin.tsx
│   │       │   │   ├── WoodpeckerPluginList.tsx
│   │       │   │   └── style.css
│   │       │   └── types.ts
│   │       ├── tsconfig.json
│   │       └── tsconfig.jsx.json
│   ├── pnpm-workspace.yaml
│   ├── sidebars.js
│   ├── src/
│   │   ├── components/
│   │   │   ├── HomepageFeatures.js
│   │   │   └── HomepageFeatures.module.css
│   │   ├── css/
│   │   │   └── custom.css
│   │   └── pages/
│   │       ├── about.md
│   │       ├── awesome.md
│   │       ├── index.module.css
│   │       ├── index.tsx
│   │       ├── migrations.md
│   │       └── versions.md
│   ├── tsconfig.json
│   ├── versioned_docs/
│   │   ├── version-2.8/
│   │   │   ├── 10-intro/
│   │   │   │   └── index.md
│   │   │   ├── 20-usage/
│   │   │   │   ├── 10-intro.md
│   │   │   │   ├── 100-troubleshooting.md
│   │   │   │   ├── 15-terminology/
│   │   │   │   │   ├── architecture.excalidraw
│   │   │   │   │   ├── index.md
│   │   │   │   │   └── pipeline-workflow-step.excalidraw
│   │   │   │   ├── 20-workflow-syntax.md
│   │   │   │   ├── 25-workflows.md
│   │   │   │   ├── 30-matrix-workflows.md
│   │   │   │   ├── 40-secrets.md
│   │   │   │   ├── 41-registries.md
│   │   │   │   ├── 45-cron.md
│   │   │   │   ├── 50-environment.md
│   │   │   │   ├── 51-plugins/
│   │   │   │   │   ├── 20-creating-plugins.md
│   │   │   │   │   ├── 51-overview.md
│   │   │   │   │   └── _category_.yaml
│   │   │   │   ├── 60-services.md
│   │   │   │   ├── 70-volumes.md
│   │   │   │   ├── 72-linter.md
│   │   │   │   ├── 75-project-settings.md
│   │   │   │   ├── 80-badges.md
│   │   │   │   ├── 90-advanced-usage.md
│   │   │   │   └── _category_.yaml
│   │   │   ├── 30-administration/
│   │   │   │   ├── 00-getting-started.md
│   │   │   │   ├── 05-deployment-methods/
│   │   │   │   │   ├── 10-docker-compose.md
│   │   │   │   │   ├── 20-kubernetes.md
│   │   │   │   │   ├── 30-third-party.md
│   │   │   │   │   ├── 40-nixos.md
│   │   │   │   │   └── _category_.yaml
│   │   │   │   ├── 10-database.md
│   │   │   │   ├── 10-server-config.md
│   │   │   │   ├── 11-forges/
│   │   │   │   │   ├── 100-addon.md
│   │   │   │   │   ├── 11-overview.md
│   │   │   │   │   ├── 20-github.md
│   │   │   │   │   ├── 30-gitea.md
│   │   │   │   │   ├── 35-forgejo.md
│   │   │   │   │   ├── 40-gitlab.md
│   │   │   │   │   ├── 50-bitbucket.md
│   │   │   │   │   ├── 60-bitbucket_datacenter.md
│   │   │   │   │   └── _category_.yaml
│   │   │   │   ├── 15-agent-config.md
│   │   │   │   ├── 22-backends/
│   │   │   │   │   ├── 10-docker.md
│   │   │   │   │   ├── 20-local.md
│   │   │   │   │   ├── 40-kubernetes.md
│   │   │   │   │   ├── 50-custom-backends.md
│   │   │   │   │   └── _category_.yaml
│   │   │   │   ├── 40-advanced/
│   │   │   │   │   ├── 10-proxy.md
│   │   │   │   │   ├── 100-external-configuration-api.md
│   │   │   │   │   ├── 20-ssl.md
│   │   │   │   │   ├── 30-autoscaler.md
│   │   │   │   │   ├── 40-advanced.md
│   │   │   │   │   ├── 90-prometheus.md
│   │   │   │   │   └── _category_.yaml
│   │   │   │   └── _category_.yaml
│   │   │   ├── 40-cli.md
│   │   │   ├── 50-about.md
│   │   │   ├── 91-migrations.md
│   │   │   ├── 92-awesome.md
│   │   │   └── 92-development/
│   │   │       ├── 01-getting-started.md
│   │   │       ├── 02-core-ideas.md
│   │   │       ├── 03-ui.md
│   │   │       ├── 04-docs.md
│   │   │       ├── 05-architecture.md
│   │   │       ├── 06-conventions.md
│   │   │       ├── 07-guides.md
│   │   │       ├── 08-translations.md
│   │   │       ├── 09-swagger.md
│   │   │       ├── 09-testing.md
│   │   │       └── _category_.yaml
│   │   ├── version-3.12/
│   │   │   ├── 10-intro/
│   │   │   │   └── index.md
│   │   │   ├── 20-usage/
│   │   │   │   ├── 10-intro.md
│   │   │   │   ├── 100-troubleshooting.md
│   │   │   │   ├── 15-terminology/
│   │   │   │   │   ├── architecture.excalidraw
│   │   │   │   │   ├── index.md
│   │   │   │   │   └── pipeline-workflow-step.excalidraw
│   │   │   │   ├── 20-workflow-syntax.md
│   │   │   │   ├── 25-workflows.md
│   │   │   │   ├── 30-matrix-workflows.md
│   │   │   │   ├── 40-secrets.md
│   │   │   │   ├── 41-registries.md
│   │   │   │   ├── 45-cron.md
│   │   │   │   ├── 50-environment.md
│   │   │   │   ├── 51-plugins/
│   │   │   │   │   ├── 20-creating-plugins.md
│   │   │   │   │   ├── 51-overview.md
│   │   │   │   │   └── _category_.yaml
│   │   │   │   ├── 60-services.md
│   │   │   │   ├── 70-volumes.md
│   │   │   │   ├── 72-extensions/
│   │   │   │   │   ├── 40-configuration-extension.md
│   │   │   │   │   ├── _category_.yaml
│   │   │   │   │   └── index.md
│   │   │   │   ├── 72-linter.md
│   │   │   │   ├── 75-project-settings.md
│   │   │   │   ├── 80-badges.md
│   │   │   │   ├── 90-advanced-usage.md
│   │   │   │   └── _category_.yaml
│   │   │   ├── 30-administration/
│   │   │   │   ├── 00-general.md
│   │   │   │   ├── 05-installation/
│   │   │   │   │   ├── 10-docker-compose.md
│   │   │   │   │   ├── 20-helm-chart.md
│   │   │   │   │   ├── 30-packages.md
│   │   │   │   │   └── _category_.yaml
│   │   │   │   ├── 10-configuration/
│   │   │   │   │   ├── 10-server.md
│   │   │   │   │   ├── 100-addons.md
│   │   │   │   │   ├── 11-backends/
│   │   │   │   │   │   ├── 10-docker.md
│   │   │   │   │   │   ├── 20-kubernetes.md
│   │   │   │   │   │   ├── 30-local.md
│   │   │   │   │   │   ├── 50-custom.md
│   │   │   │   │   │   └── _category_.yaml
│   │   │   │   │   ├── 12-forges/
│   │   │   │   │   │   ├── 11-overview.md
│   │   │   │   │   │   ├── 20-github.md
│   │   │   │   │   │   ├── 30-gitea.md
│   │   │   │   │   │   ├── 35-forgejo.md
│   │   │   │   │   │   ├── 40-gitlab.md
│   │   │   │   │   │   ├── 50-bitbucket.md
│   │   │   │   │   │   ├── 60-bitbucket_datacenter.md
│   │   │   │   │   │   └── _category_.yaml
│   │   │   │   │   ├── 30-agent.md
│   │   │   │   │   ├── 40-autoscaler.md
│   │   │   │   │   └── _category_.yaml
│   │   │   │   └── _category_.yaml
│   │   │   ├── 40-cli.md
│   │   │   └── 92-development/
│   │   │       ├── 01-getting-started.md
│   │   │       ├── 02-core-ideas.md
│   │   │       ├── 03-ui.md
│   │   │       ├── 04-docs.md
│   │   │       ├── 05-architecture.md
│   │   │       ├── 06-conventions.md
│   │   │       ├── 07-guides.md
│   │   │       ├── 08-translations.md
│   │   │       ├── 09-openapi.md
│   │   │       ├── 09-testing.md
│   │   │       ├── 100-addons.md
│   │   │       └── _category_.yaml
│   │   ├── version-3.13/
│   │   │   ├── 10-intro/
│   │   │   │   └── index.md
│   │   │   ├── 20-usage/
│   │   │   │   ├── 10-intro.md
│   │   │   │   ├── 100-troubleshooting.md
│   │   │   │   ├── 15-terminology/
│   │   │   │   │   ├── architecture.excalidraw
│   │   │   │   │   ├── index.md
│   │   │   │   │   └── pipeline-workflow-step.excalidraw
│   │   │   │   ├── 20-workflow-syntax.md
│   │   │   │   ├── 25-workflows.md
│   │   │   │   ├── 30-matrix-workflows.md
│   │   │   │   ├── 40-secrets.md
│   │   │   │   ├── 41-registries.md
│   │   │   │   ├── 45-cron.md
│   │   │   │   ├── 50-environment.md
│   │   │   │   ├── 51-plugins/
│   │   │   │   │   ├── 20-creating-plugins.md
│   │   │   │   │   ├── 51-overview.md
│   │   │   │   │   └── _category_.yaml
│   │   │   │   ├── 60-services.md
│   │   │   │   ├── 70-volumes.md
│   │   │   │   ├── 72-extensions/
│   │   │   │   │   ├── 40-configuration-extension.md
│   │   │   │   │   ├── _category_.yaml
│   │   │   │   │   └── index.md
│   │   │   │   ├── 72-linter.md
│   │   │   │   ├── 75-project-settings.md
│   │   │   │   ├── 80-badges.md
│   │   │   │   ├── 90-advanced-usage.md
│   │   │   │   └── _category_.yaml
│   │   │   ├── 30-administration/
│   │   │   │   ├── 00-general.md
│   │   │   │   ├── 05-installation/
│   │   │   │   │   ├── 10-docker-compose.md
│   │   │   │   │   ├── 20-helm-chart.md
│   │   │   │   │   ├── 30-packages.md
│   │   │   │   │   └── _category_.yaml
│   │   │   │   ├── 10-configuration/
│   │   │   │   │   ├── 10-server.md
│   │   │   │   │   ├── 100-addons.md
│   │   │   │   │   ├── 11-backends/
│   │   │   │   │   │   ├── 10-docker.md
│   │   │   │   │   │   ├── 20-kubernetes.md
│   │   │   │   │   │   ├── 30-local.md
│   │   │   │   │   │   ├── 50-custom.md
│   │   │   │   │   │   └── _category_.yaml
│   │   │   │   │   ├── 12-forges/
│   │   │   │   │   │   ├── 11-overview.md
│   │   │   │   │   │   ├── 20-github.md
│   │   │   │   │   │   ├── 30-gitea.md
│   │   │   │   │   │   ├── 35-forgejo.md
│   │   │   │   │   │   ├── 40-gitlab.md
│   │   │   │   │   │   ├── 50-bitbucket.md
│   │   │   │   │   │   ├── 60-bitbucket_datacenter.md
│   │   │   │   │   │   └── _category_.yaml
│   │   │   │   │   ├── 30-agent.md
│   │   │   │   │   ├── 40-autoscaler.md
│   │   │   │   │   └── _category_.yaml
│   │   │   │   └── _category_.yaml
│   │   │   ├── 40-cli.md
│   │   │   └── 92-development/
│   │   │       ├── 01-getting-started.md
│   │   │       ├── 02-core-ideas.md
│   │   │       ├── 03-ui.md
│   │   │       ├── 04-docs.md
│   │   │       ├── 05-architecture.md
│   │   │       ├── 06-conventions.md
│   │   │       ├── 07-guides.md
│   │   │       ├── 08-translations.md
│   │   │       ├── 09-openapi.md
│   │   │       ├── 09-testing.md
│   │   │       ├── 10-packaging.md
│   │   │       ├── 100-addons.md
│   │   │       └── _category_.yaml
│   │   └── version-3.14/
│   │       ├── 10-intro/
│   │       │   └── index.md
│   │       ├── 20-usage/
│   │       │   ├── 10-intro.md
│   │       │   ├── 100-troubleshooting.md
│   │       │   ├── 15-terminology/
│   │       │   │   ├── architecture.excalidraw
│   │       │   │   ├── index.md
│   │       │   │   └── pipeline-workflow-step.excalidraw
│   │       │   ├── 20-workflow-syntax.md
│   │       │   ├── 25-workflows.md
│   │       │   ├── 30-matrix-workflows.md
│   │       │   ├── 40-secrets.md
│   │       │   ├── 41-registries.md
│   │       │   ├── 45-cron.md
│   │       │   ├── 50-environment.md
│   │       │   ├── 51-plugins/
│   │       │   │   ├── 20-creating-plugins.md
│   │       │   │   ├── 51-overview.md
│   │       │   │   └── _category_.yaml
│   │       │   ├── 60-services.md
│   │       │   ├── 70-volumes.md
│   │       │   ├── 72-extensions/
│   │       │   │   ├── 40-configuration-extension.md
│   │       │   │   ├── 50-registry-extension.md
│   │       │   │   ├── 55-secret-extension.md
│   │       │   │   ├── _category_.yaml
│   │       │   │   └── index.md
│   │       │   ├── 72-linter.md
│   │       │   ├── 75-project-settings.md
│   │       │   ├── 80-badges.md
│   │       │   ├── 90-advanced-usage.md
│   │       │   └── _category_.yaml
│   │       ├── 30-administration/
│   │       │   ├── 00-general.md
│   │       │   ├── 05-installation/
│   │       │   │   ├── 10-docker-compose.md
│   │       │   │   ├── 20-helm-chart.md
│   │       │   │   ├── 30-packages.md
│   │       │   │   └── _category_.yaml
│   │       │   ├── 10-configuration/
│   │       │   │   ├── 10-server.md
│   │       │   │   ├── 100-addons.md
│   │       │   │   ├── 11-backends/
│   │       │   │   │   ├── 10-docker.md
│   │       │   │   │   ├── 20-kubernetes.md
│   │       │   │   │   ├── 30-local.md
│   │       │   │   │   ├── 50-custom.md
│   │       │   │   │   └── _category_.yaml
│   │       │   │   ├── 12-forges/
│   │       │   │   │   ├── 11-overview.md
│   │       │   │   │   ├── 20-github.md
│   │       │   │   │   ├── 30-gitea.md
│   │       │   │   │   ├── 35-forgejo.md
│   │       │   │   │   ├── 40-gitlab.md
│   │       │   │   │   ├── 50-bitbucket.md
│   │       │   │   │   ├── 60-bitbucket_datacenter.md
│   │       │   │   │   └── _category_.yaml
│   │       │   │   ├── 30-agent.md
│   │       │   │   ├── 40-autoscaler.md
│   │       │   │   └── _category_.yaml
│   │       │   └── _category_.yaml
│   │       ├── 40-cli.md
│   │       └── 92-development/
│   │           ├── 01-getting-started.md
│   │           ├── 02-core-ideas.md
│   │           ├── 03-ui.md
│   │           ├── 04-docs.md
│   │           ├── 05-architecture.md
│   │           ├── 06-conventions.md
│   │           ├── 07-guides.md
│   │           ├── 08-translations.md
│   │           ├── 09-openapi.md
│   │           ├── 09-testing.md
│   │           ├── 10-packaging.md
│   │           ├── 100-addons.md
│   │           ├── 40-deprecations.md
│   │           ├── _category_.yaml
│   │           └── woodpecker-architecture.dot
│   ├── versioned_sidebars/
│   │   ├── version-2.8-sidebars.json
│   │   ├── version-3.12-sidebars.json
│   │   ├── version-3.13-sidebars.json
│   │   └── version-3.14-sidebars.json
│   └── versions.json
├── e2e/
│   ├── scenarios/
│   │   ├── agent_routing_test.go
│   │   ├── cancel_test.go
│   │   ├── fixtures/
│   │   │   ├── 01_simple_success.json
│   │   │   ├── 01_simple_success.yaml
│   │   │   ├── 02_step_failure.json
│   │   │   ├── 02_step_failure.yaml
│   │   │   ├── 03_failure_ignore.json
│   │   │   ├── 03_failure_ignore.yaml
│   │   │   ├── 04_on_failure_notify.json
│   │   │   ├── 04_on_failure_notify.yaml
│   │   │   ├── 05_service.json
│   │   │   ├── 05_service.yaml
│   │   │   ├── 06_parallel_steps.json
│   │   │   ├── 06_parallel_steps.yaml
│   │   │   ├── 07_oom_killed.json
│   │   │   ├── 07_oom_killed.yaml
│   │   │   ├── 08_multi_step_on_failure.json
│   │   │   ├── 08_multi_step_on_failure.yaml
│   │   │   ├── 09_multi_workflow_parallel/
│   │   │   │   ├── build.yaml
│   │   │   │   ├── lint.yaml
│   │   │   │   └── scenario.json
│   │   │   ├── 10_multi_workflow_failure/
│   │   │   │   ├── failing.yaml
│   │   │   │   ├── passing.yaml
│   │   │   │   └── scenario.json
│   │   │   ├── 11_multi_workflow_failure_ignore/
│   │   │   │   ├── flaky.yaml
│   │   │   │   ├── main.yaml
│   │   │   │   └── scenario.json
│   │   │   ├── 12_multi_workflow_depends_on/
│   │   │   │   ├── build.yaml
│   │   │   │   ├── deploy.yaml
│   │   │   │   ├── notify.yaml
│   │   │   │   └── scenario.json
│   │   │   └── 13_multi_workflow_depends_on_failure/
│   │   │       ├── build.yaml
│   │   │       ├── deploy.yaml
│   │   │       └── scenario.json
│   │   ├── fixtures.go
│   │   ├── infra_test.go
│   │   ├── matrix_test.go
│   │   ├── restart_test.go
│   │   └── suite_test.go
│   └── setup/
│       ├── agent.go
│       ├── forge.go
│       ├── server.go
│       ├── store.go
│       └── wait.go
├── flake.nix
├── go.mod
├── go.sum
├── nfpm/
│   ├── agent.yaml
│   ├── cli.yaml
│   ├── server.yaml
│   ├── woodpecker-agent.env.example
│   ├── woodpecker-agent.service
│   ├── woodpecker-server.env.example
│   ├── woodpecker-server.service
│   └── woodpecker-system-user.preinstall.sh
├── pipeline/
│   ├── backend/
│   │   ├── backend.go
│   │   ├── common/
│   │   │   ├── script.go
│   │   │   ├── script_posix.go
│   │   │   ├── script_posix_test.go
│   │   │   ├── script_test.go
│   │   │   ├── script_win.go
│   │   │   └── script_win_test.go
│   │   ├── docker/
│   │   │   ├── backend_options.go
│   │   │   ├── backend_options_test.go
│   │   │   ├── config.go
│   │   │   ├── convert.go
│   │   │   ├── convert_test.go
│   │   │   ├── convert_win.go
│   │   │   ├── convert_win_test.go
│   │   │   ├── docker.go
│   │   │   ├── errors.go
│   │   │   └── flags.go
│   │   ├── dummy/
│   │   │   ├── dummy.go
│   │   │   └── dummy_test.go
│   │   ├── kubernetes/
│   │   │   ├── backend_options.go
│   │   │   ├── backend_options_test.go
│   │   │   ├── flags.go
│   │   │   ├── kubernetes.go
│   │   │   ├── kubernetes_test.go
│   │   │   ├── namespace.go
│   │   │   ├── namespace_test.go
│   │   │   ├── pod.go
│   │   │   ├── pod_test.go
│   │   │   ├── secrets.go
│   │   │   ├── secrets_test.go
│   │   │   ├── service.go
│   │   │   ├── service_test.go
│   │   │   ├── utils.go
│   │   │   ├── utils_test.go
│   │   │   ├── volume.go
│   │   │   └── volume_test.go
│   │   ├── local/
│   │   │   ├── clone.go
│   │   │   ├── command.go
│   │   │   ├── command_test.go
│   │   │   ├── const.go
│   │   │   ├── const_test.go
│   │   │   ├── errors.go
│   │   │   ├── flags.go
│   │   │   ├── local.go
│   │   │   ├── local_test.go
│   │   │   └── plugin.go
│   │   └── types/
│   │       ├── auth.go
│   │       ├── backend.go
│   │       ├── config.go
│   │       ├── conn.go
│   │       ├── errors.go
│   │       ├── mocks/
│   │       │   └── mock_Backend.go
│   │       ├── network.go
│   │       ├── secret.go
│   │       ├── stage.go
│   │       ├── state.go
│   │       └── step.go
│   ├── const.go
│   ├── errors/
│   │   ├── linter.go
│   │   ├── linter_test.go
│   │   ├── pipeline.go
│   │   └── runtime.go
│   ├── frontend/
│   │   ├── metadata/
│   │   │   ├── const.go
│   │   │   ├── drone_compatibility.go
│   │   │   ├── drone_compatibility_test.go
│   │   │   ├── environment.go
│   │   │   ├── environment_test.go
│   │   │   ├── substitution.go
│   │   │   ├── substitution_test.go
│   │   │   └── types.go
│   │   └── yaml/
│   │       ├── compiler/
│   │       │   ├── compiler.go
│   │       │   ├── compiler_test.go
│   │       │   ├── convert.go
│   │       │   ├── convert_test.go
│   │       │   ├── dag.go
│   │       │   ├── dag_test.go
│   │       │   ├── errors.go
│   │       │   ├── option.go
│   │       │   ├── option_test.go
│   │       │   └── settings/
│   │       │       ├── params.go
│   │       │       └── params_test.go
│   │       ├── constraint/
│   │       │   ├── constraint.go
│   │       │   ├── constraint_test.go
│   │       │   ├── list.go
│   │       │   ├── list_test.go
│   │       │   ├── map.go
│   │       │   ├── map_test.go
│   │       │   ├── path.go
│   │       │   ├── path_test.go
│   │       │   └── skip.go
│   │       ├── linter/
│   │       │   ├── error.go
│   │       │   ├── linter.go
│   │       │   ├── linter_test.go
│   │       │   ├── option.go
│   │       │   └── schema/
│   │       │       ├── .woodpecker/
│   │       │       │   ├── test-array-syntax.yaml
│   │       │       │   ├── test-backend-options.yaml
│   │       │       │   ├── test-broken-plugin.yaml
│   │       │       │   ├── test-broken-plugin2.yaml
│   │       │       │   ├── test-broken.yaml
│   │       │       │   ├── test-clone-skip.yaml
│   │       │       │   ├── test-clone.yaml
│   │       │       │   ├── test-custom-backend.yaml
│   │       │       │   ├── test-dag.yaml
│   │       │       │   ├── test-kubernetes-backend-tolerations.yaml
│   │       │       │   ├── test-labels.yaml
│   │       │       │   ├── test-matrix.yaml
│   │       │       │   ├── test-merge-map-and-sequence.yaml
│   │       │       │   ├── test-multi.yaml
│   │       │       │   ├── test-pipeline-when.yaml
│   │       │       │   ├── test-plugin.yaml
│   │       │       │   ├── test-run-on.yaml
│   │       │       │   ├── test-service.yaml
│   │       │       │   ├── test-step.yaml
│   │       │       │   ├── test-when.yaml
│   │       │       │   └── test-workspace.yaml
│   │       │       ├── schema.go
│   │       │       ├── schema.json
│   │       │       └── schema_test.go
│   │       ├── matrix/
│   │       │   ├── matrix.go
│   │       │   └── matrix_test.go
│   │       ├── parse.go
│   │       ├── parse_test.go
│   │       ├── types/
│   │       │   ├── base/
│   │       │   │   ├── int.go
│   │       │   │   ├── int_test.go
│   │       │   │   ├── slice.go
│   │       │   │   └── slice_test.go
│   │       │   ├── container.go
│   │       │   ├── container_list.go
│   │       │   ├── container_test.go
│   │       │   ├── network.go
│   │       │   ├── network_test.go
│   │       │   ├── volume.go
│   │       │   ├── volume_test.go
│   │       │   └── workflow.go
│   │       └── utils/
│   │           ├── image.go
│   │           └── image_test.go
│   ├── logging/
│   │   └── logger.go
│   ├── runtime/
│   │   ├── helpers_test.go
│   │   ├── option.go
│   │   ├── runtime.go
│   │   ├── runtime_test.go
│   │   ├── shutdown.go
│   │   ├── step.go
│   │   ├── step_test.go
│   │   ├── workflow.go
│   │   └── workflow_test.go
│   ├── shared/
│   │   ├── replace_secrets.go
│   │   └── replace_secrets_test.go
│   ├── state/
│   │   └── state.go
│   ├── tracing/
│   │   ├── mocks/
│   │   │   └── mock_Tracer.go
│   │   └── tracer.go
│   └── utils/
│       ├── copy_line_by_line.go
│       └── copy_line_by_line_test.go
├── release-config.ts
├── rpc/
│   ├── log_entry.go
│   ├── log_entry_test.go
│   ├── mocks/
│   │   └── mock_Peer.go
│   ├── peer.go
│   ├── proto/
│   │   ├── generate.go
│   │   ├── version.go
│   │   ├── woodpecker.pb.go
│   │   ├── woodpecker.proto
│   │   └── woodpecker_grpc.pb.go
│   └── types.go
├── server/
│   ├── api/
│   │   ├── agent.go
│   │   ├── agent_test.go
│   │   ├── badge.go
│   │   ├── cron.go
│   │   ├── debug/
│   │   │   └── debug.go
│   │   ├── forge.go
│   │   ├── global_registry.go
│   │   ├── global_secret.go
│   │   ├── helper.go
│   │   ├── helper_test.go
│   │   ├── hook.go
│   │   ├── hook_test.go
│   │   ├── login.go
│   │   ├── login_test.go
│   │   ├── metrics/
│   │   │   └── prometheus.go
│   │   ├── org.go
│   │   ├── org_registry.go
│   │   ├── org_secret.go
│   │   ├── pipeline.go
│   │   ├── pipeline_test.go
│   │   ├── queue.go
│   │   ├── registry.go
│   │   ├── repo.go
│   │   ├── repo_secret.go
│   │   ├── repo_test.go
│   │   ├── signature_public_key.go
│   │   ├── stream.go
│   │   ├── stream_test.go
│   │   ├── user.go
│   │   ├── users.go
│   │   └── z.go
│   ├── badges/
│   │   ├── badges.go
│   │   ├── badges_test.go
│   │   ├── color.go
│   │   ├── drawer.go
│   │   ├── fonts/
│   │   │   └── dejavusans.go
│   │   └── style.go
│   ├── cache/
│   │   └── membership.go
│   ├── ccmenu/
│   │   ├── cc.go
│   │   └── cc_test.go
│   ├── config.go
│   ├── cron/
│   │   ├── cron.go
│   │   └── cron_test.go
│   ├── forge/
│   │   ├── addon/
│   │   │   ├── args.go
│   │   │   ├── client.go
│   │   │   ├── plugin.go
│   │   │   └── server.go
│   │   ├── bitbucket/
│   │   │   ├── bitbucket.go
│   │   │   ├── bitbucket_test.go
│   │   │   ├── convert.go
│   │   │   ├── convert_test.go
│   │   │   ├── fixtures/
│   │   │   │   ├── HookPull.json
│   │   │   │   ├── HookPullRequestDeclined.json
│   │   │   │   ├── HookPullRequestMerged.json
│   │   │   │   ├── HookPush.json
│   │   │   │   ├── handler.go
│   │   │   │   └── hooks.go
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   └── types.go
│   │   │   ├── parse.go
│   │   │   └── parse_test.go
│   │   ├── bitbucketdatacenter/
│   │   │   ├── bitbucketdatacenter.go
│   │   │   ├── bitbucketdatacenter_test.go
│   │   │   ├── convert.go
│   │   │   ├── convert_test.go
│   │   │   ├── fixtures/
│   │   │   │   ├── HookPullRequestMerged.json
│   │   │   │   ├── HookPullRequestOpened.json
│   │   │   │   ├── HookPullRequestOpenedFromFork.json
│   │   │   │   ├── HookPush.json
│   │   │   │   ├── expected/
│   │   │   │   │   └── PostBuildStatus.json
│   │   │   │   ├── handler.go
│   │   │   │   └── hooks.go
│   │   │   ├── internal/
│   │   │   │   ├── client.go
│   │   │   │   └── client_test.go
│   │   │   ├── parse.go
│   │   │   └── parse_test.go
│   │   ├── common/
│   │   │   ├── event_normalize.go
│   │   │   ├── status.go
│   │   │   ├── status_test.go
│   │   │   ├── utils.go
│   │   │   └── utils_test.go
│   │   ├── forge.go
│   │   ├── forgejo/
│   │   │   ├── fixtures/
│   │   │   │   ├── HookPullRequest.json
│   │   │   │   ├── HookPullRequestAssigneeCleared.json
│   │   │   │   ├── HookPullRequestAssigneesAdded.json
│   │   │   │   ├── HookPullRequestClosed.json
│   │   │   │   ├── HookPullRequestEdited.json
│   │   │   │   ├── HookPullRequestLabelAdded.json
│   │   │   │   ├── HookPullRequestLabelsCleared.json
│   │   │   │   ├── HookPullRequestLabelsUpdated.json
│   │   │   │   ├── HookPullRequestMerged.json
│   │   │   │   ├── HookPullRequestMilestoneAdded.json
│   │   │   │   ├── HookPullRequestMilestoneChanged.json
│   │   │   │   ├── HookPullRequestMilestoneCleared.json
│   │   │   │   ├── HookPullRequestReopened.json
│   │   │   │   ├── HookPullRequestUpdated.json
│   │   │   │   ├── HookPush.json
│   │   │   │   ├── HookPushBranch.json
│   │   │   │   ├── HookPushMulti.json
│   │   │   │   ├── HookRelease.json
│   │   │   │   ├── HookTag.json
│   │   │   │   ├── handler.go
│   │   │   │   └── hooks.go
│   │   │   ├── forgejo.go
│   │   │   ├── forgejo_test.go
│   │   │   ├── helper.go
│   │   │   ├── helper_test.go
│   │   │   ├── parse.go
│   │   │   ├── parse_test.go
│   │   │   └── types.go
│   │   ├── gitea/
│   │   │   ├── fixtures/
│   │   │   │   ├── HookPullRequest.json
│   │   │   │   ├── HookPullRequestAddLabel.json
│   │   │   │   ├── HookPullRequestAddMile.json
│   │   │   │   ├── HookPullRequestAddReviewRequest.json
│   │   │   │   ├── HookPullRequestAssigneesAdded.json
│   │   │   │   ├── HookPullRequestAssigneesRemoved.json
│   │   │   │   ├── HookPullRequestChangeBody.json
│   │   │   │   ├── HookPullRequestChangeLabel.json
│   │   │   │   ├── HookPullRequestChangeMile.json
│   │   │   │   ├── HookPullRequestChangeTitle.json
│   │   │   │   ├── HookPullRequestClosed.json
│   │   │   │   ├── HookPullRequestMerged.json
│   │   │   │   ├── HookPullRequestRemoveLabel.json
│   │   │   │   ├── HookPullRequestRemoveMile.json
│   │   │   │   ├── HookPullRequestReopened.json
│   │   │   │   ├── HookPullRequestReviewAck.json
│   │   │   │   ├── HookPullRequestReviewComment.json
│   │   │   │   ├── HookPullRequestReviewDeny.json
│   │   │   │   ├── HookPullRequestUpdated.json
│   │   │   │   ├── HookPush.json
│   │   │   │   ├── HookPushBranch.json
│   │   │   │   ├── HookPushMulti.json
│   │   │   │   ├── HookRelease.json
│   │   │   │   ├── HookTag.json
│   │   │   │   ├── handler.go
│   │   │   │   └── hooks.go
│   │   │   ├── gitea.go
│   │   │   ├── gitea_test.go
│   │   │   ├── helper.go
│   │   │   ├── helper_test.go
│   │   │   ├── parse.go
│   │   │   ├── parse_test.go
│   │   │   └── types.go
│   │   ├── github/
│   │   │   ├── convert.go
│   │   │   ├── convert_test.go
│   │   │   ├── fixtures/
│   │   │   │   ├── HookDeploy.json
│   │   │   │   ├── HookPullRequest.json
│   │   │   │   ├── HookPullRequestAssigneeAdded.json
│   │   │   │   ├── HookPullRequestAssigneeRemoved.json
│   │   │   │   ├── HookPullRequestClosed.json
│   │   │   │   ├── HookPullRequestEdited.json
│   │   │   │   ├── HookPullRequestLabelAdded.json
│   │   │   │   ├── HookPullRequestLabelRemoved.json
│   │   │   │   ├── HookPullRequestLabelsCleared.json
│   │   │   │   ├── HookPullRequestMerged.json
│   │   │   │   ├── HookPullRequestMilestoneAdded.json
│   │   │   │   ├── HookPullRequestMilestoneRemoved.json
│   │   │   │   ├── HookPullRequestReopened.json
│   │   │   │   ├── HookPullRequestReviewRequested.json
│   │   │   │   ├── HookPush.json
│   │   │   │   ├── HookRelease.json
│   │   │   │   ├── HookTag.json
│   │   │   │   ├── handler.go
│   │   │   │   ├── hooks.go
│   │   │   │   └── mock_server.go
│   │   │   ├── github.go
│   │   │   ├── github_test.go
│   │   │   ├── parse.go
│   │   │   └── parse_test.go
│   │   ├── gitlab/
│   │   │   ├── convert.go
│   │   │   ├── fixtures/
│   │   │   │   ├── HookPullRequestApproved.json
│   │   │   │   ├── HookPullRequestAssigned.json
│   │   │   │   ├── HookPullRequestClosed.json
│   │   │   │   ├── HookPullRequestDemilestoned.json
│   │   │   │   ├── HookPullRequestEdited.json
│   │   │   │   ├── HookPullRequestLabelsAdded.json
│   │   │   │   ├── HookPullRequestLabelsCleared.json
│   │   │   │   ├── HookPullRequestLabelsUpdated.json
│   │   │   │   ├── HookPullRequestMerged.json
│   │   │   │   ├── HookPullRequestMilestoned.json
│   │   │   │   ├── HookPullRequestOpened.json
│   │   │   │   ├── HookPullRequestReopened.json
│   │   │   │   ├── HookPullRequestReviewRequestDel.json
│   │   │   │   ├── HookPullRequestReviewRequested.json
│   │   │   │   ├── HookPullRequestUnapproved.json
│   │   │   │   ├── HookPullRequestUnassigned.json
│   │   │   │   ├── HookPullRequestUnsupportedAction.json
│   │   │   │   ├── HookPullRequestUpdated.json
│   │   │   │   ├── HookPullRequestWithoutChanges.json
│   │   │   │   ├── HookPush.json
│   │   │   │   ├── HookTag.json
│   │   │   │   ├── WebhookReleaseBody.json
│   │   │   │   ├── hooks.go
│   │   │   │   ├── oauth.go
│   │   │   │   ├── projects.go
│   │   │   │   ├── testdata.go
│   │   │   │   └── users.go
│   │   │   ├── gitlab.go
│   │   │   ├── gitlab_test.go
│   │   │   ├── helper.go
│   │   │   └── status.go
│   │   ├── mocks/
│   │   │   ├── mock_Forge.go
│   │   │   └── mock_Refresher.go
│   │   ├── refresh.go
│   │   ├── refresh_test.go
│   │   ├── setup/
│   │   │   └── setup.go
│   │   └── types/
│   │       ├── errors.go
│   │       ├── meta.go
│   │       ├── meta_test.go
│   │       └── oauth.go
│   ├── logging/
│   │   ├── LICENSE
│   │   ├── log.go
│   │   ├── log_test.go
│   │   └── logging.go
│   ├── model/
│   │   ├── agent.go
│   │   ├── agent_test.go
│   │   ├── commit.go
│   │   ├── config.go
│   │   ├── const.go
│   │   ├── cron.go
│   │   ├── environ.go
│   │   ├── event.go
│   │   ├── feed.go
│   │   ├── forge.go
│   │   ├── log.go
│   │   ├── netrc.go
│   │   ├── org.go
│   │   ├── pagination.go
│   │   ├── pagination_test.go
│   │   ├── perm.go
│   │   ├── pipeline.go
│   │   ├── pull_request.go
│   │   ├── queue.go
│   │   ├── redirection.go
│   │   ├── registry.go
│   │   ├── repo.go
│   │   ├── repo_test.go
│   │   ├── secret.go
│   │   ├── secret_test.go
│   │   ├── server_config.go
│   │   ├── step.go
│   │   ├── step_test.go
│   │   ├── task.go
│   │   ├── task_test.go
│   │   ├── team.go
│   │   ├── user.go
│   │   ├── user_test.go
│   │   └── workflow.go
│   ├── pipeline/
│   │   ├── approve.go
│   │   ├── cancel.go
│   │   ├── config.go
│   │   ├── create.go
│   │   ├── decline.go
│   │   ├── errors.go
│   │   ├── gated.go
│   │   ├── gated_test.go
│   │   ├── helper.go
│   │   ├── items.go
│   │   ├── items_test.go
│   │   ├── pipeline_status.go
│   │   ├── pipeline_status_test.go
│   │   ├── queue.go
│   │   ├── restart.go
│   │   ├── start.go
│   │   ├── status.go
│   │   ├── status_test.go
│   │   ├── step_builder/
│   │   │   ├── metadata.go
│   │   │   ├── metadata_test.go
│   │   │   ├── step_builder.go
│   │   │   └── step_builder_test.go
│   │   ├── step_status.go
│   │   ├── step_status_test.go
│   │   ├── topic.go
│   │   ├── workflow_status.go
│   │   └── workflow_status_test.go
│   ├── pubsub/
│   │   ├── memory/
│   │   │   ├── pub.go
│   │   │   └── pub_test.go
│   │   ├── pubsub.go
│   │   └── pubsub_test.go
│   ├── queue/
│   │   ├── fifo.go
│   │   ├── fifo_test.go
│   │   ├── mocks/
│   │   │   └── mock_Queue.go
│   │   ├── persistent.go
│   │   └── queue.go
│   ├── router/
│   │   ├── api.go
│   │   ├── middleware/
│   │   │   ├── header/
│   │   │   │   └── header.go
│   │   │   ├── logger.go
│   │   │   ├── session/
│   │   │   │   ├── agent.go
│   │   │   │   ├── org.go
│   │   │   │   ├── pagination.go
│   │   │   │   ├── repo.go
│   │   │   │   └── user.go
│   │   │   ├── store.go
│   │   │   ├── token/
│   │   │   │   └── token.go
│   │   │   └── version.go
│   │   └── router.go
│   ├── rpc/
│   │   ├── auth_server.go
│   │   ├── auth_server_test.go
│   │   ├── authorizer.go
│   │   ├── authorizer_test.go
│   │   ├── errors.go
│   │   ├── filter.go
│   │   ├── filter_test.go
│   │   ├── jwt_manager.go
│   │   ├── jwt_manager_test.go
│   │   ├── rpc.go
│   │   ├── rpc_integration_test.go
│   │   ├── rpc_test.go
│   │   ├── sanitize.go
│   │   ├── sanitize_test.go
│   │   └── server.go
│   ├── scheduler/
│   │   ├── proxy.go
│   │   └── scheduler.go
│   ├── services/
│   │   ├── config/
│   │   │   ├── combined.go
│   │   │   ├── combined_test.go
│   │   │   ├── forge.go
│   │   │   ├── forge_test.go
│   │   │   ├── http.go
│   │   │   ├── mocks/
│   │   │   │   └── mock_Service.go
│   │   │   └── service.go
│   │   ├── encryption/
│   │   │   ├── aes.go
│   │   │   ├── aes_builder.go
│   │   │   ├── aes_encryption.go
│   │   │   ├── aes_state.go
│   │   │   ├── aes_test.go
│   │   │   ├── constants.go
│   │   │   ├── encryption.go
│   │   │   ├── encryption_builder.go
│   │   │   ├── no_encryption.go
│   │   │   ├── tink.go
│   │   │   ├── tink_builder.go
│   │   │   ├── tink_keyset.go
│   │   │   ├── tink_keyset_watcher.go
│   │   │   ├── tink_state.go
│   │   │   ├── types/
│   │   │   │   └── encryption.go
│   │   │   └── wrapper/
│   │   │       └── store/
│   │   │           ├── constants.go
│   │   │           ├── secret_store.go
│   │   │           └── secret_store_wrapper.go
│   │   ├── environment/
│   │   │   ├── mocks/
│   │   │   │   └── mock_Service.go
│   │   │   ├── parse.go
│   │   │   ├── parse_test.go
│   │   │   └── service.go
│   │   ├── log/
│   │   │   ├── addon/
│   │   │   │   ├── client.go
│   │   │   │   ├── plugin.go
│   │   │   │   └── server.go
│   │   │   ├── file/
│   │   │   │   └── file.go
│   │   │   ├── mocks/
│   │   │   │   └── mock_Service.go
│   │   │   └── service.go
│   │   ├── manager.go
│   │   ├── mocks/
│   │   │   └── mock_Manager.go
│   │   ├── permissions/
│   │   │   ├── admins.go
│   │   │   ├── admins_test.go
│   │   │   ├── orgs.go
│   │   │   ├── orgs_test.go
│   │   │   ├── repo_owners.go
│   │   │   └── repo_owners_test.go
│   │   ├── registry/
│   │   │   ├── combined.go
│   │   │   ├── combined_test.go
│   │   │   ├── db.go
│   │   │   ├── filesystem.go
│   │   │   ├── http.go
│   │   │   ├── mocks/
│   │   │   │   ├── mock_ReadOnlyService.go
│   │   │   │   └── mock_Service.go
│   │   │   ├── service.go
│   │   │   ├── with_extension.go
│   │   │   └── with_extension_test.go
│   │   ├── secret/
│   │   │   ├── combined.go
│   │   │   ├── combined_test.go
│   │   │   ├── db.go
│   │   │   ├── db_test.go
│   │   │   ├── http.go
│   │   │   ├── mocks/
│   │   │   │   └── mock_Service.go
│   │   │   └── service.go
│   │   ├── setup.go
│   │   └── utils/
│   │       ├── hostmatcher/
│   │       │   ├── hostmatcher.go
│   │       │   ├── hostmatcher_test.go
│   │       │   └── http.go
│   │       ├── http.go
│   │       └── http_test.go
│   ├── store/
│   │   ├── common.go
│   │   ├── context.go
│   │   ├── datastore/
│   │   │   ├── agent.go
│   │   │   ├── agent_test.go
│   │   │   ├── config.go
│   │   │   ├── config_test.go
│   │   │   ├── cron.go
│   │   │   ├── cron_test.go
│   │   │   ├── engine.go
│   │   │   ├── engine_test.go
│   │   │   ├── errors.go
│   │   │   ├── feed.go
│   │   │   ├── feed_test.go
│   │   │   ├── forge.go
│   │   │   ├── forge_test.go
│   │   │   ├── helper.go
│   │   │   ├── helper_test.go
│   │   │   ├── init.go
│   │   │   ├── init_cgo.go
│   │   │   ├── log.go
│   │   │   ├── log_test.go
│   │   │   ├── migration/
│   │   │   │   ├── 000_legacy_to_xormigrate.go
│   │   │   │   ├── 001_add_org_id.go
│   │   │   │   ├── 002_task_data_type.go
│   │   │   │   ├── 003_config_data_type.go
│   │   │   │   ├── 004_remove_secrets_plugin_only_col.go
│   │   │   │   ├── 005_convert_to_new_pipeline_errors_format.go
│   │   │   │   ├── 006_link_to_url.go
│   │   │   │   ├── 007_clean_registry_pipeline.go
│   │   │   │   ├── 008_set_default_forge_id.go
│   │   │   │   ├── 009_unify_columns_tables.go
│   │   │   │   ├── 010_registries_add_user.go
│   │   │   │   ├── 011_cron_without_sec.go
│   │   │   │   ├── 012_rename_start_end_time.go
│   │   │   │   ├── 013_fix_v31_registries.go
│   │   │   │   ├── 014_remove_old_migrations_of_v1.go
│   │   │   │   ├── 015_add_org_agents.go
│   │   │   │   ├── 016_add_custom_labels_to_agent.go
│   │   │   │   ├── 017_split_trusted.go
│   │   │   │   ├── 018_fix_orgs_users_match.go
│   │   │   │   ├── 019_gated_to_require_approval.go
│   │   │   │   ├── 020_remove_repo_netrc_only_trusted.go
│   │   │   │   ├── 021_rename_token_fields.go
│   │   │   │   ├── 022_set_new_defaults_for_require_approval.go
│   │   │   │   ├── 023_remove_repo_scm.go
│   │   │   │   ├── 024_unsanitize_org_and_user_names.go
│   │   │   │   ├── 025_fix_zero_forge_id_ref.go
│   │   │   │   ├── 026_fix_forge_columns.go
│   │   │   │   ├── 027_add_cron_field.go
│   │   │   │   ├── common.go
│   │   │   │   ├── common_test.go
│   │   │   │   ├── logger.go
│   │   │   │   ├── migration.go
│   │   │   │   ├── migration_test.go
│   │   │   │   └── test-files/
│   │   │   │       ├── .gitignore
│   │   │   │       └── postgres.sql
│   │   │   ├── org.go
│   │   │   ├── org_test.go
│   │   │   ├── permission.go
│   │   │   ├── permission_test.go
│   │   │   ├── pipeline.go
│   │   │   ├── pipeline_test.go
│   │   │   ├── redirection.go
│   │   │   ├── redirection_test.go
│   │   │   ├── registry.go
│   │   │   ├── registry_test.go
│   │   │   ├── repo.go
│   │   │   ├── repo_test.go
│   │   │   ├── secret.go
│   │   │   ├── secret_test.go
│   │   │   ├── server_config.go
│   │   │   ├── server_config_test.go
│   │   │   ├── step.go
│   │   │   ├── step_test.go
│   │   │   ├── task.go
│   │   │   ├── task_test.go
│   │   │   ├── user.go
│   │   │   ├── user_test.go
│   │   │   ├── workflow.go
│   │   │   ├── workflow_test.go
│   │   │   └── xorm.go
│   │   ├── mocks/
│   │   │   └── mock_Store.go
│   │   ├── store.go
│   │   └── types/
│   │       └── errors.go
│   └── web/
│       ├── config.go
│       ├── web.go
│       └── web_test.go
├── shared/
│   ├── constant/
│   │   └── constant.go
│   ├── httputil/
│   │   ├── http_error.go
│   │   ├── http_error_test.go
│   │   ├── httputil.go
│   │   ├── useragent.go
│   │   └── useragent_test.go
│   ├── logger/
│   │   ├── addon_logger.go
│   │   ├── logger.go
│   │   └── terminal.go
│   ├── optional/
│   │   ├── option.go
│   │   ├── option_test.go
│   │   ├── serialization.go
│   │   ├── serialization_json_test.go
│   │   ├── serialization_test.go
│   │   └── serialization_yaml_test.go
│   ├── token/
│   │   ├── token.go
│   │   └── token_test.go
│   └── utils/
│       ├── context.go
│       ├── paginate.go
│       ├── paginate_test.go
│       ├── protected.go
│       ├── slices.go
│       ├── slices_test.go
│       ├── strings.go
│       └── strings_test.go
├── tools/
│   └── tools.go
├── version/
│   └── version.go
├── web/
│   ├── .gitignore
│   ├── .prettierignore
│   ├── .prettierrc.js
│   ├── .yamlignore
│   ├── LICENSE
│   ├── components.d.ts
│   ├── eslint.config.js
│   ├── index.html
│   ├── package.json
│   ├── src/
│   │   ├── App.vue
│   │   ├── assets/
│   │   │   └── locales/
│   │   │       ├── bar.json
│   │   │       ├── cs.json
│   │   │       ├── de.json
│   │   │       ├── en.json
│   │   │       ├── eo.json
│   │   │       ├── es.json
│   │   │       ├── fi.json
│   │   │       ├── fr.json
│   │   │       ├── hu.json
│   │   │       ├── id.json
│   │   │       ├── it.json
│   │   │       ├── lv.json
│   │   │       ├── nb-NO.json
│   │   │       ├── nl.json
│   │   │       ├── pl.json
│   │   │       ├── pt.json
│   │   │       ├── ru.json
│   │   │       ├── uk.json
│   │   │       ├── zh-Hans.json
│   │   │       └── zh-Hant.json
│   │   ├── components/
│   │   │   ├── FileTree.vue
│   │   │   ├── admin/
│   │   │   │   └── settings/
│   │   │   │       ├── forges/
│   │   │   │       │   └── AdminForgeForm.vue
│   │   │   │       └── queue/
│   │   │   │           └── AdminQueueStats.vue
│   │   │   ├── agent/
│   │   │   │   ├── AgentForm.vue
│   │   │   │   ├── AgentList.vue
│   │   │   │   └── AgentManager.vue
│   │   │   ├── atomic/
│   │   │   │   ├── Badge.vue
│   │   │   │   ├── Button.vue
│   │   │   │   ├── CountBadge.vue
│   │   │   │   ├── DocsLink.vue
│   │   │   │   ├── Error.vue
│   │   │   │   ├── Icon.vue
│   │   │   │   ├── IconButton.vue
│   │   │   │   ├── ListItem.vue
│   │   │   │   ├── RenderMarkdown.vue
│   │   │   │   ├── SvgIcon.vue
│   │   │   │   ├── SyntaxHighlight.ts
│   │   │   │   └── Warning.vue
│   │   │   ├── form/
│   │   │   │   ├── Checkbox.vue
│   │   │   │   ├── CheckboxesField.vue
│   │   │   │   ├── InputField.vue
│   │   │   │   ├── KeyValueEditor.vue
│   │   │   │   ├── NumberField.vue
│   │   │   │   ├── RadioField.vue
│   │   │   │   ├── SelectField.vue
│   │   │   │   ├── TextField.vue
│   │   │   │   └── form.types.ts
│   │   │   ├── layout/
│   │   │   │   ├── Container.vue
│   │   │   │   ├── Panel.vue
│   │   │   │   ├── Popup.vue
│   │   │   │   ├── Settings.vue
│   │   │   │   ├── header/
│   │   │   │   │   ├── ActivePipelines.vue
│   │   │   │   │   └── Navbar.vue
│   │   │   │   ├── popups/
│   │   │   │   │   └── DeployPipelinePopup.vue
│   │   │   │   └── scaffold/
│   │   │   │       ├── Header.vue
│   │   │   │       ├── Scaffold.vue
│   │   │   │       ├── Tab.vue
│   │   │   │       └── Tabs.vue
│   │   │   ├── pipeline-feed/
│   │   │   │   ├── PipelineFeedItem.vue
│   │   │   │   └── PipelineFeedSidebar.vue
│   │   │   ├── registry/
│   │   │   │   ├── RegistryEdit.vue
│   │   │   │   └── RegistryList.vue
│   │   │   ├── repo/
│   │   │   │   ├── RepoItem.vue
│   │   │   │   └── pipeline/
│   │   │   │       ├── PipelineItem.vue
│   │   │   │       ├── PipelineList.vue
│   │   │   │       ├── PipelineLog.vue
│   │   │   │       ├── PipelineRunningIcon.vue
│   │   │   │       ├── PipelineStatusIcon.vue
│   │   │   │       ├── PipelineStepDuration.vue
│   │   │   │       ├── PipelineStepList.vue
│   │   │   │       └── pipeline-status.ts
│   │   │   └── secrets/
│   │   │       ├── SecretEdit.vue
│   │   │       └── SecretList.vue
│   │   ├── compositions/
│   │   │   ├── useApiClient.ts
│   │   │   ├── useAsyncAction.ts
│   │   │   ├── useAuthentication.ts
│   │   │   ├── useConfig.ts
│   │   │   ├── useDate.ts
│   │   │   ├── useElapsedTime.ts
│   │   │   ├── useEvents.ts
│   │   │   ├── useFavicon.ts
│   │   │   ├── useForgeStore.ts
│   │   │   ├── useI18n.ts
│   │   │   ├── useInjectProvide.ts
│   │   │   ├── useInterval.ts
│   │   │   ├── useNotifications.ts
│   │   │   ├── usePaginate.test.ts
│   │   │   ├── usePaginate.ts
│   │   │   ├── usePipeline.ts
│   │   │   ├── usePipelineFeed.ts
│   │   │   ├── useRepoSearch.ts
│   │   │   ├── useRepos.ts
│   │   │   ├── useRouteBack.ts
│   │   │   ├── useTabs.ts
│   │   │   ├── useTheme.ts
│   │   │   ├── useUserConfig.ts
│   │   │   ├── useVersion.ts
│   │   │   └── useWPTitle.ts
│   │   ├── lib/
│   │   │   ├── api/
│   │   │   │   ├── client.ts
│   │   │   │   ├── index.ts
│   │   │   │   └── types/
│   │   │   │       ├── agent.ts
│   │   │   │       ├── cron.ts
│   │   │   │       ├── forge.ts
│   │   │   │       ├── index.ts
│   │   │   │       ├── org.ts
│   │   │   │       ├── pipeline.ts
│   │   │   │       ├── pipelineConfig.ts
│   │   │   │       ├── pull_request.ts
│   │   │   │       ├── queue.ts
│   │   │   │       ├── registry.ts
│   │   │   │       ├── repo.ts
│   │   │   │       ├── secret.ts
│   │   │   │       ├── user.ts
│   │   │   │       └── webhook.ts
│   │   │   ├── utils/
│   │   │   │   └── index.ts
│   │   │   └── utils.test.ts
│   │   ├── main.ts
│   │   ├── router.ts
│   │   ├── store/
│   │   │   ├── pipelines.ts
│   │   │   └── repos.ts
│   │   ├── style/
│   │   │   ├── console.css
│   │   │   └── prism.css
│   │   ├── style.css
│   │   ├── tailwind.css
│   │   ├── views/
│   │   │   ├── Login.vue
│   │   │   ├── NotFound.vue
│   │   │   ├── RepoAdd.vue
│   │   │   ├── Repos.vue
│   │   │   ├── RouterView.vue
│   │   │   ├── admin/
│   │   │   │   ├── AdminAgents.vue
│   │   │   │   ├── AdminInfo.vue
│   │   │   │   ├── AdminOrgs.vue
│   │   │   │   ├── AdminQueue.vue
│   │   │   │   ├── AdminRegistries.vue
│   │   │   │   ├── AdminRepos.vue
│   │   │   │   ├── AdminSecrets.vue
│   │   │   │   ├── AdminSettingsWrapper.vue
│   │   │   │   ├── AdminUsers.vue
│   │   │   │   └── forges/
│   │   │   │       ├── AdminForge.vue
│   │   │   │       ├── AdminForgeCreate.vue
│   │   │   │       └── AdminForges.vue
│   │   │   ├── cli/
│   │   │   │   └── Auth.vue
│   │   │   ├── org/
│   │   │   │   ├── OrgDeprecatedRedirect.vue
│   │   │   │   ├── OrgRepos.vue
│   │   │   │   ├── OrgWrapper.vue
│   │   │   │   └── settings/
│   │   │   │       ├── OrgAgents.vue
│   │   │   │       ├── OrgRegistries.vue
│   │   │   │       ├── OrgSecrets.vue
│   │   │   │       └── OrgSettingsWrapper.vue
│   │   │   ├── repo/
│   │   │   │   ├── RepoBranch.vue
│   │   │   │   ├── RepoBranches.vue
│   │   │   │   ├── RepoDeprecatedRedirect.vue
│   │   │   │   ├── RepoManualPipeline.vue
│   │   │   │   ├── RepoPipelines.vue
│   │   │   │   ├── RepoPullRequest.vue
│   │   │   │   ├── RepoPullRequests.vue
│   │   │   │   ├── RepoWrapper.vue
│   │   │   │   ├── pipeline/
│   │   │   │   │   ├── Pipeline.vue
│   │   │   │   │   ├── PipelineChangedFiles.vue
│   │   │   │   │   ├── PipelineConfig.vue
│   │   │   │   │   ├── PipelineDebug.vue
│   │   │   │   │   ├── PipelineErrors.vue
│   │   │   │   │   └── PipelineWrapper.vue
│   │   │   │   └── settings/
│   │   │   │       ├── Actions.vue
│   │   │   │       ├── Badge.vue
│   │   │   │       ├── Crons.vue
│   │   │   │       ├── Extensions.vue
│   │   │   │       ├── General.vue
│   │   │   │       ├── Registries.vue
│   │   │   │       ├── RepoSettings.vue
│   │   │   │       └── Secrets.vue
│   │   │   └── user/
│   │   │       ├── UserAgents.vue
│   │   │       ├── UserCLIAndAPI.vue
│   │   │       ├── UserGeneral.vue
│   │   │       ├── UserRegistries.vue
│   │   │       ├── UserSecrets.vue
│   │   │       └── UserWrapper.vue
│   │   └── vite-env.d.ts
│   ├── tsconfig.json
│   ├── vite.config.ts
│   ├── web.go
│   └── web_external.go
└── woodpecker-go/
    ├── LICENSE
    ├── README.md
    └── woodpecker/
        ├── agent.go
        ├── agent_test.go
        ├── client.go
        ├── client_test.go
        ├── const.go
        ├── global_registry.go
        ├── global_secret.go
        ├── httputil/
        │   ├── useragent.go
        │   └── useragent_test.go
        ├── interface.go
        ├── list_options.go
        ├── list_options_test.go
        ├── mocks/
        │   └── mock_Client.go
        ├── org.go
        ├── pipeline.go
        ├── queue.go
        ├── queue_test.go
        ├── repo.go
        ├── repo_test.go
        ├── types.go
        ├── user.go
        └── user_test.go
Download .txt
Showing preview only (573K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (5948 symbols across 727 files)

FILE: agent/log/line_writer.go
  type LineWriter (line 31) | type LineWriter struct
    method Write (line 52) | func (w *LineWriter) Write(p []byte) (n int, err error) {
  function NewLineWriter (line 42) | func NewLineWriter(peer rpc.Peer, stepUUID string, secret ...string) io....

FILE: agent/log/line_writer_test.go
  function TestLineWriter (line 28) | func TestLineWriter(t *testing.T) {

FILE: agent/logger.go
  method createLogger (line 30) | func (r *Runner) createLogger(_logger zerolog.Logger, workflow *rpc.Work...

FILE: agent/rpc/auth_client_grpc.go
  constant authClientTimeout (line 26) | authClientTimeout = time.Second * 5
  type AuthClient (line 28) | type AuthClient struct
    method AgentID (line 44) | func (c *AuthClient) AgentID() int64 {
    method Auth (line 48) | func (c *AuthClient) Auth(ctx context.Context) (string, int64, error) {
  function NewAuthGrpcClient (line 35) | func NewAuthGrpcClient(conn *grpc.ClientConn, agentToken string, agentID...

FILE: agent/rpc/auth_client_grpc_test.go
  function TestAuthClientAgentID (line 25) | func TestAuthClientAgentID(t *testing.T) {

FILE: agent/rpc/auth_interceptor.go
  type AuthInterceptor (line 27) | type AuthInterceptor struct
    method Unary (line 47) | func (interceptor *AuthInterceptor) Unary() grpc.UnaryClientInterceptor {
    method Stream (line 61) | func (interceptor *AuthInterceptor) Stream() grpc.StreamClientIntercep...
    method attachToken (line 74) | func (interceptor *AuthInterceptor) attachToken(ctx context.Context) c...
    method scheduleRefreshToken (line 78) | func (interceptor *AuthInterceptor) scheduleRefreshToken(ctx context.C...
    method refreshToken (line 105) | func (interceptor *AuthInterceptor) refreshToken(ctx context.Context) ...
  function NewAuthInterceptor (line 33) | func NewAuthInterceptor(ctx context.Context, authClient *AuthClient, ref...

FILE: agent/rpc/client_grpc.go
  constant ClientGrpcVersion (line 44) | ClientGrpcVersion int32 = proto.Version
  constant maxLogBatchSize (line 48) | maxLogBatchSize int = 1 * 1024 * 1024
  constant maxLogFlushPeriod (line 52) | maxLogFlushPeriod time.Duration = time.Second
  type client (line 55) | type client struct
    method IsConnected (line 93) | func (c *client) IsConnected() bool {
    method retryOpts (line 103) | func (c *client) retryOpts(op string) []backoff.RetryOption {
    method Version (line 196) | func (c *client) Version(ctx context.Context) (*rpc.Version, error) {
    method Next (line 208) | func (c *client) Next(ctx context.Context, filter rpc.Filter) (*rpc.Wo...
    method Wait (line 237) | func (c *client) Wait(ctx context.Context, workflowID string) (cancele...
    method Init (line 257) | func (c *client) Init(ctx context.Context, workflowID string, state rp...
    method Done (line 279) | func (c *client) Done(ctx context.Context, workflowID string, state rp...
    method Extend (line 301) | func (c *client) Extend(ctx context.Context, workflowID string) error {
    method Update (line 315) | func (c *client) Update(ctx context.Context, workflowID string, state ...
    method EnqueueLog (line 341) | func (c *client) EnqueueLog(logEntry *rpc.LogEntry) {
    method processLogs (line 351) | func (c *client) processLogs(ctx context.Context) {
    method sendLogs (line 398) | func (c *client) sendLogs(ctx context.Context, entries []*proto.LogEnt...
    method RegisterAgent (line 411) | func (c *client) RegisterAgent(ctx context.Context, info rpc.AgentInfo...
    method UnregisterAgent (line 426) | func (c *client) UnregisterAgent(ctx context.Context) error {
    method ReportHealth (line 431) | func (c *client) ReportHealth(ctx context.Context) error {
  function NewGrpcClient (line 66) | func NewGrpcClient(ctx context.Context, conn *grpc.ClientConn, opts ...C...
  type ClientOption (line 80) | type ClientOption
  function SetConnectionRetryTimeout (line 82) | func SetConnectionRetryTimeout(d time.Duration) ClientOption {
  function retryRPC (line 143) | func retryRPC[T any](ctx context.Context, c *client, opName string, op b...
  function classifyRPCErr (line 171) | func classifyRPCErr(ctx context.Context, err error) error {

FILE: agent/runner.go
  constant shutdownTimeout (line 36) | shutdownTimeout = time.Second * 5
  type Runner (line 38) | type Runner struct
    method Run (line 63) | func (r *Runner) Run(runnerCtx context.Context) error {
  function NewRunner (line 46) | func NewRunner(workEngine rpc.Peer, f rpc.Filter, h string, state *State...
  function GetShutdownContext (line 56) | func GetShutdownContext() (context.Context, context.CancelFunc) {
  function extractRepositoryName (line 219) | func extractRepositoryName(config *backend_types.Config) string {
  function extractPipelineNumber (line 223) | func extractPipelineNumber(config *backend_types.Config) string {

FILE: agent/state.go
  type State (line 25) | type State struct
    method Add (line 40) | func (s *State) Add(id string, timeout time.Duration, repo, pipeline s...
    method Done (line 54) | func (s *State) Done(id string) {
    method Healthy (line 62) | func (s *State) Healthy() bool {
    method WriteTo (line 75) | func (s *State) WriteTo(w io.Writer) (int64, error) {
  type Info (line 32) | type Info struct

FILE: agent/tracer.go
  method createTracer (line 30) | func (r *Runner) createTracer(ctxMeta context.Context, logger zerolog.Lo...

FILE: cli/admin/loglevel/loglevel.go
  function logLevel (line 36) | func logLevel(ctx context.Context, c *cli.Command) error {

FILE: cli/admin/org/org_list.go
  function orgList (line 48) | func orgList(ctx context.Context, c *cli.Command) error {

FILE: cli/admin/registry/registry_add.go
  function registryCreate (line 49) | func registryCreate(ctx context.Context, c *cli.Command) error {

FILE: cli/admin/registry/registry_list.go
  function registryList (line 38) | func registryList(ctx context.Context, c *cli.Command) error {

FILE: cli/admin/registry/registry_rm.go
  function registryDelete (line 38) | func registryDelete(ctx context.Context, c *cli.Command) error {

FILE: cli/admin/registry/registry_set.go
  function registryUpdate (line 51) | func registryUpdate(ctx context.Context, c *cli.Command) error {

FILE: cli/admin/registry/registry_show.go
  function registryShow (line 42) | func registryShow(ctx context.Context, c *cli.Command) error {

FILE: cli/admin/secret/secret_add.go
  function secretCreate (line 58) | func secretCreate(ctx context.Context, c *cli.Command) error {

FILE: cli/admin/secret/secret_list.go
  function secretList (line 39) | func secretList(ctx context.Context, c *cli.Command) error {

FILE: cli/admin/secret/secret_rm.go
  function secretDelete (line 37) | func secretDelete(ctx context.Context, c *cli.Command) error {

FILE: cli/admin/secret/secret_set.go
  function secretUpdate (line 58) | func secretUpdate(ctx context.Context, c *cli.Command) error {

FILE: cli/admin/secret/secret_show.go
  function secretShow (line 42) | func secretShow(ctx context.Context, c *cli.Command) error {

FILE: cli/admin/user/user_add.go
  function userAdd (line 34) | func userAdd(ctx context.Context, c *cli.Command) error {

FILE: cli/admin/user/user_list.go
  function userList (line 37) | func userList(ctx context.Context, c *cli.Command) error {

FILE: cli/admin/user/user_rm.go
  function userRemove (line 33) | func userRemove(ctx context.Context, c *cli.Command) error {

FILE: cli/admin/user/user_show.go
  function userShow (line 37) | func userShow(ctx context.Context, c *cli.Command) error {

FILE: cli/common/flags.go
  function FormatFlag (line 68) | func FormatFlag(tmpl string, deprecated bool, hidden ...bool) *cli.Strin...
  function OutputFlags (line 83) | func OutputFlags(def string) []cli.Flag {

FILE: cli/common/hooks.go
  function Before (line 34) | func Before(ctx context.Context, c *cli.Command) (context.Context, error) {
  function After (line 70) | func After(_ context.Context, _ *cli.Command) error {

FILE: cli/common/pipeline.go
  function DetectPipelineConfig (line 28) | func DetectPipelineConfig() (isDir bool, config string, _ error) {
  function RunPipelineFunc (line 41) | func RunPipelineFunc(ctx context.Context, c *cli.Command, fileFunc, dirF...

FILE: cli/common/zerologger.go
  function setupGlobalLogger (line 25) | func setupGlobalLogger(ctx context.Context, c *cli.Command) error {

FILE: cli/context/context.go
  function listContexts (line 79) | func listContexts(_ context.Context, c *cli.Command) error {
  function useContext (line 129) | func useContext(_ context.Context, c *cli.Command) error {
  function deleteContext (line 144) | func deleteContext(_ context.Context, c *cli.Command) error {
  function renameContext (line 159) | func renameContext(_ context.Context, c *cli.Command) error {

FILE: cli/exec/dummy.go
  function init (line 21) | func init() { //nolint:gochecknoinits

FILE: cli/exec/exec.go
  function run (line 71) | func run(ctx context.Context, c *cli.Command) error {
  function execDir (line 75) | func execDir(ctx context.Context, c *cli.Command, dir string) error {
  function execFile (line 117) | func execFile(ctx context.Context, c *cli.Command, file string) error {
  function runExec (line 130) | func runExec(ctx context.Context, c *cli.Command, file, repoPath string,...
  function execWithAxis (line 158) | func execWithAxis(ctx context.Context, c *cli.Command, file, repoPath st...
  function convertPathForWindows (line 338) | func convertPathForWindows(path string) string {

FILE: cli/exec/line.go
  type LineWriter (line 25) | type LineWriter struct
    method Write (line 41) | func (w *LineWriter) Write(p []byte) (n int, err error) {
    method Close (line 47) | func (w *LineWriter) Close() error {
  function NewLineWriter (line 33) | func NewLineWriter(stepName, stepUUID string) io.WriteCloser {

FILE: cli/exec/metadata.go
  function metadataFromContext (line 33) | func metadataFromContext(_ context.Context, c *cli.Command, axis matrix....
  function metadataFileAndOverrideOrDefault (line 160) | func metadataFileAndOverrideOrDefault[T any](c *cli.Command, flag string...

FILE: cli/exec/metadata_test.go
  function TestMetadataFromContext (line 31) | func TestMetadataFromContext(t *testing.T) {
  function createTempFile (line 133) | func createTempFile(t *testing.T, content any) string {

FILE: cli/info/info.go
  function info (line 37) | func info(ctx context.Context, c *cli.Command) error {

FILE: cli/internal/config/config.go
  type Config (line 30) | type Config struct
    method MergeIfNotSet (line 36) | func (c *Config) MergeIfNotSet(c2 *Config) {
  function Load (line 50) | func Load(ctx context.Context, c *cli.Command) error {
  function getConfigPath (line 111) | func getConfigPath(configPath string) (string, error) {
  function Get (line 124) | func Get(_ context.Context, c *cli.Command, _configPath string) (*Config...
  function Save (line 178) | func Save(_ context.Context, c *cli.Command, _configPath string, conf *C...

FILE: cli/internal/config/config_test.go
  function TestConfigMerge (line 23) | func TestConfigMerge(t *testing.T) {

FILE: cli/internal/config/context.go
  type Context (line 32) | type Context struct
  type Contexts (line 39) | type Contexts struct
  function getContextsPath (line 44) | func getContextsPath() (string, error) {
  function LoadContexts (line 53) | func LoadContexts() (*Contexts, error) {
  function SaveContexts (line 83) | func SaveContexts(contexts *Contexts) error {
  function GetCurrentContext (line 104) | func GetCurrentContext(ctx context.Context, c *cli.Command) (*Config, er...
  function GetContextConfig (line 123) | func GetContextConfig(c *cli.Command, ctx *Context) (*Config, error) {
  function AddOrUpdateContext (line 148) | func AddOrUpdateContext(c *cli.Command, name, serverURL, token, logLevel...
  function DeleteContext (line 175) | func DeleteContext(c *cli.Command, name string) error {
  function SetCurrentContext (line 204) | func SetCurrentContext(name string) error {
  function RenameContext (line 219) | func RenameContext(oldName, newName string) error {

FILE: cli/internal/config/context_test.go
  function TestContextManagement (line 26) | func TestContextManagement(t *testing.T) {

FILE: cli/internal/util.go
  function NewClient (line 38) | func NewClient(ctx context.Context, c *cli.Command) (woodpecker.Client, ...
  function getRepoFromGit (line 100) | func getRepoFromGit(remoteName string) (string, error) {
  function ParseRepo (line 127) | func ParseRepo(client woodpecker.Client, str string) (repoID int64, err ...
  function ParseKeyPair (line 158) | func ParseKeyPair(p []string) map[string]string {
  function ParseStep (line 179) | func ParseStep(client woodpecker.Client, repoID, number int64, stepArg s...

FILE: cli/internal/util_test.go
  function TestParseKeyPair (line 23) | func TestParseKeyPair(t *testing.T) {

FILE: cli/lint/lint.go
  function lint (line 65) | func lint(ctx context.Context, c *cli.Command) error {
  function lintDir (line 69) | func lintDir(ctx context.Context, c *cli.Command, dir string) error {
  function lintFile (line 97) | func lintFile(_ context.Context, c *cli.Command, file string) error {

FILE: cli/lint/utils.go
  function FormatLintError (line 27) | func FormatLintError(file string, err error, strict bool) (string, error) {

FILE: cli/org/registry/registry.go
  function parseTargetArgs (line 38) | func parseTargetArgs(client woodpecker.Client, c *cli.Command) (orgID in...

FILE: cli/org/registry/registry_add.go
  function registryCreate (line 52) | func registryCreate(ctx context.Context, c *cli.Command) error {

FILE: cli/org/registry/registry_list.go
  function registryList (line 40) | func registryList(ctx context.Context, c *cli.Command) error {

FILE: cli/org/registry/registry_rm.go
  function registryDelete (line 41) | func registryDelete(ctx context.Context, c *cli.Command) error {

FILE: cli/org/registry/registry_set.go
  function registryUpdate (line 52) | func registryUpdate(ctx context.Context, c *cli.Command) error {

FILE: cli/org/registry/registry_show.go
  function registryShow (line 44) | func registryShow(ctx context.Context, c *cli.Command) error {

FILE: cli/org/secret/secret.go
  function parseTargetArgs (line 38) | func parseTargetArgs(client woodpecker.Client, c *cli.Command) (orgID in...

FILE: cli/org/secret/secret_add.go
  function secretCreate (line 61) | func secretCreate(ctx context.Context, c *cli.Command) error {

FILE: cli/org/secret/secret_list.go
  function secretList (line 41) | func secretList(ctx context.Context, c *cli.Command) error {

FILE: cli/org/secret/secret_rm.go
  function secretDelete (line 40) | func secretDelete(ctx context.Context, c *cli.Command) error {

FILE: cli/org/secret/secret_set.go
  function secretUpdate (line 61) | func secretUpdate(ctx context.Context, c *cli.Command) error {

FILE: cli/org/secret/secret_show.go
  function secretShow (line 44) | func secretShow(ctx context.Context, c *cli.Command) error {

FILE: cli/output/output.go
  function ParseOutputOptions (line 24) | func ParseOutputOptions(out string) (string, []string) {

FILE: cli/output/output_test.go
  function TestParseOutputOptions (line 23) | func TestParseOutputOptions(t *testing.T) {

FILE: cli/output/table.go
  function NewTable (line 30) | func NewTable(out io.Writer) *Table {
  type FieldFn (line 42) | type FieldFn
  type writerFlusher (line 44) | type writerFlusher interface
  type Table (line 50) | type Table struct
    method Columns (line 59) | func (o *Table) Columns() (cols []string) {
    method AddFieldAlias (line 68) | func (o *Table) AddFieldAlias(field, alias string) *Table {
    method AddFieldFn (line 74) | func (o *Table) AddFieldFn(field string, fn FieldFn) *Table {
    method AddAllowedFields (line 82) | func (o *Table) AddAllowedFields(obj any) (*Table, error) {
    method RemoveAllowedField (line 108) | func (o *Table) RemoveAllowedField(fields ...string) *Table {
    method ValidateColumns (line 117) | func (o *Table) ValidateColumns(cols []string) error {
    method WriteHeader (line 131) | func (o *Table) WriteHeader(columns []string) {
    method Flush (line 139) | func (o *Table) Flush() error {
    method Write (line 144) | func (o *Table) Write(columns []string, obj any) error {
  function NA (line 187) | func NA(s string) string {
  function YesNo (line 194) | func YesNo(b bool) string {
  function fieldName (line 201) | func fieldName(name string) string {
  function sanitizeString (line 213) | func sanitizeString(value any) string {

FILE: cli/output/table_test.go
  type writerFlusherStub (line 25) | type writerFlusherStub struct
    method Flush (line 29) | func (s writerFlusherStub) Flush() error {
  type testFieldsStruct (line 33) | type testFieldsStruct struct
  function TestTableOutput (line 39) | func TestTableOutput(t *testing.T) {

FILE: cli/pipeline/approve.go
  function pipelineApprove (line 34) | func pipelineApprove(ctx context.Context, c *cli.Command) (err error) {

FILE: cli/pipeline/create.go
  function pipelineCreate (line 49) | func pipelineCreate(ctx context.Context, c *cli.Command) error {

FILE: cli/pipeline/decline.go
  function pipelineDecline (line 34) | func pipelineDecline(ctx context.Context, c *cli.Command) (err error) {

FILE: cli/pipeline/deploy/deploy.go
  function deploy (line 64) | func deploy(ctx context.Context, c *cli.Command) error {

FILE: cli/pipeline/kill.go
  function pipelineKill (line 35) | func pipelineKill(ctx context.Context, c *cli.Command) (err error) {

FILE: cli/pipeline/last.go
  function pipelineLast (line 41) | func pipelineLast(ctx context.Context, c *cli.Command) error {

FILE: cli/pipeline/list.go
  function buildPipelineListCmd (line 30) | func buildPipelineListCmd() *cli.Command {
  function List (line 76) | func List(ctx context.Context, c *cli.Command) error {
  function pipelineList (line 88) | func pipelineList(c *cli.Command, client woodpecker.Client) ([]*woodpeck...

FILE: cli/pipeline/list_test.go
  function TestPipelineList (line 31) | func TestPipelineList(t *testing.T) {

FILE: cli/pipeline/log/log_purge.go
  function logPurge (line 34) | func logPurge(ctx context.Context, c *cli.Command) (err error) {

FILE: cli/pipeline/log/log_show.go
  function logShow (line 37) | func logShow(ctx context.Context, c *cli.Command) error {
  function pipelineLog (line 72) | func pipelineLog(client woodpecker.Client, repoID, number int64) error {
  function stepLog (line 98) | func stepLog(client woodpecker.Client, repoID, number, step int64) error {

FILE: cli/pipeline/pipeline.go
  function pipelineOutput (line 53) | func pipelineOutput(c *cli.Command, pipelines []*woodpecker.Pipeline, fd...

FILE: cli/pipeline/pipeline_test.go
  function TestPipelineOutput (line 30) | func TestPipelineOutput(t *testing.T) {

FILE: cli/pipeline/ps.go
  function pipelinePs (line 39) | func pipelinePs(ctx context.Context, c *cli.Command) error {

FILE: cli/pipeline/purge.go
  function Purge (line 61) | func Purge(ctx context.Context, c *cli.Command) error {
  function pipelinePurge (line 70) | func pipelinePurge(c *cli.Command, client woodpecker.Client, start time....
  function fetchPipelinesToKeep (line 144) | func fetchPipelinesToKeep(client woodpecker.Client, repoID int64, branch...
  function fetchPipelines (line 160) | func fetchPipelines(client woodpecker.Client, repoID int64, branch strin...

FILE: cli/pipeline/purge_test.go
  function TestPipelinePurge (line 31) | func TestPipelinePurge(t *testing.T) {

FILE: cli/pipeline/queue.go
  function pipelineQueue (line 37) | func pipelineQueue(ctx context.Context, c *cli.Command) error {

FILE: cli/pipeline/show.go
  function pipelineShow (line 36) | func pipelineShow(ctx context.Context, c *cli.Command) error {

FILE: cli/pipeline/start.go
  function pipelineStart (line 46) | func pipelineStart(ctx context.Context, c *cli.Command) (err error) {

FILE: cli/pipeline/stop.go
  function pipelineStop (line 34) | func pipelineStop(ctx context.Context, c *cli.Command) (err error) {

FILE: cli/repo/cron/cron_add.go
  function cronCreate (line 59) | func cronCreate(ctx context.Context, c *cli.Command) error {

FILE: cli/repo/cron/cron_list.go
  function cronList (line 40) | func cronList(ctx context.Context, c *cli.Command) error {

FILE: cli/repo/cron/cron_rm.go
  function cronDelete (line 42) | func cronDelete(ctx context.Context, c *cli.Command) error {

FILE: cli/repo/cron/cron_show.go
  function cronShow (line 44) | func cronShow(ctx context.Context, c *cli.Command) error {

FILE: cli/repo/cron/cron_update.go
  function cronUpdate (line 62) | func cronUpdate(ctx context.Context, c *cli.Command) error {

FILE: cli/repo/registry/registry.go
  function parseTargetArgs (line 37) | func parseTargetArgs(client woodpecker.Client, c *cli.Command) (repoID i...

FILE: cli/repo/registry/registry_add.go
  function registryCreate (line 52) | func registryCreate(ctx context.Context, c *cli.Command) error {

FILE: cli/repo/registry/registry_list.go
  function registryList (line 40) | func registryList(ctx context.Context, c *cli.Command) error {

FILE: cli/repo/registry/registry_rm.go
  function registryDelete (line 41) | func registryDelete(ctx context.Context, c *cli.Command) error {

FILE: cli/repo/registry/registry_set.go
  function registryUpdate (line 52) | func registryUpdate(ctx context.Context, c *cli.Command) error {

FILE: cli/repo/registry/registry_show.go
  function registryShow (line 44) | func registryShow(ctx context.Context, c *cli.Command) error {

FILE: cli/repo/repo.go
  function repoOutput (line 52) | func repoOutput(c *cli.Command, repos []*woodpecker.Repo, fd ...io.Write...

FILE: cli/repo/repo_add.go
  function repoAdd (line 35) | func repoAdd(ctx context.Context, c *cli.Command) error {

FILE: cli/repo/repo_chown.go
  function repoChown (line 33) | func repoChown(ctx context.Context, c *cli.Command) error {

FILE: cli/repo/repo_list.go
  function List (line 45) | func List(ctx context.Context, c *cli.Command) error {
  function repoList (line 57) | func repoList(c *cli.Command, client woodpecker.Client) ([]*woodpecker.R...

FILE: cli/repo/repo_repair.go
  function repoRepair (line 33) | func repoRepair(ctx context.Context, c *cli.Command) error {

FILE: cli/repo/repo_rm.go
  function repoRemove (line 33) | func repoRemove(ctx context.Context, c *cli.Command) error {

FILE: cli/repo/repo_show.go
  function Show (line 35) | func Show(ctx context.Context, c *cli.Command) error {
  function repoShow (line 47) | func repoShow(c *cli.Command, client woodpecker.Client) (*woodpecker.Rep...

FILE: cli/repo/repo_show_test.go
  function TestRepoShow (line 30) | func TestRepoShow(t *testing.T) {

FILE: cli/repo/repo_sync.go
  function repoSync (line 38) | func repoSync(ctx context.Context, c *cli.Command) error {

FILE: cli/repo/repo_test.go
  function TestRepoOutput (line 30) | func TestRepoOutput(t *testing.T) {

FILE: cli/repo/repo_update.go
  function repoUpdate (line 82) | func repoUpdate(ctx context.Context, c *cli.Command) error {

FILE: cli/repo/secret/secret.go
  function parseTargetArgs (line 37) | func parseTargetArgs(client woodpecker.Client, c *cli.Command) (repoID i...

FILE: cli/repo/secret/secret_add.go
  function secretCreate (line 61) | func secretCreate(ctx context.Context, c *cli.Command) error {

FILE: cli/repo/secret/secret_list.go
  function secretList (line 41) | func secretList(ctx context.Context, c *cli.Command) error {

FILE: cli/repo/secret/secret_rm.go
  function secretDelete (line 40) | func secretDelete(ctx context.Context, c *cli.Command) error {

FILE: cli/repo/secret/secret_set.go
  function secretUpdate (line 61) | func secretUpdate(ctx context.Context, c *cli.Command) error {

FILE: cli/repo/secret/secret_show.go
  function secretShow (line 44) | func secretShow(ctx context.Context, c *cli.Command) error {

FILE: cli/setup/setup.go
  function setup (line 53) | func setup(ctx context.Context, c *cli.Command) error {

FILE: cli/setup/token_fetcher.go
  function receiveTokenFromUI (line 32) | func receiveTokenFromUI(c context.Context, serverURL string) (string, er...
  function setupRouter (line 80) | func setupRouter(tokenReceived chan string) *gin.Engine {
  function openBrowser (line 124) | func openBrowser(url string) error {
  function randomPort (line 142) | func randomPort() int {

FILE: cli/setup/ui/ask.go
  function Ask (line 24) | func Ask(prompt, placeholder string, required bool) (string, error) {

FILE: cli/setup/ui/confirm.go
  function Confirm (line 21) | func Confirm(prompt string) (bool, error) {

FILE: cli/update/command.go
  function update (line 40) | func update(ctx context.Context, c *cli.Command) error {

FILE: cli/update/tar.go
  constant tarDirectoryMode (line 26) | tarDirectoryMode fs.FileMode = 0x755
  function UnTar (line 28) | func UnTar(dst string, r io.Reader) error {

FILE: cli/update/types.go
  type VersionData (line 17) | type VersionData struct
  type NewVersion (line 23) | type NewVersion struct
  constant woodpeckerVersionURL (line 29) | woodpeckerVersionURL = "https://woodpecker-ci.org/version.json"
  constant githubBinaryURL (line 30) | githubBinaryURL      = "https://github.com/woodpecker-ci/woodpecker/rele...

FILE: cli/update/updater.go
  function CheckForUpdate (line 34) | func CheckForUpdate(ctx context.Context, force bool) (*NewVersion, error) {
  function checkForUpdate (line 38) | func checkForUpdate(ctx context.Context, versionURL string, force bool) ...
  function downloadNewVersion (line 91) | func downloadNewVersion(ctx context.Context, downloadURL string) (string...
  function extractNewVersion (line 124) | func extractNewVersion(tarFilePath string) (string, error) {

FILE: cli/update/updater_test.go
  function TestCheckForUpdate (line 27) | func TestCheckForUpdate(t *testing.T) {
  function TestDownloadNewVersion (line 50) | func TestDownloadNewVersion(t *testing.T) {

FILE: cmd/agent/core/agent.go
  constant reportHealthInterval (line 53) | reportHealthInterval           = time.Second * 10
  constant authInterceptorRefreshInterval (line 54) | authInterceptorRefreshInterval = time.Minute * 30
  function run (line 57) | func run(ctx context.Context, c *cli.Command, backends []types.Backend) ...
  function runWithRetry (line 349) | func runWithRetry(backendEngines []types.Backend) func(ctx context.Conte...
  function stringSliceAddToMap (line 372) | func stringSliceAddToMap(sl []string, m map[string]string) error {

FILE: cmd/agent/core/agent_test.go
  function TestStringSliceAddToMap (line 23) | func TestStringSliceAddToMap(t *testing.T) {

FILE: cmd/agent/core/config.go
  type AgentConfig (line 27) | type AgentConfig struct
  constant defaultAgentIDValue (line 31) | defaultAgentIDValue = int64(-1)
  function readAgentConfig (line 33) | func readAgentConfig(agentConfigPath string) AgentConfig {
  function writeAgentConfig (line 61) | func writeAgentConfig(conf AgentConfig, agentConfigPath string) error {

FILE: cmd/agent/core/config_test.go
  function TestReadAgentIDFileNotExists (line 25) | func TestReadAgentIDFileNotExists(t *testing.T) {
  function TestReadAgentIDFileExists (line 29) | func TestReadAgentIDFileExists(t *testing.T) {

FILE: cmd/agent/core/health.go
  function initHealth (line 35) | func initHealth() {
  function handleHeartbeat (line 41) | func handleHeartbeat(w http.ResponseWriter, _ *http.Request) {
  function handleVersion (line 49) | func handleVersion(w http.ResponseWriter, _ *http.Request) {
  function handleStats (line 61) | func handleStats(w http.ResponseWriter, _ *http.Request) {
  type versionResp (line 73) | type versionResp struct
  function pinger (line 85) | func pinger(ctx context.Context, c *cli.Command) error {

FILE: cmd/agent/core/health_test.go
  function TestHealthy (line 26) | func TestHealthy(t *testing.T) {

FILE: cmd/agent/core/run.go
  function GenApp (line 32) | func GenApp(backends []backend_types.Backend) *cli.Command {
  function RunAgent (line 53) | func RunAgent(ctx context.Context, backends []backend_types.Backend) {

FILE: cmd/agent/dummy.go
  function init (line 21) | func init() { //nolint:gochecknoinits

FILE: cmd/agent/main.go
  function main (line 36) | func main() {

FILE: cmd/agent/man.go
  function main (line 37) | func main() {

FILE: cmd/cli/app.go
  function newApp (line 35) | func newApp() *cli.Command {

FILE: cmd/cli/docs.go
  function main (line 25) | func main() {

FILE: cmd/cli/main.go
  function main (line 27) | func main() {

FILE: cmd/cli/man.go
  function main (line 25) | func main() {

FILE: cmd/server/app.go
  function genApp (line 23) | func genApp() *cli.Command {

FILE: cmd/server/flags.go
  function datasourceDefaultValue (line 639) | func datasourceDefaultValue() string {
  function getFirstNonEmptyEnvVar (line 647) | func getFirstNonEmptyEnvVar(envVars ...string) string {

FILE: cmd/server/grpc_server.go
  function runGrpcServer (line 33) | func runGrpcServer(ctx context.Context, c *cli.Command, _store store.Sto...

FILE: cmd/server/health.go
  constant pingTimeout (line 29) | pingTimeout = 1 * time.Second
  function pinger (line 33) | func pinger(_ context.Context, c *cli.Command) error {

FILE: cmd/server/main.go
  function main (line 30) | func main() {

FILE: cmd/server/man.go
  function main (line 28) | func main() {

FILE: cmd/server/metrics_server.go
  function startMetricsCollector (line 30) | func startMetricsCollector(ctx context.Context, _store store.Store) {

FILE: cmd/server/openapi.go
  function setupOpenAPIStaticConfig (line 36) | func setupOpenAPIStaticConfig() {

FILE: cmd/server/openapi/docs.go
  constant docTemplate (line 6) | docTemplate = `{
  function init (line 6318) | func init() {

FILE: cmd/server/openapi_json_gen.go
  function main (line 36) | func main() {
  function removeHost (line 68) | func removeHost(jsonIn string) (string, error) {
  function toOpenApi3 (line 81) | func toOpenApi3(input, output string) error {

FILE: cmd/server/openapi_test.go
  function TestSetupOpenApiStaticConfig (line 25) | func TestSetupOpenApiStaticConfig(t *testing.T) {

FILE: cmd/server/server.go
  constant shutdownTimeout (line 47) | shutdownTimeout = time.Second * 5
  function run (line 56) | func run(ctx context.Context, c *cli.Command) error {

FILE: cmd/server/setup.go
  constant queueInfoRefreshInterval (line 51) | queueInfoRefreshInterval = 500 * time.Millisecond
  constant storeInfoRefreshInterval (line 52) | storeInfoRefreshInterval = 10 * time.Second
  function setupStore (line 55) | func setupStore(ctx context.Context, c *cli.Command) (store.Store, error) {
  function checkSqliteFileExist (line 106) | func checkSqliteFileExist(path string) error {
  function setupQueue (line 115) | func setupQueue(ctx context.Context, s store.Store) (queue.Queue, error) {
  function setupMembershipService (line 122) | func setupMembershipService(_ context.Context, _store store.Store) cache...
  function setupLogStore (line 126) | func setupLogStore(c *cli.Command, s store.Store) (service_log.Service, ...
  constant jwtSecretID (line 137) | jwtSecretID = "jwt-secret"
  function setupJWTSecret (line 139) | func setupJWTSecret(_store store.Store) (string, error) {
  function setupEvilGlobals (line 160) | func setupEvilGlobals(ctx context.Context, c *cli.Command, s store.Store...

FILE: docs/docusaurus.config.ts
  method injectHtmlTags (line 234) | injectHtmlTags() {
  method configureWebpack (line 259) | configureWebpack() {

FILE: docs/plugins/woodpecker-plugins/src/index.ts
  function loadContent (line 10) | async function loadContent(): Promise<Content> {
  function contentLoaded (line 89) | async function contentLoaded({
  function pluginWoodpeckerPluginsIndex (line 125) | function pluginWoodpeckerPluginsIndex(context: LoadContext, options: any...

FILE: docs/plugins/woodpecker-plugins/src/markdown.ts
  function getHeader (line 8) | function getHeader<T = any>(data: string): T {
  function getRawHeader (line 13) | function getRawHeader(data: string): string {
  function getContent (line 21) | async function getContent(data: string): Promise<string> {

FILE: docs/plugins/woodpecker-plugins/src/theme/WoodpeckerPlugin.tsx
  function WoodpeckerPlugin (line 7) | function WoodpeckerPlugin({ plugin }: { plugin: WoodpeckerPluginType }) {

FILE: docs/plugins/woodpecker-plugins/src/theme/WoodpeckerPluginList.tsx
  function PluginPanel (line 10) | function PluginPanel({ plugin }: { plugin: WoodpeckerPlugin }) {
  function WoodpeckerPluginList (line 38) | function WoodpeckerPluginList({ plugins }: { plugins: WoodpeckerPlugin[]...

FILE: docs/plugins/woodpecker-plugins/src/types.ts
  type WoodpeckerPluginHeader (line 1) | type WoodpeckerPluginHeader = {
  type WoodpeckerPluginIndexEntry (line 12) | type WoodpeckerPluginIndexEntry = {
  type WoodpeckerPlugin (line 18) | type WoodpeckerPlugin = WoodpeckerPluginHeader & {
  type Content (line 26) | type Content = {

FILE: docs/src/components/HomepageFeatures.js
  function Feature (line 43) | function Feature({ Svg, title, description }) {
  function HomepageFeatures (line 57) | function HomepageFeatures() {

FILE: docs/src/pages/index.tsx
  function HomepageHeader (line 10) | function HomepageHeader() {
  function Home (line 27) | function Home() {

FILE: e2e/scenarios/agent_routing_test.go
  function TestAgentLabelRouting (line 47) | func TestAgentLabelRouting(t *testing.T) {

FILE: e2e/scenarios/cancel_test.go
  function TestCancelRunningPipeline (line 54) | func TestCancelRunningPipeline(t *testing.T) {

FILE: e2e/scenarios/fixtures.go
  type Scenario (line 47) | type Scenario struct
  type ExpectedStep (line 75) | type ExpectedStep struct
  type ExpectedWorkflow (line 82) | type ExpectedWorkflow struct
  function LoadScenarios (line 92) | func LoadScenarios(t *testing.T) []Scenario {
  function loadMultiWorkflowScenario (line 152) | func loadMultiWorkflowScenario(t *testing.T, dirName string) Scenario {

FILE: e2e/scenarios/infra_test.go
  function TestMain (line 40) | func TestMain(m *testing.M) {
  function TestInfraSmoke (line 70) | func TestInfraSmoke(t *testing.T) {

FILE: e2e/scenarios/matrix_test.go
  function TestMatrixPipeline (line 72) | func TestMatrixPipeline(t *testing.T) {
  function TestMatrixIncludePipeline (line 138) | func TestMatrixIncludePipeline(t *testing.T) {
  function TestMatrixSingleAxis (line 196) | func TestMatrixSingleAxis(t *testing.T) {
  function TestMatrixNoMatrix (line 250) | func TestMatrixNoMatrix(t *testing.T) {

FILE: e2e/scenarios/restart_test.go
  function TestRestartPipeline (line 34) | func TestRestartPipeline(t *testing.T) {

FILE: e2e/scenarios/suite_test.go
  function TestScenarios (line 36) | func TestScenarios(t *testing.T) {
  function runScenario (line 46) | func runScenario(t *testing.T, sc Scenario) {
  function expStepsToName (line 114) | func expStepsToName(in []ExpectedStep) []string {
  function modelStepsToName (line 122) | func modelStepsToName(in []*model.Step) []string {
  function expWorkflowsToName (line 130) | func expWorkflowsToName(in []ExpectedWorkflow) []string {
  function modelWorkflowsToName (line 138) | func modelWorkflowsToName(in []*model.Workflow) []string {

FILE: e2e/setup/agent.go
  constant AgentMaxWorkflows (line 40) | AgentMaxWorkflows     = 4
  constant agentAuthRefreshEvery (line 41) | agentAuthRefreshEvery = 30 * time.Minute
  type AgentEnv (line 46) | type AgentEnv struct
  type AgentOption (line 61) | type AgentOption
  type agentConfig (line 63) | type agentConfig struct
  function WithHostname (line 78) | func WithHostname(name string) AgentOption {
  function WithCustomLabels (line 91) | func WithCustomLabels(labels map[string]string) AgentOption {
  function WithOrgID (line 103) | func WithOrgID(id int64) AgentOption {
  function StartAgent (line 111) | func StartAgent(t *testing.T, grpcAddr string, opts ...AgentOption) *Age...

FILE: e2e/setup/forge.go
  function newMockForge (line 39) | func newMockForge(t *testing.T, files []*forge_types.FileMeta) *forge_mo...

FILE: e2e/setup/server.go
  constant TestAgentToken (line 51) | TestAgentToken = "test-agent-secret-for-integration-tests"
  constant TestJWTSecret (line 54) | TestJWTSecret = "test-jwt-secret-for-integration-tests"
  constant TestForgeType (line 57) | TestForgeType = model.ForgeTypeGitea
  type ServerEnv (line 63) | type ServerEnv struct
  function StartServer (line 83) | func StartServer(ctx context.Context, t *testing.T, files []*forge_types...
  function newTestManager (line 144) | func newTestManager(s store.Store, mockForge *forge_mocks.MockForge) (se...
  function startGRPCServer (line 166) | func startGRPCServer(ctx context.Context, t *testing.T, s store.Store) s...

FILE: e2e/setup/store.go
  type Fixtures (line 31) | type Fixtures struct
  function newStore (line 38) | func newStore(ctx context.Context, t *testing.T) store.Store {
  function seedFixtures (line 63) | func seedFixtures(t *testing.T, s store.Store) *Fixtures {

FILE: e2e/setup/wait.go
  constant defaultTimeout (line 33) | defaultTimeout  = 30 * time.Second
  constant defaultRetry (line 34) | defaultRetry    = 3
  constant shortTimeout (line 35) | shortTimeout    = 10 * time.Second
  constant defaultInterval (line 36) | defaultInterval = 100 * time.Millisecond
  function isTerminal (line 40) | func isTerminal(s model.StatusValue) bool {
  function WaitForPipeline (line 51) | func WaitForPipeline(t *testing.T, s store.Store, pipelineID int64) *mod...
  function WaitForPipelineStatus (line 58) | func WaitForPipelineStatus(t *testing.T, s store.Store, pipelineID int64...
  function WaitForAgentRegistered (line 85) | func WaitForAgentRegistered(t *testing.T, s store.Store, agents ...*Agen...
  function WaitForStep (line 123) | func WaitForStep(t *testing.T, s store.Store, pipeline *model.Pipeline, ...
  function WaitForStepStatus (line 132) | func WaitForStepStatus(t *testing.T, s store.Store, pipeline *model.Pipe...
  function AssertWorkflowRanOnAgent (line 176) | func AssertWorkflowRanOnAgent(t *testing.T, s store.Store, pipeline *mod...
  function WaitForWorkersReady (line 200) | func WaitForWorkersReady(t *testing.T, q queue.Queue, minWorkers int) {
  function WaitForStepRunning (line 221) | func WaitForStepRunning(t *testing.T, s store.Store, pipelineID int64, s...

FILE: pipeline/backend/backend.go
  function FindBackend (line 24) | func FindBackend(ctx context.Context, backends []types.Backend, backendN...

FILE: pipeline/backend/common/script.go
  function GenerateContainerConf (line 21) | func GenerateContainerConf(commands []string, osType, workDir string) (e...

FILE: pipeline/backend/common/script_posix.go
  function generateScriptPosix (line 27) | func generateScriptPosix(commands []string, workDir string) string {
  constant setupScriptProto (line 50) | setupScriptProto = `
  constant traceScript (line 70) | traceScript = `

FILE: pipeline/backend/common/script_posix_test.go
  function TestGenerateScriptPosix (line 24) | func TestGenerateScriptPosix(t *testing.T) {
  function TestSetupScriptProtoParse (line 63) | func TestSetupScriptProtoParse(t *testing.T) {

FILE: pipeline/backend/common/script_test.go
  constant windowsScriptBase64 (line 24) | windowsScriptBase64 = "CiRFcnJvckFjdGlvblByZWZlcmVuY2UgPSAnU3RvcCc7CmlmI...
  constant posixScriptBase64 (line 25) | posixScriptBase64   = "CmlmIFsgLW4gIiRDSV9ORVRSQ19NQUNISU5FIiBdOyB0aGVuC...
  function TestGenerateContainerConf (line 28) | func TestGenerateContainerConf(t *testing.T) {

FILE: pipeline/backend/common/script_win.go
  function generateScriptWindows (line 24) | func generateScriptWindows(commands []string, workDir string) string {
  constant setupScriptWinProto (line 47) | setupScriptWinProto = `
  constant traceScriptWin (line 67) | traceScriptWin = `

FILE: pipeline/backend/common/script_win_test.go
  function TestGenerateScriptWin (line 24) | func TestGenerateScriptWin(t *testing.T) {
  function TestSetupScriptWinProtoParse (line 63) | func TestSetupScriptWinProtoParse(t *testing.T) {

FILE: pipeline/backend/docker/backend_options.go
  type BackendOptions (line 24) | type BackendOptions struct
  function parseBackendOptions (line 28) | func parseBackendOptions(step *backend_types.Step) (BackendOptions, erro...

FILE: pipeline/backend/docker/backend_options_test.go
  function Test_parseBackendOptions (line 25) | func Test_parseBackendOptions(t *testing.T) {

FILE: pipeline/backend/docker/config.go
  type config (line 25) | type config struct
  type resourceLimit (line 33) | type resourceLimit struct
  function configFromCli (line 42) | func configFromCli(c *cli.Command) (config, error) {

FILE: pipeline/backend/docker/convert.go
  constant minVolumeComponents (line 33) | minVolumeComponents = 2
  method toConfig (line 36) | func (e *docker) toConfig(step *types.Step, options BackendOptions) *con...
  function toContainerName (line 72) | func toContainerName(step *types.Step) string {
  function toHostConfig (line 77) | func toHostConfig(step *types.Step, conf *config) (*container.HostConfig...
  function toVol (line 141) | func toVol(paths []string) map[string]struct{} {
  function toEnv (line 161) | func toEnv(env map[string]string) []string {
  function toDev (line 174) | func toDev(paths []string) []container.DeviceMapping {
  function encodeAuthToBase64 (line 199) | func encodeAuthToBase64(authConfig types.Auth) (string, error) {
  function splitVolumeParts (line 216) | func splitVolumeParts(volumeParts string) ([]string, error) {
  function toRef (line 236) | func toRef[T any](v T) *T {

FILE: pipeline/backend/docker/convert_test.go
  function TestSplitVolumeParts (line 31) | func TestSplitVolumeParts(t *testing.T) {
  function TestToContainerName (line 127) | func TestToContainerName(t *testing.T) {
  function TestStepToConfig (line 132) | func TestStepToConfig(t *testing.T) {
  function TestToEnv (line 149) | func TestToEnv(t *testing.T) {
  function TestToVol (line 155) | func TestToVol(t *testing.T) {
  function TestEncodeAuthToBase64 (line 160) | func TestEncodeAuthToBase64(t *testing.T) {
  function TestToConfigSmall (line 170) | func TestToConfigSmall(t *testing.T) {
  function TestToConfigFull (line 196) | func TestToConfigFull(t *testing.T) {
  function TestToWindowsConfig (line 261) | func TestToWindowsConfig(t *testing.T) {

FILE: pipeline/backend/docker/convert_win.go
  constant osTypeWindows (line 26) | osTypeWindows              = "windows"
  constant defaultWindowsDriverLetter (line 27) | defaultWindowsDriverLetter = "C:"
  method windowsPathPatch (line 44) | func (e *docker) windowsPathPatch(step *types.Step) {

FILE: pipeline/backend/docker/convert_win_test.go
  function TestMustNotAddWindowsLetterPattern (line 19) | func TestMustNotAddWindowsLetterPattern(t *testing.T) {

FILE: pipeline/backend/docker/docker.go
  constant containerKillTimeout (line 46) | containerKillTimeout               = 5
  constant volumeRetryWait (line 47) | volumeRetryWait      time.Duration = 1 * time.Second
  constant maxRetry (line 48) | maxRetry             uint          = 3
  type docker (line 51) | type docker struct
    method Name (line 71) | func (e *docker) Name() string {
    method IsAvailable (line 75) | func (e *docker) IsAvailable(ctx context.Context) bool {
    method Flags (line 110) | func (e *docker) Flags() []cli.Flag {
    method Load (line 115) | func (e *docker) Load(ctx context.Context) (*backend_types.BackendInfo...
    method SetupWorkflow (line 155) | func (e *docker) SetupWorkflow(ctx context.Context, conf *backend_type...
    method StartStep (line 177) | func (e *docker) StartStep(ctx context.Context, step *backend_types.St...
    method WaitStep (line 277) | func (e *docker) WaitStep(ctx context.Context, step *backend_types.Ste...
    method TailStep (line 315) | func (e *docker) TailStep(ctx context.Context, step *backend_types.Ste...
    method DestroyStep (line 339) | func (e *docker) DestroyStep(ctx context.Context, step *backend_types....
    method DestroyWorkflow (line 368) | func (e *docker) DestroyWorkflow(ctx context.Context, conf *backend_ty...
  constant EngineName (line 58) | EngineName          = "docker"
  constant networkDriverNAT (line 59) | networkDriverNAT    = "nat"
  constant networkDriverBridge (line 60) | networkDriverBridge = "bridge"
  constant volumeDriver (line 61) | volumeDriver        = "local"
  function New (line 65) | func New() backend_types.Backend {
  function httpClientOfOpts (line 85) | func httpClientOfOpts(dockerCertPath string, verifyTLS bool) *http.Client {
  function normalizeArchType (line 418) | func normalizeArchType(s string) string {

FILE: pipeline/backend/docker/errors.go
  function isErrContainerNotFoundOrNotRunning (line 19) | func isErrContainerNotFoundOrNotRunning(err error) bool {
  function isErrVolumeInUse (line 32) | func isErrVolumeInUse(err error) bool {

FILE: pipeline/backend/dummy/dummy.go
  type dummy (line 34) | type dummy struct
    method Name (line 76) | func (e *dummy) Name() string {
    method IsAvailable (line 80) | func (e *dummy) IsAvailable(_ context.Context) bool {
    method Flags (line 84) | func (e *dummy) Flags() []cli.Flag {
    method Load (line 89) | func (e *dummy) Load(_ context.Context) (*backend_types.BackendInfo, e...
    method SetupWorkflow (line 95) | func (e *dummy) SetupWorkflow(_ context.Context, _ *backend_types.Conf...
    method StartStep (line 104) | func (e *dummy) StartStep(_ context.Context, step *backend_types.Step,...
    method WaitStep (line 155) | func (e *dummy) WaitStep(ctx context.Context, step *backend_types.Step...
    method TailStep (line 218) | func (e *dummy) TailStep(_ context.Context, step *backend_types.Step, ...
    method DestroyStep (line 244) | func (e *dummy) DestroyStep(_ context.Context, step *backend_types.Ste...
    method DestroyWorkflow (line 269) | func (e *dummy) DestroyWorkflow(_ context.Context, _ *backend_types.Co...
  constant WorkflowSetupFailUUID (line 40) | WorkflowSetupFailUUID = "WorkflowSetupShouldFail"
  constant EnvKeyStepSleep (line 41) | EnvKeyStepSleep       = "SLEEP"
  constant EnvKeyStepType (line 42) | EnvKeyStepType        = "EXPECT_TYPE"
  constant EnvKeyStepStartFail (line 43) | EnvKeyStepStartFail   = "STEP_START_FAIL"
  constant EnvKeyStepExitCode (line 44) | EnvKeyStepExitCode    = "STEP_EXIT_CODE"
  constant EnvKeyStepTailFail (line 45) | EnvKeyStepTailFail    = "STEP_TAIL_FAIL"
  constant EnvKeyStepOOMKilled (line 46) | EnvKeyStepOOMKilled   = "STEP_OOM_KILLED"
  constant stepStateStarted (line 49) | stepStateStarted   = "started"
  constant stepStateDone (line 50) | stepStateDone      = "done"
  constant testServiceTimeout (line 51) | testServiceTimeout = 1 * time.Second
  constant ExitCodeCanceled (line 56) | ExitCodeCanceled = 130
  function stepKey (line 60) | func stepKey(taskUUID, stepUUID string) string {
  function workflowKey (line 65) | func workflowKey(taskUUID string) string {
  function New (line 70) | func New() backend_types.Backend {
  function canceledState (line 133) | func canceledState() *backend_types.State {
  function sleepWithContext (line 139) | func sleepWithContext(ctx context.Context, stop <-chan struct{}, d time....
  function dummyExecStepOutput (line 286) | func dummyExecStepOutput(step *backend_types.Step) string {

FILE: pipeline/backend/dummy/dummy_test.go
  function TestSmalPipelineDummyRun (line 29) | func TestSmalPipelineDummyRun(t *testing.T) {
  function TestWaitStepCanceledBySleep (line 168) | func TestWaitStepCanceledBySleep(t *testing.T) {

FILE: pipeline/backend/kubernetes/backend_options.go
  type BackendOptions (line 25) | type BackendOptions struct
  type Resources (line 39) | type Resources struct
  type Toleration (line 45) | type Toleration struct
  type TaintEffect (line 53) | type TaintEffect
  constant TaintEffectNoSchedule (line 56) | TaintEffectNoSchedule       TaintEffect = "NoSchedule"
  constant TaintEffectPreferNoSchedule (line 57) | TaintEffectPreferNoSchedule TaintEffect = "PreferNoSchedule"
  constant TaintEffectNoExecute (line 58) | TaintEffectNoExecute        TaintEffect = "NoExecute"
  type TolerationOperator (line 61) | type TolerationOperator
  constant TolerationOpExists (line 64) | TolerationOpExists TolerationOperator = "Exists"
  constant TolerationOpEqual (line 65) | TolerationOpEqual  TolerationOperator = "Equal"
  type SecurityContext (line 68) | type SecurityContext struct
  type SecProfile (line 81) | type SecProfile struct
  type SecProfileType (line 86) | type SecProfileType
  type Capabilities (line 88) | type Capabilities struct
  type SecretRef (line 93) | type SecretRef struct
  type SecretTarget (line 100) | type SecretTarget struct
  constant SecProfileTypeRuntimeDefault (line 106) | SecProfileTypeRuntimeDefault SecProfileType = "RuntimeDefault"
  constant SecProfileTypeLocalhost (line 107) | SecProfileTypeLocalhost      SecProfileType = "Localhost"
  function parseBackendOptions (line 110) | func parseBackendOptions(step *backend_types.Step) (BackendOptions, erro...

FILE: pipeline/backend/kubernetes/backend_options_test.go
  function Test_parseBackendOptions (line 27) | func Test_parseBackendOptions(t *testing.T) {

FILE: pipeline/backend/kubernetes/kubernetes.go
  constant EngineName (line 48) | EngineName = "kubernetes"
  constant defaultResyncDuration (line 50) | defaultResyncDuration = 5 * time.Second
  constant maxRetryDuration (line 51) | maxRetryDuration      = 1 * time.Minute
  type kube (line 54) | type kube struct
    method Name (line 172) | func (e *kube) Name() string {
    method IsAvailable (line 176) | func (e *kube) IsAvailable(context.Context) bool {
    method Flags (line 181) | func (e *kube) Flags() []cli.Flag {
    method Load (line 185) | func (e *kube) Load(ctx context.Context) (*types.BackendInfo, error) {
    method getConfig (line 213) | func (e *kube) getConfig() *config {
    method SetupWorkflow (line 226) | func (e *kube) SetupWorkflow(ctx context.Context, conf *types.Config, ...
    method StartStep (line 255) | func (e *kube) StartStep(ctx context.Context, step *types.Step, taskUU...
    method WaitStep (line 282) | func (e *kube) WaitStep(ctx context.Context, step *types.Step, taskUUI...
    method TailStep (line 362) | func (e *kube) TailStep(ctx context.Context, step *types.Step, taskUUI...
    method DestroyStep (line 448) | func (e *kube) DestroyStep(ctx context.Context, step *types.Step, task...
    method DestroyWorkflow (line 473) | func (e *kube) DestroyWorkflow(ctx context.Context, conf *types.Config...
  type config (line 60) | type config struct
    method GetNamespace (line 82) | func (c *config) GetNamespace(orgID int64) string {
    method newDefaultDeleteOptions (line 94) | func (c *config) newDefaultDeleteOptions() kube_meta_v1.DeleteOptions {
  type SecurityContextConfig (line 89) | type SecurityContextConfig struct
  function configFromCliContext (line 103) | func configFromCliContext(ctx context.Context) (*config, error) {
  function New (line 168) | func New() types.Backend {

FILE: pipeline/backend/kubernetes/kubernetes_test.go
  function TestGettingConfig (line 35) | func TestGettingConfig(t *testing.T) {
  function TestSetupWorkflow (line 67) | func TestSetupWorkflow(t *testing.T) {
  function TestAffinityFromCliContext (line 141) | func TestAffinityFromCliContext(t *testing.T) {
  function makeStep (line 184) | func makeStep(uuid string) *types.Step {
  function makeEngine (line 192) | func makeEngine(client *fake.Clientset) *kube {
  function createPod (line 201) | func createPod(
  function TestWaitStepReturnsOnContextCancel (line 227) | func TestWaitStepReturnsOnContextCancel(t *testing.T) {
  function TestWaitStepNoGoroutineLeak (line 262) | func TestWaitStepNoGoroutineLeak(t *testing.T) {

FILE: pipeline/backend/kubernetes/namespace.go
  type K8sNamespaceClient (line 26) | type K8sNamespaceClient interface
  function mkNamespace (line 31) | func mkNamespace(ctx context.Context, client K8sNamespaceClient, namespa...

FILE: pipeline/backend/kubernetes/namespace_test.go
  type mockNamespaceClient (line 29) | type mockNamespaceClient struct
    method Get (line 37) | func (m *mockNamespaceClient) Get(_ context.Context, name string, _ ku...
    method Create (line 47) | func (m *mockNamespaceClient) Create(_ context.Context, ns *kube_core_...
  function TestMkNamespace (line 53) | func TestMkNamespace(t *testing.T) {

FILE: pipeline/backend/kubernetes/pod.go
  constant StepLabelLegacy (line 37) | StepLabelLegacy          = "step"
  constant StepLabel (line 38) | StepLabel                = "woodpecker-ci.org/step"
  constant TaskUUIDLabel (line 39) | TaskUUIDLabel            = "woodpecker-ci.org/task-uuid"
  constant podPrefix (line 40) | podPrefix                = "wp-"
  constant defaultFSGroup (line 41) | defaultFSGroup     int64 = 1000
  constant initContainerImage (line 42) | initContainerImage       = "busybox:stable-musl"
  function mkPod (line 45) | func mkPod(step *types.Step, config *config, podName, goos string, optio...
  function stepToPodName (line 83) | func stepToPodName(step *types.Step) (name string, err error) {
  function podName (line 90) | func podName(step *types.Step) (string, error) {
  function podMeta (line 94) | func podMeta(step *types.Step, config *config, options BackendOptions, p...
  function podLabels (line 110) | func podLabels(step *types.Step, config *config, options BackendOptions,...
  function stepLabel (line 158) | func stepLabel(step *types.Step) (string, error) {
  function podAnnotations (line 162) | func podAnnotations(config *config, options BackendOptions) map[string]s...
  function podSpec (line 181) | func podSpec(step *types.Step, config *config, options BackendOptions, n...
  function podContainer (line 240) | func podContainer(step *types.Step, podName, goos string, options Backen...
  function podInitContainer (line 296) | func podInitContainer(podSpec *kube_core_v1.PodSpec, container *kube_cor...
  function mapToEnvVarsFromStepSecrets (line 345) | func mapToEnvVarsFromStepSecrets(secs []string, stepSecretName string) [...
  function filterSecrets (line 363) | func filterSecrets(environment, secrets map[string]string) (map[string]s...
  function pvcVolumes (line 377) | func pvcVolumes(volumes []string) ([]kube_core_v1.Volume, error) {
  function pvcVolume (line 391) | func pvcVolume(name string) kube_core_v1.Volume {
  function volumeMounts (line 404) | func volumeMounts(volumes []string) ([]kube_core_v1.VolumeMount, error) {
  function volumeMount (line 419) | func volumeMount(name, path string) kube_core_v1.VolumeMount {
  function containerPorts (line 426) | func containerPorts(ports []types.Port) []kube_core_v1.ContainerPort {
  function containerPort (line 434) | func containerPort(port types.Port) kube_core_v1.ContainerPort {
  function hostAliases (line 442) | func hostAliases(extraHosts []types.HostAlias) []kube_core_v1.HostAlias {
  function hostAlias (line 451) | func hostAlias(extraHost types.HostAlias) kube_core_v1.HostAlias {
  function resourceRequirements (line 458) | func resourceRequirements(resources Resources) (kube_core_v1.ResourceReq...
  function resourceList (line 475) | func resourceList(resources map[string]string) (kube_core_v1.ResourceLis...
  function nodeSelector (line 488) | func nodeSelector(backendNodeSelector, configNodeSelector map[string]str...
  function tolerations (line 510) | func tolerations(backendTolerations []Toleration) []kube_core_v1.Tolerat...
  function toleration (line 524) | func toleration(backendToleration Toleration) kube_core_v1.Toleration {
  function affinity (line 534) | func affinity(stepAffinity, agentAffinity *kube_core_v1.Affinity, allowF...
  function podSecurityContext (line 553) | func podSecurityContext(sc *SecurityContext, secCtxConf SecurityContextC...
  function seccompProfile (line 619) | func seccompProfile(scp *SecProfile) *kube_core_v1.SeccompProfile {
  function apparmorProfile (line 635) | func apparmorProfile(scp *SecProfile) *kube_core_v1.AppArmorProfile {
  function containerCapabilities (line 651) | func containerCapabilities(capabilities *Capabilities) *kube_core_v1.Cap...
  function containerSecurityContext (line 667) | func containerSecurityContext(sc *SecurityContext, stepPrivileged bool) ...
  function mapToEnvVars (line 704) | func mapToEnvVars(m map[string]string) []kube_core_v1.EnvVar {
  function dnsConfig (line 715) | func dnsConfig(namespace, subdomain string) *kube_core_v1.PodDNSConfig {
  function startPod (line 721) | func startPod(ctx context.Context, engine *kube, step *types.Step, optio...
  function stopPod (line 736) | func stopPod(ctx context.Context, engine *kube, step *types.Step, delete...

FILE: pipeline/backend/kubernetes/pod_test.go
  constant taskUUID (line 29) | taskUUID = "11301"
  function TestPodName (line 31) | func TestPodName(t *testing.T) {
  function TestStepToPodName (line 43) | func TestStepToPodName(t *testing.T) {
  function TestPodMeta (line 69) | func TestPodMeta(t *testing.T) {
  function TestStepLabel (line 116) | func TestStepLabel(t *testing.T) {
  function TestPodHostnameSanitized (line 125) | func TestPodHostnameSanitized(t *testing.T) {
  function TestTinyPod (line 137) | func TestTinyPod(t *testing.T) {
  function TestFullPod (line 223) | func TestFullPod(t *testing.T) {
  function TestPodPrivilege (line 457) | func TestPodPrivilege(t *testing.T) {
  function TestScratchPod (line 589) | func TestScratchPod(t *testing.T) {
  function TestSecrets (line 641) | func TestSecrets(t *testing.T) {
  function TestPodTolerations (line 767) | func TestPodTolerations(t *testing.T) {
  function TestPodTolerationsAllowFromStep (line 832) | func TestPodTolerationsAllowFromStep(t *testing.T) {
  function TestStepSecret (line 936) | func TestStepSecret(t *testing.T) {
  function TestPodAffinity (line 967) | func TestPodAffinity(t *testing.T) {
  function TestPodAffinityAllowFromStep (line 1038) | func TestPodAffinityAllowFromStep(t *testing.T) {
  function TestPodAffinityStepOverridesAgent (line 1168) | func TestPodAffinityStepOverridesAgent(t *testing.T) {
  function TestInitContainer (line 1271) | func TestInitContainer(t *testing.T) {
  function TestUnrequiredInitContainer (line 1330) | func TestUnrequiredInitContainer(t *testing.T) {

FILE: pipeline/backend/kubernetes/secrets.go
  type nativeSecretsProcessor (line 36) | type nativeSecretsProcessor struct
    method isEnabled (line 52) | func (nsp *nativeSecretsProcessor) isEnabled() bool {
    method process (line 56) | func (nsp *nativeSecretsProcessor) process() error {
  function newNativeSecretsProcessor (line 45) | func newNativeSecretsProcessor(config *config, secrets []SecretRef) nati...
  method isSimple (line 98) | func (sr SecretRef) isSimple() bool {
  method isAdvanced (line 102) | func (sr SecretRef) isAdvanced() bool {
  method isFile (line 106) | func (sr SecretRef) isFile() bool {
  method toEnvFromSource (line 110) | func (sr SecretRef) toEnvFromSource() (kube_core_v1.EnvFromSource, error) {
  method toEnvVar (line 126) | func (sr SecretRef) toEnvVar() (kube_core_v1.EnvVar, error) {
  method toVolume (line 149) | func (sr SecretRef) toVolume() (kube_core_v1.Volume, error) {
  method toVolumeMount (line 169) | func (sr SecretRef) toVolumeMount() (kube_core_v1.VolumeMount, error) {
  function secretsReferences (line 190) | func secretsReferences(names []string) []kube_core_v1.LocalObjectReferen...
  function secretReference (line 198) | func secretReference(name string) kube_core_v1.LocalObjectReference {
  function needsRegistrySecret (line 204) | func needsRegistrySecret(step *types.Step) bool {
  function mkRegistrySecret (line 208) | func mkRegistrySecret(step *types.Step, config *config) (*kube_core_v1.S...
  function registrySecretName (line 251) | func registrySecretName(step *types.Step) (string, error) {
  function registrySecretLabels (line 255) | func registrySecretLabels(step *types.Step, config *config) (map[string]...
  function startRegistrySecret (line 285) | func startRegistrySecret(ctx context.Context, engine *kube, step *types....
  function stopRegistrySecret (line 298) | func stopRegistrySecret(ctx context.Context, engine *kube, step *types.S...
  function needsStepSecret (line 312) | func needsStepSecret(step *types.Step) bool {
  function startStepSecret (line 316) | func startStepSecret(ctx context.Context, e *kube, step *types.Step) err...
  function mkStepSecret (line 329) | func mkStepSecret(step *types.Step, config *config) (*kube_core_v1.Secre...
  function stepSecretName (line 345) | func stepSecretName(step *types.Step) (string, error) {
  function stopStepSecret (line 353) | func stopStepSecret(ctx context.Context, engine *kube, step *types.Step,...

FILE: pipeline/backend/kubernetes/secrets_test.go
  function TestNativeSecretsEnabled (line 28) | func TestNativeSecretsEnabled(t *testing.T) {
  function TestNativeSecretsDisabled (line 35) | func TestNativeSecretsDisabled(t *testing.T) {
  function TestSimpleSecret (line 67) | func TestSimpleSecret(t *testing.T) {
  function TestSecretWithKey (line 90) | func TestSecretWithKey(t *testing.T) {
  function TestSecretWithKeyMapping (line 118) | func TestSecretWithKeyMapping(t *testing.T) {
  function TestFileSecret (line 149) | func TestFileSecret(t *testing.T) {
  function TestNoAuthNoSecret (line 186) | func TestNoAuthNoSecret(t *testing.T) {
  function TestNoPasswordNoSecret (line 190) | func TestNoPasswordNoSecret(t *testing.T) {
  function TestNoUsernameNoSecret (line 196) | func TestNoUsernameNoSecret(t *testing.T) {
  function TestUsernameAndPasswordNeedsSecret (line 202) | func TestUsernameAndPasswordNeedsSecret(t *testing.T) {
  function TestRegistrySecret (line 208) | func TestRegistrySecret(t *testing.T) {

FILE: pipeline/backend/kubernetes/service.go
  constant ServiceLabel (line 29) | ServiceLabel          = "service"
  constant HeadlessServicePrefix (line 30) | HeadlessServicePrefix = "wp-hsvc-"
  constant ServicePrefix (line 31) | ServicePrefix         = "wp-svc-"
  function mkHeadlessService (line 34) | func mkHeadlessService(namespace, taskUUID string) (*kube_core_v1.Servic...
  function serviceName (line 58) | func serviceName(step *types.Step) (string, error) {
  function isService (line 62) | func isService(step *types.Step) bool {
  function subdomain (line 66) | func subdomain(taskUUID string) (string, error) {
  function startHeadlessService (line 70) | func startHeadlessService(ctx context.Context, engine *kube, namespace, ...
  method stopHeadlessService (line 80) | func (e *kube) stopHeadlessService(ctx context.Context, engine *kube, na...

FILE: pipeline/backend/kubernetes/service_test.go
  function TestServiceName (line 29) | func TestServiceName(t *testing.T) {
  function TestHeadlessService (line 43) | func TestHeadlessService(t *testing.T) {
  function TestInvalidHeadlessService (line 69) | func TestInvalidHeadlessService(t *testing.T) {
  function TestStartHeadlessService (line 74) | func TestStartHeadlessService(t *testing.T) {
  function TestStopHeadlessService (line 107) | func TestStopHeadlessService(t *testing.T) {

FILE: pipeline/backend/kubernetes/utils.go
  constant maxDNSLabelLen (line 29) | maxDNSLabelLen = 63
  function getHostnameOrEmpty (line 41) | func getHostnameOrEmpty(name string) string {
  function dnsName (line 60) | func dnsName(i string) (string, error) {
  function toDNSName (line 70) | func toDNSName(in string) (string, error) {
  function isImagePullBackOffState (line 78) | func isImagePullBackOffState(pod *kube_core_v1.Pod) bool {
  function isInvalidImageName (line 90) | func isInvalidImageName(pod *kube_core_v1.Pod) bool {
  function getClientOutOfCluster (line 103) | func getClientOutOfCluster() (kubernetes.Interface, error) {
  function getClientInsideOfCluster (line 119) | func getClientInsideOfCluster() (kubernetes.Interface, error) {
  function newBool (line 128) | func newBool(val bool) *bool {
  function newInt64 (line 134) | func newInt64(val int64) *int64 {

FILE: pipeline/backend/kubernetes/utils_test.go
  function TestDNSName (line 23) | func TestDNSName(t *testing.T) {
  function TestToDnsName (line 58) | func TestToDnsName(t *testing.T) {
  function TestGetHostnameOrEmpty (line 75) | func TestGetHostnameOrEmpty(t *testing.T) {

FILE: pipeline/backend/kubernetes/volume.go
  function mkPersistentVolumeClaim (line 28) | func mkPersistentVolumeClaim(config *config, name, namespace string) (*k...
  function volumeName (line 66) | func volumeName(name string) (string, error) {
  function volumeMountPath (line 70) | func volumeMountPath(name string) string {
  function startVolume (line 78) | func startVolume(ctx context.Context, engine *kube, name, namespace stri...
  function stopVolume (line 89) | func stopVolume(ctx context.Context, engine *kube, name, namespace strin...

FILE: pipeline/backend/kubernetes/volume_test.go
  function TestPvcName (line 24) | func TestPvcName(t *testing.T) {
  function TestPvcMount (line 36) | func TestPvcMount(t *testing.T) {
  function TestPersistentVolumeClaim (line 44) | func TestPersistentVolumeClaim(t *testing.T) {

FILE: pipeline/backend/local/clone.go
  function checkGitCloneCap (line 34) | func checkGitCloneCap() error {
  method loadClone (line 40) | func (e *local) loadClone() {
  method setupClone (line 50) | func (e *local) setupClone(ctx context.Context, state *workflowState) er...
  method execClone (line 65) | func (e *local) execClone(ctx context.Context, step *types.Step, state *...
  method writeNetRC (line 121) | func (e *local) writeNetRC(step *types.Step, state *workflowState) (stri...
  method downloadLatestGitPluginBinary (line 145) | func (e *local) downloadLatestGitPluginBinary(ctx context.Context, dest ...

FILE: pipeline/backend/local/command.go
  method execCommands (line 35) | func (e *local) execCommands(ctx context.Context, step *types.Step, stat...
  function checkShellExistence (line 75) | func checkShellExistence(shell string) error {
  method genCmdByShell (line 80) | func (e *local) genCmdByShell(shell string, cmdList []string, baseDir st...
  function probeShellIsPosix (line 143) | func probeShellIsPosix(shell string) error {

FILE: pipeline/backend/local/command_test.go
  function TestGenCmdByShell (line 27) | func TestGenCmdByShell(t *testing.T) {
  function TestProbeShellIsPosix (line 142) | func TestProbeShellIsPosix(t *testing.T) {

FILE: pipeline/backend/local/const.go
  constant netrcFile (line 32) | netrcFile = `
  function genNetRC (line 38) | func genNetRC(env map[string]string) string {

FILE: pipeline/backend/local/const_test.go
  function TestGenNetRC (line 23) | func TestGenNetRC(t *testing.T) {

FILE: pipeline/backend/local/errors.go
  type ErrNoPosixShell (line 34) | type ErrNoPosixShell struct
    method Error (line 39) | func (e *ErrNoPosixShell) Error() string {
    method Unwrap (line 44) | func (e *ErrNoPosixShell) Unwrap() error {
    method Is (line 49) | func (e *ErrNoPosixShell) Is(target error) bool {

FILE: pipeline/backend/local/local.go
  type workflowState (line 35) | type workflowState struct
  type stepState (line 43) | type stepState struct
  type local (line 48) | type local struct
    method Name (line 66) | func (e *local) Name() string {
    method IsAvailable (line 70) | func (e *local) IsAvailable(ctx context.Context) bool {
    method Flags (line 80) | func (e *local) Flags() []cli.Flag {
    method Load (line 84) | func (e *local) Load(ctx context.Context) (*types.BackendInfo, error) {
    method SetupWorkflow (line 98) | func (e *local) SetupWorkflow(_ context.Context, _ *types.Config, task...
    method StartStep (line 142) | func (e *local) StartStep(ctx context.Context, step *types.Step, taskU...
    method WaitStep (line 178) | func (e *local) WaitStep(ctx context.Context, step *types.Step, taskUU...
    method TailStep (line 225) | func (e *local) TailStep(_ context.Context, step *types.Step, taskUUID...
    method DestroyStep (line 235) | func (e *local) DestroyStep(_ context.Context, step *types.Step, taskU...
    method DestroyWorkflow (line 263) | func (e *local) DestroyWorkflow(_ context.Context, _ *types.Config, ta...
    method getWorkflowState (line 298) | func (e *local) getWorkflowState(taskUUID string) (*workflowState, err...
    method getStepState (line 312) | func (e *local) getStepState(taskUUID, stepUUID string) (*stepState, e...
  function New (line 59) | func New() types.Backend {

FILE: pipeline/backend/local/local_test.go
  function TestIsAvailable (line 41) | func TestIsAvailable(t *testing.T) {
  function TestLoad (line 60) | func TestLoad(t *testing.T) {
  function TestSetupWorkflow (line 92) | func TestSetupWorkflow(t *testing.T) {
  function TestDestroyWorkflow (line 124) | func TestDestroyWorkflow(t *testing.T) {
  function prepairEnv (line 155) | func prepairEnv(t *testing.T) {
  function TestRunStep (line 167) | func TestRunStep(t *testing.T) {
  function TestStateManagement (line 366) | func TestStateManagement(t *testing.T) {
  function TestConcurrentWorkflows (line 410) | func TestConcurrentWorkflows(t *testing.T) {

FILE: pipeline/backend/local/plugin.go
  method execPlugin (line 26) | func (e *local) execPlugin(ctx context.Context, step *types.Step, state ...

FILE: pipeline/backend/types/auth.go
  type Auth (line 18) | type Auth struct

FILE: pipeline/backend/types/backend.go
  type Backend (line 60) | type Backend interface
  type BackendInfo (line 167) | type BackendInfo struct

FILE: pipeline/backend/types/config.go
  type Config (line 18) | type Config struct
  type contextKey (line 31) | type contextKey struct

FILE: pipeline/backend/types/conn.go
  type Conn (line 18) | type Conn struct

FILE: pipeline/backend/types/mocks/mock_Backend.go
  function NewMockBackend (line 18) | func NewMockBackend(t interface {
  type MockBackend (line 31) | type MockBackend struct
    method EXPECT (line 39) | func (_m *MockBackend) EXPECT() *MockBackend_Expecter {
    method DestroyStep (line 44) | func (_mock *MockBackend) DestroyStep(ctx context.Context, step *types...
    method DestroyWorkflow (line 107) | func (_mock *MockBackend) DestroyWorkflow(ctx context.Context, conf *t...
    method Flags (line 170) | func (_mock *MockBackend) Flags() []cli.Flag {
    method IsAvailable (line 216) | func (_mock *MockBackend) IsAvailable(ctx context.Context) bool {
    method Load (line 267) | func (_mock *MockBackend) Load(ctx context.Context) (*types.BackendInf...
    method Name (line 329) | func (_mock *MockBackend) Name() string {
    method SetupWorkflow (line 373) | func (_mock *MockBackend) SetupWorkflow(ctx context.Context, conf *typ...
    method StartStep (line 436) | func (_mock *MockBackend) StartStep(ctx context.Context, step *types.S...
    method TailStep (line 499) | func (_mock *MockBackend) TailStep(ctx context.Context, step *types.St...
    method WaitStep (line 573) | func (_mock *MockBackend) WaitStep(ctx context.Context, step *types.St...
  type MockBackend_Expecter (line 35) | type MockBackend_Expecter struct
    method DestroyStep (line 69) | func (_e *MockBackend_Expecter) DestroyStep(ctx interface{}, step inte...
    method DestroyWorkflow (line 132) | func (_e *MockBackend_Expecter) DestroyWorkflow(ctx interface{}, conf ...
    method Flags (line 194) | func (_e *MockBackend_Expecter) Flags() *MockBackend_Flags_Call {
    method IsAvailable (line 239) | func (_e *MockBackend_Expecter) IsAvailable(ctx interface{}) *MockBack...
    method Load (line 301) | func (_e *MockBackend_Expecter) Load(ctx interface{}) *MockBackend_Loa...
    method Name (line 351) | func (_e *MockBackend_Expecter) Name() *MockBackend_Name_Call {
    method SetupWorkflow (line 398) | func (_e *MockBackend_Expecter) SetupWorkflow(ctx interface{}, conf in...
    method StartStep (line 461) | func (_e *MockBackend_Expecter) StartStep(ctx interface{}, step interf...
    method TailStep (line 535) | func (_e *MockBackend_Expecter) TailStep(ctx interface{}, step interfa...
    method WaitStep (line 609) | func (_e *MockBackend_Expecter) WaitStep(ctx interface{}, step interfa...
  type MockBackend_DestroyStep_Call (line 61) | type MockBackend_DestroyStep_Call struct
    method Run (line 73) | func (_c *MockBackend_DestroyStep_Call) Run(run func(ctx context.Conte...
    method Return (line 96) | func (_c *MockBackend_DestroyStep_Call) Return(err error) *MockBackend...
    method RunAndReturn (line 101) | func (_c *MockBackend_DestroyStep_Call) RunAndReturn(run func(ctx cont...
  type MockBackend_DestroyWorkflow_Call (line 124) | type MockBackend_DestroyWorkflow_Call struct
    method Run (line 136) | func (_c *MockBackend_DestroyWorkflow_Call) Run(run func(ctx context.C...
    method Return (line 159) | func (_c *MockBackend_DestroyWorkflow_Call) Return(err error) *MockBac...
    method RunAndReturn (line 164) | func (_c *MockBackend_DestroyWorkflow_Call) RunAndReturn(run func(ctx ...
  type MockBackend_Flags_Call (line 189) | type MockBackend_Flags_Call struct
    method Run (line 198) | func (_c *MockBackend_Flags_Call) Run(run func()) *MockBackend_Flags_C...
    method Return (line 205) | func (_c *MockBackend_Flags_Call) Return(flags []cli.Flag) *MockBacken...
    method RunAndReturn (line 210) | func (_c *MockBackend_Flags_Call) RunAndReturn(run func() []cli.Flag) ...
  type MockBackend_IsAvailable_Call (line 233) | type MockBackend_IsAvailable_Call struct
    method Run (line 243) | func (_c *MockBackend_IsAvailable_Call) Run(run func(ctx context.Conte...
    method Return (line 256) | func (_c *MockBackend_IsAvailable_Call) Return(b bool) *MockBackend_Is...
    method RunAndReturn (line 261) | func (_c *MockBackend_IsAvailable_Call) RunAndReturn(run func(ctx cont...
  type MockBackend_Load_Call (line 295) | type MockBackend_Load_Call struct
    method Run (line 305) | func (_c *MockBackend_Load_Call) Run(run func(ctx context.Context)) *M...
    method Return (line 318) | func (_c *MockBackend_Load_Call) Return(backendInfo *types.BackendInfo...
    method RunAndReturn (line 323) | func (_c *MockBackend_Load_Call) RunAndReturn(run func(ctx context.Con...
  type MockBackend_Name_Call (line 346) | type MockBackend_Name_Call struct
    method Run (line 355) | func (_c *MockBackend_Name_Call) Run(run func()) *MockBackend_Name_Call {
    method Return (line 362) | func (_c *MockBackend_Name_Call) Return(s string) *MockBackend_Name_Ca...
    method RunAndReturn (line 367) | func (_c *MockBackend_Name_Call) RunAndReturn(run func() string) *Mock...
  type MockBackend_SetupWorkflow_Call (line 390) | type MockBackend_SetupWorkflow_Call struct
    method Run (line 402) | func (_c *MockBackend_SetupWorkflow_Call) Run(run func(ctx context.Con...
    method Return (line 425) | func (_c *MockBackend_SetupWorkflow_Call) Return(err error) *MockBacke...
    method RunAndReturn (line 430) | func (_c *MockBackend_SetupWorkflow_Call) RunAndReturn(run func(ctx co...
  type MockBackend_StartStep_Call (line 453) | type MockBackend_StartStep_Call struct
    method Run (line 465) | func (_c *MockBackend_StartStep_Call) Run(run func(ctx context.Context...
    method Return (line 488) | func (_c *MockBackend_StartStep_Call) Return(err error) *MockBackend_S...
    method RunAndReturn (line 493) | func (_c *MockBackend_StartStep_Call) RunAndReturn(run func(ctx contex...
  type MockBackend_TailStep_Call (line 527) | type MockBackend_TailStep_Call struct
    method Run (line 539) | func (_c *MockBackend_TailStep_Call) Run(run func(ctx context.Context,...
    method Return (line 562) | func (_c *MockBackend_TailStep_Call) Return(readCloser io.ReadCloser, ...
    method RunAndReturn (line 567) | func (_c *MockBackend_TailStep_Call) RunAndReturn(run func(ctx context...
  type MockBackend_WaitStep_Call (line 601) | type MockBackend_WaitStep_Call struct
    method Run (line 613) | func (_c *MockBackend_WaitStep_Call) Run(run func(ctx context.Context,...
    method Return (line 636) | func (_c *MockBackend_WaitStep_Call) Return(state *types.State, err er...
    method RunAndReturn (line 641) | func (_c *MockBackend_WaitStep_Call) RunAndReturn(run func(ctx context...

FILE: pipeline/backend/types/network.go
  type Port (line 17) | type Port struct
  type HostAlias (line 22) | type HostAlias struct

FILE: pipeline/backend/types/secret.go
  type Secret (line 18) | type Secret struct

FILE: pipeline/backend/types/stage.go
  type Stage (line 18) | type Stage struct

FILE: pipeline/backend/types/state.go
  type State (line 18) | type State struct

FILE: pipeline/backend/types/step.go
  type Step (line 18) | type Step struct
  type StepType (line 51) | type StepType
  constant StepTypeClone (line 54) | StepTypeClone    StepType = "clone"
  constant StepTypeService (line 55) | StepTypeService  StepType = "service"
  constant StepTypePlugin (line 56) | StepTypePlugin   StepType = "plugin"
  constant StepTypeCommands (line 57) | StepTypeCommands StepType = "commands"
  constant StepTypeCache (line 58) | StepTypeCache    StepType = "cache"

FILE: pipeline/const.go
  constant ExitCodeKilled (line 18) | ExitCodeKilled int = 137
  constant MaxLogLineLength (line 22) | MaxLogLineLength int = 1 * 1024 * 1024
  constant InternalLabelPrefix (line 24) | InternalLabelPrefix string = "woodpecker-ci.org"
  constant LabelForgeRemoteID (line 25) | LabelForgeRemoteID  string = InternalLabelPrefix + "/forge-id"
  constant LabelRepoForgeID (line 26) | LabelRepoForgeID    string = InternalLabelPrefix + "/repo-forge-id"
  constant LabelRepoID (line 27) | LabelRepoID         string = InternalLabelPrefix + "/repo-id"
  constant LabelRepoName (line 28) | LabelRepoName       string = InternalLabelPrefix + "/repo-name"
  constant LabelRepoFullName (line 29) | LabelRepoFullName   string = InternalLabelPrefix + "/repo-full-name"
  constant LabelBranch (line 30) | LabelBranch         string = InternalLabelPrefix + "/branch"
  constant LabelOrgID (line 31) | LabelOrgID          string = InternalLabelPrefix + "/org-id"
  constant LabelFilterOrg (line 32) | LabelFilterOrg      string = "org-id"
  constant LabelFilterRepo (line 33) | LabelFilterRepo     string = "repo"
  constant LabelFilterPlatform (line 34) | LabelFilterPlatform string = "platform"
  constant LabelFilterHostname (line 35) | LabelFilterHostname string = "hostname"
  constant LabelFilterBackend (line 36) | LabelFilterBackend  string = "backend"

FILE: pipeline/errors/linter.go
  type LinterErrorData (line 23) | type LinterErrorData struct
  type DeprecationErrorData (line 28) | type DeprecationErrorData struct
  type BadHabitErrorData (line 34) | type BadHabitErrorData struct
  function GetLinterData (line 40) | func GetLinterData(e *PipelineError) *LinterErrorData {
  function GetPipelineErrors (line 52) | func GetPipelineErrors(err error) []*PipelineError {
  function HasBlockingErrors (line 69) | func HasBlockingErrors(err error) bool {

FILE: pipeline/errors/linter_test.go
  function TestGetPipelineErrors (line 27) | func TestGetPipelineErrors(t *testing.T) {
  function TestHasBlockingErrors (line 113) | func TestHasBlockingErrors(t *testing.T) {

FILE: pipeline/errors/pipeline.go
  type PipelineErrorType (line 23) | type PipelineErrorType
  constant PipelineErrorTypeLinter (line 26) | PipelineErrorTypeLinter      PipelineErrorType = "linter"
  constant PipelineErrorTypeDeprecation (line 27) | PipelineErrorTypeDeprecation PipelineErrorType = "deprecation"
  constant PipelineErrorTypeCompiler (line 28) | PipelineErrorTypeCompiler    PipelineErrorType = "compiler"
  constant PipelineErrorTypeGeneric (line 29) | PipelineErrorTypeGeneric     PipelineErrorType = "generic"
  constant PipelineErrorTypeBadHabit (line 30) | PipelineErrorTypeBadHabit    PipelineErrorType = "bad_habit"
  type PipelineError (line 33) | type PipelineError struct
    method Error (line 40) | func (e *PipelineError) Error() string {
  type ErrInvalidWorkflowSetup (line 44) | type ErrInvalidWorkflowSetup struct
    method Error (line 49) | func (e *ErrInvalidWorkflowSetup) Error() string {

FILE: pipeline/errors/runtime.go
  type ExitError (line 33) | type ExitError struct
    method Error (line 39) | func (e *ExitError) Error() string {
  type OomError (line 44) | type OomError struct
    method Error (line 50) | func (e *OomError) Error() string {

FILE: pipeline/frontend/metadata/const.go
  type Event (line 17) | type Event
    method IsPull (line 32) | func (event Event) IsPull() bool {
  constant EventPush (line 21) | EventPush         Event = "push"
  constant EventPull (line 22) | EventPull         Event = "pull_request"
  constant EventPullClosed (line 23) | EventPullClosed   Event = "pull_request_closed"
  constant EventPullMetadata (line 24) | EventPullMetadata Event = "pull_request_metadata"
  constant EventTag (line 25) | EventTag          Event = "tag"
  constant EventRelease (line 26) | EventRelease      Event = "release"
  constant EventDeploy (line 27) | EventDeploy       Event = "deployment"
  constant EventCron (line 28) | EventCron         Event = "cron"
  constant EventManual (line 29) | EventManual       Event = "manual"
  type Failure (line 42) | type Failure
  constant FailureIgnore (line 46) | FailureIgnore Failure = "ignore"
  constant FailureFail (line 47) | FailureFail   Failure = "fail"
  constant FailureCancel (line 48) | FailureCancel Failure = "cancel"

FILE: pipeline/frontend/metadata/drone_compatibility.go
  function SetDroneEnviron (line 19) | func SetDroneEnviron(env map[string]string) {
  function copyEnv (line 74) | func copyEnv(woodpecker, drone string, env map[string]string) {

FILE: pipeline/frontend/metadata/drone_compatibility_test.go
  function TestSetDroneEnvironOnPull (line 26) | func TestSetDroneEnvironOnPull(t *testing.T) {
  function TestSetDroneEnvironOnPush (line 106) | func TestSetDroneEnvironOnPush(t *testing.T) {
  function convertListToEnvMap (line 223) | func convertListToEnvMap(t *testing.T, list string) map[string]string {

FILE: pipeline/frontend/metadata/environment.go
  constant initialEnvMapSize (line 29) | initialEnvMapSize = 100
  constant maxChangedFiles (line 30) | maxChangedFiles   = 500
  method Environ (line 36) | func (m *Metadata) Environ() map[string]string {
  method getPipelineWebURL (line 165) | func (m *Metadata) getPipelineWebURL(pipeline Pipeline, stepNumber int) ...
  function getSourceTargetBranches (line 173) | func getSourceTargetBranches(refspec string) (string, string) {
  function setNonEmptyEnvVar (line 188) | func setNonEmptyEnvVar(env map[string]string, key, value string) {

FILE: pipeline/frontend/metadata/environment_test.go
  function TestEnviron (line 23) | func TestEnviron(t *testing.T) {

FILE: pipeline/frontend/metadata/substitution.go
  function EnvVarSubst (line 24) | func EnvVarSubst(yaml string, environ map[string]string) (string, error) {

FILE: pipeline/frontend/metadata/substitution_test.go
  function TestEnvVarSubst (line 23) | func TestEnvVarSubst(t *testing.T) {

FILE: pipeline/frontend/metadata/types.go
  type Metadata (line 19) | type Metadata struct
  type Repo (line 31) | type Repo struct
  type Pipeline (line 45) | type Pipeline struct
  type Commit (line 64) | type Commit struct
  type Author (line 78) | type Author struct
  type Workflow (line 84) | type Workflow struct
  type Step (line 91) | type Step struct
  type System (line 97) | type System struct
  type Forge (line 106) | type Forge struct
  type ServerForge (line 112) | type ServerForge interface
  type TrustedConfiguration (line 119) | type TrustedConfiguration struct

FILE: pipeline/frontend/yaml/compiler/compiler.go
  constant defaultCloneName (line 31) | defaultCloneName = "clone"
  type Registry (line 35) | type Registry struct
  type Secret (line 41) | type Secret struct
    method Available (line 48) | func (s *Secret) Available(event metadata.Event, container *yaml_types...
    method Match (line 67) | func (s *Secret) Match(event metadata.Event) bool {
  type Compiler (line 81) | type Compiler struct
    method Compile (line 118) | func (c *Compiler) Compile(conf *yaml_types.Workflow) (*backend_types....
  function New (line 102) | func New(opts ...Option) *Compiler {

FILE: pipeline/frontend/yaml/compiler/compiler_test.go
  function TestSecretAvailable (line 29) | func TestSecretAvailable(t *testing.T) {
  function TestCompilerCompile (line 63) | func TestCompilerCompile(t *testing.T) {
  function TestCompilerCompileWithFromSecret (line 326) | func TestCompilerCompileWithFromSecret(t *testing.T) {
  function TestSecretMatch (line 439) | func TestSecretMatch(t *testing.T) {
  function TestCompilerCompilePrivileged (line 485) | func TestCompilerCompilePrivileged(t *testing.T) {

FILE: pipeline/frontend/yaml/compiler/convert.go
  constant pluginWorkspaceBase (line 35) | pluginWorkspaceBase = "/woodpecker"
  constant DefaultWorkspaceBase (line 37) | DefaultWorkspaceBase = pluginWorkspaceBase
  method createProcess (line 40) | func (c *Compiler) createProcess(container *yaml_types.Container, workfl...
  method stepWorkingDir (line 196) | func (c *Compiler) stepWorkingDir(container *yaml_types.Container) string {
  function convertPort (line 207) | func convertPort(portDef string) (backend_types.Port, error) {

FILE: pipeline/frontend/yaml/compiler/convert_test.go
  function TestConvertPortNumber (line 25) | func TestConvertPortNumber(t *testing.T) {
  function TestConvertPortUdp (line 35) | func TestConvertPortUdp(t *testing.T) {
  function TestConvertPortWrongOrder (line 45) | func TestConvertPortWrongOrder(t *testing.T) {
  function TestConvertPortWrongDelimiter (line 51) | func TestConvertPortWrongDelimiter(t *testing.T) {
  function TestConvertPortWrong (line 57) | func TestConvertPortWrong(t *testing.T) {

FILE: pipeline/frontend/yaml/compiler/dag.go
  type dagCompilerStep (line 23) | type dagCompilerStep struct
  type dagCompiler (line 30) | type dagCompiler struct
    method isDAG (line 40) | func (c dagCompiler) isDAG() bool {
    method compile (line 49) | func (c dagCompiler) compile() ([]*backend_types.Stage, error) {
    method compileSequence (line 56) | func (c dagCompiler) compileSequence() ([]*backend_types.Stage, error) {
    method compileByDependsOn (line 68) | func (c dagCompiler) compileByDependsOn() ([]*backend_types.Stage, err...
  function newDAGCompiler (line 34) | func newDAGCompiler(steps []*dagCompilerStep) dagCompiler {
  function dfsVisit (line 76) | func dfsVisit(steps map[string]*dagCompilerStep, name string, visited ma...
  function convertDAGToStages (line 95) | func convertDAGToStages(steps map[string]*dagCompilerStep) ([]*backend_t...
  function allDependenciesSatisfied (line 147) | func allDependenciesSatisfied(step *dagCompilerStep, addedSteps map[stri...

FILE: pipeline/frontend/yaml/compiler/dag_test.go
  function TestConvertDAGToStages (line 25) | func TestConvertDAGToStages(t *testing.T) {
  function TestIsDag (line 141) | func TestIsDag(t *testing.T) {

FILE: pipeline/frontend/yaml/compiler/errors.go
  type ErrExtraHostFormat (line 19) | type ErrExtraHostFormat struct
    method Error (line 23) | func (err *ErrExtraHostFormat) Error() string {
    method Is (line 27) | func (*ErrExtraHostFormat) Is(target error) bool {
  type ErrStepMissingDependency (line 32) | type ErrStepMissingDependency struct
    method Error (line 37) | func (err *ErrStepMissingDependency) Error() string {
    method Is (line 41) | func (*ErrStepMissingDependency) Is(target error) bool {
  type ErrStepDependencyCycle (line 46) | type ErrStepDependencyCycle struct
    method Error (line 50) | func (err *ErrStepDependencyCycle) Error() string {
    method Is (line 54) | func (*ErrStepDependencyCycle) Is(target error) bool {

FILE: pipeline/frontend/yaml/compiler/option.go
  type Option (line 27) | type Option
  function noopOption (line 29) | func noopOption() Option {
  function WithOption (line 35) | func WithOption(option Option, b bool) Option {
  function WithVolumes (line 46) | func WithVolumes(volumes ...string) Option {
  function WithRegistry (line 54) | func WithRegistry(registries ...Registry) Option {
  function WithSecret (line 62) | func WithSecret(secrets ...Secret) Option {
  function WithMetadata (line 74) | func WithMetadata(metadata metadata.Metadata) Option {
  function WithNetrc (line 84) | func WithNetrc(username, password, machine string) Option {
  function WithWorkspace (line 97) | func WithWorkspace(base, path string) Option {
  function WithWorkspaceFromURL (line 106) | func WithWorkspaceFromURL(base, u string) Option {
  function WithEscalated (line 117) | func WithEscalated(images ...string) Option {
  function WithPrefix (line 126) | func WithPrefix(prefix string) Option {
  function WithLocal (line 135) | func WithLocal(local bool) Option {
  function WithEnviron (line 143) | func WithEnviron(env map[string]string) Option {
  function WithNetworks (line 151) | func WithNetworks(networks ...string) Option {
  function WithDefaultClonePlugin (line 157) | func WithDefaultClonePlugin(cloneImage string) Option {
  function WithTrustedClonePlugins (line 163) | func WithTrustedClonePlugins(images []string) Option {
  function WithTrustedSecurity (line 170) | func WithTrustedSecurity(trusted bool) Option {
  type ProxyOptions (line 176) | type ProxyOptions struct
  function WithProxy (line 185) | func WithProxy(opt ProxyOptions) Option {
  function WithForceIgnoreServiceFailure (line 204) | func WithForceIgnoreServiceFailure() Option {

FILE: pipeline/frontend/yaml/compiler/option_test.go
  function TestWithWorkspace (line 26) | func TestWithWorkspace(t *testing.T) {
  function TestWithEscalated (line 37) | func TestWithEscalated(t *testing.T) {
  function TestWithVolumes (line 48) | func TestWithVolumes(t *testing.T) {
  function TestWithNetworks (line 59) | func TestWithNetworks(t *testing.T) {
  function TestWithPrefix (line 70) | func TestWithPrefix(t *testing.T) {
  function TestWithMetadata (line 74) | func TestWithMetadata(t *testing.T) {
  function TestWithLocal (line 94) | func TestWithLocal(t *testing.T) {
  function TestWithNetrc (line 99) | func TestWithNetrc(t *testing.T) {
  function TestWithProxy (line 112) | func TestWithProxy(t *testing.T) {
  function TestWithEnviron (line 138) | func TestWithEnviron(t *testing.T) {
  function TestDefaultClonePlugin (line 151) | func TestDefaultClonePlugin(t *testing.T) {
  function TestWithTrustedClonePlugins (line 158) | func TestWithTrustedClonePlugins(t *testing.T) {

FILE: pipeline/frontend/yaml/compiler/settings/params.go
  function ParamsToEnv (line 29) | func ParamsToEnv(from map[string]any, to map[string]string, prefix strin...
  function sanitizeParamKey (line 58) | func sanitizeParamKey(prefix string, upper bool, k string) string {
  function isComplex (line 68) | func isComplex(t reflect.Kind) bool {
  function sanitizeParamValue (line 81) | func sanitizeParamValue(v any, getSecretValue func(name string) (string,...
  function handleComplex (line 158) | func handleComplex(v any, getSecretValue func(name string) (string, erro...
  function injectSecret (line 178) | func injectSecret(v map[string]any, getSecretValue func(name string) (st...
  function injectSecretRecursive (line 195) | func injectSecretRecursive(v any, getSecretValue func(name string) (stri...

FILE: pipeline/frontend/yaml/compiler/settings/params_test.go
  function TestParamsToEnv (line 26) | func TestParamsToEnv(t *testing.T) {
  function TestParamsToEnvPrefix (line 81) | func TestParamsToEnvPrefix(t *testing.T) {
  function TestSanitizeParamKey (line 109) | func TestSanitizeParamKey(t *testing.T) {
  function TestYAMLToParamsToEnv (line 118) | func TestYAMLToParamsToEnv(t *testing.T) {
  function TestYAMLToParamsToEnvError (line 180) | func TestYAMLToParamsToEnvError(t *testing.T) {
  function stringsToInterface (line 204) | func stringsToInterface(val ...string) []any {
  function TestSecretNotFound (line 212) | func TestSecretNotFound(t *testing.T) {
  function TestSecretMappingSimpleSecret (line 236) | func TestSecretMappingSimpleSecret(t *testing.T) {
  function TestSecretMappingComplexMapWithSecrets (line 267) | func TestSecretMappingComplexMapWithSecrets(t *testing.T) {
  function TestComplexTypesWithNilValuesWontPanic (line 308) | func TestComplexTypesWithNilValuesWontPanic(t *testing.T) {

FILE: pipeline/frontend/yaml/constraint/constraint.go
  constant statusFailure (line 32) | statusFailure = "failure"
  constant statusSuccess (line 33) | statusSuccess = "success"
  type When (line 38) | type When struct
    method IsEmpty (line 59) | func (when *When) IsEmpty() bool {
    method Match (line 64) | func (when *When) Match(metadata metadata.Metadata, global bool, env m...
    method IncludesStatusFailure (line 83) | func (when *When) IncludesStatusFailure(metadata metadata.Metadata, gl...
    method IncludesStatusSuccess (line 98) | func (when *When) IncludesStatusSuccess(metadata metadata.Metadata, gl...
    method IsLocal (line 116) | func (when *When) IsLocal() bool {
    method UnmarshalYAML (line 125) | func (when *When) UnmarshalYAML(value *yaml.Node) error {
    method MarshalYAML (line 147) | func (when When) MarshalYAML() (any, error) {
  type Constraint (line 43) | type Constraint struct
    method Match (line 167) | func (c *Constraint) Match(m metadata.Metadata, global bool, env map[s...

FILE: pipeline/frontend/yaml/constraint/constraint_test.go
  function TestConstraintStatusSuccessFailure (line 27) | func TestConstraintStatusSuccessFailure(t *testing.T) {
  function TestConstraints (line 63) | func TestConstraints(t *testing.T) {
  function parseConstraints (line 202) | func parseConstraints(t *testing.T, s string) *When {

FILE: pipeline/frontend/yaml/constraint/list.go
  type List (line 28) | type List struct
    method IsEmpty (line 34) | func (c List) IsEmpty() bool {
    method Match (line 40) | func (c *List) Match(v string) bool {
    method Includes (line 57) | func (c *List) Includes(v string) bool {
    method Excludes (line 67) | func (c *List) Excludes(v string) bool {
    method UnmarshalYAML (line 77) | func (c *List) UnmarshalYAML(value *yaml.Node) error {
    method MarshalYAML (line 103) | func (c List) MarshalYAML() (any, error) {

FILE: pipeline/frontend/yaml/constraint/list_test.go
  function TestConstraintList (line 24) | func TestConstraintList(t *testing.T) {
  function parseConstraintList (line 163) | func parseConstraintList(t *testing.T, s string) *List {

FILE: pipeline/frontend/yaml/constraint/map.go
  type Map (line 20) | type Map struct
    method Match (line 27) | func (c *Map) Match(params map[string]string) bool {
    method UnmarshalYAML (line 56) | func (c *Map) UnmarshalYAML(unmarshal func(any) error) error {
    method MarshalYAML (line 79) | func (c Map) MarshalYAML() (any, error) {

FILE: pipeline/frontend/yaml/constraint/map_test.go
  function TestConstraintMap (line 24) | func TestConstraintMap(t *testing.T) {
  function parseConstraintMap (line 146) | func parseConstraintMap(t *testing.T, s string) *Map {

FILE: pipeline/frontend/yaml/constraint/path.go
  type Path (line 29) | type Path struct
    method UnmarshalYAML (line 37) | func (c *Path) UnmarshalYAML(value *yaml.Node) error {
    method MarshalYAML (line 67) | func (c Path) MarshalYAML() (any, error) {
    method Match (line 99) | func (c *Path) Match(v []string, message string) bool {
    method Includes (line 120) | func (c *Path) Includes(v []string) bool {
    method Excludes (line 132) | func (c *Path) Excludes(v []string) bool {

FILE: pipeline/frontend/yaml/constraint/path_test.go
  function TestConstraintPath (line 24) | func TestConstraintPath(t *testing.T) {
  function parseConstraintPath (line 154) | func parseConstraintPath(t *testing.T, s string) *Path {

FILE: pipeline/frontend/yaml/constraint/skip.go
  function IsSkipCommitMessage (line 25) | func IsSkipCommitMessage(event metadata.Event, commitMessage string) bool {

FILE: pipeline/frontend/yaml/linter/error.go
  function newLinterError (line 21) | func newLinterError(message, file, field string, isWarning bool) *pipeli...

FILE: pipeline/frontend/yaml/linter/linter.go
  constant networkModeNone (line 32) | networkModeNone = "none"
  type Linter (line 35) | type Linter struct
    method Lint (line 68) | func (l *Linter) Lint(configs []*WorkflowConfig) error {
    method lintFile (line 80) | func (l *Linter) lintFile(config *WorkflowConfig) error {
    method lintCloneSteps (line 114) | func (l *Linter) lintCloneSteps(config *WorkflowConfig) error {
    method lintContainers (line 137) | func (l *Linter) lintContainers(config *WorkflowConfig, area string) e...
    method lintDependsOn (line 175) | func (l *Linter) lintDependsOn(config *WorkflowConfig, c *types.Contai...
    method lintImage (line 198) | func (l *Linter) lintImage(config *WorkflowConfig, c *types.Container,...
    method lintPrivilegedPlugins (line 205) | func (l *Linter) lintPrivilegedPlugins(config *WorkflowConfig, c *type...
    method lintSettings (line 221) | func (l *Linter) lintSettings(config *WorkflowConfig, c *types.Contain...
    method lintContainerDeprecations (line 237) | func (l *Linter) lintContainerDeprecations(config *WorkflowConfig, c *...
    method lintTrusted (line 241) | func (l *Linter) lintTrusted(config *WorkflowConfig, c *types.Containe...
    method lintSchema (line 288) | func (l *Linter) lintSchema(config *WorkflowConfig) error {
    method lintDeprecations (line 304) | func (l *Linter) lintDeprecations(config *WorkflowConfig) error {
    method lintBadHabits (line 327) | func (l *Linter) lintBadHabits(config *WorkflowConfig) (err error) {
  type TrustedConfiguration (line 41) | type TrustedConfiguration struct
  function New (line 48) | func New(opts ...Option) *Linter {
  type WorkflowConfig (line 56) | type WorkflowConfig struct

FILE: pipeline/frontend/yaml/linter/linter_test.go
  function TestLint (line 28) | func TestLint(t *testing.T) {
  function TestLintErrors (line 114) | func TestLintErrors(t *testing.T) {
  function TestBadHabits (line 213) | func TestBadHabits(t *testing.T) {

FILE: pipeline/frontend/yaml/linter/option.go
  type Option (line 18) | type Option
  function WithTrusted (line 21) | func WithTrusted(trusted TrustedConfiguration) Option {
  function PrivilegedPlugins (line 28) | func PrivilegedPlugins(plugins []string) Option {
  function WithTrustedClonePlugins (line 35) | func WithTrustedClonePlugins(plugins []string) Option {

FILE: pipeline/frontend/yaml/linter/schema/schema.go
  function Lint (line 33) | func Lint(r io.Reader) ([]gojsonschema.ResultError, error) {
  function LintString (line 67) | func LintString(s string) ([]gojsonschema.ResultError, error) {

FILE: pipeline/frontend/yaml/linter/schema/schema_test.go
  function TestSchema (line 30) | func TestSchema(t *testing.T) {

FILE: pipeline/frontend/yaml/matrix/matrix.go
  constant limitTags (line 26) | limitTags = 10
  constant limitAxis (line 27) | limitAxis = 25
  type Matrix (line 31) | type Matrix
  type Axis (line 34) | type Axis
    method String (line 38) | func (a Axis) String() string {
  function Parse (line 47) | func Parse(data []byte) ([]Axis, error) {
  function ParseString (line 66) | func ParseString(data string) ([]Axis, error) {
  function calc (line 70) | func calc(matrix Matrix) []Axis {
  function parse (line 114) | func parse(raw []byte) (Matrix, error) {
  function parseList (line 124) | func parseList(raw []byte) ([]Axis, error) {

FILE: pipeline/frontend/yaml/matrix/matrix_test.go
  function TestMatrix (line 23) | func TestMatrix(t *testing.T) {
  function TestMatrixEmpty (line 34) | func TestMatrixEmpty(t *testing.T) {
  function TestMatrixIncluded (line 40) | func TestMatrixIncluded(t *testing.T) {

FILE: pipeline/frontend/yaml/parse.go
  function ParseBytes (line 24) | func ParseBytes(b []byte) (*types.Workflow, error) {
  function ParseString (line 34) | func ParseString(s string) (*types.Workflow, error) {

FILE: pipeline/frontend/yaml/parse_test.go
  function TestParse (line 28) | func TestParse(t *testing.T) {
  function TestMatch (line 82) | func TestMatch(t *testing.T) {
  function TestParseLegacy (line 129) | func TestParseLegacy(t *testing.T) {
  function TestReSerialize (line 248) | func TestReSerialize(t *testing.T) {
  function TestSlice (line 331) | func TestSlice(t *testing.T) {

FILE: pipeline/frontend/yaml/types/base/int.go
  type StringOrInt (line 25) | type StringOrInt
    method UnmarshalYAML (line 28) | func (s *StringOrInt) UnmarshalYAML(unmarshal func(any) error) error {
  type MemStringOrInt (line 50) | type MemStringOrInt
    method UnmarshalYAML (line 53) | func (s *MemStringOrInt) UnmarshalYAML(unmarshal func(any) error) error {

FILE: pipeline/frontend/yaml/types/base/int_test.go
  type StructStringOrInt (line 24) | type StructStringOrInt struct
  function TestStringOrIntYaml (line 28) | func TestStringOrIntYaml(t *testing.T) {

FILE: pipeline/frontend/yaml/types/base/slice.go
  type StringOrSlice (line 24) | type StringOrSlice
    method UnmarshalYAML (line 27) | func (s *StringOrSlice) UnmarshalYAML(unmarshal func(any) error) error {
    method MarshalYAML (line 48) | func (s StringOrSlice) MarshalYAML() (any, error) {
  function toStrings (line 57) | func toStrings(s []any) ([]string, error) {

FILE: pipeline/frontend/yaml/types/base/slice_test.go
  type StructStringOrSlice (line 24) | type StructStringOrSlice struct
  function TestStringOrSliceYaml (line 29) | func TestStringOrSliceYaml(t *testing.T) {

FILE: pipeline/frontend/yaml/types/container.go
  type Container (line 24) | type Container struct
    method IsPlugin (line 60) | func (c *Container) IsPlugin() bool {
    method IsTrustedCloneImage (line 66) | func (c *Container) IsTrustedCloneImage(trustedClonePlugins []string) ...

FILE: pipeline/frontend/yaml/types/container_list.go
  type ContainerList (line 24) | type ContainerList struct
    method UnmarshalYAML (line 29) | func (c *ContainerList) UnmarshalYAML(value *yaml.Node) error {
    method MarshalYAML (line 77) | func (c ContainerList) MarshalYAML() (any, error) {

FILE: pipeline/frontend/yaml/types/container_test.go
  function TestUnmarshalContainer (line 72) | func TestUnmarshalContainer(t *testing.T) {
  function TestUnmarshalContainers (line 126) | func TestUnmarshalContainers(t *testing.T) {
  function TestUnmarshalContainersErr (line 251) | func TestUnmarshalContainersErr(t *testing.T) {
  function stringsToInterface (line 264) | func stringsToInterface(val ...string) []any {
  function TestIsPlugin (line 272) | func TestIsPlugin(t *testing.T) {

FILE: pipeline/frontend/yaml/types/network.go
  type Networks (line 24) | type Networks struct
    method MarshalYAML (line 37) | func (n Networks) MarshalYAML() (any, error) {
    method UnmarshalYAML (line 46) | func (n *Networks) UnmarshalYAML(unmarshal func(any) error) error {
  type Network (line 29) | type Network struct
  function handleNetwork (line 82) | func handleNetwork(name string, value any) (*Network, error) {

FILE: pipeline/frontend/yaml/types/network_test.go
  function TestMarshalNetworks (line 24) | func TestMarshalNetworks(t *testing.T) {
  function TestUnmarshalNetworks (line 98) | func TestUnmarshalNetworks(t *testing.T) {

FILE: pipeline/frontend/yaml/types/volume.go
  type Volumes (line 25) | type Volumes struct
    method MarshalYAML (line 51) | func (v Volumes) MarshalYAML() (any, error) {
    method UnmarshalYAML (line 60) | func (v *Volumes) UnmarshalYAML(unmarshal func(any) error) error {
  type Volume (line 30) | type Volume struct
    method String (line 37) | func (v *Volume) String() string {

FILE: pipeline/frontend/yaml/types/volume_test.go
  function TestMarshalVolumes (line 24) | func TestMarshalVolumes(t *testing.T) {
  function TestUnmarshalVolumes (line 95) | func TestUnmarshalVolumes(t *testing.T) {

FILE: pipeline/frontend/yaml/types/workflow.go
  type Workflow (line 23) | type Workflow struct
  type Workspace (line 37) | type Workspace struct

FILE: pipeline/frontend/yaml/utils/image.go
  function trimImage (line 24) | func trimImage(name string) string {
  function expandImage (line 38) | func expandImage(name string) string {
  function MatchImage (line 54) | func MatchImage(from string, to ...string) bool {
  function MatchImageDynamic (line 66) | func MatchImageDynamic(from string, to ...string) bool {
  function imageHasTag (line 83) | func imageHasTag(name string) bool {
  function ParseNamed (line 88) | func ParseNamed(image string) (reference.Named, error) {
  function MatchHostname (line 98) | func MatchHostname(image, hostname string) bool {

FILE: pipeline/frontend/yaml/utils/image_test.go
  function Test_trimImage (line 23) | func Test_trimImage(t *testing.T) {
  function Test_expandImage (line 75) | func Test_expandImage(t *testing.T) {
  function Test_imageHasTag (line 131) | func Test_imageHasTag(t *testing.T) {
  function Test_matchImage (line 182) | func Test_matchImage(t *testing.T) {
  function Test_matchImageDynamic (line 268) | func Test_matchImageDynamic(t *testing.T) {
  function Test_matchHostname (line 318) | func Test_matchHostname(t *testing.T) {

FILE: pipeline/logging/logger.go
  type Logger (line 24) | type Logger

FILE: pipeline/runtime/helpers_test.go
  function newTestTracer (line 33) | func newTestTracer(t *testing.T) *tracer_mocks.MockTracer {
  function newTestLogger (line 41) | func newTestLogger(t *testing.T) logging.Logger {
  function getTracerStates (line 51) | func getTracerStates(tracer *tracer_mocks.MockTracer) []state.State {
  function indexOfTrace (line 66) | func indexOfTrace(traces []state.State, match func(s state.State) bool) ...

FILE: pipeline/runtime/option.go
  type Option (line 25) | type Option
  function WithLogger (line 28) | func WithLogger(logger logging.Logger) Option {
  function WithTracer (line 35) | func WithTracer(tracer tracing.Tracer) Option {
  function WithContext (line 42) | func WithContext(ctx context.Context) Option {
  function WithDescription (line 49) | func WithDescription(desc map[string]string) Option {
  function WithTaskUUID (line 56) | func WithTaskUUID(uuid string) Option {

FILE: pipeline/runtime/runtime.go
  type Runtime (line 33) | type Runtime struct
    method makeLogger (line 72) | func (r *Runtime) makeLogger() zerolog.Logger {
  function New (line 56) | func New(spec *backend_types.Config, backend backend_types.Backend, opts...

FILE: pipeline/runtime/runtime_test.go
  function cmdStep (line 42) | func cmdStep(name string, opts ...func(*backend_types.Step)) *backend_ty...
  function withExitCode (line 58) | func withExitCode(code int) func(*backend_types.Step) {
  function withIgnoreFailure (line 64) | func withIgnoreFailure() func(*backend_types.Step) {
  function withOnFailure (line 68) | func withOnFailure() func(*backend_types.Step) {
  function withDetached (line 72) | func withDetached() func(*backend_types.Step) {
  function withUnboundedDetached (line 80) | func withUnboundedDetached() func(*backend_types.Step) {
  function withService (line 88) | func withService() func(*backend_types.Step) {
  function withUnboundedService (line 97) | func withUnboundedService() func(*backend_types.Step) {
  function withPlugin (line 105) | func withPlugin() func(*backend_types.Step) {
  function withOOM (line 112) | func withOOM() func(*backend_types.Step) {
  function withStartFail (line 119) | func withStartFail() func(*backend_types.Step) {
  function withSleep (line 125) | func withSleep(d string) func(*backend_types.Step) {
  function findFirstTraceByName (line 135) | func findFirstTraceByName(traces []state.State, name string) *state.State {
  function findLastTraceByName (line 144) | func findLastTraceByName(traces []state.State, name string) *state.State {
  function findStartedTrace (line 153) | func findStartedTrace(traces []state.State, name string) *state.State {
  function TestWorkflowCloneBuildDeploy (line 166) | func TestWorkflowCloneBuildDeploy(t *testing.T) {
  function TestWorkflowWithServiceStep (line 201) | func TestWorkflowWithServiceStep(t *testing.T) {
  function TestWorkflowDetachedStepDoesNotBlockWorkflow (line 298) | func TestWorkflowDetachedStepDoesNotBlockWorkflow(t *testing.T) {
  function TestWorkflowBuildFailSkipsSubsequentStages (line 318) | func TestWorkflowBuildFailSkipsSubsequentStages(t *testing.T) {
  function TestWorkflowOnFailureStepRuns (line 357) | func TestWorkflowOnFailureStepRuns(t *testing.T) {
  function TestWorkflowOnFailureStepSkippedOnSuccess (line 384) | func TestWorkflowOnFailureStepSkippedOnSuccess(t *testing.T) {
  function TestWorkflowFailureIgnore (line 409) | func TestWorkflowFailureIgnore(t *testing.T) {
  function TestWorkflowFailureIgnoreDoesNotSetWorkflowError (line 436) | func TestWorkflowFailureIgnoreDoesNotSetWorkflowError(t *testing.T) {
  function TestWorkflowPluginStep (line 462) | func TestWorkflowPluginStep(t *testing.T) {
  function TestWorkflowOOMKilledStep (line 496) | func TestWorkflowOOMKilledStep(t *testing.T) {
  function TestWorkflowParallelStepsInStage (line 522) | func TestWorkflowParallelStepsInStage(t *testing.T) {
  function TestWorkflowParallelStepOneFailsOthersComplete (line 547) | func TestWorkflowParallelStepOneFailsOthersComplete(t *testing.T) {
  function TestWorkflowStepStartFailure (line 579) | func TestWorkflowStepStartFailure(t *testing.T) {
  function TestWorkflowContextCancelDuringExecution (line 601) | func TestWorkflowContextCancelDuringExecution(t *testing.T) {
  function TestWorkflowSetupFailure (line 635) | func TestWorkflowSetupFailure(t *testing.T) {
  function TestWorkflowServiceWithParallelBuildAndOnFailure (line 655) | func TestWorkflowServiceWithParallelBuildAndOnFailure(t *testing.T) {
  function TestWorkflowIgnoredFailureFollowedByOnFailureStep (line 698) | func TestWorkflowIgnoredFailureFollowedByOnFailureStep(t *testing.T) {
  function TestWorkflowEmptyStages (line 728) | func TestWorkflowEmptyStages(t *testing.T) {
  function TestPluginStepFailure (line 748) | func TestPluginStepFailure(t *testing.T) {
  function TestDetachedStepFailure (line 775) | func TestDetachedStepFailure(t *testing.T) {
  function TestServiceStepFailure (line 797) | func TestServiceStepFailure(t *testing.T) {
  function TestPluginStepStartFailure (line 823) | func TestPluginStepStartFailure(t *testing.T) {
  function TestDetachedStepStartFailure (line 842) | func TestDetachedStepStartFailure(t *testing.T) {
  function TestServiceStepStartFailure (line 865) | func TestServiceStepStartFailure(t *testing.T) {
  function TestPluginOnFailureStepRuns (line 890) | func TestPluginOnFailureStepRuns(t *testing.T) {
  function TestPluginOnFailureStepSkippedOnSuccess (line 917) | func TestPluginOnFailureStepSkippedOnSuccess(t *testing.T) {
  function TestDetachedOnFailureStepRuns (line 941) | func TestDetachedOnFailureStepRuns(t *testing.T) {
  function TestDetachedOnFailureStepSkippedOnSuccess (line 963) | func TestDetachedOnFailureStepSkippedOnSuccess(t *testing.T) {
  function withAlwaysRun (line 991) | func withAlwaysRun() func(*backend_types.Step) {
  function TestAlwaysRunStepRunsOnSuccess (line 995) | func TestAlwaysRunStepRunsOnSuccess(t *testing.T) {
  function TestAlwaysRunStepRunsOnFailure (line 1019) | func TestAlwaysRunStepRunsOnFailure(t *testing.T) {
  function TestAlwaysRunPluginRunsOnFailure (line 1046) | func TestAlwaysRunPluginRunsOnFailure(t *testing.T) {
  function TestPluginFailureIgnore (line 1072) | func TestPluginFailureIgnore(t *testing.T) {
  function TestDetachedFailureIgnore (line 1096) | func TestDetachedFailureIgnore(t *testing.T) {
  function TestWorkflowContextCancelWithPluginStep (line 1122) | func TestWorkflowContextCancelWithPluginStep(t *testing.T) {
  function TestWorkflowContextCancelWithDetachedStep (line 1156) | func TestWorkflowContextCancelWithDetachedStep(t *testing.T) {
  function TestWorkflowContextCancelWithServiceStep (line 1193) | func TestWorkflowContextCancelWithServiceStep(t *testing.T) {
  function TestWorkflowCancelDuringStepSleep (line 1244) | func TestWorkflowCancelDuringStepSleep(t *testing.T) {
  function TestWorkflowFailingServiceDoesNotFailWorkflow (line 1307) | func TestWorkflowFailingServiceDoesNotFailWorkflow(t *testing.T) {
  function TestWorkflowFailingDetachedStepDoesNotFailWorkflow (line 1359) | func TestWorkflowFailingDetachedStepDoesNotFailWorkflow(t *testing.T) {
  function TestWorkflowUnboundedServiceDoesNotHang (line 1408) | func TestWorkflowUnboundedServiceDoesNotHang(t *testing.T) {
  function TestWorkflowUnboundedDetachedDoesNotHang (line 1442) | func TestWorkflowUnboundedDetachedDoesNotHang(t *testing.T) {

FILE: pipeline/runtime/shutdown.go
  constant shutdownTimeout (line 23) | shutdownTimeout = time.Second * 5
  function GetShutdownCtx (line 33) | func GetShutdownCtx() context.Context {

FILE: pipeline/runtime/step.go
  method executeStep (line 34) | func (r *Runtime) executeStep(runnerCtx context.Context, step *backend_t...
  method shouldSkipStep (line 65) | func (r *Runtime) shouldSkipStep(step *backend_types.Step) bool {
  method setStepEnv (line 89) | func (r *Runtime) setStepEnv(step *backend_types.Step) error {
  method startStep (line 122) | func (r *Runtime) startStep(step *backend_types.Step) (func(), int64, er...
  method completeStep (line 151) | func (r *Runtime) completeStep(runnerCtx context.Context, step *backend_...
  method runBlockingStep (line 199) | func (r *Runtime) runBlockingStep(runnerCtx context.Context, step *backe...
  method runDetachedStep (line 227) | func (r *Runtime) runDetachedStep(runnerCtx context.Context, step *backe...
  method traceStep (line 267) | func (r *Runtime) traceStep(processState *backend_types.State, err error...

FILE: pipeline/runtime/step_test.go
  constant testWorkflowID (line 41) | testWorkflowID = "WID_test"
  function newDummyRuntime (line 45) | func newDummyRuntime(t *testing.T, tracer *tracer_mocks.MockTracer) *Run...
  function dummyStep (line 57) | func dummyStep(name string) *backend_types.Step {
  function TestShouldSkipStep (line 69) | func TestShouldSkipStep(t *testing.T) {
  function TestTraceStep (line 107) | func TestTraceStep(t *testing.T) {
  function TestStartStep (line 196) | func TestStartStep(t *testing.T) {
  function TestCompleteStep (line 285) | func TestCompleteStep(t *testing.T) {
  function TestExecuteStep (line 435) | func TestExecuteStep(t *testing.T) {
  function TestRunBlockingStep (line 511) | func TestRunBlockingStep(t *testing.T) {
  function TestRunDetachedStep (line 569) | func TestRunDetachedStep(t *testing.T) {

FILE: pipeline/runtime/workflow.go
  method Run (line 35) | func (r *Runtime) Run(runnerCtx context.Context) error {
  method validateConfig (line 90) | func (r *Runtime) validateConfig() error {
  method logStages (line 104) | func (r *Runtime) logStages() {
  method traceWorkflowSetupError (line 120) | func (r *Runtime) traceWorkflowSetupError(err error) {
  method runStage (line 143) | func (r *Runtime) runStage(runnerCtx context.Context, steps []*backend_t...

FILE: pipeline/runtime/workflow_test.go
  function TestRunNilTracer (line 36) | func TestRunNilTracer(t *testing.T) {
  function TestRunSuccess (line 46) | func TestRunSuccess(t *testing.T) {
  function TestRunMultipleStages (line 71) | func TestRunMultipleStages(t *testing.T) {
  function TestRunStepError (line 101) | func TestRunStepError(t *testing.T) {
  function TestRunContextCanceled (line 128) | func TestRunContextCanceled(t *testing.T) {
  function TestRunSetupWorkflowError (line 154) | func TestRunSetupWorkflowError(t *testing.T) {
  function TestRunSetupWorkflowInvalidSetupError (line 169) | func TestRunSetupWorkflowInvalidSetupError(t *testing.T) {
  function TestRunDestroyWorkflowAlwaysCalled (line 193) | func TestRunDestroyWorkflowAlwaysCalled(t *testing.T) {
  function TestRunDestroyWorkflowCalledOnSetupError (line 208) | func TestRunDestroyWorkflowCalledOnSetupError(t *testing.T) {
  function TestTraceWorkflowSetupError (line 224) | func TestTraceWorkflowSetupError(t *testing.T) {
  function TestRunStage (line 266) | func TestRunStage(t *testing.T) {
  function TestNewDefaults (line 302) | func TestNewDefaults(t *testing.T) {
  function TestWithOptions (line 316) | func TestWithOptions(t *testing.T) {
  function TestGetShutdownCtx (line 339) | func TestGetShutdownCtx(t *testing.T) {
  function TestRunNilLogger (line 348) | func TestRunNilLogger(t *testing.T) {
  function TestRunDestroyWorkflowFallsBackToShutdownCtx (line 363) | func TestRunDestroyWorkflowFallsBackToShutdownCtx(t *testing.T) {

FILE: pipeline/shared/replace_secrets.go
  function NewSecretsReplacer (line 24) | func NewSecretsReplacer(secrets []string) *strings.Replacer {

FILE: pipeline/shared/replace_secrets_test.go
  function TestNewSecretsReplacer (line 23) | func TestNewSecretsReplacer(t *testing.T) {

FILE: pipeline/state/state.go
  type State (line 24) | type State struct
  type Workflow (line 33) | type Workflow struct

FILE: pipeline/tracing/mocks/mock_Tracer.go
  function NewMockTracer (line 14) | func NewMockTracer(t interface {
  type MockTracer (line 27) | type MockTracer struct
    method EXPECT (line 35) | func (_m *MockTracer) EXPECT() *MockTracer_Expecter {
    method Trace (line 40) | func (_mock *MockTracer) Trace(state1 *state.State) error {
  type MockTracer_Expecter (line 31) | type MockTracer_Expecter struct
    method Trace (line 63) | func (_e *MockTracer_Expecter) Trace(state1 interface{}) *MockTracer_T...
  type MockTracer_Trace_Call (line 57) | type MockTracer_Trace_Call struct
    method Run (line 67) | func (_c *MockTracer_Trace_Call) Run(run func(state1 *state.State)) *M...
    method Return (line 80) | func (_c *MockTracer_Trace_Call) Return(err error) *MockTracer_Trace_C...
    method RunAndReturn (line 85) | func (_c *MockTracer_Trace_Call) RunAndReturn(run func(state1 *state.S...

FILE: pipeline/tracing/tracer.go
  type Tracer (line 22) | type Tracer interface
  type TraceFunc (line 28) | type TraceFunc
    method Trace (line 31) | func (f TraceFunc) Trace(state *state.State) error {

FILE: pipeline/utils/copy_line_by_line.go
  function writeChunks (line 24) | func writeChunks(dst io.Writer, data []byte, size int) error {
  function CopyLineByLine (line 45) | func CopyLineByLine(dst io.Writer, src io.Reader, maxSize int) error {

FILE: pipeline/utils/copy_line_by_line_test.go
  type testWriter (line 29) | type testWriter struct
    method Write (line 34) | func (b *testWriter) Write(p []byte) (n int, err error) {
    method Close (line 41) | func (b *testWriter) Close() error {
    method GetWrites (line 45) | func (b *testWriter) GetWrites() []string {
  function TestCopyLineByLine (line 53) | func TestCopyLineByLine(t *testing.T) {
  function TestCopyLineByLineSizeLimit (line 108) | func TestCopyLineByLineSizeLimit(t *testing.T) {
  function TestStringReader (line 156) | func TestStringReader(t *testing.T) {
  function TestCopyLineByLineNewlineCharacter (line 171) | func TestCopyLineByLineNewlineCharacter(t *testing.T) {
  function TestCopyLineByLineLongLine (line 232) | func TestCopyLineByLineLongLine(t *testing.T) {
  function TestCopyLineByLineWriteChunks (line 285) | func TestCopyLineByLineWriteChunks(t *testing.T) {

FILE: rpc/log_entry.go
  constant LogEntryStdout (line 24) | LogEntryStdout int = iota
  constant LogEntryStderr (line 25) | LogEntryStderr
  constant LogEntryExitCode (line 26) | LogEntryExitCode
  constant LogEntryMetadata (line 27) | LogEntryMetadata
  constant LogEntryProgress (line 28) | LogEntryProgress
  type LogEntry (line 32) | type LogEntry struct
    method String (line 40) | func (l *LogEntry) String() string {

FILE: rpc/log_entry_test.go
  function TestLogEntry (line 23) | func TestLogEntry(t *testing.T) {

FILE: rpc/mocks/mock_Peer.go
  function NewMockPeer (line 16) | func NewMockPeer(t interface {
  type MockPeer (line 29) | type MockPeer struct
    method EXPECT (line 37) | func (_m *MockPeer) EXPECT() *MockPeer_Expecter {
    method Done (line 42) | func (_mock *MockPeer) Done(c context.Context, workflowID string, stat...
    method EnqueueLog (line 105) | func (_mock *MockPeer) EnqueueLog(logEntry *rpc.LogEntry) {
    method Extend (line 145) | func (_mock *MockPeer) Extend(c context.Context, workflowID string) er...
    method Init (line 202) | func (_mock *MockPeer) Init(c context.Context, workflowID string, stat...
    method IsConnected (line 265) | func (_mock *MockPeer) IsConnected() bool {
    method Next (line 309) | func (_mock *MockPeer) Next(c context.Context, f rpc.Filter) (*rpc.Wor...
    method RegisterAgent (line 377) | func (_mock *MockPeer) RegisterAgent(ctx context.Context, info rpc.Age...
    method ReportHealth (line 443) | func (_mock *MockPeer) ReportHealth(c context.Context) error {
    method UnregisterAgent (line 494) | func (_mock *MockPeer) UnregisterAgent(ctx context.Context) error {
    method Update (line 545) | func (_mock *MockPeer) Update(c context.Context, workflowID string, st...
    method Version (line 608) | func (_mock *MockPeer) Version(c context.Context) (*rpc.Version, error) {
    method Wait (line 670) | func (_mock *MockPeer) Wait(c context.Context, workflowID string) (boo...
  type MockPeer_Expecter (line 33) | type MockPeer_Expecter struct
    method Done (line 67) | func (_e *MockPeer_Expecter) Done(c interface{}, workflowID interface{...
    method EnqueueLog (line 117) | func (_e *MockPeer_Expecter) EnqueueLog(logEntry interface{}) *MockPee...
    method Extend (line 169) | func (_e *MockPeer_Expecter) Extend(c interface{}, workflowID interfac...
    method Init (line 227) | func (_e *MockPeer_Expecter) Init(c interface{}, workflowID interface{...
    method IsConnected (line 287) | func (_e *MockPeer_Expecter) IsConnected() *MockPeer_IsConnected_Call {
    method Next (line 344) | func (_e *MockPeer_Expecter) Next(c interface{}, f interface{}) *MockP...
    method RegisterAgent (line 410) | func (_e *MockPeer_Expecter) RegisterAgent(ctx interface{}, info inter...
    method ReportHealth (line 466) | func (_e *MockPeer_Expecter) ReportHealth(c interface{}) *MockPeer_Rep...
    method UnregisterAgent (line 517) | func (_e *MockPeer_Expecter) UnregisterAgent(ctx interface{}) *MockPee...
    method Update (line 570) | func (_e *MockPeer_Expecter) Update(c interface{}, workflowID interfac...
    method Version (line 642) | func (_e *MockPeer_Expecter) Version(c interface{}) *MockPeer_Version_...
    method Wait (line 703) | func (_e *MockPeer_Expecter) Wait(c interface{}, workflowID interface{...
  type MockPeer_Done_Call (line 59) | type MockPeer_Done_Call struct
    method Run (line 71) | func (_c *MockPeer_Done_Call) Run(run func(c context.Context, workflow...
    method Return (line 94) | func (_c *MockPeer_Done_Call) Return(err error) *MockPeer_Done_Call {
    method RunAndReturn (line 99) | func (_c *MockPeer_Done_Call) RunAndReturn(run func(c context.Context,...
  type MockPeer_EnqueueLog_Call (line 111) | type MockPeer_EnqueueLog_Call struct
    method Run (line 121) | func (_c *MockPeer_EnqueueLog_Call) Run(run func(logEntry *rpc.LogEntr...
    method Return (line 134) | func (_c *MockPeer_EnqueueLog_Call) Return() *MockPeer_EnqueueLog_Call {
    method RunAndReturn (line 139) | func (_c *MockPeer_EnqueueLog_Call) RunAndReturn(run func(logEntry *rp...
  type MockPeer_Extend_Call (line 162) | type MockPeer_Extend_Call struct
    method Run (line 173) | func (_c *MockPeer_Extend_Call) Run(run func(c context.Context, workfl...
    method Return (line 191) | func (_c *MockPeer_Extend_Call) Return(err error) *MockPeer_Extend_Call {
    method RunAndReturn (line 196) | func (_c *MockPeer_Extend_Call) RunAndReturn(run func(c context.Contex...
  type MockPeer_Init_Call (line 219) | type MockPeer_Init_Call struct
    method Run (line 231) | func (_c *MockPeer_Init_Call) Run(run func(c context.Context, workflow...
    method Return (line 254) | func (_c *MockPeer_Init_Call) Return(err error) *MockPeer_Init_Call {
    method RunAndReturn (line 259) | func (_c *MockPeer_Init_Call) RunAndReturn(run func(c context.Context,...
  type MockPeer_IsConnected_Call (line 282) | type MockPeer_IsConnected_Call struct
    method Run (line 291) | func (_c *MockPeer_IsConnected_Call) Run(run func()) *MockPeer_IsConne...
    method Return (line 298) | func (_c *MockPeer_IsConnected_Call) Return(b bool) *MockPeer_IsConnec...
    method RunAndReturn (line 303) | func (_c *MockPeer_IsConnected_Call) RunAndReturn(run func() bool) *Mo...
  type MockPeer_Next_Call (line 337) | type MockPeer_Next_Call struct
    method Run (line 348) | func (_c *MockPeer_Next_Call) Run(run func(c context.Context, f rpc.Fi...
    method Return (line 366) | func (_c *MockPeer_Next_Call) Return(workflow *rpc.Workflow, err error...
    method RunAndReturn (line 371) | func (_c *MockPeer_Next_Call) RunAndReturn(run func(c context.Context,...
  type MockPeer_RegisterAgent_Call (line 403) | type MockPeer_RegisterAgent_Call struct
    method Run (line 414) | func (_c *MockPeer_RegisterAgent_Call) Run(run func(ctx context.Contex...
    method Return (line 432) | func (_c *MockPeer_RegisterAgent_Call) Return(n int64, err error) *Moc...
    method RunAndReturn (line 437) | func (_c *MockPeer_RegisterAgent_Call) RunAndReturn(run func(ctx conte...
  type MockPeer_ReportHealth_Call (line 460) | type MockPeer_ReportHealth_Call struct
    method Run (line 470) | func (_c *MockPeer_ReportHealth_Call) Run(run func(c context.Context))...
    method Return (line 483) | func (_c *MockPeer_ReportHealth_Call) Return(err error) *MockPeer_Repo...
    method RunAndReturn (line 488) | func (_c *MockPeer_ReportHealth_Call) RunAndReturn(run func(c context....
  type MockPeer_UnregisterAgent_Call (line 511) | type MockPeer_UnregisterAgent_Call struct
    method Run (line 521) | func (_c *MockPeer_UnregisterAgent_Call) Run(run func(ctx context.Cont...
    method Return (line 534) | func (_c *MockPeer_UnregisterAgent_Call) Return(err error) *MockPeer_U...
    method RunAndReturn (line 539) | func (_c *MockPeer_UnregisterAgent_Call) RunAndReturn(run func(ctx con...
  type MockPeer_Update_Call (line 562) | type MockPeer_Update_Call struct
    method Run (line 574) | func (_c *MockPeer_Update_Call) Run(run func(c context.Context, workfl...
    method Return (line 597) | func (_c *MockPeer_Update_Call) Return(err error) *MockPeer_Update_Call {
    method RunAndReturn (line 602) | func (_c *MockPeer_Update_Call) RunAndReturn(run func(c context.Contex...
  type MockPeer_Version_Call (line 636) | type MockPeer_Version_Call struct
    method Run (line 646) | func (_c *MockPeer_Version_Call) Run(run func(c context.Context)) *Moc...
    method Return (line 659) | func (_c *MockPeer_Version_Call) Return(version *rpc.Version, err erro...
    method RunAndReturn (line 664) | func (_c *MockPeer_Version_Call) RunAndReturn(run func(c context.Conte...
  type MockPeer_Wait_Call (line 696) | type MockPeer_Wait_Call struct
    method Run (line 707) | func (_c *MockPeer_Wait_Call) Run(run func(c context.Context, workflow...
    method Return (line 725) | func (_c *MockPeer_Wait_Call) Return(canceled bool, err error) *MockPe...
    method RunAndReturn (line 730) | func (_c *MockPeer_Wait_Call) RunAndReturn(run func(c context.Context,...

FILE: rpc/peer.go
  type Peer (line 70) | type Peer interface

FILE: rpc/proto/version.go
  constant Version (line 19) | Version int32 = 16

FILE: rpc/proto/woodpecker.pb.go
  constant _ (line 34) | _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
  constant _ (line 36) | _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
  type StepState (line 39) | type StepState struct
    method Reset (line 53) | func (x *StepState) Reset() {
    method String (line 60) | func (x *StepState) String() string {
    method ProtoMessage (line 64) | func (*StepState) ProtoMessage() {}
    method ProtoReflect (line 66) | func (x *StepState) ProtoReflect() protoreflect.Message {
    method Descriptor (line 79) | func (*StepState) Descriptor() ([]byte, []int) {
    method GetStepUuid (line 83) | func (x *StepState) GetStepUuid() string {
    method GetStarted (line 90) | func (x *StepState) GetStarted() int64 {
    method GetFinished (line 97) | func (x *StepState) GetFinished() int64 {
    method GetExited (line 104) | func (x *StepState) GetExited() bool {
    method GetExitCode (line 111) | func (x *StepState) GetExitCode() int32 {
    method GetError (line 118) | func (x *StepState) GetError() string {
    method GetCanceled (line 125) | func (x *StepState) GetCanceled() bool {
    method GetSkipped (line 132) | func (x *StepState) GetSkipped() bool {
  type WorkflowState (line 139) | type WorkflowState struct
    method Reset (line 149) | func (x *WorkflowState) Reset() {
    method String (line 156) | func (x *WorkflowState) String() string {
    method ProtoMessage (line 160) | func (*WorkflowState) ProtoMessage() {}
    method ProtoReflect (line 162) | func (x *WorkflowState) ProtoReflect() protoreflect.Message {
    method Descriptor (line 175) | func (*WorkflowState) Descriptor() ([]byte, []int) {
    method GetStarted (line 179) | func (x *WorkflowState) GetStarted() int64 {
    method GetFinished (line 186) | func (x *WorkflowState) GetFinished() int64 {
    method GetError (line 193) | func (x *WorkflowState) GetError() string {
    method GetCanceled (line 200) | func (x *WorkflowState) GetCanceled() bool {
  type LogEntry (line 207) | type LogEntry struct
    method Reset (line 218) | func (x *LogEntry) Reset() {
    method String (line 225) | func (x *LogEntry) String() string {
    method ProtoMessage (line 229) | func (*LogEntry) ProtoMessage() {}
    method ProtoReflect (line 231) | func (x *LogEntry) ProtoReflect() protoreflect.Message {
    method Descriptor (line 244) | func (*LogEntry) Descriptor() ([]byte, []int) {
    method GetStepUuid (line 248) | func (x *LogEntry) GetStepUuid() string {
    method GetTime (line 255) | func (x *LogEntry) GetTime() int64 {
    method GetLine (line 262) | func (x *LogEntry) GetLine() int32 {
    method GetType (line 269) | func (x *LogEntry) GetType() int32 {
    method GetData (line 276) | func (x *LogEntry) GetData() []byte {
  type Filter (line 283) | type Filter struct
    method Reset (line 290) | func (x *Filter) Reset() {
    method String (line 297) | func (x *Filter) String() string {
    method ProtoMessage (line 301) | func (*Filter) ProtoMessage() {}
    method ProtoReflect (line 303) | func (x *Filter) ProtoReflect() protoreflect.Message {
    method Descriptor (line 316) | func (*Filter) Descriptor() ([]byte, []int) {
    method GetLabels (line 320) | func (x *Filter) GetLabels() map[string]string {
  type Workflow (line 327) | type Workflow struct
    method Reset (line 336) | func (x *Workflow) Reset() {
    method String (line 343) | func (x *Workflow) String() string {
    method ProtoMessage (line 347) | func (*Workflow) ProtoMessage() {}
    method ProtoReflect (line 349) | func (x *Workflow) ProtoReflect() protoreflect.Message {
    method Descriptor (line 362) | func (*Workflow) Descriptor() ([]byte, []int) {
    method GetId (line 366) | func (x *Workflow) GetId() string {
    method GetTimeout (line 373) | func (x *Workflow) GetTimeout() int64 {
    method GetPayload (line 380) | func (x *Workflow) GetPayload() []byte {
  type NextRequest (line 387) | type NextRequest struct
    method Reset (line 394) | func (x *NextRequest) Reset() {
    method String (line 401) | func (x *NextRequest) String() string {
    method ProtoMessage (line 405) | func (*NextRequest) ProtoMessage() {}
    method ProtoReflect (line 407) | func (x *NextRequest) ProtoReflect() protoreflect.Message {
    method Descriptor (line 420) | func (*NextRequest) Descriptor() ([]byte, []int) {
    method GetFilter (line 424) | func (x *NextRequest) GetFilter() *Filter {
  type InitRequest (line 431) | type InitRequest struct
    method Reset (line 439) | func (x *InitRequest) Reset() {
    method String (line 446) | func (x *InitRequest) String() string {
    method ProtoMessage (line 450) | func (*InitRequest) ProtoMessage() {}
    method ProtoReflect (line 452) | func (x *InitRequest) ProtoReflect() protoreflect.Message {
    method Descriptor (line 465) | func (*InitRequest) Descriptor() ([]byte, []int) {
    method GetId (line 469) | func (x *InitRequest) GetId() string {
    method GetState (line 476) | func (x *InitRequest) GetState() *WorkflowState {
  type WaitRequest (line 483) | type WaitRequest struct
    method Reset (line 490) | func (x *WaitRequest) Reset() {
    method String (line 497) | func (x *WaitRequest) String() string {
    method ProtoMessage (line 501) | func (*WaitRequest) ProtoMessage() {}
    method ProtoReflect (line 503) | func (x *WaitRequest) ProtoReflect() protoreflect.Message {
    method Descriptor (line 516) | func (*WaitRequest) Descriptor() ([]byte, []int) {
    method GetId (line 520) | func (x *WaitRequest) GetId() string {
  type DoneRequest (line 527) | type DoneRequest struct
    method Reset (line 535) | func (x *DoneRequest) Reset() {
    method String (line 542) | func (x *DoneRequest) String() string {
    method ProtoMessage (line 546) | func (*DoneRequest) ProtoMessage() {}
    method ProtoReflect (line 548) | func (x *DoneRequest) ProtoReflect() protoreflect.Message {
    method Descriptor (line 561) | func (*DoneRequest) Descriptor() ([]byte, []int) {
    method GetId (line 565) | func (x *DoneRequest) GetId() string {
    method GetState (line 572) | func (x *DoneRequest) GetState() *WorkflowState {
  type ExtendRequest (line 579) | type ExtendRequest struct
    method Reset (line 586) | func (x *ExtendRequest) Reset() {
    method String (line 593) | func (x *ExtendRequest) String() string {
    method ProtoMessage (line 597) | func (*ExtendRequest) ProtoMessage() {}
    method ProtoReflect (line 599) | func (x *ExtendRequest) ProtoReflect() protoreflect.Message {
    method Descriptor (line 612) | func (*ExtendRequest) Descriptor() ([]byte, []int) {
    method GetId (line 616) | func (x *ExtendRequest) GetId() string {
  type UpdateRequest (line 623) | type UpdateRequest struct
    method Reset (line 631) | func (x *UpdateRequest) Reset() {
    method String (line 638) | func (x *UpdateRequest) String() string {
    method ProtoMessage (line 642) | func (*UpdateRequest) ProtoMessage() {}
    method ProtoReflect (line 644) | func (x *UpdateRequest) ProtoReflect() protoreflect.Message {
    method Descriptor (line 657) | func (*UpdateRequest) Descriptor() ([]byte, []int) {
    method GetId (line 661) | func (x *UpdateRequest) GetId() string {
    method GetState (line 668) | func (x *UpdateRequest) GetState() *StepState {
  type LogRequest (line 675) | type LogRequest struct
    method Reset (line 682) | func (x *LogRequest) Reset() {
    method String (line 689) | func (x *LogRequest) String() string {
    method ProtoMessage (line 693) | func (*LogRequest) ProtoMessage() {}
    method ProtoReflect (line 695) | func (x *LogRequest) ProtoReflect() protoreflect.Message {
    method Descriptor (line 708) | func (*LogRequest) Descriptor() ([]byte, []int) {
    method GetLogEntries (line 712) | func (x *LogRequest) GetLogEntries() []*LogEntry {
  type Empty (line 719) | type Empty struct
    method Reset (line 725) | func (x *Empty) Reset() {
    method String (line 732) | func (x *Empty) String() string {
    method ProtoMessage (line 736) | func (*Empty) ProtoMessage() {}
    method ProtoReflect (line 738) | func (x *Empty) ProtoReflect() protoreflect.Message {
    method Descriptor (line 751) | func (*Empty) Descriptor() ([]byte, []int) {
  type ReportHealthRequest (line 755) | type ReportHealthRequest struct
    method Reset (line 762) | func (x *ReportHealthRequest) Reset() {
    method String (line 769) | func (x *ReportHealthRequest) String() string {
    method ProtoMessage (line 773) | func (*ReportHealthRequest) ProtoMessage() {}
    method ProtoReflect (line 775) | func (x *ReportHealthRequest) ProtoReflect() protoreflect.Message {
    method Descriptor (line 788) | func (*ReportHealthRequest) Descriptor() ([]byte, []int) {
    method GetStatus (line 792) | func (x *ReportHealthRequest) GetStatus() string {
  type AgentInfo (line 799) | type AgentInfo struct
    method Reset (line 810) | func (x *AgentInfo) Reset() {
    method String (line 817) | func (x *AgentInfo) String() string {
    method ProtoMessage (line 821) | func (*AgentInfo) ProtoMessage() {}
    method ProtoReflect (line 823) | func (x *AgentInfo) ProtoReflect() protoreflect.Message {
    method Descriptor (line 836) | func (*AgentInfo) Descriptor() ([]byte, []int) {
    method GetPlatform (line 840) | func (x *AgentInfo) GetPlatform() string {
    method GetCapacity (line 847) | func (x *AgentInfo) GetCapacity() int32 {
    method GetBackend (line 854) | func (x *AgentInfo) GetBackend() string {
    method GetVersion (line 861) | func (x *AgentInfo) GetVersion() string {
    method GetCustomLabels (line 868) | func (x *AgentInfo) GetCustomLabels() map[string]string {
  type RegisterAgentRequest (line 875) | type RegisterAgentRequest struct
    method Reset (line 882) | func (x *RegisterAgentRequest) Reset() {
    method String (line 889) | func (x *RegisterAgentRequest) String() string {
    method ProtoMessage (line 893) | func (*RegisterAgentRequest) ProtoMessage() {}
    method ProtoReflect (line 895) | func (x *RegisterAgentRequest) ProtoReflect() protoreflect.Message {
    method Descriptor (line 908) | func (*RegisterAgentRequest) Descriptor() ([]byte, []int) {
    method GetInfo (line 912) | func (x *RegisterAgentRequest) GetInfo() *AgentInfo {
  type VersionResponse (line 919) | type VersionResponse struct
    method Reset (line 927) | func (x *VersionResponse) Reset() {
    method String (line 934) | func (x *VersionResponse) String() string {
    method ProtoMessage (line 938) | func (*VersionResponse) ProtoMessage() {}
    method ProtoReflect (line 940) | func (x *VersionResponse) ProtoReflect() protoreflect.Message {
    method Descriptor (line 953) | func (*VersionResponse) Descriptor() ([]byte, []int) {
    method GetGrpcVersion (line 957) | func (x *VersionResponse) GetGrpcVersion() int32 {
    method GetServerVersion (line 964) | func (x *VersionResponse) GetServerVersion() string {
  type NextResponse (line 971) | type NextResponse struct
    method Reset (line 978) | func (x *NextResponse) Reset() {
    method String (line 985) | func (x *NextResponse) String() string {
    method ProtoMessage (line 989) | func (*NextResponse) ProtoMessage() {}
    method ProtoReflect (line 991) | func (x *NextResponse) ProtoReflect() protoreflect.Message {
    method Descriptor (line 1004) | func (*NextResponse) Descriptor() ([]byte, []int) {
    method GetWorkflow (line 1008) | func (x *NextResponse) GetWorkflow() *Workflow {
  type RegisterAgentResponse (line 1015) | type RegisterAgentResponse struct
    method Reset (line 1022) | func (x *RegisterAgentResponse) Reset() {
    method String (line 1029) | func (x *RegisterAgentResponse) String() string {
    method ProtoMessage (line 1033) | func (*RegisterAgentResponse) ProtoMessage() {}
    method ProtoReflect (line 1035) | func (x *RegisterAgentResponse) ProtoReflect() protoreflect.Message {
    method Descriptor (line 1048) | func (*RegisterAgentResponse) Descriptor() ([]byte, []int) {
    method GetAgentId (line 1052) | func (x *RegisterAgentResponse) GetAgentId() int64 {
  type WaitResponse (line 1059) | type WaitResponse struct
    method Reset (line 1066) | func (x *WaitResponse) Reset() {
    method String (line 1073) | func (x *WaitResponse) String() string {
    method ProtoMessage (line 1077) | func (*WaitResponse) ProtoMessage() {}
    method ProtoReflect (line 1079) | func (x *WaitResponse) ProtoReflect() protoreflect.Message {
    method Descriptor (line 1092) | func (*WaitResponse) Descriptor() ([]byte, []int) {
    method GetCanceled (line 1096) | func (x *WaitResponse) GetCanceled() bool {
  type AuthRequest (line 1103) | type AuthRequest struct
    method Reset (line 1111) | func (x *AuthRequest) Reset() {
    method String (line 1118) | func (x *AuthRequest) String() string {
    method ProtoMessage (line 1122) | func (*AuthRequest) ProtoMessage() {}
    method ProtoReflect (line 1124) | func (x *AuthRequest) ProtoReflect() protoreflect.Message {
    method Descriptor (line 1137) | func (*AuthRequest) Descriptor() ([]byte, []int) {
    method GetAgentToken (line 1141) | func (x *AuthRequest) GetAgentToken() string {
    method GetAgentId (line 1148) | func (x *AuthRequest) GetAgentId() int64 {
  type AuthResponse (line 1155) | type AuthResponse struct
    method Reset (line 1164) | func (x *AuthResponse) Reset() {
    method String (line 1171) | func (x *AuthResponse) String() string {
    method ProtoMessage (line 1175) | func (*AuthResponse) ProtoMessage() {}
    method ProtoReflect (line 1177) | func (x *AuthResponse) ProtoReflect() protoreflect.Message {
    method Descriptor (line 1190) | func (*AuthResponse) Descriptor() ([]byte, []int) {
    method GetStatus (line 1194) | func (x *AuthResponse) GetStatus() string {
    method GetAgentId (line 1201) | func (x *AuthResponse) GetAgentId() int64 {
    method GetAccessToken (line 1208) | func (x *AuthResponse) GetAccessToken() string {
  constant file_woodpecker_proto_rawDesc (line 1217) | file_woodpecker_proto_rawDesc = "" +
  function file_woodpecker_proto_rawDescGZIP (line 1321) | func file_woodpecker_proto_rawDescGZIP() []byte {
  function init (line 1396) | func init() { file_woodpecker_proto_init() }
  function file_woodpecker_proto_init (line 1397) | func file_woodpecker_proto_init() {

FILE: rpc/proto/woodpecker_grpc.pb.go
  constant _ (line 34) | _ = grpc.SupportPackageIsVersion9
  constant Woodpecker_Version_FullMethodName (line 37) | Woodpecker_Version_FullMethodName         = "/proto.Woodpecker/Version"
  constant Woodpecker_Next_FullMethodName (line 38) | Woodpecker_Next_FullMethodName            = "/proto.Woodpecker/Next"
  constant Woodpecker_Init_FullMethodName (line 39) | Woodpecker_Init_FullMethodName            = "/proto.Woodpecker/Init"
  constant Woodpecker_Wait_FullMethodName (line 40) | Woodpecker_Wait_FullMethodName            = "/proto.Woodpecker/Wait"
  constant Woodpecker_Done_FullMethodName (line 41) | Woodpecker_Done_FullMethodName            = "/proto.Woodpecker/Done"
  constant Woodpecker_Extend_FullMethodName (line 42) | Woodpecker_Extend_FullMethodName          = "/proto.Woodpecker/Extend"
  constant Woodpecker_Update_FullMethodName (line 43) | Woodpecker_Update_FullMethodName          = "/proto.Woodpecker/Update"
  constant Woodpecker_Log_FullMethodName (line 44) | Woodpecker_Log_FullMethodName             = "/proto.Woodpecker/Log"
  constant Woodpecker_RegisterAgent_FullMethodName (line 45) | Woodpecker_RegisterAgent_FullMethodName   = "/proto.Woodpecker/RegisterA...
  constant Woodpecker_UnregisterAgent_FullMethodName (line 46) | Woodpecker_UnregisterAgent_FullMethodName = "/proto.Woodpecker/Unregiste...
  constant Woodpecker_ReportHealth_FullMethodName (line 47) | Woodpecker_ReportHealth_FullMethodName    = "/proto.Woodpecker/ReportHea...
  type WoodpeckerClient (line 55) | type WoodpeckerClient interface
  type woodpeckerClient (line 69) | type woodpeckerClient struct
    method Version (line 77) | func (c *woodpeckerClient) Version(ctx context.Context, in *Empty, opt...
    method Next (line 87) | func (c *woodpeckerClient) Next(ctx context.Context, in *NextRequest, ...
    method Init (line 97) | func (c *woodpeckerClient) Init(ctx context.Context, in *InitRequest, ...
    method Wait (line 107) | func (c *woodpeckerClient) Wait(ctx context.Context, in *WaitRequest, ...
    method Done (line 117) | func (c *woodpeckerClient) Done(ctx context.Context, in *DoneRequest, ...
    method Extend (line 127) | func (c *woodpeckerClient) Extend(ctx context.Context, in *ExtendReque...
    method Update (line 137) | func (c *woodpeckerClient) Update(ctx context.Context, in *UpdateReque...
    method Log (line 147) | func (c *woodpeckerClient) Log(ctx context.Context, in *LogRequest, op...
    method RegisterAgent (line 157) | func (c *woodpeckerClient) RegisterAgent(ctx context.Context, in *Regi...
    method UnregisterAgent (line 167) | func (c *woodpeckerClient) UnregisterAgent(ctx context.Context, in *Em...
    method ReportHealth (line 177) | func (c *woodpeckerClient) ReportHealth(ctx context.Context, in *Repor...
  function NewWoodpeckerClient (line 73) | func NewWoodpeckerClient(cc grpc.ClientConnInterface) WoodpeckerClient {
  type WoodpeckerServer (line 192) | type WoodpeckerServer interface
  type UnimplementedWoodpeckerServer (line 212) | type UnimplementedWoodpeckerServer struct
    method Version (line 214) | func (UnimplementedWoodpeckerServer) Version(context.Context, *Empty) ...
    method Next (line 217) | func (UnimplementedWoodpeckerServer) Next(context.Context, *NextReques...
    method Init (line 220) | func (UnimplementedWoodpeckerServer) Init(context.Context, *InitReques...
    method Wait (line 223) | func (UnimplementedWoodpeckerServer) Wait(context.Context, *WaitReques...
    method Done (line 226) | func (UnimplementedWoodpeckerServer) Done(context.Context, *DoneReques...
    method Extend (line 229) | func (UnimplementedWoodpeckerServer) Extend(context.Context, *ExtendRe...
    method Update (line 232) | func (UnimplementedWoodpeckerServer) Update(context.Context, *UpdateRe...
    method Log (line 235) | func (UnimplementedWoodpeckerServer) Log(context.Context, *LogRequest)...
    method RegisterAgent (line 238) | func (UnimplementedWoodpeckerServer) RegisterAgent(context.Context, *R...
    method UnregisterAgent (line 241) | func (UnimplementedWoodpeckerServer) UnregisterAgent(context.Context, ...
    method ReportHealth (line 244) | func (UnimplementedWoodpeckerServer) ReportHealth(context.Context, *Re...
    method mustEmbedUnimplementedWoodpeckerServer (line 247) | func (UnimplementedWoodpeckerServer) mustEmbedUnimplementedWoodpeckerS...
    method testEmbeddedByValue (line 248) | func (UnimplementedWoodpeckerServer) testEmbeddedByValue()            ...
  type UnsafeWoodpeckerServer (line 253) | type UnsafeWoodpeckerServer interface
  function RegisterWoodpeckerServer (line 257) | func RegisterWoodpeckerServer(s grpc.ServiceRegistrar, srv WoodpeckerSer...
  function _Woodpecker_Version_Handler (line 268) | func _Woodpecker_Version_Handler(srv interface{}, ctx context.Context, d...
  function _Woodpecker_Next_Handler (line 286) | func _Woodpecker_Next_Handler(srv interface{}, ctx context.Context, dec ...
  function _Woodpecker_Init_Handler (line 304) | func _Woodpecker_Init_Handler(srv interface{}, ctx context.Context, dec ...
  function _Woodpecker_Wait_Handler (line 322) | func _Woodpecker_Wait_Handler(srv interface{}, ctx context.Context, dec ...
  function _Woodpecker_Done_Handler (line 340) | func _Woodpecker_Done_Handler(srv interface{}, ctx context.Context, dec ...
  function _Woodpecker_Extend_Handler (line 358) | func _Woodpecker_Extend_Handler(srv interface{}, ctx context.Context, de...
  function _Woodpecker_Update_Handler (line 376) | func _Woodpecker_Update_Handler(srv interface{}, ctx context.Context, de...
  function _Woodpecker_Log_Handler (line 394) | func _Woodpecker_Log_Handler(srv interface{}, ctx context.Context, dec f...
  function _Woodpecker_RegisterAgent_Handler (line 412) | func _Woodpecker_RegisterAgent_Handler(srv interface{}, ctx context.Cont...
  function _Woodpecker_UnregisterAgent_Handler (line 430) | func _Woodpecker_UnregisterAgent_Handler(srv interface{}, ctx context.Co...
  function _Woodpecker_ReportHealth_Handler (line 448) | func _Woodpecker_ReportHealth_Handler(srv interface{}, ctx context.Conte...
  constant WoodpeckerAuth_Auth_FullMethodName (line 523) | WoodpeckerAuth_Auth_FullMethodName = "/proto.WoodpeckerAuth/Auth"
  type WoodpeckerAuthClient (line 529) | type WoodpeckerAuthClient interface
  type woodpeckerAuthClient (line 533) | type woodpeckerAuthClient struct
    method Auth (line 541) | func (c *woodpeckerAuthClient) Auth(ctx context.Context, in *AuthReque...
  function NewWoodpeckerAuthClient (line 537) | func NewWoodpeckerAuthClient(cc grpc.ClientConnInterface) WoodpeckerAuth...
  type WoodpeckerAuthServer (line 554) | type WoodpeckerAuthServer interface
  type UnimplementedWoodpeckerAuthServer (line 564) | type UnimplementedWoodpeckerAuthServer struct
    method Auth (line 566) | func (UnimplementedWoodpeckerAuthServer) Auth(context.Context, *AuthRe...
    method mustEmbedUnimplementedWoodpeckerAuthServer (line 569) | func (UnimplementedWoodpeckerAuthServer) mustEmbedUnimplementedWoodpec...
    method testEmbeddedByValue (line 570) | func (UnimplementedWoodpeckerAuthServer) testEmbeddedByValue()        ...
  type UnsafeWoodpeckerAuthServer (line 575) | type UnsafeWoodpeckerAuthServer interface
  function RegisterWoodpeckerAuthServer (line 579) | func RegisterWoodpeckerAuthServer(s grpc.ServiceRegistrar, srv Woodpecke...
  function _WoodpeckerAuth_Auth_Handler (line 590) | func _WoodpeckerAuth_Auth_Handler(srv interface{}, ctx context.Context, ...

FILE: rpc/types.go
  type Filter (line 23) | type Filter struct
  type StepState (line 28) | type StepState struct
  type WorkflowState (line 40) | type WorkflowState struct
  type Workflow (line 48) | type Workflow struct
  type Version (line 54) | type Version struct
  type AgentInfo (line 60) | type AgentInfo struct

FILE: server/api/agent.go
  function GetAgents (line 43) | func GetAgents(c *gin.Context) {
  function GetAgent (line 61) | func GetAgent(c *gin.Context) {
  function GetAgentTasks (line 85) | func GetAgentTasks(c *gin.Context) {
  function PatchAgent (line 119) | func PatchAgent(c *gin.Context) {
  function PostAgent (line 167) | func PostAgent(c *gin.Context) {
  function DeleteAgent (line 200) | func DeleteAgent(c *gin.Context) {
  function PostOrgAgent (line 249) | func PostOrgAgent(c *gin.Context) {
  function GetOrgAgents (line 293) | func GetOrgAgents(c *gin.Context) {
  function PatchOrgAgent (line 317) | func PatchOrgAgent(c *gin.Context) {
  function DeleteOrgAgent (line 369) | func DeleteOrgAgent(c *gin.Context) {

FILE: server/api/agent_test.go
  function TestGetAgents (line 46) | func TestGetAgents(t *testing.T) {
  function TestGetAgent (line 72) | func TestGetAgent(t *testing.T) {
  function TestPatchAgent (line 123) | func TestPatchAgent(t *testing.T) {
  function TestPostAgent (line 155) | func TestPostAgent(t *testing.T) {
  function TestDeleteAgent (line 187) | func TestDeleteAgent(t *testing.T) {
  function TestPostOrgAgent (line 244) | func TestPostOrgAgent(t *testing.T) {

FILE: server/api/badge.go
  function GetBadge (line 46) | func GetBadge(c *gin.Context) {
  function GetCC (line 168) | func GetCC(c *gin.Context) {

FILE: server/api/cron.go
  function GetCron (line 45) | func GetCron(c *gin.Context) {
  function RunCron (line 71) | func RunCron(c *gin.Context) {
  function PostCron (line 111) | func PostCron(c *gin.Context) {
  function PatchCron (line 179) | func PatchCron(c *gin.Context) {
  function GetCronList (line 268) | func GetCronList(c *gin.Context) {
  function DeleteCron (line 288) | func DeleteCron(c *gin.Context) {

FILE: server/api/debug/debug.go
  function IndexHandler (line 32) | func IndexHandler() gin.HandlerFunc {
  function HeapHandler (line 48) | func HeapHandler() gin.HandlerFunc {
  function GoroutineHandler (line 64) | func GoroutineHandler() gin.HandlerFunc {
  function BlockHandler (line 79) | func BlockHandler() gin.HandlerFunc {
  function ThreadCreateHandler (line 94) | func ThreadCreateHandler() gin.HandlerFunc {
  function CmdlineHandler (line 109) | func CmdlineHandler() gin.HandlerFunc {
  function ProfileHandler (line 126) | func ProfileHandler() gin.HandlerFunc {
  function SymbolHandler (line 146) | func SymbolHandler() gin.HandlerFunc {
  function TraceHandler (line 163) | func TraceHandler() gin.HandlerFunc {

FILE: server/api/forge.go
  function GetForges (line 38) | func GetForges(c *gin.Context) {
  function GetForge (line 68) | func GetForge(c *gin.Context) {
  function PatchForge (line 99) | func PatchForge(c *gin.Context) {
  function PostForge (line 149) | func PostForge(c *gin.Context) {
  function DeleteForge (line 182) | func DeleteForge(c *gin.Context) {

FILE: server/api/global_registry.go
  function GetGlobalRegistryList (line 37) | func GetGlobalRegistryList(c *gin.Context) {
  function GetGlobalRegistry (line 61) | func GetGlobalRegistry(c *gin.Context) {
  function PostGlobalRegistry (line 81) | func PostGlobalRegistry(c *gin.Context) {
  function PatchGlobalRegistry (line 115) | func PatchGlobalRegistry(c *gin.Context) {
  function DeleteGlobalRegistry (line 162) | func DeleteGlobalRegistry(c *gin.Context) {

FILE: server/api/global_secret.go
  function GetGlobalSecretList (line 37) | func GetGlobalSecretList(c *gin.Context) {
  function GetGlobalSecret (line 61) | func GetGlobalSecret(c *gin.Context) {
  function PostGlobalSecret (line 81) | func PostGlobalSecret(c *gin.Context) {
  function PatchGlobalSecret (line 117) | func PatchGlobalSecret(c *gin.Context) {
  function DeleteGlobalSecret (line 167) | func DeleteGlobalSecret(c *gin.Context) {

FILE: server/api/helper.go
  function handlePipelineErr (line 32) | func handlePipelineErr(c *gin.Context, err error) {
  function handleDBError (line 47) | func handleDBError(c *gin.Context, err error) {
  function refreshUserToken (line 57) | func refreshUserToken(c *gin.Context, user *model.User) {
  function pipelineDeleteAllowed (line 70) | func pipelineDeleteAllowed(pl *model.Pipeline) bool {

FILE: server/api/helper_test.go
  function TestHandlePipelineError (line 28) | func TestHandlePipelineError(t *testing.T) {

FILE: server/api/hook.go
  function getAgentName (line 38) | func getAgentName(store store.Store, agentNameMap map[int64]string, agen...
  function PostHook (line 69) | func PostHook(c *gin.Context) {
  function getRepoFromToken (line 215) | func getRepoFromToken(store store.Store, t *token.Token) (*model.Repo, e...

FILE: server/api/hook_test.go
  function TestHook (line 41) | func TestHook(t *testing.T) {

FILE: server/api/login.go
  constant stateTokenDuration (line 42) | stateTokenDuration = time.Minute * 5
  constant perPage (line 43) | perPage            = 50
  constant maxPage (line 44) | maxPage            = 10000
  function HandleAuth (line 47) | func HandleAuth(c *gin.Context) {
  function updateRepoPermissions (line 308) | func updateRepoPermissions(c *gin.Context, user *model.User, _store stor...
  function GetLogout (line 356) | func GetLogout(c *gin.Context) {

FILE: server/api/login_test.go
  function TestHandleAuth (line 42) | func TestHandleAuth(t *testing.T) {

FILE: server/api/metrics/prometheus.go
  function PromHandler (line 32) | func PromHandler() gin.HandlerFunc {

FILE: server/api/org.go
  function GetOrgs (line 41) | func GetOrgs(c *gin.Context) {
  function GetOrg (line 59) | func GetOrg(c *gin.Context) {
  function GetOrgPermissions (line 73) | func GetOrgPermissions(c *gin.Context) {
  function LookupOrg (line 118) | func LookupOrg(c *gin.Context) {
  function DeleteOrg (line 175) | func DeleteOrg(c *gin.Context) {

FILE: server/api/org_registry.go
  function GetOrgRegistry (line 37) | func GetOrgRegistry(c *gin.Context) {
  function GetOrgRegistryList (line 61) | func GetOrgRegistryList(c *gin.Context) {
  function PostOrgRegistry (line 88) | func PostOrgRegistry(c *gin.Context) {
  function PatchOrgRegistry (line 126) | func PatchOrgRegistry(c *gin.Context) {
  function DeleteOrgRegistry (line 174) | func DeleteOrgRegistry(c *gin.Context) {

FILE: server/api/org_secret.go
  function GetOrgSecret (line 37) | func GetOrgSecret(c *gin.Context) {
  function GetOrgSecretList (line 61) | func GetOrgSecretList(c *gin.Context) {
  function PostOrgSecret (line 88) | func PostOrgSecret(c *gin.Context) {
  function PatchOrgSecret (line 128) | func PatchOrgSecret(c *gin.Context) {
  function DeleteOrgSecret (line 179) | func DeleteOrgSecret(c *gin.Context) {

FILE: server/api/pipeline.go
  function CreatePipeline (line 50) | func CreatePipeline(c *gin.Context) {
  function createTmpPipeline (line 91) | func createTmpPipeline(event model.WebhookEvent, commit *model.Commit, u...
  function GetPipelines (line 129) | func GetPipelines(c *gin.Context) {
  function DeletePipeline (line 201) | func DeletePipeline(c *gin.Context) {
  function GetPipeline (line 241) | func GetPipeline(c *gin.Context) {
  function GetPipelineLastByBranch (line 268) | func GetPipelineLastByBranch(c *gin.Context) {
  function GetStepLogs (line 297) | func GetStepLogs(c *gin.Context) {
  function DeleteStepLogs (line 347) | func DeleteStepLogs(c *gin.Context) {
  function GetPipelineConfig (line 400) | func GetPipelineConfig(c *gin.Context) {
  function GetPipelineMetadata (line 434) | func GetPipelineMetadata(c *gin.Context) {
  function CancelPipeline (line 475) | func CancelPipeline(c *gin.Context) {
  function PostApproval (line 513) | func PostApproval(c *gin.Context) {
  function PostDecline (line 545) | func PostDecline(c *gin.Context) {
  function GetPipelineQueue (line 575) | func GetPipelineQueue(c *gin.Context) {
  function PostPipeline (line 597) | func PostPipeline(c *gin.Context) {
  function DeletePipelineLogs (line 677) | func DeletePipelineLogs(c *gin.Context) {

FILE: server/api/pipeline_test.go
  function TestGetPipelines (line 51) | func TestGetPipelines(t *testing.T) {
  function TestDeletePipeline (line 128) | func TestDeletePipeline(t *testing.T) {
  function TestGetPipelineMetadata (line 174) | func TestGetPipelineMetadata(t *testing.T) {
  function TestCancelPipeline (line 246) | func TestCancelPipeline(t *testing.T) {
  function TestCreatePipeline (line 283) | func TestCreatePipeline(t *testing.T) {

FILE: server/api/queue.go
  function GetQueueInfo (line 37) | func GetQueueInfo(c *gin.Context) {
  function PauseQueue (line 93) | func PauseQueue(c *gin.Context) {
  function ResumeQueue (line 106) | func ResumeQueue(c *gin.Context) {
  function BlockTilQueueHasRunningItem (line 119) | func BlockTilQueueHasRunningItem(c *gin.Context) {
  function processQueueTasks (line 130) | func processQueueTasks(store store.Store, tasks []*model.Task, agentName...

FILE: server/api/registry.go
  function GetRegistry (line 37) | func GetRegistry(c *gin.Context) {
  function PostRegistry (line 60) | func PostRegistry(c *gin.Context) {
  function PatchRegistry (line 98) | func PatchRegistry(c *gin.Context) {
  function GetRegistryList (line 144) | func GetRegistryList(c *gin.Context) {
  function DeleteRegistry (line 170) | func DeleteRegistry(c *gin.Context) {

FILE: server/api/repo.go
  function PostRepo (line 49) | func PostRepo(c *gin.Context) {
  function PatchRepo (line 220) | func PatchRepo(c *gin.Context) {
  function ChownRepo (line 339) | func ChownRepo(c *gin.Context) {
  function LookupRepo (line 362) | func LookupRepo(c *gin.Context) {
  function GetRepo (line 375) | func GetRepo(c *gin.Context) {
  function GetRepoPermissions (line 389) | func GetRepoPermissions(c *gin.Context) {
  function GetRepoBranches (line 405) | func GetRepoBranches(c *gin.Context) {
  function GetRepoPullRequests (line 446) | func GetRepoPullRequests(c *gin.Context) {
  function DeleteRepo (line 484) | func DeleteRepo(c *gin.Context) {
  function RepairRepo (line 538) | func RepairRepo(c *gin.Context) {
  function MoveRepo (line 560) | func MoveRepo(c *gin.Context) {
  function GetAllRepos (line 659) | func GetAllRepos(c *gin.Context) {
  function RepairAllRepos (line 682) | func RepairAllRepos(c *gin.Context) {
  function repairRepo (line 713) | func repairRepo(c *gin.Context, repo *model.Repo, updatePermissions bool...
  function repairRepoUser (line 798) | func repairRepoUser(c *gin.Context, repo *model.Repo, _store store.Store...

FILE: server/api/repo_secret.go
  function GetSecret (line 37) | func GetSecret(c *gin.Context) {
  function PostSecret (line 60) | func PostSecret(c *gin.Context) {
  function PatchSecret (line 100) | func PatchSecret(c *gin.Context) {
  function GetSecretList (line 154) | func GetSecretList(c *gin.Context) {
  function DeleteSecret (line 180) | func DeleteSecret(c *gin.Context) {

FILE: server/api/repo_test.go
  function TestPostRepoReturnsConflictOnDuplicateRepository (line 35) | func TestPostRepoReturnsConflictOnDuplicateRepository(t *testing.T) {

FILE: server/api/signature_public_key.go
  function GetSignaturePublicKey (line 36) | func GetSignaturePublicKey(c *gin.Context) {

FILE: server/api/stream.go
  constant maxQueuedBatchesPerClient (line 42) | maxQueuedBatchesPerClient int = 30
  constant idlePingTime (line 45) | idlePingTime = time.Second * 30
  function EventStreamSSE (line 56) | func EventStreamSSE(c *gin.Context) {
  function LogStreamSSE (line 140) | func LogStreamSSE(c *gin.Context) {
  function logWriteStringErr (line 283) | func logWriteStringErr(_ int, err error) {

FILE: server/api/stream_test.go
  function TestEventStreamSSEConcurrentDisconnect (line 38) | func TestEventStreamSSEConcurrentDisconnect(t *testing.T) {
  function setupLogStreamContext (line 85) | func setupLogStreamContext(t *testing.T) (*httptest.ResponseRecorder, *g...
  function TestLogStreamSSEConcurrentDisconnect (line 118) | func TestLogStreamSSEConcurrentDisconnect(t *testing.T) {

FILE: server/api/user.go
  function GetSelf (line 43) | func GetSelf(c *gin.Context) {
  function GetFeed (line 56) | func GetFeed(c *gin.Context) {
  function GetRepos (line 91) | func GetRepos(c *gin.Context) {
  function PostToken (line 224) | func PostToken(c *gin.Context) {
  function DeleteToken (line 245) | func DeleteToken(c *gin.Context) {

FILE: server/api/users.go
  constant defaultForgeID (line 33) | defaultForgeID = 1
  function GetUsers (line 46) | func GetUsers(c *gin.Context) {
  function GetUser (line 67) | func GetUser(c *gin.Context) {
  function PatchUser (line 101) | func PatchUser(c *gin.Context) {
  function PostUser (line 154) | func PostUser(c *gin.Context) {
  function DeleteUser (line 194) | func DeleteUser(c *gin.Context) {

FILE: server/api/z.go
  function Health (line 37) | func Health(c *gin.Context) {
  function Version (line 53) | func Version(c *gin.Context) {
  function LogLevel (line 68) | func LogLevel(c *gin.Context) {
  function SetLogLevel (line 84) | func SetLogLevel(c *gin.Context) {

FILE: server/badges/badges.go
  function getBadgeStatusLabelAndColor (line 32) | func getBadgeStatusLabelAndColor(status *model.StatusValue) (string, Col...
  function Generate (line 52) | func Generate(name string, status *model.StatusValue) (string, error) {

FILE: server/badges/badges_test.go
  function TestGenerate (line 38) | func TestGenerate(t *testing.T) {
  function TestBadgeDrawerRender (line 69) | func TestBadgeDrawerRender(t *testing.T) {
  function TestBadgeDrawerRenderBytes (line 92) | func TestBadgeDrawerRenderBytes(t *testing.T) {

FILE: server/badges/color.go
  type Color (line 7) | type Color
  constant ColorGreen (line 11) | ColorGreen  = "#44cc11"
  constant ColorYellow (line 12) | ColorYellow = "#dfb317"
  constant ColorRed (line 13) | ColorRed    = "#e05d44"
  constant ColorGray (line 14) | ColorGray   = "#9f9f9f"

FILE: server/badges/drawer.go
  type badge (line 21) | type badge struct
  type bounds (line 28) | type bounds struct
    method Dx (line 37) | func (b bounds) Dx() float64 {
  type badgeDrawer (line 41) | type badgeDrawer struct
    method Render (line 47) | func (d *badgeDrawer) Render(subject, status string, color Color, w io...
    method RenderBytes (line 67) | func (d *badgeDrawer) RenderBytes(subject, status string, color Color)...
    method measureString (line 77) | func (d *badgeDrawer) measureString(s string) float64 {
  constant extraDx (line 75) | extraDx = 5
  function RenderBytes (line 83) | func RenderBytes(subject, status string, color Color) ([]byte, error) {
  constant dpi (line 92) | dpi      = 72
  constant fontSize (line 93) | fontSize = 11
  function initDrawer (line 102) | func initDrawer() (*badgeDrawer, error) {
  function mustNewFontDrawer (line 119) | func mustNewFontDrawer(size, dpi float64) (*font.Drawer, error) {

FILE: server/cache/membership.go
  type MembershipService (line 33) | type MembershipService interface
  type membershipCache (line 38) | type membershipCache struct
    method Get (line 54) | func (c *membershipCache) Get(ctx context.Context, _forge forge.Forge,...
  function NewMembershipService (line 45) | func NewMembershipService(_store store.Store) MembershipService {

FILE: server/ccmenu/cc.go
  type CCProjects (line 31) | type CCProjects struct
  type CCProject (line 36) | type CCProject struct
  function New (line 46) | func New(r *model.Repo, b *model.Pipeline, url string) *CCProjects {

FILE: server/ccmenu/cc_test.go
  function TestCC (line 27) | func TestCC(t *testing.T) {

FILE: server/cron/cron.go
  constant checkTime (line 34) | checkTime = time.Minute
  constant checkItems (line 37) | checkItems = 10
  function Run (line 41) | func Run(ctx context.Context, store store.Store) error {
  function CalcNewNext (line 68) | func CalcNewNext(schedule string, now time.Time) (time.Time, error) {
  function runCron (line 86) | func runCron(ctx context.Context, store store.Store, cron *model.Cron, n...
  function CreatePipeline (line 113) | func CreatePipeline(ctx context.Context, store store.Store, cron *model....

FILE: server/cron/cron_test.go
  function TestCreatePipeline (line 31) | func TestCreatePipeline(t *testing.T) {
  function TestCalcNewNext (line 74) | func TestCalcNewNext(t *testing.T) {

FILE: server/forge/addon/args.go
  type argumentsRepo (line 21) | type argumentsRepo struct
  type argumentsFileDir (line 28) | type argumentsFileDir struct
  type argumentsStatus (line 35) | type argumentsStatus struct
  type argumentsNetrc (line 42) | type argumentsNetrc struct
  type argumentsActivateDeactivate (line 47) | type argumentsActivateDeactivate struct
  type argumentsBranchesPullRequests (line 53) | type argumentsBranchesPullRequests struct
  type argumentsBranchHead (line 59) | type argumentsBranchHead struct
  type argumentsOrgMembershipOrg (line 65) | type argumentsOrgMembershipOrg struct
  type argumentsTeams (line 70) | type argumentsTeams struct
  type argumentsRepos (line 75) | type argumentsRepos struct
  type responseHook (line 80) | type responseHook struct
  type responseLogin (line 85) | type responseLogin struct
  type httpRequest (line 90) | type httpRequest struct
  type modelUser (line 99) | type modelUser struct
    method asModel (line 117) | func (m *modelUser) asModel() *model.User {
  function modelUserFromModel (line 129) | func modelUserFromModel(u *model.User) *modelUser {
  type modelRepo (line 144) | type modelRepo struct
    method asModel (line 151) | func (m *modelRepo) asModel() *model.Repo {
  function modelRepoFromModel (line 161) | func modelRepoFromModel(r *model.Repo) *modelRepo {

FILE: server/forge/addon/client.go
  function Load (line 37) | func Load(file string) (forge.Forge, error) {
  type RPC (line 64) | type RPC struct
    method Name (line 68) | func (g *RPC) Name() string {
    method URL (line 77) | func (g *RPC) URL() string {
    method Login (line 86) | func (g *RPC) Login(_ context.Context, r *types.OAuthRequest) (*model....
    method Teams (line 106) | func (g *RPC) Teams(_ context.Context, u *model.User, p *model.ListOpt...
    method Repo (line 124) | func (g *RPC) Repo(_ context.Context, u *model.User, remoteID model.Fo...
    method Repos (line 148) | func (g *RPC) Repos(_ context.Context, u *model.User, p *model.ListOpt...
    method File (line 174) | func (g *RPC) File(_ context.Context, u *model.User, r *model.Repo, b ...
    method Dir (line 188) | func (g *RPC) Dir(_ context.Context, u *model.User, r *model.Repo, b *...
    method Status (line 207) | func (g *RPC) Status(_ context.Context, u *model.User, r *model.Repo, ...
    method Netrc (line 221) | func (g *RPC) Netrc(u *model.User, r *model.Repo) (*model.Netrc, error) {
    method Activate (line 238) | func (g *RPC) Activate(_ context.Context, u *model.User, r *model.Repo...
    method Deactivate (line 251) | func (g *RPC) Deactivate(_ context.Context, u *model.User, r *model.Re...
    method Branches (line 264) | func (g *RPC) Branches(_ context.Context, u *model.User, r *model.Repo...
    method BranchHead (line 282) | func (g *RPC) BranchHead(_ context.Context, u *model.User, r *model.Re...
    method PullRequests (line 300) | func (g *RPC) PullRequests(_ context.Context, u *model.User, r *model....
    method Hook (line 318) | func (g *RPC) Hook(_ context.Context, r *http.Request) (*model.Repo, *...
    method OrgMembership (line 346) | func (g *RPC) OrgMembership(_ context.Context, u *model.User, org stri...
    method Org (line 363) | func (g *RPC) Org(_ context.Context, u *model.User, org string) (*mode...

FILE: server/forge/addon/plugin.go
  constant pluginKey (line 25) | pluginKey = "forge"
  type Plugin (line 33) | type Plugin struct
    method Server (line 37) | func (p *Plugin) Server(*plugin.MuxBroker) (any, error) {
    method Client (line 41) | func (*Plugin) Client(_ *plugin.MuxBroker, c *rpc.Client) (any, error) {

FILE: server/forge/addon/server.go
  function Serve (line 29) | func Serve(impl forge.Forge) {
  function mkCtx (line 38) | func mkCtx() context.Context {
  type RPCServer (line 42) | type RPCServer struct
    method Name (line 46) | func (s *RPCServer) Name(_ []byte, resp *string) error {
    method URL (line 51) | func (s *RPCServer) URL(_ []byte, resp *string) error {
    method Teams (line 56) | func (s *RPCServer) Teams(args []byte, resp *[]byte) error {
    method Repo (line 70) | func (s *RPCServer) Repo(args []byte, resp *[]byte) error {
    method Repos (line 84) | func (s *RPCServer) Repos(args []byte, resp *[]byte) error {
    method File (line 102) | func (s *RPCServer) File(args []byte, resp *[]byte) error {
    method Dir (line 112) | func (s *RPCServer) Dir(args []byte, resp *[]byte) error {
    method Status (line 126) | func (s *RPCServer) Status(args []byte, resp *[]byte) error {
    method Netrc (line 136) | func (s *RPCServer) Netrc(args []byte, resp *[]byte) error {
    method Activate (line 150) | func (s *RPCServer) Activate(args []byte, resp *[]byte) error {
    method Deactivate (line 160) | func (s *RPCServer) Deactivate(args []byte, resp *[]byte) error {
    method Branches (line 170) | func (s *RPCServer) Branches(args []byte, resp *[]byte) error {
    method BranchHead (line 184) | func (s *RPCServer) BranchHead(args []byte, resp *[]byte) error {
    method PullRequests (line 198) | func (s *RPCServer) PullRequests(args []byte, resp *[]byte) error {
    method OrgMembership (line 212) | func (s *RPCServer) OrgMembership(args []byte, resp *[]byte) error {
    method Org (line 226) | func (s *RPCServer) Org(args []byte, resp *[]byte) error {
    method Hook (line 240) | func (s *RPCServer) Hook(args []byte, resp *[]byte) error {
    method Login (line 263) | func (s *RPCServer) Login(args []byte, resp *[]byte) error {

FILE: server/forge/bitbucket/bitbucket.go
  constant DefaultAPI (line 42) | DefaultAPI = "https://api.bitbucket.org"
  constant DefaultURL (line 43) | DefaultURL = "https://bitbucket.org"
  constant pageSize (line 44) | pageSize   = 100
  type Opts (line 48) | type Opts struct
  type config (line 53) | type config struct
    method Name (line 75) | func (c *config) Name() string {
    method URL (line 80) | func (c *config) URL() string {
    method Login (line 86) | func (c *config) Login(ctx context.Context, req *forge_types.OAuthRequ...
    method Refresh (line 124) | func (c *config) Refresh(ctx context.Context, user *model.User) (bool,...
    method Teams (line 141) | func (c *config) Teams(ctx context.Context, u *model.User, p *model.Li...
    method Repo (line 162) | func (c *config) Repo(ctx context.Context, u *model.User, remoteID mod...
    method Repos (line 192) | func (c *config) Repos(ctx context.Context, u *model.User, p *model.Li...
    method File (line 243) | func (c *config) File(ctx context.Context, u *model.User, r *model.Rep...
    method Dir (line 258) | func (c *config) Dir(ctx context.Context, u *model.User, r *model.Repo...
    method Status (line 312) | func (c *config) Status(ctx context.Context, user *model.User, repo *m...
    method Activate (line 330) | func (c *config) Activate(ctx context.Context, u *model.User, r *model...
    method Deactivate (line 347) | func (c *config) Deactivate(ctx context.Context, u *model.User, r *mod...
    method Netrc (line 376) | func (c *config) Netrc(u *model.User, _ *model.Repo) (*model.Netrc, er...
    method Branches (line 386) | func (c *config) Branches(ctx context.Context, u *model.User, r *model...
    method BranchHead (line 402) | func (c *config) BranchHead(ctx context.Context, u *model.User, r *mod...
    method PullRequests (line 414) | func (c *config) PullRequests(ctx context.Context, u *model.User, r *m...
    method Hook (line 434) | func (c *config) Hook(ctx context.Context, req *http.Request) (*model....
    method OrgMembership (line 484) | func (c *config) OrgMembership(ctx context.Context, u *model.User, own...
    method Org (line 492) | func (c *config) Org(ctx context.Context, u *model.User, owner string)...
    method newClient (line 505) | func (c *config) newClient(ctx context.Context, u *model.User) *intern...
    method newClientToken (line 513) | func (c *config) newClientToken(ctx context.Context, accessToken, refr...
    method newOAuth2Config (line 529) | func (c *config) newOAuth2Config() *oauth2.Config {
  function New (line 63) | func New(id int64, opts *Opts) (forge.Forge, error) {
  function matchingHooks (line 542) | func matchingHooks(hooks []*internal.Hook, rawURL string) *internal.Hook {
  function setListOptions (line 556) | func setListOptions(p *model.ListOptions) {

FILE: server/forge/bitbucket/bitbucket_test.go
  function TestNew (line 36) | func TestNew(t *testing.T) {
  function TestBitbucket (line 46) | func TestBitbucket(t *testing.T) {

FILE: server/forge/bitbucket/convert.go
  constant statusPending (line 31) | statusPending = "INPROGRESS"
  constant statusSuccess (line 32) | statusSuccess = "SUCCESSFUL"
  constant statusFailure (line 33) | statusFailure = "FAILED"
  function convertStatus (line 38) | func convertStatus(status model.StatusValue) string {
  function convertRepo (line 51) | func convertRepo(from *internal.Repo, perm *internal.RepoPerm) *model.Re...
  function convertPerm (line 69) | func convertPerm(from *internal.RepoPerm) *model.Perm {
  function cloneLink (line 86) | func cloneLink(repo *internal.Repo) string {
  function sshCloneLink (line 117) | func sshCloneLink(repo *internal.Repo) string {
  function convertUser (line 129) | func convertUser(from *internal.Account, token *oauth2.Token, email stri...
  function convertWorkspaceList (line 143) | func convertWorkspaceList(from []*internal.Workspace) []*model.Team {
  function convertWorkspace (line 153) | func convertWorkspace(from *internal.Workspace) *model.Team {
  function convertPullHook (line 162) | func convertPullHook(from *internal.PullRequestHook) *model.Pipeline {
  function convertPushHook (line 197) | func convertPushHook(hook *internal.PushHook, change *internal.Change) *...
  function extractEmail (line 226) | func extractEmail(gitAuthor string) (author string) {

FILE: server/forge/bitbucket/convert_test.go
  function Test_convertStatus (line 29) | func Test_convertStatus(t *testing.T) {
  function Test_convertRepo (line 38) | func Test_convertRepo(t *testing.T) {
  function Test_convertWorkspace (line 64) | func Test_convertWorkspace(t *testing.T) {
  function Test_convertWorkspaceList (line 72) | func Test_convertWorkspaceList(t *testing.T) {
  function Test_convertUser (line 80) | func Test_convertUser(t *testing.T) {
  function Test_cloneLink (line 98) | func Test_cloneLink(t *testing.T) {
  function Test_convertPullHook (line 113) | func Test_convertPullHook(t *testing.T) {
  function Test_convertPushHook (line 141) | func Test_convertPushHook(t *testing.T) {
  function Test_convertPushHookTag (line 167) | func Test_convertPushHookTag(t *testing.T) {

FILE: server/forge/bitbucket/fixtures/handler.go
  function Handler (line 26) | func Handler() http.Handler {
  function getCommitDiffstat (line 48) | func getCommitDiffstat(c *gin.Context) {
  function getOauth (line 52) | func getOauth(c *gin.Context) {
  function getWorkspaces (line 77) | func getWorkspaces(c *gin.Context) {
  function getRepo (line 90) | func getRepo(c *gin.Context) {
  function getRepoHooks (line 103) | func getRepoHooks(c *gin.Context) {
  function getRepoFile (line 118) | func getRepoFile(c *gin.Context) {
  function getBranchHead (line 131) | func getBranchHead(c *gin.Context) {
  function getPullRequests (line 140) | func getPullRequests(c *gin.Context) {
  function createRepoStatus (line 149) | func createRepoStatus(c *gin.Context) {
  function createRepoHook (line 158) | func createRepoHook(c *gin.Context) {
  function deleteRepoHook (line 162) | func deleteRepoHook(c *gin.Context) {
  function getUser (line 171) | func getUser(c *gin.Context) {
  function getEmails (line 180) | func getEmails(c *gin.Context) {
  function getUserRepos (line 189) | func getUserRepos(c *gin.Context) {
  function getPermissions (line 202) | func getPermissions(c *gin.Context) {
  constant tokenPayload (line 231) | tokenPayload = `
  constant tokenNotFoundPayload (line 240) | tokenNotFoundPayload = `
  constant repoPayload (line 249) | repoPayload = `
  constant permissionRepoPayload (line 257) | permissionRepoPayload = `
  constant repoPayloadFromHook (line 265) | repoPayloadFromHook = `
  constant repoHookPayload (line 396) | repoHookPayload = `
  constant repoFilePayload (line 410) | repoFilePayload = "dummy payload"
  constant repoDirPayload (line 412) | repoDirPayload = `
  constant branchCommitsPayload (line 433) | branchCommitsPayload = `
  constant pullRequestsPayload (line 454) | pullRequestsPayload = `
  constant diffStatPayload (line 472) | diffStatPayload = `
  constant userPayload (line 487) | userPayload = `
  constant userRepoPayload (line 500) | userRepoPayload = `
  constant emailsPayload (line 520) | emailsPayload = `
  constant workspacesPayload (line 535) | workspacesPayload = `
  constant permissionsPayLoad (line 562) | permissionsPayLoad = `
  constant permissionPayLoad (line 595) | permissionPayLoad = `
  constant permissionHookPayLoad (line 610) | permissionHookPayLoad = `

FILE: server/forge/bitbucket/fixtures/hooks.go
  constant HookPushEmptyHash (line 23) | HookPushEmptyHash = `

FILE: server/forge/bitbucket/internal/client.go
  constant pathUser (line 33) | pathUser          = "%s/2.0/user/"
  constant pathEmails (line 34) | pathEmails        = "%s/2.0/user/emails"
  constant pathPermissions (line 35) | pathPermissions   = "%s/2.0/user/workspaces/%s/permissions/repositories?%s"
  constant pathWorkspaces (line 36) | pathWorkspaces    = "%s/2.0/user/workspaces/?%s"
  constant pathWorkspace (line 37) | pathWorkspace     = "%s/2.0/workspaces/%s"
  constant pathRepo (line 38) | pathRepo          = "%s/2.0/repositories/%s/%s"
  constant pathRepos (line 39) | pathRepos         = "%s/2.0/repositories/%s?%s"
  constant pathHook (line 40) | pathHook          = "%s/2.0/repositories/%s/%s/hooks/%s"
  constant pathHooks (line 41) | pathHooks         = "%s/2.0/repositories/%s/%s/hooks?%s"
  constant pathSource (line 42) | pathSource        = "%s/2.0/repositories/%s/%s/src/%s/%s"
  constant pathStatus (line 43) | pathStatus        = "%s/2.0/repositories/%s/%s/commit/%s/statuses/build"
  constant pathBranches (line 44) | pathBranches      = "%s/2.0/repositories/%s/%s/refs/branches?%s"
  constant pathOrgPerms (line 45) | pathOrgPerms      = "%s/2.0/workspaces/%s/permissions?%s"
  constant pathPullRequests (line 46) | pathPullRequests  = "%s/2.0/repositories/%s/%s/pullrequests?%s"
  constant pathBranchCommits (line 47) | pathBranchCommits = "%s/2.0/repositories/%s/%s/commits/%s"
  constant pathDir (line 48) | pathDir           = "%s/2.0/repositories/%s/%s/src/%s/%s"
  constant pathDiffStat (line 49) | pathDiffStat      = "%s/2.0/repositories/%s/%s/diffstat/%s?%s"
  constant pageSize (line 50) | pageSize          = 100
  type Client (line 53) | type Client struct
    method FindCurrent (line 76) | func (c *Client) FindCurrent() (*Account, error) {
    method ListEmail (line 83) | func (c *Client) ListEmail() (*EmailResp, error) {
    method ListWorkspaces (line 90) | func (c *Client) ListWorkspaces(opts *ListOpts) (*WorkspacesResp, erro...
    method FindRepo (line 97) | func (c *Client) FindRepo(owner, name string) (*Repo, error) {
    method ListRepos (line 104) | func (c *Client) ListRepos(workspace string, opts *ListOpts) (*RepoRes...
    method ListReposAll (line 111) | func (c *Client) ListReposAll(workspace string) ([]*Repo, error) {
    method FindHook (line 121) | func (c *Client) FindHook(owner, name, id string) (*Hook, error) {
    method ListHooks (line 128) | func (c *Client) ListHooks(owner, name string, opts *ListOpts) (*HookR...
    method CreateHook (line 135) | func (c *Client) CreateHook(owner, name string, hook *Hook) error {
    method DeleteHook (line 141) | func (c *Client) DeleteHook(owner, name, id string) error {
    method FindSource (line 147) | func (c *Client) FindSource(owner, name, revision, path string) (*stri...
    method CreateStatus (line 152) | func (c *Client) CreateStatus(owner, name, revision string, status *Pi...
    method GetPermission (line 158) | func (c *Client) GetPermission(owner, fullName string) (*RepoPerm, err...
    method ListPermissions (line 172) | func (c *Client) ListPermissions(workspace string, opts *ListOpts) (*R...
    method ListPermissionsAll (line 179) | func (c *Client) ListPermissionsAll(workspace string) ([]*RepoPerm, er...
    method ListBranches (line 189) | func (c *Client) ListBranches(owner, name string, opts *ListOpts) ([]*...
    method GetBranchHead (line 196) | func (c *Client) GetBranchHead(owner, name, branch string) (*Commit, e...
    method GetUserWorkspaceMembership (line 209) | func (c *Client) GetUserWorkspaceMembership(workspace, user string) (s...
    method ListPullRequests (line 231) | func (c *Client) ListPullRequests(owner, name string, opts *ListOpts) ...
    method ListChangedFiles (line 238) | func (c *Client) ListChangedFiles(owner, name, ref string) (result []s...
    method GetWorkspace (line 274) | func (c *Client) GetWorkspace(name string) (*Workspace, error) {
    method GetRepoFiles (line 281) | func (c *Client) GetRepoFiles(owner, name, revision, path string, page...
    method do (line 291) | func (c *Client) do(rawURL, method string, in, out any) (*string, erro...
  function NewClient (line 59) | func NewClient(ctx context.Context, url string, client *http.Client) *Cl...
  function NewClientToken (line 67) | func NewClientToken(ctx context.Context, url, client, secret string, tok...

FILE: server/forge/bitbucket/internal/types.go
  type Account (line 25) | type Account struct
  type Workspace (line 33) | type Workspace struct
  type WorkspaceAccess (line 40) | type WorkspaceAccess struct
  type WorkspacesResp (line 46) | type WorkspacesResp struct
  type PipelineStatus (line 54) | type PipelineStatus struct
  type Email (line 63) | type Email struct
  type EmailResp (line 69) | type EmailResp struct
  type Hook (line 77) | type Hook struct
  type HookResp (line 85) | type HookResp struct
  type Links (line 93) | type Links struct
  type Link (line 100) | type Link struct
  type LinkClone (line 105) | type LinkClone struct
  type Repo (line 109) | type Repo struct
  type RepoResp (line 125) | type RepoResp struct
  type Change (line 133) | type Change struct
  type PushHook (line 151) | type PushHook struct
  type PullRequestHook (line 159) | type PullRequestHook struct
  type WorkspaceMembershipResp (line 201) | type WorkspaceMembershipResp struct
  type ListOpts (line 214) | type ListOpts struct
    method Encode (line 219) | func (o *ListOpts) Encode() string {
  type Error (line 230) | type Error struct
    method Error (line 237) | func (e Error) Error() string {
  type RepoPermResp (line 241) | type RepoPermResp struct
  type RepoPerm (line 247) | type RepoPerm struct
  type BranchResp (line 252) | type BranchResp struct
  type Branch (line 256) | type Branch struct
  type PullRequestResp (line 260) | type PullRequestResp struct
  type PullRequest (line 267) | type PullRequest struct
  type CommitsResp (line 272) | type CommitsResp struct
  type Commit (line 276) | type Commit struct
  type DirResp (line 285) | type DirResp struct
  type Dir (line 292) | type Dir struct
  type DiffStatResp (line 298) | type DiffStatResp struct
  type Diff (line 303) | type Diff struct
  type DiffFile (line 308) | type DiffFile struct

FILE: server/forge/bitbucket/parse.go
  constant hookEvent (line 28) | hookEvent        = "X-Event-Key"
  constant hookPush (line 29) | hookPush         = "repo:push"
  constant hookPullCreated (line 30) | hookPullCreated  = "pullrequest:created"
  constant hookPullUpdated (line 31) | hookPullUpdated  = "pullrequest:updated"
  constant hookPullMerged (line 32) | hookPullMerged   = "pullrequest:fulfilled"
  constant hookPullDeclined (line 33) | hookPullDeclined = "pullrequest:rejected"
  constant stateClosed (line 34) | stateClosed      = "MERGED"
  constant stateDeclined (line 35) | stateDeclined    = "DECLINED"
  function parseHook (line 40) | func parseHook(r *http.Request) (*internal.PullRequestHook, *model.Repo,...
  function parsePushHook (line 60) | func parsePushHook(payload []byte) (*model.Repo, *model.Pipeline, error) {
  function parsePullHook (line 79) | func parsePullHook(payload []byte) (*internal.PullRequestHook, *model.Re...

FILE: server/forge/bitbucket/parse_test.go
  function Test_parseHook (line 29) | func Test_parseHook(t *testing.T) {

FILE: server/forge/bitbucketdatacenter/bitbucketdatacenter.go
  constant listLimit (line 41) | listLimit            = 250
  constant millisecondsInSecond (line 42) | millisecondsInSecond = 1000
  type Opts (line 46) | type Opts struct
  type client (line 56) | type client struct
    method Name (line 98) | func (c *client) Name() string {
    method URL (line 103) | func (c *client) URL() string {
    method Login (line 107) | func (c *client) Login(ctx context.Context, req *forge_types.OAuthRequ...
    method Refresh (line 145) | func (c *client) Refresh(ctx context.Context, u *model.User) (bool, er...
    method Repo (line 160) | func (c *client) Repo(ctx context.Context, u *model.User, rID model.Fo...
    method Repos (line 213) | func (c *client) Repos(ctx context.Context, u *model.User, p *model.Li...
    method File (line 269) | func (c *client) File(ctx context.Context, u *model.User, r *model.Rep...
    method Dir (line 288) | func (c *client) Dir(ctx context.Context, u *model.User, r *model.Repo...
    method Status (line 323) | func (c *client) Status(ctx context.Context, u *model.User, repo *mode...
    method Netrc (line 342) | func (c *client) Netrc(_ *model.User, r *model.Repo) (*model.Netrc, er...
    method Branches (line 357) | func (c *client) Branches(ctx context.Context, u *model.User, r *model...
    method BranchHead (line 382) | func (c *client) BranchHead(ctx context.Context, u *model.User, r *mod...
    method PullRequests (line 405) | func (c *client) PullRequests(ctx context.Context, u *model.User, r *m...
    method Activate (line 430) | func (c *client) Activate(ctx context.Context, u *model.User, r *model...
    method Deactivate (line 454) | func (c *client) Deactivate(ctx context.Context, u *model.User, r *mod...
    method Hook (line 499) | func (c *client) Hook(ctx context.Context, r *http.Request) (*model.Re...
    method getUserAndRepo (line 535) | func (c *client) getUserAndRepo(ctx context.Context, r *model.Repo) (*...
    method updatePipelineFromCommits (line 559) | func (c *client) updatePipelineFromCommits(ctx context.Context, u *mod...
    method updatePipelineFromPullRequest (line 607) | func (c *client) updatePipelineFromPullRequest(ctx context.Context, u ...
    method Teams (line 632) | func (c *client) Teams(ctx context.Context, u *model.User, p *model.Li...
    method TeamPerm (line 664) | func (*client) TeamPerm(_ *model.User, _ string) (*model.Perm, error) {
    method OrgMembership (line 670) | func (c *client) OrgMembership(ctx context.Context, u *model.User, org...
    method hasProjectAdminAccess (line 699) | func (c *client) hasProjectAdminAccess(ctx context.Context, client *bi...
    method hasRepositoryWriteAccess (line 708) | func (c *client) hasRepositoryWriteAccess(ctx context.Context, org str...
    method Org (line 736) | func (c *client) Org(_ context.Context, _ *model.User, owner string) (...
    method newOAuth2Config (line 749) | func (c *client) newOAuth2Config() *oauth2.Config {
    method newClient (line 778) | func (c *client) newClient(ctx context.Context, u *model.User) (*bitbu...
  function New (line 70) | func New(id int64, opts Opts) (forge.Forge, error) {

FILE: server/forge/bitbucketdatacenter/bitbucketdatacenter_test.go
  function TestNew (line 29) | func TestNew(t *testing.T) {
  function TestBitbucketDC (line 52) | func TestBitbucketDC(t *testing.T) {

FILE: server/forge/bitbucketdatacenter/convert.go
  function convertStatus (line 29) | func convertStatus(status model.StatusValue) bitbucket.BuildStatusState {
  function convertID (line 40) | func convertID(id uint64) model.ForgeRemoteID {
  function anonymizeLink (line 44) | func anonymizeLink(link string) (href string) {
  function convertRepo (line 53) | func convertRepo(from *bitbucket.Repository, perm *model.Perm, branch st...
  function convertRepositoryPushEvent (line 78) | func convertRepositoryPushEvent(ev *bitbucket.RepositoryPushEvent, baseU...
  function convertGetCommitRange (line 112) | func convertGetCommitRange(ev *bitbucket.RepositoryPushEvent) (currCommi...
  function convertPullRequestEvent (line 125) | func convertPullRequestEvent(ev *bitbucket.PullRequestEvent, baseURL str...
  function authorLabel (line 150) | func authorLabel(name string) string {
  function convertUser (line 163) | func convertUser(user *bitbucket.User, baseURL string) *model.User {
  function bitbucketAvatarURL (line 172) | func bitbucketAvatarURL(baseURL, slug string) string {
  function convertListOptions (line 176) | func convertListOptions(p *model.ListOptions) bitbucket.ListOptions {
  function updateUserCredentials (line 183) | func updateUserCredentials(u *model.User, t *oauth2.Token) {
  function convertProjectsToTeams (line 189) | func convertProjectsToTeams(projects []*bitbucket.Project, client *bitbu...

FILE: server/forge/bitbucketdatacenter/convert_test.go
  function Test_convertStatus (line 28) | func Test_convertStatus(t *testing.T) {
  function Test_convertRepo (line 56) | func Test_convertRepo(t *testing.T) {
  function Test_convertRepositoryPushEvent (line 94) | func Test_convertRepositoryPushEvent(t *testing.T) {
  function Test_convertPullRequestEvent (line 174) | func Test_convertPullRequestEvent(t *testing.T) {
  function Test_convertPullRequestCloseEvent (line 230) | func Test_convertPullRequestCloseEvent(t *testing.T) {
  function Test_authorLabel (line 286) | func Test_authorLabel(t *testing.T) {
  function Test_convertUser (line 306) | func Test_convertUser(t *testing.T) {
  function Test_convertProjectsToTeams (line 321) | func Test_convertProjectsToTeams(t *testing.T) {

FILE: server/forge/bitbucketdatacenter/fixtures/handler.go
  type ResponseContent (line 35) | type ResponseContent
  function Server (line 37) | func Server() *httptest.Server {
  function ExpectedContentHandler (line 95) | func ExpectedContentHandler(expectedFileName string, successCode int, su...
  function loadExpectedContent (line 118) | func loadExpectedContent(fileName string) (ResponseContent, error) {
  function writeResponse (line 130) | func writeResponse(w http.ResponseWriter, statusCode int, content Respon...

FILE: server/forge/bitbucketdatacenter/internal/client.go
  constant currentUserID (line 28) | currentUserID = "%s/plugins/servlet/applinks/whoami"
  type Client (line 31) | type Client struct
    method FindCurrentUser (line 44) | func (c *Client) FindCurrentUser(ctx context.Context) (string, error) {
  function NewClientWithToken (line 36) | func NewClientWithToken(ctx context.Context, ts oauth2.TokenSource, url ...

FILE: server/forge/bitbucketdatacenter/internal/client_test.go
  function TestCurrentUser (line 26) | func TestCurrentUser(t *testing.T) {
  type mockSource (line 42) | type mockSource
    method Token (line 44) | func (ds mockSource) Token() (*oauth2.Token, error) {

FILE: server/forge/bitbucketdatacenter/parse.go
  type HookResult (line 27) | type HookResult struct
  function parseHook (line 34) | func parseHook(r *http.Request, baseURL string) (*HookResult, string, st...

FILE: server/forge/bitbucketdatacenter/parse_test.go
  function Test_parseHook (line 29) | func Test_parseHook(t *testing.T) {

FILE: server/forge/common/event_normalize.go
  function NormalizeEventReason (line 17) | func NormalizeEventReason(in string) string {

FILE: server/forge/common/status.go
  function GetPipelineStatusContext (line 28) | func GetPipelineStatusContext(repo *model.Repo, pipeline *model.Pipeline...
  function GetPipelineStatusDescription (line 58) | func GetPipelineStatusDescription(status model.StatusValue) string {
  function GetPipelineStatusURL (line 79) | func GetPipelineStatusURL(repo *model.Repo, pipeline *model.Pipeline, wo...

FILE: server/forge/common/status_test.go
  function TestGetPipelineStatusContext (line 26) | func TestGetPipelineStatusContext(t *testing.T) {

FILE: server/forge/common/utils.go
  function ExtractHostFromCloneURL (line 30) | func ExtractHostFromCloneURL(cloneURL string) (string, error) {
  function UserToken (line 48) | func UserToken(ctx context.Context, r *model.Repo, u *model.User) string {
  function RepoUser (line 61) | func RepoUser(ctx context.Context, r *model.Repo) (*model.User, error) {
  function RepoUserForgeID (line 77) | func RepoUserForgeID(ctx context.Context, forgeID int64, remoteID model....

FILE: server/forge/common/utils_test.go
  function Test_Netrc (line 25) | func Test_Netrc(t *testing.T) {

FILE: server/forge/forge.go
  type Forge (line 56) | type Forge interface

FILE: server/forge/forgejo/fixtures/handler.go
  function Handler (line 25) | func Handler() http.Handler {
  function listRepoHooks (line 43) | func listRepoHooks(c *gin.Context) {
  function getRepo (line 52) | func getRepo(c *gin.Context) {
  function getRepoByID (line 61) | func getRepoByID(c *gin.Context) {
  function createRepoCommitStatus (line 70) | func createRepoCommitStatus(c *gin.Context) {
  function getRepoFile (line 77) | func getRepoFile(c *gin.Context) {
  function createRepoHook (line 90) | func createRepoHook(c *gin.Context) {
  function deleteRepoHook (line 109) | func deleteRepoHook(c *gin.Context) {
  function getUserRepos (line 113) | func getUserRepos(c *gin.Context) {
  function getVersion (line 127) | func getVersion(c *gin.Context) {
  function getPRFiles (line 131) | func getPRFiles(c *gin.Context) {
  constant listRepoHookPayloads (line 140) | listRepoHookPayloads = `
  constant repoPayload (line 153) | repoPayload = `
  constant repoFilePayload (line 173) | repoFilePayload = `{ platform: linux/amd64 }`
  constant userRepoPayload (line 175) | userRepoPayload = `
  constant prFilesPayload (line 197) | prFilesPayload = `

FILE: server/forge/forgejo/forgejo.go
  constant authorizeTokenURL (line 42) | authorizeTokenURL = "%s/login/oauth/authorize"
  constant accessTokenURL (line 43) | accessTokenURL    = "%s/login/oauth/access_token"
  constant defaultPageSize (line 44) | defaultPageSize   = 50
  constant forgejoDevVersion (line 45) | forgejoDevVersion = "v7.0.2"
  type Forgejo (line 48) | type Forgejo struct
    method Name (line 85) | func (c *Forgejo) Name() string {
    method URL (line 90) | func (c *Forgejo) URL() string {
    method oauth2Config (line 94) | func (c *Forgejo) oauth2Config(ctx context.Context) (*oauth2.Config, c...
    method Login (line 113) | func (c *Forgejo) Login(ctx context.Context, req *forge_types.OAuthReq...
    method Refresh (line 149) | func (c *Forgejo) Refresh(ctx context.Context, user *model.User) (bool...
    method Teams (line 171) | func (c *Forgejo) Teams(ctx context.Context, u *model.User, p *model.L...
    method TeamPerm (line 200) | func (c *Forgejo) TeamPerm(_ *model.User, _ string) (*model.Perm, erro...
    method Repo (line 205) | func (c *Forgejo) Repo(ctx context.Context, u *model.User, remoteID mo...
    method Repos (line 238) | func (c *Forgejo) Repos(ctx context.Context, u *model.User, p *model.L...
    method File (line 272) | func (c *Forgejo) File(ctx context.Context, u *model.User, r *model.Re...
    method Dir (line 285) | func (c *Forgejo) Dir(ctx context.Context, u *model.User, r *model.Rep...
    method Status (line 320) | func (c *Forgejo) Status(ctx context.Context, user *model.User, repo *...
    method Netrc (line 343) | func (c *Forgejo) Netrc(u *model.User, r *model.Repo) (*model.Netrc, e...
    method Activate (line 367) | func (c *Forgejo) Activate(ctx context.Context, u *model.User, r *mode...
    method Deactivate (line 401) | func (c *Forgejo) Deactivate(ctx context.Context, u *model.User, r *mo...
    method Branches (line 436) | func (c *Forgejo) Branches(ctx context.Context, u *model.User, r *mode...
    method BranchHead (line 456) | func (c *Forgejo) BranchHead(ctx context.Context, u *model.User, r *mo...
    method PullRequests (line 473) | func (c *Forgejo) PullRequests(ctx context.Context, u *model.User, r *...
    method Hook (line 500) | func (c *Forgejo) Hook(ctx context.Context, r *http.Request) (*model.R...
    method OrgMembership (line 531) | func (c *Forgejo) OrgMembership(ctx context.Context, u *model.User, ow...
    method Org (line 554) | func (c *Forgejo) Org(ctx context.Context, u *model.User, owner string...
    method newClientToken (line 583) | func (c *Forgejo) newClientToken(ctx context.Context, token string) (*...
    method getChangedFilesForPR (line 624) | func (c *Forgejo) getChangedFilesForPR(ctx context.Context, repo *mode...
    method getTagCommitSHA (line 663) | func (c *Forgejo) getTagCommitSHA(ctx context.Context, repo *model.Rep...
    method perPage (line 695) | func (c *Forgejo) perPage(ctx context.Context) int {
  type Opts (line 59) | type Opts struct
  function New (line 69) | func New(id int64, opts Opts) (forge.Forge, error) {
  function getStatus (line 603) | func getStatus(status model.StatusValue) forgejo.StatusState {

FILE: server/forge/forgejo/forgejo_test.go
  function TestNew (line 33) | func TestNew(t *testing.T) {
  function Test_forgejo (line 44) | func Test_forgejo(t *testing.T) {

FILE: server/forge/forgejo/helper.go
  function toRepo (line 32) | func toRepo(from *forgejo.Repository) *model.Repo {
  function toPerm (line 55) | func toPerm(from *forgejo.Permission) *model.Perm {
  function toTeam (line 64) | func toTeam(from *forgejo.Organization, link string) *model.Team {
  function pipelineFromPush (line 72) | func pipelineFromPush(hook *pushHook) *model.Pipeline {
  function getChangedFilesFromPushHook (line 106) | func getChangedFilesFromPushHook(hook *pushHook) []s
Condensed preview — 1510 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (8,483K chars).
[
  {
    "path": ".cspell.json",
    "chars": 5167,
    "preview": "{\n  \"version\": \"0.2\",\n  \"language\": \"en\",\n  \"dictionaries\": [\n    // language\n    \"en_us\",\n    // code\n    \"go\",\n    \"no"
  },
  {
    "path": ".ecrc",
    "chars": 356,
    "preview": "{\n  \"Exclude\": [\n    \".git\",\n    \"go.mod\",\n    \"go.sum\",\n    \"vendor\",\n    \"fixtures\",\n    \"LICENSE\",\n    \"node_modules\""
  },
  {
    "path": ".editorconfig",
    "chars": 276,
    "preview": "root = true\n\n[*]\nindent_style = space\nindent_size = 2\ntab_width = 2\nend_of_line = lf\ncharset = utf-8\ntrim_trailing_white"
  },
  {
    "path": ".gitattributes",
    "chars": 19,
    "preview": "* text=auto eol=lf\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yaml",
    "chars": 3331,
    "preview": "# Credits to: https://github.com/vitejs/vite/blob/main/.github/ISSUE_TEMPLATE/bug_report.yml\nname: \"\\U0001F41E Bug repor"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 515,
    "preview": "blank_issues_enabled: true\ncontact_links:\n  - name: Start a discussion\n    about: Our preferred starting point if you ha"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yaml",
    "chars": 1897,
    "preview": "# Credits to: https://github.com/vitejs/vite/blob/main/.github/ISSUE_TEMPLATE/feature_request.yml\nname: \"\\U0001F680 New "
  },
  {
    "path": ".github/pull_request_template.md",
    "chars": 1036,
    "preview": "<!--\n\nPlease check the following tips:\n1. Avoid using force-push and commands that require it (such as `commit --amend` "
  },
  {
    "path": ".github/release_template.md",
    "chars": 2102,
    "preview": "<!-- markdownlint-disable MD041 -->\n\n### Prerequisites\n\n- [ ] MAJOR: Check `docs/src/pages/migrations.md`\n  - [ ] Check "
  },
  {
    "path": ".github/renovate.json",
    "chars": 2202,
    "preview": "{\n  \"$schema\": \"https://docs.renovatebot.com/renovate-schema.json\",\n  \"extends\": [\"github>woodpecker-ci/renovate-config\""
  },
  {
    "path": ".gitignore",
    "chars": 794,
    "preview": "### IDEs ###\n.idea/\n.vscode/*\n!.vscode/settings.json\n!.vscode/launch.json\n!.vscode/extensions.json\n\n### GO ###\n# Binarie"
  },
  {
    "path": ".gitpod.yml",
    "chars": 4792,
    "preview": "tasks:\n  - name: Server\n    env:\n      WOODPECKER_OPEN: true\n      WOODPECKER_ADMIN: woodpecker\n      WOODPECKER_EXPERT_"
  },
  {
    "path": ".golangci.yaml",
    "chars": 10348,
    "preview": "version: '2'\nrun:\n  timeout: 15m\n  build-tags:\n    - test\nlinters:\n  default: none\n  enable:\n    - asciicheck\n    - bidi"
  },
  {
    "path": ".hadolint.yaml",
    "chars": 49,
    "preview": "ignored:\n  - DL3018 # pin versions in Dockerfile\n"
  },
  {
    "path": ".lycheeignore",
    "chars": 28,
    "preview": "https://stackoverflow.com/*\n"
  },
  {
    "path": ".markdownlint.yaml",
    "chars": 3405,
    "preview": "# markdownlint YAML configuration\n# https://github.com/DavidAnson/markdownlint/blob/main/schema/.markdownlint.yaml\n\n# De"
  },
  {
    "path": ".mockery.yaml",
    "chars": 893,
    "preview": "---\nall: true\ndir: '{{.InterfaceDir}}/mocks'\nfilename: mock_{{.InterfaceName}}.go\npkgname: mocks\nrecursive: true\npackage"
  },
  {
    "path": ".pre-commit-config.yaml",
    "chars": 1945,
    "preview": "# cSpell:ignore checkmake hadolint autofix autoupdate\nrepos:\n  - repo: meta\n    hooks:\n      - id: check-hooks-apply\n   "
  },
  {
    "path": ".prettierignore",
    "chars": 148,
    "preview": "build/\ndist/\nCHANGELOG.md\n\n# web/ and docs/ must be directly formatted from there\n# to prevent conflicts with different "
  },
  {
    "path": ".prettierrc.json",
    "chars": 127,
    "preview": "{\n  \"semi\": true,\n  \"trailingComma\": \"all\",\n  \"singleQuote\": true,\n  \"printWidth\": 120,\n  \"tabWidth\": 2,\n  \"endOfLine\": "
  },
  {
    "path": ".vscode/extensions.json",
    "chars": 502,
    "preview": "{\n  // List of extensions which should be recommended for users of this workspace.\n  \"recommendations\": [\n    \"golang.go"
  },
  {
    "path": ".vscode/launch.json",
    "chars": 1263,
    "preview": "{\n  \"version\": \"0.2.0\",\n  \"compounds\": [\n    {\n      \"name\": \"Woodpecker CI\",\n      \"configurations\": [\"Woodpecker UI\", "
  },
  {
    "path": ".vscode/settings.json",
    "chars": 487,
    "preview": "{\n  \"git.ignoreLimitWarning\": true,\n  \"search.exclude\": {\n    \"**/node_modules\": true,\n    \"**/bower_components\": true,\n"
  },
  {
    "path": ".woodpecker/binaries.yaml",
    "chars": 2238,
    "preview": "when:\n  - event: tag\n  - event: pull_request\n    branch: ${CI_REPO_DEFAULT_BRANCH}\n    path:\n      - Makefile\n      - .w"
  },
  {
    "path": ".woodpecker/check-feature-docs.sh",
    "chars": 525,
    "preview": "#!/bin/sh\nDOCS_CHANGED=$(echo \"$CI_PIPELINE_FILES\" | jq -r '.[]' | grep -c '^docs/docs/' || true)\nif [ \"$DOCS_CHANGED\" -"
  },
  {
    "path": ".woodpecker/docker.yaml",
    "chars": 12242,
    "preview": "variables:\n  - &golang_image 'docker.io/golang:1.26'\n  - &node_image 'docker.io/node:24-alpine'\n  - &xgo_image 'docker.i"
  },
  {
    "path": ".woodpecker/docs.yaml",
    "chars": 4927,
    "preview": "variables:\n  - &golang_image 'docker.io/golang:1.26'\n  - &node_image 'docker.io/node:24-alpine'\n  - &alpine_image 'docke"
  },
  {
    "path": ".woodpecker/links.yaml",
    "chars": 970,
    "preview": "when:\n  - event: cron\n    cron: links\n\nsteps:\n  - name: links\n    image: docker.io/lycheeverse/lychee:0.24.2\n    failure"
  },
  {
    "path": ".woodpecker/release-helper.yaml",
    "chars": 361,
    "preview": "when:\n  - event: push\n    branch:\n      - ${CI_REPO_DEFAULT_BRANCH}\n      - release/*\n\nsteps:\n  - name: release-helper\n "
  },
  {
    "path": ".woodpecker/securityscan.yaml",
    "chars": 821,
    "preview": "when:\n  - event: [pull_request]\n  - event: push\n    branch:\n      - ${CI_REPO_DEFAULT_BRANCH}\n\nvariables:\n  - &trivy_plu"
  },
  {
    "path": ".woodpecker/social.yaml",
    "chars": 1829,
    "preview": "depends_on:\n  - docker\n  - binaries\n\nwhen:\n  - event: tag\n    evaluate: 'CI_COMMIT_TAG matches \"^v?[0-9]+\\\\\\\\.[0-9]+\\\\\\\\"
  },
  {
    "path": ".woodpecker/static.yaml",
    "chars": 1421,
    "preview": "when:\n  - event: pull_request\n\nsteps:\n  - name: lint-editorconfig\n    image: docker.io/woodpeckerci/plugin-editorconfig-"
  },
  {
    "path": ".woodpecker/test.yaml",
    "chars": 3799,
    "preview": "variables:\n  - &golang_image 'docker.io/golang:1.26'\n  - &when\n    - path: &when_path # related config files\n        - '"
  },
  {
    "path": ".woodpecker/web.yaml",
    "chars": 1255,
    "preview": "when:\n  - event: pull_request\n  - event: push\n    branch:\n      - release/*\n\nvariables:\n  - &node_image 'docker.io/node:"
  },
  {
    "path": ".yamllint.yaml",
    "chars": 293,
    "preview": "extends: default\n\nignore-from-file:\n  - docs/.gitignore\n  - docs/plugins/woodpecker-plugins/.gitignore\n  - .gitignore\n  "
  },
  {
    "path": "CHANGELOG.md",
    "chars": 298193,
    "preview": "# Changelog\n\n## [3.14.1](https://github.com/woodpecker-ci/woodpecker/releases/tag/v3.14.1) - 2026-05-12\n\n### ❤️ Special "
  },
  {
    "path": "LICENSE",
    "chars": 11379,
    "preview": "                                Apache License\n                           Version 2.0, January 2004\n                    "
  },
  {
    "path": "Makefile",
    "chars": 19086,
    "preview": "# renovate: datasource=github-releases depName=mvdan/gofumpt\nGOFUMPT_VERSION := v0.10.0\n# renovate: datasource=github-re"
  },
  {
    "path": "README.md",
    "chars": 4473,
    "preview": "# Woodpecker\n\n<p align=\"center\">\n  <a href=\"https://github.com/woodpecker-ci/woodpecker/\">\n    <img alt=\"Woodpecker\" src"
  },
  {
    "path": "agent/log/line_writer.go",
    "chars": 1792,
    "preview": "// Copyright 2022 Woodpecker Authors\n// Copyright 2011 Drone.IO Inc.\n//\n// Licensed under the Apache License, Version 2."
  },
  {
    "path": "agent/log/line_writer_test.go",
    "chars": 1714,
    "preview": "// Copyright 2019 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "agent/logger.go",
    "chars": 1709,
    "preview": "// Copyright 2022 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "agent/rpc/auth_client_grpc.go",
    "chars": 1613,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "agent/rpc/auth_client_grpc_test.go",
    "chars": 1036,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "agent/rpc/auth_interceptor.go",
    "chars": 2947,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "agent/rpc/client_grpc.go",
    "chars": 13256,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "agent/runner.go",
    "chars": 7022,
    "preview": "// Copyright 2022 Woodpecker Authors\n// Copyright 2018 Drone.IO Inc.\n//\n// Licensed under the Apache License, Version 2."
  },
  {
    "path": "agent/state.go",
    "chars": 1952,
    "preview": "// Copyright 2022 Woodpecker Authors\n// Copyright 2018 Drone.IO Inc.\n//\n// Licensed under the Apache License, Version 2."
  },
  {
    "path": "agent/tracer.go",
    "chars": 1982,
    "preview": "// Copyright 2022 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "checkmake.ini",
    "chars": 32,
    "preview": "[maxbodylength]\ndisabled = true\n"
  },
  {
    "path": "cli/README.md",
    "chars": 167,
    "preview": "# Woodpecker CLI\n\nCommand line client for the Woodpecker continuous integration server.\n\nPlease see the official documen"
  },
  {
    "path": "cli/admin/admin.go",
    "chars": 1169,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/admin/loglevel/loglevel.go",
    "chars": 1621,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/admin/org/org_list.go",
    "chars": 1882,
    "preview": "// Copyright 2025 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/admin/registry/registry.go",
    "chars": 917,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/admin/registry/registry_add.go",
    "chars": 1812,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/admin/registry/registry_list.go",
    "chars": 1686,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/admin/registry/registry_rm.go",
    "chars": 1178,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/admin/registry/registry_set.go",
    "chars": 1886,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/admin/registry/registry_show.go",
    "chars": 1507,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/admin/secret/secret.go",
    "chars": 894,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/admin/secret/secret_add.go",
    "chars": 2127,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/admin/secret/secret_list.go",
    "chars": 1861,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/admin/secret/secret_rm.go",
    "chars": 1133,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/admin/secret/secret_set.go",
    "chars": 1927,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/admin/secret/secret_show.go",
    "chars": 1559,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/admin/user/user.go",
    "chars": 853,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/admin/user/user_add.go",
    "chars": 1238,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/admin/user/user_list.go",
    "chars": 1585,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/admin/user/user_rm.go",
    "chars": 1151,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/admin/user/user_show.go",
    "chars": 1539,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/common/flags.go",
    "chars": 2777,
    "preview": "// Copyright 2021 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/common/hooks.go",
    "chars": 2336,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/common/pipeline.go",
    "chars": 1884,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/common/zerologger.go",
    "chars": 835,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/context/context.go",
    "chars": 4127,
    "preview": "// Copyright 2026 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/exec/dummy.go",
    "chars": 778,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/exec/exec.go",
    "chars": 10285,
    "preview": "// Copyright 2022 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/exec/flags.go",
    "chars": 14325,
    "preview": "// Copyright 2021 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/exec/line.go",
    "chars": 1249,
    "preview": "// Copyright 2022 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/exec/metadata.go",
    "chars": 8713,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/exec/metadata_test.go",
    "chars": 4084,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/info/info.go",
    "chars": 1447,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/internal/config/config.go",
    "chars": 4751,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/internal/config/config_test.go",
    "chars": 1126,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/internal/config/context.go",
    "chars": 5966,
    "preview": "// Copyright 2026 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/internal/config/context_test.go",
    "chars": 3990,
    "preview": "// Copyright 2026 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/internal/util.go",
    "chars": 5325,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/internal/util_test.go",
    "chars": 1113,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/lint/lint.go",
    "chars": 3736,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/lint/utils.go",
    "chars": 1973,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/org/org.go",
    "chars": 944,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/org/registry/registry.go",
    "chars": 1491,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/org/registry/registry_add.go",
    "chars": 2006,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/org/registry/registry_list.go",
    "chars": 1831,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/org/registry/registry_rm.go",
    "chars": 1372,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/org/registry/registry_set.go",
    "chars": 2013,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/org/registry/registry_show.go",
    "chars": 1652,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/org/secret/secret.go",
    "chars": 1455,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/org/secret/secret_add.go",
    "chars": 2323,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/org/secret/secret_list.go",
    "chars": 2004,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/org/secret/secret_rm.go",
    "chars": 1329,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/org/secret/secret_set.go",
    "chars": 2117,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/org/secret/secret_show.go",
    "chars": 1706,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/output/output.go",
    "chars": 950,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/output/output_test.go",
    "chars": 1196,
    "preview": "// Copyright 2026 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/output/table.go",
    "chars": 5531,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/output/table_test.go",
    "chars": 2480,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/pipeline/approve.go",
    "chars": 1453,
    "preview": "// Copyright 2022 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/pipeline/create.go",
    "chars": 2056,
    "preview": "// Copyright 2022 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/pipeline/decline.go",
    "chars": 1454,
    "preview": "// Copyright 2022 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/pipeline/deploy/deploy.go",
    "chars": 3590,
    "preview": "// Copyright 2022 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/pipeline/kill.go",
    "chars": 1463,
    "preview": "// Copyright 2022 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/pipeline/last.go",
    "chars": 1648,
    "preview": "// Copyright 2022 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/pipeline/list.go",
    "chars": 3114,
    "preview": "// Copyright 2022 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/pipeline/list_test.go",
    "chars": 3448,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/pipeline/log/log.go",
    "chars": 818,
    "preview": "// Copyright 2022 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/pipeline/log/log_purge.go",
    "chars": 2091,
    "preview": "// Copyright 2022 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/pipeline/log/log_show.go",
    "chars": 2973,
    "preview": "// Copyright 2022 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/pipeline/pipeline.go",
    "chars": 2649,
    "preview": "// Copyright 2022 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/pipeline/pipeline_test.go",
    "chars": 2816,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/pipeline/ps.go",
    "chars": 2582,
    "preview": "// Copyright 2022 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/pipeline/purge.go",
    "chars": 4470,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/pipeline/purge_test.go",
    "chars": 3605,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/pipeline/queue.go",
    "chars": 1866,
    "preview": "// Copyright 2022 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/pipeline/show.go",
    "chars": 1883,
    "preview": "// Copyright 2022 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/pipeline/start.go",
    "chars": 2248,
    "preview": "// Copyright 2022 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/pipeline/stop.go",
    "chars": 1431,
    "preview": "// Copyright 2022 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/repo/cron/cron.go",
    "chars": 877,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/repo/cron/cron_add.go",
    "chars": 2312,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/repo/cron/cron_list.go",
    "chars": 1979,
    "preview": "// Copyright 2022 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/repo/cron/cron_rm.go",
    "chars": 1554,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/repo/cron/cron_show.go",
    "chars": 1747,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/repo/cron/cron_update.go",
    "chars": 2405,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/repo/registry/registry.go",
    "chars": 1287,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/repo/registry/registry_add.go",
    "chars": 2008,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/repo/registry/registry_list.go",
    "chars": 1833,
    "preview": "// Copyright 2022 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/repo/registry/registry_rm.go",
    "chars": 1374,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/repo/registry/registry_set.go",
    "chars": 2015,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/repo/registry/registry_show.go",
    "chars": 1654,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/repo/repo.go",
    "chars": 3579,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/repo/repo_add.go",
    "chars": 1494,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/repo/repo_chown.go",
    "chars": 1325,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/repo/repo_list.go",
    "chars": 1876,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/repo/repo_repair.go",
    "chars": 1309,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/repo/repo_rm.go",
    "chars": 1293,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/repo/repo_show.go",
    "chars": 1587,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/repo/repo_show_test.go",
    "chars": 2386,
    "preview": "// Copyright 2025 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/repo/repo_sync.go",
    "chars": 1905,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/repo/repo_test.go",
    "chars": 3012,
    "preview": "// Copyright 2025 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/repo/repo_update.go",
    "chars": 4415,
    "preview": "// Copyright 2022 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/repo/secret/secret.go",
    "chars": 1264,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/repo/secret/secret_add.go",
    "chars": 2319,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/repo/secret/secret_list.go",
    "chars": 2004,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/repo/secret/secret_rm.go",
    "chars": 1329,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/repo/secret/secret_set.go",
    "chars": 2119,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/repo/secret/secret_show.go",
    "chars": 1706,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/setup/setup.go",
    "chars": 2851,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/setup/token_fetcher.go",
    "chars": 3527,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/setup/ui/ask.go",
    "chars": 1052,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/setup/ui/confirm.go",
    "chars": 876,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/update/command.go",
    "chars": 2193,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/update/tar.go",
    "chars": 1511,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/update/types.go",
    "chars": 985,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/update/updater.go",
    "chars": 3793,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cli/update/updater_test.go",
    "chars": 1979,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cmd/agent/core/agent.go",
    "chars": 11912,
    "preview": "// Copyright 2023 Woodpecker Authors\n// Copyright 2018 Drone.IO Inc.\n//\n// Licensed under the Apache License, Version 2."
  },
  {
    "path": "cmd/agent/core/agent_test.go",
    "chars": 1831,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cmd/agent/core/config.go",
    "chars": 2067,
    "preview": "// Copyright 2022 Woodpecker Authors\n// Copyright 2019 Laszlo Fogas\n//\n// Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "cmd/agent/core/config_test.go",
    "chars": 1695,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cmd/agent/core/flags.go",
    "chars": 4406,
    "preview": "// Copyright 2022 Woodpecker Authors\n// Copyright 2019 Laszlo Fogas\n//\n// Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "cmd/agent/core/health.go",
    "chars": 2897,
    "preview": "// Copyright 2018 Drone.IO Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use"
  },
  {
    "path": "cmd/agent/core/health_test.go",
    "chars": 1579,
    "preview": "// Copyright 2018 Drone.IO Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use"
  },
  {
    "path": "cmd/agent/core/run.go",
    "chars": 1684,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cmd/agent/dummy.go",
    "chars": 778,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cmd/agent/main.go",
    "chars": 1313,
    "preview": "// Copyright 2018 Drone.IO Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use"
  },
  {
    "path": "cmd/agent/man.go",
    "chars": 1216,
    "preview": "// Copyright 2025 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cmd/cli/app.go",
    "chars": 1940,
    "preview": "// Copyright 2021 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cmd/cli/docs.go",
    "chars": 968,
    "preview": "// Copyright 2021 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cmd/cli/main.go",
    "chars": 1054,
    "preview": "// Copyright 2021 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cmd/cli/man.go",
    "chars": 794,
    "preview": "// Copyright 2025 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cmd/server/app.go",
    "chars": 1011,
    "preview": "// Copyright 2025 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cmd/server/flags.go",
    "chars": 21407,
    "preview": "// Copyright 2023 Woodpecker Authors\n// Copyright 2019 Laszlo Fogas\n//\n// Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "cmd/server/grpc_server.go",
    "chars": 2516,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cmd/server/health.go",
    "chars": 1833,
    "preview": "// Copyright 2023 Woodpecker Authors\n// Copyright 2018 Drone.IO Inc.\n//\n// Licensed under the Apache License, Version 2."
  },
  {
    "path": "cmd/server/main.go",
    "chars": 1160,
    "preview": "// Copyright 2018 Drone.IO Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use"
  },
  {
    "path": "cmd/server/man.go",
    "chars": 893,
    "preview": "// Copyright 2025 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cmd/server/metrics_server.go",
    "chars": 3236,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cmd/server/openapi/docs.go",
    "chars": 221659,
    "preview": "// Package openapi Code generated by swaggo/swag. DO NOT EDIT\npackage openapi\n\nimport \"github.com/swaggo/swag\"\n\nconst do"
  },
  {
    "path": "cmd/server/openapi.go",
    "chars": 1627,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cmd/server/openapi_json_gen.go",
    "chars": 2628,
    "preview": "// Copyright 2023 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cmd/server/openapi_test.go",
    "chars": 865,
    "preview": "// Copyright 2024 Woodpecker Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may no"
  },
  {
    "path": "cmd/server/server.go",
    "chars": 8689,
    "preview": "// Copyright 2018 Drone.IO Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use"
  },
  {
    "path": "cmd/server/setup.go",
    "chars": 9804,
    "preview": "// Copyright 2022 Woodpecker Authors\n// Copyright 2018 Drone.IO Inc.\n//\n// Licensed under the Apache License, Version 2."
  },
  {
    "path": "codecov.yaml",
    "chars": 74,
    "preview": "ignore:\n  - '**/mocks/mock_*.go'\n  - '**/fixtures/*.go'\n  - 'e2e/**/*.go'\n"
  },
  {
    "path": "contrib/woodpecker-test-repo/.woodpecker/demo.yaml",
    "chars": 69,
    "preview": "steps:\n  demo:\n    image: 'alpine'\n    commands:\n      - echo 'Demo'\n"
  },
  {
    "path": "contrib/woodpecker-test-repo/.woodpecker/test.yaml",
    "chars": 207,
    "preview": "steps:\n  test_1:\n    image: 'alpine'\n    commands:\n      - echo 'Test 1'\n\n  test_2:\n    image: 'alpine'\n    commands:\n  "
  },
  {
    "path": "docker/Dockerfile.agent.alpine.multiarch",
    "chars": 767,
    "preview": "FROM --platform=$BUILDPLATFORM docker.io/golang:1.26 AS build\n\nWORKDIR /src\nCOPY . .\nARG TARGETOS TARGETARCH CI_COMMIT_S"
  },
  {
    "path": "docker/Dockerfile.agent.multiarch",
    "chars": 974,
    "preview": "FROM --platform=$BUILDPLATFORM docker.io/golang:1.26 AS build\n\nRUN groupadd -g 1000 woodpecker && \\\n  useradd -u 1000 -g"
  },
  {
    "path": "docker/Dockerfile.cli.alpine.multiarch.rootless",
    "chars": 619,
    "preview": "FROM --platform=$BUILDPLATFORM docker.io/golang:1.26 AS build\n\nWORKDIR /src\nCOPY . .\nARG TARGETOS TARGETARCH CI_COMMIT_S"
  }
]

// ... and 1310 more files (download for full content)

About this extraction

This page contains the full source code of the laszlocph/woodpecker GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1510 files (7.4 MB), approximately 2.0M tokens, and a symbol index with 5948 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!