From 544b2cfcab75f2e13cb039f84b7c8b68b7e81036 Mon Sep 17 00:00:00 2001 From: Ronald Loyko <108372764+ronaldloyko@users.noreply.github.com> Date: Tue, 27 Sep 2022 17:12:56 +0300 Subject: [PATCH] feat: add woodpecker (#733) * feat: add woodpecker * feat: add agent configurations * feat: add more start instructions --- public/v4/apps/woodpecker.yml | 459 +++++++++++++++++++++++++++++++++ public/v4/logos/woodpecker.png | Bin 0 -> 14744 bytes 2 files changed, 459 insertions(+) create mode 100644 public/v4/apps/woodpecker.yml create mode 100644 public/v4/logos/woodpecker.png diff --git a/public/v4/apps/woodpecker.yml b/public/v4/apps/woodpecker.yml new file mode 100644 index 0000000..51ec70b --- /dev/null +++ b/public/v4/apps/woodpecker.yml @@ -0,0 +1,459 @@ +captainVersion: 4 +services: + $$cap_appname: + caproverExtra: + containerHttpPort: '8000' + image: woodpeckerci/woodpecker-server:$$cap_woodpecker_version + hostname: $$cap_appname.$$cap_root_domain + volumes: + - $$cap_appname-server:/var/lib/woodpecker + environment: + WOODPECKER_LOG_LEVEL: $$cap_WOODPECKER_LOG_LEVEL + WOODPECKER_DEBUG_PRETTY: $$cap_WOODPECKER_DEBUG_PRETTY + WOODPECKER_DEBUG_NOCOLOR: $$cap_WOODPECKER_DEBUG_NOCOLOR + WOODPECKER_HOST: $$cap_WOODPECKER_HOST + WOODPECKER_ADMIN: $$cap_WOODPECKER_ADMIN + WOODPECKER_ORGS: $$cap_WOODPECKER_ORGS + WOODPECKER_REPO_OWNERS: $$cap_WOODPECKER_REPO_OWNERS + WOODPECKER_OPEN: $$cap_WOODPECKER_OPEN + WOODPECKER_DOCS: $$cap_WOODPECKER_DOCS + WOODPECKER_AUTHENTICATE_PUBLIC_REPOS: $$cap_WOODPECKER_AUTHENTICATE_PUBLIC_REPOS + WOODPECKER_DEFAULT_CLONE_IMAGE: $$cap_WOODPECKER_DEFAULT_CLONE_IMAGE + WOODPECKER_SESSION_EXPIRES: $$cap_WOODPECKER_SESSION_EXPIRES + WOODPECKER_ESCALATE: $$cap_WOODPECKER_ESCALATE + WOODPECKER_DOCKER_CONFIG: $$cap_WOODPECKER_DOCKER_CONFIG + WOODPECKER_AGENT_SECRET: $$cap_WOODPECKER_AGENT_SECRET + WOODPECKER_KEEPALIVE_MIN_TIME: $$cap_WOODPECKER_KEEPALIVE_MIN_TIME + WOODPECKER_DATABASE_DRIVER: $$cap_WOODPECKER_DATABASE_DRIVER + WOODPECKER_DATABASE_DATASOURCE: $$cap_WOODPECKER_DATABASE_DATASOURCE + WOODPECKER_PROMETHEUS_AUTH_TOKEN: $$cap_WOODPECKER_PROMETHEUS_AUTH_TOKEN + WOODPECKER_STATUS_CONTEXT: $$cap_WOODPECKER_STATUS_CONTEXT + WOODPECKER_LIMIT_MEM_SWAP: $$cap_WOODPECKER_LIMIT_MEM_SWAP + WOODPECKER_LIMIT_MEM: $$cap_WOODPECKER_LIMIT_MEM_USED + WOODPECKER_LIMIT_SHM_SIZE: $$cap_WOODPECKER_LIMIT_SHM_SIZE + WOODPECKER_LIMIT_CPU_QUOTA: $$cap_WOODPECKER_LIMIT_CPU_QUOTA + WOODPECKER_LIMIT_CPU_SHARES: $$cap_WOODPECKER_LIMIT_CPU_SHARES + WOODPECKER_LIMIT_CPU_SET: $$cap_WOODPECKER_LIMIT_CPU_SET + WOODPECKER_GITHUB: $$cap_WOODPECKER_GITHUB_ENABLED + WOODPECKER_GITHUB_URL: $$cap_WOODPECKER_GITHUB_URL + WOODPECKER_GITHUB_CLIENT: $$cap_WOODPECKER_GITHUB_CLIENT + WOODPECKER_GITHUB_SECRET: $$cap_WOODPECKER_GITHUB_SECRET + WOODPECKER_GITHUB_MERGE_REF: $$cap_WOODPECKER_GITHUB_MERGE_REF + WOODPECKER_GITHUB_SKIP_VERIFY: $$cap_WOODPECKER_GITHUB_SKIP_VERIFY + WOODPECKER_GOGS: $$cap_WOODPECKER_GOGS_ENABLED + WOODPECKER_GOGS_URL: $$cap_WOODPECKER_GOGS_URL + WOODPECKER_GOGS_GIT_USERNAME: $$cap_WOODPECKER_GOGS_GIT_USERNAME + WOODPECKER_GOGS_GIT_PASSWORD: $$cap_WOODPECKER_GOGS_GIT_PASSWORD + WOODPECKER_GOGS_PRIVATE_MODE: $$cap_WOODPECKER_GOGS_PRIVATE_MODE + WOODPECKER_GOGS_SKIP_VERIFY: $$cap_WOODPECKER_GOGS_SKIP_VERIFY + WOODPECKER_GITEA: $$cap_WOODPECKER_GITEA_ENABLED + WOODPECKER_GITEA_URL: $$cap_WOODPECKER_GITEA_URL + WOODPECKER_GITEA_CLIENT: $$cap_WOODPECKER_GITEA_CLIENT + WOODPECKER_GITEA_SECRET: $$cap_WOODPECKER_GITEA_SECRET + WOODPECKER_GITEA_SKIP_VERIFY: $$cap_WOODPECKER_GITEA_SKIP_VERIFY + WOODPECKER_BITBUCKET: $$cap_WOODPECKER_BITBUCKET_ENABLED + WOODPECKER_BITBUCKET_CLIENT: $$cap_WOODPECKER_BITBUCKET_CLIENT + WOODPECKER_BITBUCKET_SECRET: $$cap_WOODPECKER_BITBUCKET_SECRET + WOODPECKER_STASH: $$cap_WOODPECKER_STASH_ENABLED + WOODPECKER_STASH_URL: $$cap_WOODPECKER_STASH_URL + WOODPECKER_STASH_CONSUMER_KEY: $$cap_WOODPECKER_STASH_CONSUMER_KEY + WOODPECKER_STASH_CONSUMER_RSA: $$cap_WOODPECKER_STASH_CONSUMER_RSA_PATH + WOODPECKER_STASH_CONSUMER_RSA_STRING: $$cap_WOODPECKER_STASH_CONSUMER_RSA_STRING + WOODPECKER_STASH_GIT_USERNAME: $$cap_WOODPECKER_STASH_GIT_USERNAME + WOODPECKER_STASH_GIT_PASSWORD: $$cap_WOODPECKER_STASH_GIT_PASSWORD + WOODPECKER_STASH_SKIP_VERIFY: $$cap_WOODPECKER_STASH_SKIP_VERIFY + WOODPECKER_GITLAB: $$cap_WOODPECKER_GITLAB_ENABLED + WOODPECKER_GITLAB_URL: $$cap_WOODPECKER_GITLAB_URL + WOODPECKER_GITLAB_CLIENT: $$cap_WOODPECKER_GITLAB_CLIENT + WOODPECKER_GITLAB_SECRET: $$cap_WOODPECKER_GITLAB_SECRET + WOODPECKER_GITLAB_SKIP_VERIFY: $$cap_WOODPECKER_GITLAB_SKIP_VERIFY + WOODPECKER_CODING: $$cap_WOODPECKER_CODING_ENABLED + WOODPECKER_CODING_URL: $$cap_WOODPECKER_CODING_URL + WOODPECKER_CODING_CLIENT: $$cap_WOODPECKER_CODING_CLIENT + WOODPECKER_CODING_SECRET: $$cap_WOODPECKER_CODING_SECRET + WOODPECKER_CODING_SCOPE: $$cap_WOODPECKER_CODING_SCOPE + WOODPECKER_CODING_GIT_MACHINE: $$cap_WOODPECKER_CODING_GIT_MACHINE + WOODPECKER_CODING_GIT_USERNAME: $$cap_WOODPECKER_CODING_GIT_USERNAME + WOODPECKER_CODING_GIT_PASSWORD: $$cap_WOODPECKER_CODING_GIT_PASSWORD + WOODPECKER_CODING_SKIP_VERIFY: $$cap_WOODPECKER_CODING_SKIP_VERIFY + $$cap_appname-agent: + caproverExtra: + notExposeAsWebApp: 'true' + dockerfileLines: + - FROM woodpeckerci/woodpecker-agent:$$cap_woodpecker_version + - CMD ["agent"] + depends_on: + - $$cap_appname + volumes: + - /var/run/docker.sock:/var/run/docker.sock + environment: + WOODPECKER_SERVER: srv-captain--$$cap_appname:9000 + WOODPECKER_USERNAME: $$cap_WOODPECKER_USERNAME + WOODPECKER_AGENT_SECRET: $$cap_WOODPECKER_AGENT_SECRET + WOODPECKER_LOG_LEVEL: $$cap_WOODPECKER_LOG_LEVEL + WOODPECKER_DEBUG_PRETTY: $$cap_WOODPECKER_DEBUG_PRETTY + WOODPECKER_DEBUG_NOCOLOR: $$cap_WOODPECKER_DEBUG_NOCOLOR + WOODPECKER_HOSTNAME: $$cap_WOODPECKER_AGENT_HOSTNAME + WOODPECKER_MAX_PROCS: $$cap_WOODPECKER_MAX_PROCS + WOODPECKER_HEALTHCHECK: $$cap_WOODPECKER_HEALTHCHECK + WOODPECKER_KEEPALIVE_TIME: $$cap_WOODPECKER_KEEPALIVE_TIME_SETTING + WOODPECKER_KEEPALIVE_TIMEOUT: $$cap_WOODPECKER_KEEPALIVE_TIMEOUT + WOODPECKER_GRPC_SECURE: $$cap_WOODPECKER_GRPC_SECURE + WOODPECKER_GRPC_VERIFY: $$cap_WOODPECKER_GRPC_VERIFY + WOODPECKER_BACKEND: $$cap_WOODPECKER_BACKEND + +caproverOneClickApp: + displayName: Woodpecker + description: Simple CI engine with great extensibility. It runs your pipelines inside Docker containers. + isOfficial: true + documentation: See https://woodpecker-ci.org + instructions: + start: |- + Woodpecker is a simple CI engine with great extensibility. + It is a community fork of the Drone CI system. + It runs your pipelines inside Docker containers, so if you are already using them in your daily workflow, you'll love Woodpecker for sure. + You should set up `WOODPECKER_HOST` and at least one version control system (e.g. `WOODPECKER_GITEA` for Gitea or `WOODPECKER_GITHUB` for GitHub etc.). + end: > + Woodpecker has been successfully deployed! It might take few moments before it's fully started. + You can access it at http://$$cap_appname.$$cap_root_domain + variables: + - id: $$cap_woodpecker_version + label: Version Tag + description: Check out their Docker Hub page for the valid tags https://hub.docker.com/r/woodpeckerci/woodpecker-server/tags + defaultValue: pull_1209 + validRegex: "/^([^\\s^\\/])+$/" + - id: $$cap_WOODPECKER_LOG_LEVEL + label: Logging Level + defaultValue: error + description: Configures the logging level. Possible values are trace, debug, info, warn, error, fatal, panic, disabled and empty. + - id: $$cap_WOODPECKER_DEBUG_PRETTY + label: Pretty-Printed Debug Output + description: Enable pretty-printed debug output. + defaultValue: 'false' + validRegex: /^(false|true)$/ + - id: $$cap_WOODPECKER_DEBUG_NOCOLOR + label: Colored Debug Output + description: Disable colored debug output. + defaultValue: 'true' + validRegex: /^(false|true)$/ + - id: $$cap_WOODPECKER_HOST + label: Host + description: |- + Server fully qualified url of the user-facing hostname. + Example: http://woodpecker.example.org + - id: $$cap_WOODPECKER_ADMIN + label: Admin Accounts + description: |- + Comma-separated list of admin accounts. + Example: user1,user2 + - id: $$cap_WOODPECKER_ORGS + label: Approved Organizations + description: |- + Comma-separated list of approved organizations. + Example: org1,org2 + - id: $$cap_WOODPECKER_REPO_OWNERS + label: Syncable Repository Owners + description: |- + Comma-separated list of syncable repo owners. + Example: user1,user2 + - id: $$cap_WOODPECKER_OPEN + label: User Registration + description: Enable to allow user registration. + defaultValue: 'false' + validRegex: /^(false|true)$/ + - id: $$cap_WOODPECKER_DOCS + label: Link To Documentation + description: Link to documentation in the UI. + defaultValue: https://woodpecker-ci.org/ + validRegex: /.{1,}/ + - id: $$cap_WOODPECKER_AUTHENTICATE_PUBLIC_REPOS + label: Authenticate Cloning Of Public Repositories + description: Always use authentication to clone repositories even if they are public. Needed if the SCM requires to always authenticate as used by many companies. + defaultValue: 'false' + validRegex: /^(false|true)$/ + - id: $$cap_WOODPECKER_DEFAULT_CLONE_IMAGE + label: Repository Cloning Docker Image + description: The default docker image to be used when cloning the repo + defaultValue: woodpeckerci/plugin-git:latest + validRegex: /.{1,}/ + - id: $$cap_WOODPECKER_SESSION_EXPIRES + label: Session Expiration Time + description: Configures the session expiration time. + defaultValue: 72h + validRegex: /.{1,}/ + - id: $$cap_WOODPECKER_ESCALATE + label: Privileged Mode Images + description: Docker images to run in privileged mode. Only change if you are sure what you do! + defaultValue: plugins/docker,plugins/gcr,plugins/ecr,woodpeckerci/plugin-docker,woodpeckerci/plugin-docker-buildx + validRegex: /.{1,}/ + - id: $$cap_WOODPECKER_DOCKER_CONFIG + label: Private Registry Configuration + description: |- + Configures a specific private registry config for all pipelines. + Example: /home/user/.docker/config.json + - id: $$cap_WOODPECKER_AGENT_SECRET + label: Shared Secret Used By Server And Agents + description: A shared secret used by server and agents to authenticate communication. + defaultValue: $$cap_gen_random_hex(32) + validRegex: /.{1,}/ + - id: $$cap_WOODPECKER_KEEPALIVE_MIN_TIME + label: Time Before Sending A Keep-Alive Ping + description: |- + Server-side enforcement policy on the minimum amount of time a client should wait before sending a keep-alive ping. + Example: 10s + - id: $$cap_WOODPECKER_DATABASE_DRIVER + label: Database Driver + description: The database driver name. Possible values are sqlite3, mysql or postgres. + defaultValue: sqlite3 + validRegex: /.{1,}/ + - id: $$cap_WOODPECKER_DATABASE_DATASOURCE + label: Database Connection String + description: |- + The database connection string. The default value is the path of the embedded SQLite database file. + Example for MySQL: root:password@tcp(1.2.3.4:3306)/woodpecker?parseTime=true + Example for PostgreSQL: postgres://root:password@1.2.3.4:5432/woodpecker?sslmode=disable + defaultValue: woodpecker.sqlite + validRegex: /.{1,}/ + - id: $$cap_WOODPECKER_PROMETHEUS_AUTH_TOKEN + label: Prometheus Token + description: Token to secure the Prometheus metrics endpoint. + - id: $$cap_WOODPECKER_STATUS_CONTEXT + label: SCM Status Message Context Prefix + description: Context prefix Woodpecker will use to publish status messages to SCM. You probably will only need to change it if you run multiple Woodpecker instances for a single repository. + defaultValue: ci/woodpecker + validRegex: /.{1,}/ + - id: $$cap_WOODPECKER_LIMIT_MEM_SWAP + label: Maximum Memory Swap Per Pipeline Container + description: The maximum amount of memory a single pipeline container is allowed to swap to disk, configured in bytes. There is no limit if 0. + defaultValue: 0 + - id: $$cap_WOODPECKER_LIMIT_MEM_USED + label: Maximum Memory Used Per Pipeline Container + description: The maximum amount of memory a single pipeline container can use, configured in bytes. There is no limit if 0. + defaultValue: 0 + - id: $$cap_WOODPECKER_LIMIT_SHM_SIZE + label: Maximum Memory Used Of /dev/shm + description: The maximum amount of memory of /dev/shm allowed in bytes. There is no limit if 0. + defaultValue: 0 + - id: $$cap_WOODPECKER_LIMIT_CPU_QUOTA + label: CPU Quota Limit + description: The number of microseconds per CPU period that the container is limited to before throttled. There is no limit if 0. + defaultValue: 0 + - id: $$cap_WOODPECKER_LIMIT_CPU_SHARES + label: CPU Weight Against Other Containers + description: The relative weight vs. other containers. + defaultValue: 0 + - id: $$cap_WOODPECKER_LIMIT_CPU_SET + label: Limit CPU Usage + description: |- + Comma-separated list to limit the specific CPUs or cores a pipeline container can use. + Example: 1,2 + - id: $$cap_WOODPECKER_GITHUB_ENABLED + label: Enable GitHub + description: Enables the GitHub driver. + defaultValue: 'false' + validRegex: /^(false|true)$/ + - id: $$cap_WOODPECKER_GITHUB_URL + label: GitHub URL + description: Configures the GitHub server address. + defaultValue: https://github.com + validRegex: /.{1,}/ + - id: $$cap_WOODPECKER_GITHUB_CLIENT + label: GitHub Client + description: Configures the GitHub OAuth client id. This is used to authorize access. + - id: $$cap_WOODPECKER_GITHUB_SECRET + label: GitHub Secret + description: Configures the GitHub OAuth client secret. This is used to authorize access. + - id: $$cap_WOODPECKER_GITHUB_MERGE_REF + label: GitHub Merge Reference Usage + description: Use GitHub Merge References + defaultValue: 'true' + validRegex: /^(false|true)$/ + - id: $$cap_WOODPECKER_GITHUB_SKIP_VERIFY + label: Skip SSL Verification + description: Configure if SSL verification should be skipped. + defaultValue: 'false' + validRegex: /^(false|true)$/ + - id: $$cap_WOODPECKER_GOGS_ENABLED + label: Enable Gogs + description: Enables the Gogs driver. + defaultValue: 'false' + validRegex: /^(false|true)$/ + - id: $$cap_WOODPECKER_GOGS_URL + label: Gogs URL + description: Configures the Gogs server address. + defaultValue: https://github.com + validRegex: /.{1,}/ + - id: $$cap_WOODPECKER_GOGS_GIT_USERNAME + label: Gogs User Name. + description: This username is used to authenticate and clone all private repositories. + - id: $$cap_WOODPECKER_GOGS_GIT_PASSWORD + label: Gogs User Password. + description: The password is used to authenticate and clone all private repositories. + - id: $$cap_WOODPECKER_GOGS_PRIVATE_MODE + label: Enable Gogs Private Module + description: Enables the Gogs private mode. + defaultValue: 'false' + validRegex: /^(false|true)$/ + - id: $$cap_WOODPECKER_GOGS_SKIP_VERIFY + label: Skip SSL Verification + description: Configure if SSL verification should be skipped. + defaultValue: 'false' + validRegex: /^(false|true)$/ + - id: $$cap_WOODPECKER_GITEA_ENABLED + label: Enable Gitea + description: Enables the Gitea driver. + defaultValue: 'false' + validRegex: /^(false|true)$/ + - id: $$cap_WOODPECKER_GITEA_URL + label: Gitea URL + description: Configures the Gitea server address. + defaultValue: https://try.gitea.io + validRegex: /.{1,}/ + - id: $$cap_WOODPECKER_GITEA_CLIENT + label: Gitea Client + description: Configures the Gitea OAuth client id. This is used to authorize access. + - id: $$cap_WOODPECKER_GITEA_SECRET + label: Gitea Secret + description: Configures the Gitea OAuth client secret. This is used to authorize access. + - id: $$cap_WOODPECKER_GITEA_SKIP_VERIFY + label: Skip SSL Verification + description: Configure if SSL verification should be skipped. + defaultValue: 'false' + validRegex: /^(false|true)$/ + - id: $$cap_WOODPECKER_BITBUCKET_ENABLED + label: Enable Bitbucket + description: Enables the Bitbucket driver. + defaultValue: 'false' + validRegex: /^(false|true)$/ + - id: $$cap_WOODPECKER_BITBUCKET_CLIENT + label: Bitbucket Client + description: Configures the Bitbucket OAuth client id. This is used to authorize access. + - id: $$cap_WOODPECKER_BITBUCKET_SECRET + label: Bitbucket Secret + description: Configures the Bitbucket OAuth client secret. This is used to authorize access. + - id: $$cap_WOODPECKER_STASH_ENABLED + label: Enable Stash + description: Enables the Stash driver. + defaultValue: 'false' + validRegex: /^(false|true)$/ + - id: $$cap_WOODPECKER_STASH_URL + label: Stash URL + description: Configures the Stash server address. + - id: $$cap_WOODPECKER_STASH_CONSUMER_KEY + label: Stash Consumer Key + description: Configures your Bitbucket Server consumer key. + - id: $$cap_WOODPECKER_STASH_CONSUMER_RSA_PATH + label: Stash Consumer Private Key Path + description: Configures the path to your Bitbucket Server private key file. + - id: $$cap_WOODPECKER_STASH_CONSUMER_RSA_STRING + label: Stash Consumer Private Key + description: Configures your Bitbucket Server private key. + - id: $$cap_WOODPECKER_STASH_GIT_USERNAME + label: Stash Git User Name + description: This username is used to authenticate and clone all private repositories. + - id: $$cap_WOODPECKER_STASH_GIT_PASSWORD + label: Stash Git User Password + description: The password is used to authenticate and clone all private repositories. + - id: $$cap_WOODPECKER_STASH_SKIP_VERIFY + label: Skip SSL Verification + description: Configure if SSL verification should be skipped. + defaultValue: 'false' + validRegex: /^(false|true)$/ + - id: $$cap_WOODPECKER_GITLAB_ENABLED + label: Enable GitLab + description: Enables the GitLab driver. + defaultValue: 'false' + validRegex: /^(false|true)$/ + - id: $$cap_WOODPECKER_GITLAB_URL + label: GitLab URL + description: Configures the GitLab server address. + defaultValue: https://gitlab.com + validRegex: /.{1,}/ + - id: $$cap_WOODPECKER_GITLAB_CLIENT + label: GitLab Client + description: Configures the GitLab OAuth client id. This is used to authorize access. + - id: $$cap_WOODPECKER_GITLAB_SECRET + label: GitLab Secret + description: Configures the GitLab OAuth client secret. This is used to authorize access. + - id: $$cap_WOODPECKER_GITLAB_SKIP_VERIFY + label: Skip SSL Verification + description: Configure if SSL verification should be skipped. + defaultValue: 'false' + validRegex: /^(false|true)$/ + - id: $$cap_WOODPECKER_CODING_ENABLED + label: Enable Coding + description: Enables the Coding driver. + defaultValue: 'false' + validRegex: /^(false|true)$/ + - id: $$cap_WOODPECKER_CODING_URL + label: Coding URL + description: Configures the Coding server address. + defaultValue: https://coding.net + validRegex: /.{1,}/ + - id: $$cap_WOODPECKER_CODING_CLIENT + label: Coding Client + description: Configures the Coding OAuth client id. This is used to authorize access. + - id: $$cap_WOODPECKER_CODING_SECRET + label: Coding Secret + description: Configures the Coding OAuth client secret. This is used to authorize access. + - id: $$cap_WOODPECKER_CODING_SCOPE + label: Coding Scope + description: Comma-separated list of OAuth scopes. + defaultValue: user, project, project:depot + validRegex: /.{1,}/ + - id: $$cap_WOODPECKER_CODING_GIT_MACHINE + label: Coding Git Host + description: Configures the Git host. + defaultValue: git.coding.net + validRegex: /.{1,}/ + - id: $$cap_WOODPECKER_CODING_GIT_USERNAME + label: Coding Git User Name + description: This username is used to authenticate and clone all private repositories. + - id: $$cap_WOODPECKER_CODING_GIT_PASSWORD + label: Coding Git User Password + description: The password is used to authenticate and clone all private repositories. + - id: $$cap_WOODPECKER_CODING_SKIP_VERIFY + label: Skip SSL Verification + description: Configure if SSL verification should be skipped. + defaultValue: 'false' + validRegex: /^(false|true)$/ + - id: $$cap_WOODPECKER_USERNAME + label: gRPC User Name + description: The gRPC username. + defaultValue: x-oauth-basic + validRegex: /.{1,}/ + - id: $$cap_WOODPECKER_AGENT_HOSTNAME + label: Agent Hostname + description: Configures the agent hostname. + - id: $$cap_WOODPECKER_MAX_PROCS + label: Parallel Builds + description: Configures the number of parallel builds. + defaultValue: 1 + - id: $$cap_WOODPECKER_HEALTHCHECK + label: Health Check + description: Enable healthcheck endpoint. + defaultValue: 'true' + validRegex: /^(false|true)$/ + - id: $$cap_WOODPECKER_KEEPALIVE_TIME_SETTING + label: Keep-Alive Time + description: After a duration of this time of no activity, the agent pings the server to check if the transport is still alive. + - id: $$cap_WOODPECKER_KEEPALIVE_TIMEOUT + label: Keep-Alive Timeout + description: After pinging for a keepalive check, the agent waits for a duration of this time before closing the connection if no activity. + defaultValue: 20s + validRegex: /.{1,}/ + - id: $$cap_WOODPECKER_GRPC_SECURE + label: Secure gRPC Connection + description: Configures if the connection to WOODPECKER_SERVER should be made using a secure transport. + defaultValue: 'false' + validRegex: /^(false|true)$/ + - id: $$cap_WOODPECKER_GRPC_VERIFY + label: Verify gRPC Server Certificate + description: Configures if the gRPC server certificate should be verified, only valid when WOODPECKER_GRPC_SECURE is true. + defaultValue: 'true' + validRegex: /^(false|true)$/ + - id: $$cap_WOODPECKER_BACKEND + label: Backend Engine + description: Configures the backend engine to run pipelines on. Possible values are auto-detect or docker. + defaultValue: docker + validRegex: /^(auto-detect|docker)$/ diff --git a/public/v4/logos/woodpecker.png b/public/v4/logos/woodpecker.png new file mode 100644 index 0000000000000000000000000000000000000000..ac5f80f8808e0e5970335a89f4749fd19b127003 GIT binary patch literal 14744 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 literal 0 HcmV?d00001