3
.gitignore
vendored
|
@ -1,6 +1,5 @@
|
|||
drone/drone
|
||||
*.sqlite
|
||||
*.txt
|
||||
*.out
|
||||
/.env
|
||||
extras/
|
||||
|
@ -15,3 +14,5 @@ web/node_modules
|
|||
web/dist/files
|
||||
web/*.log
|
||||
web/.env
|
||||
|
||||
docs/venv
|
||||
|
|
186
README.md
|
@ -20,13 +20,6 @@ An opinionated fork of the Drone CI system.
|
|||
- [Pipeline documentation](#pipeline-documentation)
|
||||
- [Plugins](#plugins)
|
||||
- [Custom plugins](#custom-plugins)
|
||||
- [Server setup](#server-setup)
|
||||
- [Quickstart](#quickstart)
|
||||
- [Authentication](#authentication)
|
||||
- [Database](#database)
|
||||
- [SSL](#ssl)
|
||||
- [Metrics](#metrics)
|
||||
- [Behind a proxy](#behind-a-proxy)
|
||||
- [Contributing](#contributing)
|
||||
- [License](#license)
|
||||
|
||||
|
@ -133,185 +126,6 @@ Plugins are Docker containers with their entrypoint set to a predefined script.
|
|||
|
||||
## Server setup
|
||||
|
||||
#### Quickstart
|
||||
|
||||
The below [docker-compose](https://docs.docker.com/compose/) configuration can be used to start the Drone server with a single agent. It relies on a number of environment variables that you must set before running `docker-compose up`. The variables are described below.
|
||||
|
||||
Each agent is able to process one build by default. If you have 4 agents installed and connected to the Drone server, your system will process 4 builds in parallel. You can add more agents to increase the number of parallel builds or set the agent's `DRONE_MAX_PROCS=1` environment variable to increase the number of parallel builds for that agent.
|
||||
|
||||
```yaml
|
||||
version: '2'
|
||||
|
||||
services:
|
||||
drone-server:
|
||||
image: drone/drone:{{% version %}}
|
||||
ports:
|
||||
- 80:8000
|
||||
- 9000
|
||||
volumes:
|
||||
- drone-server-data:/var/lib/drone/
|
||||
restart: always
|
||||
environment:
|
||||
- DRONE_OPEN=true
|
||||
- DRONE_HOST=${DRONE_HOST}
|
||||
- DRONE_GITHUB=true
|
||||
- DRONE_GITHUB_CLIENT=${DRONE_GITHUB_CLIENT}
|
||||
- DRONE_GITHUB_SECRET=${DRONE_GITHUB_SECRET}
|
||||
- DRONE_SECRET=${DRONE_SECRET}
|
||||
|
||||
drone-agent:
|
||||
image: drone/agent:{{% version %}}
|
||||
command: agent
|
||||
restart: always
|
||||
depends_on:
|
||||
- drone-server
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
environment:
|
||||
- DRONE_SERVER=drone-server:9000
|
||||
- DRONE_SECRET=${DRONE_SECRET}
|
||||
|
||||
volumes:
|
||||
drone-server-data:
|
||||
```
|
||||
|
||||
Drone needs to know its own address. You must therefore provide the address in `<scheme>://<hostname>` format. Please omit trailing slashes.
|
||||
|
||||
```diff
|
||||
services:
|
||||
drone-server:
|
||||
image: drone/drone:{{% version %}}
|
||||
environment:
|
||||
- DRONE_OPEN=true
|
||||
+ - DRONE_HOST=${DRONE_HOST}
|
||||
- DRONE_GITHUB=true
|
||||
- DRONE_GITHUB_CLIENT=${DRONE_GITHUB_CLIENT}
|
||||
- DRONE_GITHUB_SECRET=${DRONE_GITHUB_SECRET}
|
||||
- DRONE_SECRET=${DRONE_SECRET}
|
||||
```
|
||||
|
||||
Drone agents require access to the host machine Docker daemon.
|
||||
|
||||
```diff
|
||||
services:
|
||||
drone-agent:
|
||||
image: drone/agent:{{% version %}}
|
||||
command: agent
|
||||
restart: always
|
||||
depends_on: [ drone-server ]
|
||||
+ volumes:
|
||||
+ - /var/run/docker.sock:/var/run/docker.sock
|
||||
```
|
||||
|
||||
Drone agents require the server address for agent-to-server communication.
|
||||
|
||||
```diff
|
||||
services:
|
||||
drone-agent:
|
||||
image: drone/agent:{{% version %}}
|
||||
command: agent
|
||||
restart: always
|
||||
depends_on: [ drone-server ]
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
environment:
|
||||
+ - DRONE_SERVER=drone-server:9000
|
||||
- DRONE_SECRET=${DRONE_SECRET}
|
||||
```
|
||||
|
||||
Drone server and agents use a shared secret to authenticate communication. This should be a random string of your choosing and should be kept private. You can generate such string with `openssl rand -hex 32`.
|
||||
|
||||
```diff
|
||||
services:
|
||||
drone-server:
|
||||
image: drone/drone:{{% version %}}
|
||||
environment:
|
||||
- DRONE_OPEN=true
|
||||
- DRONE_HOST=${DRONE_HOST}
|
||||
- DRONE_GITHUB=true
|
||||
- DRONE_GITHUB_CLIENT=${DRONE_GITHUB_CLIENT}
|
||||
- DRONE_GITHUB_SECRET=${DRONE_GITHUB_SECRET}
|
||||
+ - DRONE_SECRET=${DRONE_SECRET}
|
||||
drone-agent:
|
||||
image: drone/agent:{{% version %}}
|
||||
environment:
|
||||
- DRONE_SERVER=drone-server:9000
|
||||
- DRONE_DEBUG=true
|
||||
+ - DRONE_SECRET=${DRONE_SECRET}
|
||||
```
|
||||
|
||||
Drone registration is closed by default. This example enables open registration for users that are members of approved GitHub organizations.
|
||||
|
||||
```diff
|
||||
services:
|
||||
drone-server:
|
||||
image: drone/drone:{{% version %}}
|
||||
environment:
|
||||
+ - DRONE_OPEN=true
|
||||
+ - DRONE_ORGS=dolores,dogpatch
|
||||
- DRONE_HOST=${DRONE_HOST}
|
||||
- DRONE_GITHUB=true
|
||||
- DRONE_GITHUB_CLIENT=${DRONE_GITHUB_CLIENT}
|
||||
- DRONE_GITHUB_SECRET=${DRONE_GITHUB_SECRET}
|
||||
- DRONE_SECRET=${DRONE_SECRET}
|
||||
```
|
||||
|
||||
Drone administrators should also be enumerated in your configuration.
|
||||
|
||||
```diff
|
||||
services:
|
||||
drone-server:
|
||||
image: drone/drone:{{% version %}}
|
||||
environment:
|
||||
- DRONE_OPEN=true
|
||||
- DRONE_ORGS=dolores,dogpatch
|
||||
+ - DRONE_ADMIN=johnsmith,janedoe
|
||||
- DRONE_HOST=${DRONE_HOST}
|
||||
- DRONE_GITHUB=true
|
||||
- DRONE_GITHUB_CLIENT=${DRONE_GITHUB_CLIENT}
|
||||
- DRONE_GITHUB_SECRET=${DRONE_GITHUB_SECRET}
|
||||
- DRONE_SECRET=${DRONE_SECRET}
|
||||
```
|
||||
|
||||
#### Authentication
|
||||
|
||||
Authentication is done using OAuth and is delegated to one of multiple version control providers, configured using environment variables. The example above demonstrates basic GitHub integration.
|
||||
|
||||
See the complete reference for [Github](docs/administration/github.md), [Bitbucket Cloud](docs/administration/bitbucket.md), [Bitbucket Server](docs/administration/bitbucket_server.md) and [Gitlab](docs/administration/gitlab.md).
|
||||
|
||||
#### Database
|
||||
|
||||
Drone mounts a [data volume](https://docs.docker.com/storage/volumes/#create-and-manage-volumes) to persist the sqlite database.
|
||||
|
||||
See the [database settings](docs/administration/database.md) page to configure Postgresql or MySQL as database.
|
||||
|
||||
```diff
|
||||
services:
|
||||
drone-server:
|
||||
image: drone/drone:{{% version %}}
|
||||
ports:
|
||||
- 80:8000
|
||||
- 9000
|
||||
+ volumes:
|
||||
+ - drone-server-data:/var/lib/drone/
|
||||
restart: always
|
||||
```
|
||||
|
||||
#### SSL
|
||||
|
||||
Drone supports ssl configuration by mounting certificates into your container.
|
||||
|
||||
See the [SSL guide](docs/administration/ssl.md).
|
||||
|
||||
Automated [Lets Encrypt](docs/administration/lets_encrypt.md) is also supported.
|
||||
|
||||
#### Metrics
|
||||
|
||||
A [Prometheus endpoint](docs/administration/lets_encrypt.md) is exposed.
|
||||
|
||||
#### Behind a proxy
|
||||
|
||||
See the [proxy guide](docs/administration/proxy.md) if you want to see a setup behind Apache, Nginx, Caddy or ngrok.
|
||||
|
||||
## Contributing
|
||||
|
||||
|
|
Before Width: | Height: | Size: 136 KiB After Width: | Height: | Size: 136 KiB |
Before Width: | Height: | Size: 128 KiB After Width: | Height: | Size: 128 KiB |
|
@ -1,48 +0,0 @@
|
|||
|
||||
This guide provides instructions for using alternate storage engines. Please note this is optional. The default storage engine is an embedded SQLite database which requires zero installation or configuration.
|
||||
|
||||
# Configure MySQL
|
||||
|
||||
The below example demonstrates mysql database configuration. See the official driver [documentation](https://github.com/go-sql-driver/mysql#dsn-data-source-name) for configuration options and examples.
|
||||
|
||||
```diff
|
||||
version: '2'
|
||||
|
||||
services:
|
||||
drone-server:
|
||||
image: drone/drone:{{% version %}}
|
||||
environment:
|
||||
+ DRONE_DATABASE_DRIVER: mysql
|
||||
+ DRONE_DATABASE_DATASOURCE: root:password@tcp(1.2.3.4:3306)/drone?parseTime=true
|
||||
```
|
||||
|
||||
# Configure Postgres
|
||||
|
||||
The below example demonstrates postgres database configuration. See the official driver [documentation](https://www.postgresql.org/docs/current/static/libpq-connect.html#LIBPQ-CONNSTRING) for configuration options and examples.
|
||||
|
||||
```diff
|
||||
version: '2'
|
||||
|
||||
services:
|
||||
drone-server:
|
||||
image: drone/drone:{{% version %}}
|
||||
environment:
|
||||
+ DRONE_DATABASE_DRIVER: postgres
|
||||
+ DRONE_DATABASE_DATASOURCE: postgres://root:password@1.2.3.4:5432/postgres?sslmode=disable
|
||||
```
|
||||
|
||||
# Database Creation
|
||||
|
||||
Drone does not create your database automatically. If you are using the mysql or postgres driver you will need to manually create your database using `CREATE DATABASE`
|
||||
|
||||
# Database Migration
|
||||
|
||||
Drone automatically handles database migration, including the initial creation of tables and indexes. New versions of Drone will automatically upgrade the database unless otherwise specified in the release notes.
|
||||
|
||||
# Database Backups
|
||||
|
||||
Drone does not perform database backups. This should be handled by separate third party tools provided by your database vendor of choice.
|
||||
|
||||
# Database Archiving
|
||||
|
||||
Drone does not perform data archival; it considered out-of-scope for the project. Drone is rather conservative with the amount of data it stores, however, you should expect the database logs to grow the size of your database considerably.
|
|
@ -1,38 +0,0 @@
|
|||
Drone supports automated ssl configuration and updates using let's encrypt. You can enable let's encrypt by making the following modifications to your server configuration:
|
||||
|
||||
```diff
|
||||
services:
|
||||
drone-server:
|
||||
image: drone/drone:{{% version %}}
|
||||
ports:
|
||||
+ - 80:80
|
||||
+ - 443:443
|
||||
- 9000:9000
|
||||
volumes:
|
||||
- /var/lib/drone:/var/lib/drone/
|
||||
restart: always
|
||||
environment:
|
||||
- DRONE_OPEN=true
|
||||
- DRONE_HOST=${DRONE_HOST}
|
||||
- DRONE_GITHUB=true
|
||||
- DRONE_GITHUB_CLIENT=${DRONE_GITHUB_CLIENT}
|
||||
- DRONE_GITHUB_SECRET=${DRONE_GITHUB_SECRET}
|
||||
- DRONE_SECRET=${DRONE_SECRET}
|
||||
+ - DRONE_LETS_ENCRYPT=true
|
||||
```
|
||||
|
||||
Note that Drone uses the hostname from the `DRONE_HOST` environment variable when requesting certificates. For example, if `DRONE_HOST=https://foo.com` the certificate is requested for `foo.com`.
|
||||
|
||||
>Once enabled you can visit your website at both the http and the https address
|
||||
|
||||
# Certificate Cache
|
||||
|
||||
Drone writes the certificates to the below directory:
|
||||
|
||||
```
|
||||
/var/lib/drone/golang-autocert
|
||||
```
|
||||
|
||||
# Certificate Updates
|
||||
|
||||
Drone uses the official Go acme library which will handle certificate upgrades. There should be no addition configuration or management required.
|
|
@ -1,162 +0,0 @@
|
|||
|
||||
Drone is compatible with Prometheus and exposes a `/metrics` endpoint. Please note that access to the metrics endpoint is restricted and requires an authorization token with administrative privileges.
|
||||
|
||||
```nohighlight
|
||||
global:
|
||||
scrape_interval: 60s
|
||||
|
||||
scrape_configs:
|
||||
- job_name: 'drone'
|
||||
bearer_token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
|
||||
|
||||
static_configs:
|
||||
- targets: ['drone.domain.com']
|
||||
```
|
||||
|
||||
# Authorization
|
||||
|
||||
An administrator will need to generate a user api token and configure in the prometheus configuration file as a bearer token. Please see the following example:
|
||||
|
||||
```diff
|
||||
global:
|
||||
scrape_interval: 60s
|
||||
|
||||
scrape_configs:
|
||||
- job_name: 'drone'
|
||||
+ bearer_token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
|
||||
|
||||
static_configs:
|
||||
- targets: ['drone.domain.com']
|
||||
```
|
||||
|
||||
# Metric Reference
|
||||
|
||||
List of prometheus metrics specific to Drone:
|
||||
|
||||
```
|
||||
# HELP drone_build_count Total number of builds.
|
||||
# TYPE drone_build_count gauge
|
||||
drone_build_count 7275
|
||||
# HELP drone_pending_jobs Total number of pending build processes.
|
||||
# TYPE drone_pending_jobs gauge
|
||||
drone_pending_jobs 0
|
||||
# HELP drone_repo_count Total number of registered repositories.
|
||||
# TYPE drone_repo_count gauge
|
||||
drone_repo_count 133
|
||||
# HELP drone_running_jobs Total number of running build processes.
|
||||
# TYPE drone_running_jobs gauge
|
||||
drone_running_jobs 0
|
||||
# HELP drone_user_count Total number of active users.
|
||||
# TYPE drone_user_count gauge
|
||||
drone_user_count 15
|
||||
```
|
||||
|
||||
List of prometheus metrics for server resource usage:
|
||||
|
||||
```
|
||||
# HELP go_gc_duration_seconds A summary of the GC invocation durations.
|
||||
# TYPE go_gc_duration_seconds summary
|
||||
go_gc_duration_seconds{quantile="0"} 0.000189189
|
||||
go_gc_duration_seconds{quantile="0.25"} 0.000391444
|
||||
go_gc_duration_seconds{quantile="0.5"} 0.001895967
|
||||
go_gc_duration_seconds{quantile="0.75"} 0.003075854
|
||||
go_gc_duration_seconds{quantile="1"} 0.004224575
|
||||
go_gc_duration_seconds_sum 0.019922696
|
||||
go_gc_duration_seconds_count 10
|
||||
# HELP go_goroutines Number of goroutines that currently exist.
|
||||
# TYPE go_goroutines gauge
|
||||
go_goroutines 24
|
||||
# HELP go_memstats_alloc_bytes Number of bytes allocated and still in use.
|
||||
# TYPE go_memstats_alloc_bytes gauge
|
||||
go_memstats_alloc_bytes 2.556344e+06
|
||||
# HELP go_memstats_alloc_bytes_total Total number of bytes allocated, even if freed.
|
||||
# TYPE go_memstats_alloc_bytes_total counter
|
||||
go_memstats_alloc_bytes_total 2.0479656e+07
|
||||
# HELP go_memstats_buck_hash_sys_bytes Number of bytes used by the profiling bucket hash table.
|
||||
# TYPE go_memstats_buck_hash_sys_bytes gauge
|
||||
go_memstats_buck_hash_sys_bytes 1.45144e+06
|
||||
# HELP go_memstats_frees_total Total number of frees.
|
||||
# TYPE go_memstats_frees_total counter
|
||||
go_memstats_frees_total 200332
|
||||
# HELP go_memstats_gc_cpu_fraction The fraction of this program's available CPU time used by the GC since the program started.
|
||||
# TYPE go_memstats_gc_cpu_fraction gauge
|
||||
go_memstats_gc_cpu_fraction 8.821705133777562e-05
|
||||
# HELP go_memstats_gc_sys_bytes Number of bytes used for garbage collection system metadata.
|
||||
# TYPE go_memstats_gc_sys_bytes gauge
|
||||
go_memstats_gc_sys_bytes 557056
|
||||
# HELP go_memstats_heap_alloc_bytes Number of heap bytes allocated and still in use.
|
||||
# TYPE go_memstats_heap_alloc_bytes gauge
|
||||
go_memstats_heap_alloc_bytes 2.556344e+06
|
||||
# HELP go_memstats_heap_idle_bytes Number of heap bytes waiting to be used.
|
||||
# TYPE go_memstats_heap_idle_bytes gauge
|
||||
go_memstats_heap_idle_bytes 3.842048e+06
|
||||
# HELP go_memstats_heap_inuse_bytes Number of heap bytes that are in use.
|
||||
# TYPE go_memstats_heap_inuse_bytes gauge
|
||||
go_memstats_heap_inuse_bytes 4.972544e+06
|
||||
# HELP go_memstats_heap_objects Number of allocated objects.
|
||||
# TYPE go_memstats_heap_objects gauge
|
||||
go_memstats_heap_objects 19986
|
||||
# HELP go_memstats_heap_released_bytes Number of heap bytes released to OS.
|
||||
# TYPE go_memstats_heap_released_bytes gauge
|
||||
go_memstats_heap_released_bytes 0
|
||||
# HELP go_memstats_heap_sys_bytes Number of heap bytes obtained from system.
|
||||
# TYPE go_memstats_heap_sys_bytes gauge
|
||||
go_memstats_heap_sys_bytes 8.814592e+06
|
||||
# HELP go_memstats_last_gc_time_seconds Number of seconds since 1970 of last garbage collection.
|
||||
# TYPE go_memstats_last_gc_time_seconds gauge
|
||||
go_memstats_last_gc_time_seconds 1.4941783810383117e+09
|
||||
# HELP go_memstats_lookups_total Total number of pointer lookups.
|
||||
# TYPE go_memstats_lookups_total counter
|
||||
go_memstats_lookups_total 325
|
||||
# HELP go_memstats_mallocs_total Total number of mallocs.
|
||||
# TYPE go_memstats_mallocs_total counter
|
||||
go_memstats_mallocs_total 220318
|
||||
# HELP go_memstats_mcache_inuse_bytes Number of bytes in use by mcache structures.
|
||||
# TYPE go_memstats_mcache_inuse_bytes gauge
|
||||
go_memstats_mcache_inuse_bytes 2400
|
||||
# HELP go_memstats_mcache_sys_bytes Number of bytes used for mcache structures obtained from system.
|
||||
# TYPE go_memstats_mcache_sys_bytes gauge
|
||||
go_memstats_mcache_sys_bytes 16384
|
||||
# HELP go_memstats_mspan_inuse_bytes Number of bytes in use by mspan structures.
|
||||
# TYPE go_memstats_mspan_inuse_bytes gauge
|
||||
go_memstats_mspan_inuse_bytes 81016
|
||||
# HELP go_memstats_mspan_sys_bytes Number of bytes used for mspan structures obtained from system.
|
||||
# TYPE go_memstats_mspan_sys_bytes gauge
|
||||
go_memstats_mspan_sys_bytes 98304
|
||||
# HELP go_memstats_next_gc_bytes Number of heap bytes when next garbage collection will take place.
|
||||
# TYPE go_memstats_next_gc_bytes gauge
|
||||
go_memstats_next_gc_bytes 4.819216e+06
|
||||
# HELP go_memstats_other_sys_bytes Number of bytes used for other system allocations.
|
||||
# TYPE go_memstats_other_sys_bytes gauge
|
||||
go_memstats_other_sys_bytes 672584
|
||||
# HELP go_memstats_stack_inuse_bytes Number of bytes in use by the stack allocator.
|
||||
# TYPE go_memstats_stack_inuse_bytes gauge
|
||||
go_memstats_stack_inuse_bytes 622592
|
||||
# HELP go_memstats_stack_sys_bytes Number of bytes obtained from system for stack allocator.
|
||||
# TYPE go_memstats_stack_sys_bytes gauge
|
||||
go_memstats_stack_sys_bytes 622592
|
||||
# HELP go_memstats_sys_bytes Number of bytes obtained from system.
|
||||
# TYPE go_memstats_sys_bytes gauge
|
||||
go_memstats_sys_bytes 1.2232952e+07
|
||||
# HELP go_threads Number of OS threads created
|
||||
# TYPE go_threads gauge
|
||||
go_threads 9
|
||||
# HELP process_cpu_seconds_total Total user and system CPU time spent in seconds.
|
||||
# TYPE process_cpu_seconds_total counter
|
||||
process_cpu_seconds_total 0.9
|
||||
# HELP process_max_fds Maximum number of open file descriptors.
|
||||
# TYPE process_max_fds gauge
|
||||
process_max_fds 524288
|
||||
# HELP process_open_fds Number of open file descriptors.
|
||||
# TYPE process_open_fds gauge
|
||||
process_open_fds 17
|
||||
# HELP process_resident_memory_bytes Resident memory size in bytes.
|
||||
# TYPE process_resident_memory_bytes gauge
|
||||
process_resident_memory_bytes 2.5296896e+07
|
||||
# HELP process_start_time_seconds Start time of the process since unix epoch in seconds.
|
||||
# TYPE process_start_time_seconds gauge
|
||||
process_start_time_seconds 1.494177893e+09
|
||||
# HELP process_virtual_memory_bytes Virtual memory size in bytes.
|
||||
# TYPE process_virtual_memory_bytes gauge
|
||||
process_virtual_memory_bytes 4.23243776e+08
|
||||
```
|
|
@ -1,11 +1,13 @@
|
|||
Drone comes with built-in support for Bitbucket Cloud. To enable Bitbucket Cloud you should configure the Drone container using the following environment variables:
|
||||
# Bitbucket
|
||||
|
||||
Woodpecker comes with built-in support for Bitbucket Cloud. To enable Bitbucket Cloud you should configure the Woodpecker container using the following environment variables:
|
||||
|
||||
```diff
|
||||
version: '2'
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
drone-server:
|
||||
image: drone/drone:{{% version %}}
|
||||
woodpecker-server:
|
||||
image: laszlocloud/woodpecker-server:v0.9.0
|
||||
ports:
|
||||
- 80:8000
|
||||
- 9000
|
||||
|
@ -20,19 +22,19 @@ services:
|
|||
+ - DRONE_BITBUCKET_SECRET=30f5064039e6b359e075
|
||||
- DRONE_SECRET=${DRONE_SECRET}
|
||||
|
||||
drone-agent:
|
||||
image: drone/agent:{{% version %}}
|
||||
woodpecker-agent:
|
||||
image: laszlocloud/woodpecker-agent:v0.9.0
|
||||
restart: always
|
||||
depends_on:
|
||||
- drone-server
|
||||
- woodpecker-server
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
environment:
|
||||
- DRONE_SERVER=drone-server:9000
|
||||
- DRONE_SERVER=woodpecker-server:9000
|
||||
- DRONE_SECRET=${DRONE_SECRET}
|
||||
```
|
||||
|
||||
# Configuration
|
||||
## Configuration
|
||||
|
||||
This is a full list of configuration options. Please note that many of these options use default configuration values that should work for the majority of installations.
|
||||
|
||||
|
@ -45,7 +47,7 @@ DRONE_BITBUCKET_CLIENT
|
|||
DRONE_BITBUCKET_SECRET
|
||||
: Bitbucket oauth2 client secret
|
||||
|
||||
# Registration
|
||||
## Registration
|
||||
|
||||
You must register your application with Bitbucket in order to generate a client and secret. Navigate to your account settings and choose OAuth from the menu, and click Add Consumer.
|
||||
|
||||
|
@ -65,6 +67,6 @@ Repositories:Read
|
|||
Webhooks:Read and Write
|
||||
```
|
||||
|
||||
# Missing Features
|
||||
## Missing Features
|
||||
|
||||
Merge requests are not currently supported. We are interested in patches to include this functionality. If you are interested in contributing to Drone and submitting a patch please [contact us](https://discourse.drone.io).
|
||||
Merge requests are not currently supported. We are interested in patches to include this functionality. If you are interested in contributing to Woodpecker and submitting a patch please [contact us](https://discourse.drone.io).
|
|
@ -1,11 +1,13 @@
|
|||
Drone comes with experimental support for Bitbucket Server, formerly known as Atlassian Stash. To enable Bitbucket Server you should configure the Drone container using the following environment variables:
|
||||
# Bitbucket Server
|
||||
|
||||
Woodpecker comes with experimental support for Bitbucket Server, formerly known as Atlassian Stash. To enable Bitbucket Server you should configure the Woodpecker container using the following environment variables:
|
||||
|
||||
```diff
|
||||
version: '2'
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
drone-server:
|
||||
image: drone/drone:{{% version %}}
|
||||
woodpecker-server:
|
||||
image: laszlocloud/woodpecker-server:v0.9.0
|
||||
ports:
|
||||
- 80:8000
|
||||
- 9000
|
||||
|
@ -25,19 +27,19 @@ services:
|
|||
volumes:
|
||||
+ - /path/to/key.pem:/path/to/key.pem
|
||||
|
||||
drone-agent:
|
||||
image: drone/agent:{{% version %}}
|
||||
woodpecker-agent:
|
||||
image: laszlocloud/woodpecker-agent:v0.9.0
|
||||
restart: always
|
||||
depends_on:
|
||||
- drone-server
|
||||
- woodpecker-server
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
environment:
|
||||
- DRONE_SERVER=drone-server:9000
|
||||
- DRONE_SERVER=woodpecker-server:9000
|
||||
- DRONE_SECRET=${DRONE_SECRET}
|
||||
```
|
||||
|
||||
# Private Key File
|
||||
## Private Key File
|
||||
|
||||
The OAuth process in Bitbucket server requires a private and a public RSA certificate. This is how you create the private RSA certificate.
|
||||
|
||||
|
@ -51,16 +53,16 @@ This stores the private RSA certificate in `key.pem`. The next command generates
|
|||
openssl rsa -in /etc/bitbucket/key.pem -pubout >> /etc/bitbucket/key.pub
|
||||
```
|
||||
|
||||
Please note that the private key file can be mounted into your Drone conatiner at runtime or as an environment variable
|
||||
Please note that the private key file can be mounted into your Woodpecker conatiner at runtime or as an environment variable
|
||||
|
||||
Private key file mounted into your Drone container at runtime as a volume.
|
||||
Private key file mounted into your Woodpecker container at runtime as a volume.
|
||||
|
||||
```diff
|
||||
version: '2'
|
||||
|
||||
services:
|
||||
drone-server:
|
||||
image: drone/drone:{{% version %}}
|
||||
woodpecker-server:
|
||||
image: laszlocloud/woodpecker-server:v0.9.0
|
||||
environment:
|
||||
- DRONE_OPEN=true
|
||||
- DRONE_HOST=${DRONE_HOST}
|
||||
|
@ -78,11 +80,11 @@ services:
|
|||
Private key as environment variable
|
||||
|
||||
```diff
|
||||
version: '2'
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
drone-server:
|
||||
image: drone/drone:{{% version %}}
|
||||
woodpecker-server:
|
||||
image: laszlocloud/woodpecker-server:v0.9.0
|
||||
environment:
|
||||
- DRONE_OPEN=true
|
||||
- DRONE_HOST=${DRONE_HOST}
|
||||
|
@ -95,18 +97,18 @@ services:
|
|||
- DRONE_SECRET=${DRONE_SECRET}
|
||||
```
|
||||
|
||||
# Service Account
|
||||
## Service Account
|
||||
|
||||
Drone uses `git+https` to clone repositories, however, Bitbucket Server does not currently support cloning repositories with oauth token. To work around this limitation, you must create a service account and provide the username and password to Drone. This service account will be used to authenticate and clone private repositories.
|
||||
Woodpecker uses `git+https` to clone repositories, however, Bitbucket Server does not currently support cloning repositories with oauth token. To work around this limitation, you must create a service account and provide the username and password to Woodpecker. This service account will be used to authenticate and clone private repositories.
|
||||
|
||||
# Registration
|
||||
## Registration
|
||||
|
||||
You must register your application with Bitbucket Server in order to generate a consumer key. Navigate to your account settings and choose Applications from the menu, and click Register new application. Now copy & paste the text value from `/etc/bitbucket/key.pub` into the `Public Key` in the incoming link part of the application registration.
|
||||
|
||||
Please use http://drone.mycompany.com/authorize as the Authorization callback URL.
|
||||
|
||||
|
||||
# Configuration
|
||||
## Configuration
|
||||
|
||||
This is a full list of configuration options. Please note that many of these options use default configuration values that should work for the majority of installations.
|
||||
|
49
docs/docs/administration/database.md
Normal file
|
@ -0,0 +1,49 @@
|
|||
# Databases
|
||||
|
||||
This guide provides instructions for using alternate storage engines. Please note this is optional. The default storage engine is an embedded SQLite database which requires zero installation or configuration.
|
||||
|
||||
## Configure MySQL
|
||||
|
||||
The below example demonstrates mysql database configuration. See the official driver [documentation](https://github.com/go-sql-driver/mysql#dsn-data-source-name) for configuration options and examples.
|
||||
|
||||
```diff
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
woodpecker-server:
|
||||
image: laszlocloud/woodpecker-server:v0.9.0
|
||||
environment:
|
||||
+ DRONE_DATABASE_DRIVER: mysql
|
||||
+ DRONE_DATABASE_DATASOURCE: root:password@tcp(1.2.3.4:3306)/drone?parseTime=true
|
||||
```
|
||||
|
||||
## Configure Postgres
|
||||
|
||||
The below example demonstrates postgres database configuration. See the official driver [documentation](https://www.postgresql.org/docs/current/static/libpq-connect.html#LIBPQ-CONNSTRING) for configuration options and examples.
|
||||
|
||||
```diff
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
woodpecker-server:
|
||||
image: laszlocloud/woodpecker-server:v0.9.0
|
||||
environment:
|
||||
+ DRONE_DATABASE_DRIVER: postgres
|
||||
+ DRONE_DATABASE_DATASOURCE: postgres://root:password@1.2.3.4:5432/postgres?sslmode=disable
|
||||
```
|
||||
|
||||
## Database Creation
|
||||
|
||||
Woodpecker does not create your database automatically. If you are using the mysql or postgres driver you will need to manually create your database using `CREATE DATABASE`
|
||||
|
||||
## Database Migration
|
||||
|
||||
Woodpecker automatically handles database migration, including the initial creation of tables and indexes. New versions of Woodpecker will automatically upgrade the database unless otherwise specified in the release notes.
|
||||
|
||||
## Database Backups
|
||||
|
||||
Woodpecker does not perform database backups. This should be handled by separate third party tools provided by your database vendor of choice.
|
||||
|
||||
## Database Archiving
|
||||
|
||||
Woodpecker does not perform data archival; it considered out-of-scope for the project. Woodpecker is rather conservative with the amount of data it stores, however, you should expect the database logs to grow the size of your database considerably.
|
|
@ -1,11 +1,13 @@
|
|||
Drone comes with built-in support for GitHub and GitHub Enterprise. To enable GitHub you should configure the Drone container using the following environment variables:
|
||||
# Github
|
||||
|
||||
Woodpecker comes with built-in support for GitHub and GitHub Enterprise. To enable GitHub you should configure the Woodpecker container using the following environment variables:
|
||||
|
||||
```diff
|
||||
version: '2'
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
drone-server:
|
||||
image: drone/drone:{{% version %}}
|
||||
woodpecker-server:
|
||||
image: laszlocloud/woodpecker-server:v0.9.0
|
||||
ports:
|
||||
- 80:8000
|
||||
- 9000
|
||||
|
@ -20,19 +22,19 @@ services:
|
|||
+ - DRONE_GITHUB_SECRET=${DRONE_GITHUB_SECRET}
|
||||
- DRONE_SECRET=${DRONE_SECRET}
|
||||
|
||||
drone-agent:
|
||||
image: drone/agent:{{% version %}}
|
||||
woodpecker-agent:
|
||||
image: laszlocloud/woodpecker-agent:v0.9.0
|
||||
restart: always
|
||||
depends_on:
|
||||
- drone-server
|
||||
- woodpecker-server
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
environment:
|
||||
- DRONE_SERVER=drone-server:9000
|
||||
- DRONE_SERVER=woodpecker-server:9000
|
||||
- DRONE_SECRET=${DRONE_SECRET}
|
||||
```
|
||||
|
||||
# Registration
|
||||
## Registration
|
||||
|
||||
Register your application with GitHub to create your client id and secret. It is very import the authorization callback URL matches your http(s) scheme and hostname exactly with `<scheme>://<host>/authorize` as the path.
|
||||
|
||||
|
@ -40,7 +42,7 @@ Please use this screenshot for reference:
|
|||
|
||||
![github oauth setup](github_oauth.png)
|
||||
|
||||
# Configuration
|
||||
## Configuration
|
||||
|
||||
This is a full list of configuration options. Please note that many of these options use default configuration values that should work for the majority of installations.
|
||||
|
Before Width: | Height: | Size: 154 KiB After Width: | Height: | Size: 154 KiB |
|
@ -1,11 +1,13 @@
|
|||
Drone comes with built-in support for the GitLab version 8.2 and higher. To enable GitLab you should configure the Drone container using the following environment variables:
|
||||
# Gitlab
|
||||
|
||||
Woodpecker comes with built-in support for the GitLab version 8.2 and higher. To enable GitLab you should configure the Woodpecker container using the following environment variables:
|
||||
|
||||
```diff
|
||||
version: '2'
|
||||
|
||||
services:
|
||||
drone-server:
|
||||
image: drone/drone:{{% version %}}
|
||||
woodpecker-server:
|
||||
image: laszlocloud/woodpecker-server:v0.9.0
|
||||
ports:
|
||||
- 80:8000
|
||||
- 9000
|
||||
|
@ -19,19 +21,19 @@ services:
|
|||
+ - DRONE_GITLAB_URL=http://gitlab.mycompany.com
|
||||
- DRONE_SECRET=${DRONE_SECRET}
|
||||
|
||||
drone-agent:
|
||||
image: drone/agent:{{% version %}}
|
||||
woodpecker-agent:
|
||||
image: laszlocloud/woodpecker-agent:v0.9.0
|
||||
restart: always
|
||||
depends_on:
|
||||
- drone-server
|
||||
- woodpecker-server
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
environment:
|
||||
- DRONE_SERVER=drone-server:9000
|
||||
- DRONE_SERVER=woodpecker-server:9000
|
||||
- DRONE_SECRET=${DRONE_SECRET}
|
||||
```
|
||||
|
||||
# Configuration
|
||||
## Configuration
|
||||
|
||||
This is a full list of configuration options. Please note that many of these options use default configuration values that should work for the majority of installations.
|
||||
|
||||
|
@ -59,8 +61,8 @@ DRONE_GITLAB_SKIP_VERIFY=false
|
|||
DRONE_GITLAB_PRIVATE_MODE=false
|
||||
: Set to true if GitLab is running in private mode.
|
||||
|
||||
# Registration
|
||||
## Registration
|
||||
|
||||
You must register your application with GitLab in order to generate a Client and Secret. Navigate to your account settings and choose Applications from the menu, and click New Application.
|
||||
|
||||
Please use `http://drone.mycompany.com/authorize` as the Authorization callback URL. Grant `api` scope to the application.
|
||||
Please use `http://woodpecker.mycompany.com/authorize` as the Authorization callback URL. Grant `api` scope to the application.
|
42
docs/docs/administration/lets-encrypt.md
Normal file
|
@ -0,0 +1,42 @@
|
|||
# Let's Encrypt
|
||||
|
||||
Woodpecker supports automated SSL configuration and updates using Let's Encrypt.
|
||||
|
||||
You can enable Let's Encrypt by making the following modifications to your server configuration:
|
||||
|
||||
```diff
|
||||
services:
|
||||
woodpecker-server:
|
||||
image: laszlocloud/woodpecker-server:v0.9.0
|
||||
ports:
|
||||
+ - 80:80
|
||||
+ - 443:443
|
||||
- 9000:9000
|
||||
volumes:
|
||||
- /var/lib/drone:/var/lib/drone/
|
||||
restart: always
|
||||
environment:
|
||||
- DRONE_OPEN=true
|
||||
- DRONE_HOST=${DRONE_HOST}
|
||||
- DRONE_GITHUB=true
|
||||
- DRONE_GITHUB_CLIENT=${DRONE_GITHUB_CLIENT}
|
||||
- DRONE_GITHUB_SECRET=${DRONE_GITHUB_SECRET}
|
||||
- DRONE_SECRET=${DRONE_SECRET}
|
||||
+ - DRONE_LETS_ENCRYPT=true
|
||||
```
|
||||
|
||||
Note that Woodpecker uses the hostname from the `DRONE_HOST` environment variable when requesting certificates. For example, if `DRONE_HOST=https://foo.com` the certificate is requested for `foo.com`.
|
||||
|
||||
>Once enabled you can visit your website at both the http and the https address
|
||||
|
||||
## Certificate Cache
|
||||
|
||||
Woodpecker writes the certificates to the below directory:
|
||||
|
||||
```
|
||||
/var/lib/drone/golang-autocert
|
||||
```
|
||||
|
||||
## Certificate Updates
|
||||
|
||||
Woodpecker uses the official Go acme library which will handle certificate upgrades. There should be no addition configuration or management required.
|
67
docs/docs/administration/prometheus.md
Normal file
|
@ -0,0 +1,67 @@
|
|||
# Prometheus
|
||||
|
||||
Woodpecker is compatible with Prometheus and exposes a `/metrics` endpoint. Please note that access to the metrics endpoint is restricted and requires an authorization token with administrative privileges.
|
||||
|
||||
```yaml
|
||||
global:
|
||||
scrape_interval: 60s
|
||||
|
||||
scrape_configs:
|
||||
- job_name: 'drone'
|
||||
bearer_token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
|
||||
|
||||
static_configs:
|
||||
- targets: ['woodpecker.domain.com']
|
||||
```
|
||||
|
||||
## Authorization
|
||||
|
||||
An administrator will need to generate a user api token and configure in the prometheus configuration file as a bearer token. Please see the following example:
|
||||
|
||||
```diff
|
||||
global:
|
||||
scrape_interval: 60s
|
||||
|
||||
scrape_configs:
|
||||
- job_name: 'drone'
|
||||
+ bearer_token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
|
||||
|
||||
static_configs:
|
||||
- targets: ['woodpecker.domain.com']
|
||||
```
|
||||
|
||||
## Metric Reference
|
||||
|
||||
List of prometheus metrics specific to Woodpecker:
|
||||
|
||||
```
|
||||
# HELP drone_build_count Build count.
|
||||
# TYPE drone_build_count counter
|
||||
drone_build_count{branch="master",pipeline="total",repo="laszlocph/woodpecker",status="success"} 3
|
||||
drone_build_count{branch="mkdocs",pipeline="total",repo="laszlocph/woodpecker",status="success"} 3
|
||||
# HELP drone_build_time Build time.
|
||||
# TYPE drone_build_time gauge
|
||||
drone_build_time{branch="master",pipeline="total",repo="laszlocph/woodpecker",status="success"} 116
|
||||
drone_build_time{branch="mkdocs",pipeline="total",repo="laszlocph/woodpecker",status="success"} 155
|
||||
# HELP drone_build_total_count Total number of builds.
|
||||
# TYPE drone_build_total_count gauge
|
||||
drone_build_total_count 1025
|
||||
# HELP drone_pending_jobs Total number of pending build processes.
|
||||
# TYPE drone_pending_jobs gauge
|
||||
drone_pending_jobs 0
|
||||
# HELP drone_repo_count Total number of repos.
|
||||
# TYPE drone_repo_count gauge
|
||||
drone_repo_count 9
|
||||
# HELP drone_running_jobs Total number of running build processes.
|
||||
# TYPE drone_running_jobs gauge
|
||||
drone_running_jobs 0
|
||||
# HELP drone_user_count Total number of users.
|
||||
# TYPE drone_user_count gauge
|
||||
drone_user_count 1
|
||||
# HELP drone_waiting_jobs Total number of builds waiting on deps.
|
||||
# TYPE drone_waiting_jobs gauge
|
||||
drone_waiting_jobs 0
|
||||
# HELP drone_worker_count Total number of workers.
|
||||
# TYPE drone_worker_count gauge
|
||||
drone_worker_count 4
|
||||
```
|
|
@ -1,11 +1,5 @@
|
|||
**Table of Contents**
|
||||
- [Apache](#apache)
|
||||
- [Nginx](#nginx)
|
||||
- [Caddy](#caddy)
|
||||
- [Ngrok](#ngrok)
|
||||
|
||||
# Apache
|
||||
This guide provides a brief overview for installing Drone server behind the Apache2 webserver. This is an example configuration:
|
||||
## Apache
|
||||
This guide provides a brief overview for installing Woodpecker server behind the Apache2 webserver. This is an example configuration:
|
||||
|
||||
```nohighlight
|
||||
ProxyPreserveHost On
|
||||
|
@ -34,16 +28,16 @@ ProxyPass / http://127.0.0.1:8000/
|
|||
ProxyPassReverse / http://127.0.0.1:8000/
|
||||
```
|
||||
|
||||
# Nginx
|
||||
## Nginx
|
||||
|
||||
This guide provides a basic overview for installing Drone server behind the nginx webserver. For more advanced configuration options please consult the official nginx [documentation](https://www.nginx.com/resources/admin-guide/).
|
||||
This guide provides a basic overview for installing Woodpecker server behind the nginx webserver. For more advanced configuration options please consult the official nginx [documentation](https://www.nginx.com/resources/admin-guide/).
|
||||
|
||||
Example configuration:
|
||||
|
||||
```nginx
|
||||
server {
|
||||
listen 80;
|
||||
server_name drone.example.com;
|
||||
server_name woodpecker.example.com;
|
||||
|
||||
location / {
|
||||
proxy_set_header X-Forwarded-For $remote_addr;
|
||||
|
@ -65,7 +59,7 @@ You must configure the proxy to set `X-Forwarded` proxy headers:
|
|||
```diff
|
||||
server {
|
||||
listen 80;
|
||||
server_name drone.example.com;
|
||||
server_name woodpecker.example.com;
|
||||
|
||||
location / {
|
||||
+ proxy_set_header X-Forwarded-For $remote_addr;
|
||||
|
@ -81,12 +75,12 @@ server {
|
|||
}
|
||||
```
|
||||
|
||||
# Caddy
|
||||
## Caddy
|
||||
|
||||
This guide provides a brief overview for installing Drone server behind the [Caddy webserver](https://caddyserver.com/). This is an example caddyfile proxy configuration:
|
||||
This guide provides a brief overview for installing Woodpecker server behind the [Caddy webserver](https://caddyserver.com/). This is an example caddyfile proxy configuration:
|
||||
|
||||
```nohighlight
|
||||
drone.mycompany.com {
|
||||
woodpecker.mycompany.com {
|
||||
gzip {
|
||||
not /stream/
|
||||
}
|
||||
|
@ -99,7 +93,7 @@ drone.mycompany.com {
|
|||
You must disable gzip compression for streamed data otherwise the live updates won't be instant:
|
||||
|
||||
```diff
|
||||
drone.mycompany.com {
|
||||
woodpecker.mycompany.com {
|
||||
+ gzip {
|
||||
+ not /stream/
|
||||
+ }
|
||||
|
@ -113,7 +107,7 @@ drone.mycompany.com {
|
|||
You must configure the proxy to enable websocket upgrades:
|
||||
|
||||
```diff
|
||||
drone.mycompany.com {
|
||||
woodpecker.mycompany.com {
|
||||
gzip {
|
||||
not /stream/
|
||||
}
|
||||
|
@ -127,7 +121,7 @@ drone.mycompany.com {
|
|||
You must configure the proxy to include `X-Forwarded` headers using the `transparent` directive:
|
||||
|
||||
```diff
|
||||
drone.mycompany.com {
|
||||
woodpecker.mycompany.com {
|
||||
gzip {
|
||||
not /stream/
|
||||
}
|
||||
|
@ -138,7 +132,7 @@ drone.mycompany.com {
|
|||
}
|
||||
```
|
||||
|
||||
# Ngrok
|
||||
## Ngrok
|
||||
After installing [ngrok](https://ngrok.com/), open a new console and run:
|
||||
|
||||
```
|
|
@ -1,29 +1,31 @@
|
|||
Drone supports ssl configuration by mounting certificates into your container.
|
||||
# SSL
|
||||
|
||||
Woodpecker supports ssl configuration by mounting certificates into your container.
|
||||
|
||||
```diff
|
||||
services:
|
||||
drone-server:
|
||||
image: drone/drone:{{% version %}}
|
||||
woodpecker-server:
|
||||
image: laszlocloud/woodpecker-server:v0.9.0
|
||||
ports:
|
||||
+ - 80:80
|
||||
+ - 443:443
|
||||
- 9000:9000
|
||||
volumes:
|
||||
- /var/lib/drone:/var/lib/drone/
|
||||
+ - /etc/certs/drone.foo.com/server.crt:/etc/certs/drone.foo.com/server.crt
|
||||
+ - /etc/certs/drone.foo.com/server.key:/etc/certs/drone.foo.com/server.key
|
||||
+ - /etc/certs/woodpecker.foo.com/server.crt:/etc/certs/woodpecker.foo.com/server.crt
|
||||
+ - /etc/certs/woodpecker.foo.com/server.key:/etc/certs/woodpecker.foo.com/server.key
|
||||
restart: always
|
||||
environment:
|
||||
+ - DRONE_SERVER_CERT=/etc/certs/drone.foo.com/server.crt
|
||||
+ - DRONE_SERVER_KEY=/etc/certs/drone.foo.com/server.key
|
||||
+ - DRONE_SERVER_CERT=/etc/certs/woodpecker.foo.com/server.crt
|
||||
+ - DRONE_SERVER_KEY=/etc/certs/woodpecker.foo.com/server.key
|
||||
```
|
||||
|
||||
Update your configuration to expose the following ports:
|
||||
|
||||
```diff
|
||||
services:
|
||||
drone-server:
|
||||
image: drone/drone:{{% version %}}
|
||||
woodpecker-server:
|
||||
image: laszlocloud/woodpecker-server:v0.9.0
|
||||
ports:
|
||||
+ - 80:80
|
||||
+ - 443:443
|
||||
|
@ -34,44 +36,44 @@ Update your configuration to mount your certificate and key:
|
|||
|
||||
```diff
|
||||
services:
|
||||
drone-server:
|
||||
image: drone/drone:{{% version %}}
|
||||
woodpecker-server:
|
||||
image: laszlocloud/woodpecker-server:v0.9.0
|
||||
ports:
|
||||
- 80:80
|
||||
- 443:443
|
||||
- 9000:9000
|
||||
volumes:
|
||||
- /var/lib/drone:/var/lib/drone/
|
||||
+ - /etc/certs/drone.foo.com/server.crt:/etc/certs/drone.foo.com/server.crt
|
||||
+ - /etc/certs/drone.foo.com/server.key:/etc/certs/drone.foo.com/server.key
|
||||
+ - /etc/certs/woodpecker.foo.com/server.crt:/etc/certs/woodpecker.foo.com/server.crt
|
||||
+ - /etc/certs/woodpecker.foo.com/server.key:/etc/certs/woodpecker.foo.com/server.key
|
||||
```
|
||||
|
||||
Update your configuration to provide the paths of your certificate and key:
|
||||
|
||||
```diff
|
||||
services:
|
||||
drone-server:
|
||||
image: drone/drone:{{% version %}}
|
||||
woodpecker-server:
|
||||
image: laszlocloud/woodpecker-server:v0.9.0
|
||||
ports:
|
||||
- 80:80
|
||||
- 443:443
|
||||
- 9000:9000
|
||||
volumes:
|
||||
- /var/lib/drone:/var/lib/drone/
|
||||
- /etc/certs/drone.foo.com/server.crt:/etc/certs/drone.foo.com/server.crt
|
||||
- /etc/certs/drone.foo.com/server.key:/etc/certs/drone.foo.com/server.key
|
||||
- /etc/certs/woodpecker.foo.com/server.crt:/etc/certs/woodpecker.foo.com/server.crt
|
||||
- /etc/certs/woodpecker.foo.com/server.key:/etc/certs/woodpecker.foo.com/server.key
|
||||
restart: always
|
||||
environment:
|
||||
+ - DRONE_SERVER_CERT=/etc/certs/drone.foo.com/server.crt
|
||||
+ - DRONE_SERVER_KEY=/etc/certs/drone.foo.com/server.key
|
||||
+ - DRONE_SERVER_CERT=/etc/certs/woodpecker.foo.com/server.crt
|
||||
+ - DRONE_SERVER_KEY=/etc/certs/woodpecker.foo.com/server.key
|
||||
```
|
||||
|
||||
# Certificate Chain
|
||||
## Certificate Chain
|
||||
|
||||
The most common problem encountered is providing a certificate file without the intermediate chain.
|
||||
|
||||
> LoadX509KeyPair reads and parses a public/private key pair from a pair of files. The files must contain PEM encoded data. The certificate file may contain intermediate certificates following the leaf certificate to form a certificate chain.
|
||||
|
||||
# Certificate Errors
|
||||
## Certificate Errors
|
||||
|
||||
SSL support is provided using the [ListenAndServeTLS](https://golang.org/pkg/net/http/#ListenAndServeTLS) function from the Go standard library. If you receive certificate errors or warnings please examine your configuration more closely. Please do not create issues claiming SSL is broken.
|
||||
SSL support is provided using the [ListenAndServeTLS](https://golang.org/pkg/net/http/#ListenAndServeTLS) function from the Go standard library. If you receive certificate errors or warnings please examine your configuration more closely.
|
66
docs/docs/images/favicon.svg
Normal file
|
@ -0,0 +1,66 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
viewBox="0 0 22 22"
|
||||
preserveAspectRatio="xMidYMid meet"
|
||||
version="1.1"
|
||||
id="svg45"
|
||||
sodipodi:docname="favicon.svg"
|
||||
width="22"
|
||||
height="22"
|
||||
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
|
||||
<metadata
|
||||
id="metadata51">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs49" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="3840"
|
||||
inkscape:window-height="2032"
|
||||
id="namedview47"
|
||||
showgrid="false"
|
||||
inkscape:zoom="28.768"
|
||||
inkscape:cx="3.33428"
|
||||
inkscape:cy="29.45752"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="54"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="g43"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0" />
|
||||
<g
|
||||
id="g43"
|
||||
transform="translate(-13.01027,-62.240601)">
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="m 14.272999,64.98413 c 1.148,1.088 1.582,2.188 2.855,2.337 l 0.036,0.007 c -0.588,0.606 -1.089,1.402 -1.443,2.423 -0.379,1.096 -0.488,2.285 -0.614,3.659 -0.189,2.046 -0.401,4.364001 -1.556,7.269001 -2.486,6.258 -1.119,11.631 0.332,17.317004 0.664,2.604005 1.348,5.297005 1.642,8.107005 0.035,0.355 0.287,0.652 0.633,0.744 0.346,0.095 0.709,-0.035 0.922,-0.323 0.227,-0.313 0.524,-0.797 0.86,-1.424 0.84,3.323 1.355,6.131 1.783,8.697 0.126,0.73 1.048,0.973 1.517,0.41 2.881,-3.463 3.763,-8.636 2.184,-12.674 0.459,-2.433005 1.402,-4.450005 2.398,-6.583009 0.536,-1.15 1.08,-2.318 1.55,-3.566 0.228,-0.084 0.569,-0.314 0.791,-0.441 l 1.706,-0.981 -0.256,1.052 c -0.112,0.461 0.171,0.929 0.635,1.04 0.457,0.118 0.93,-0.173 1.043,-0.632 l 0.68,-2.858 1.285,-2.95 c 0.19,-0.436 -0.009,-0.943 -0.446,-1.135 -0.44,-0.189 -0.947,0.01 -1.135,0.448 l -1.152,2.669 -2.383,1.372 c 0.235,-0.932 0.414,-1.919 0.508,-2.981 0.432,-4.859 -0.718,-9.074 -3.066,-11.266001 -0.163,-0.157 -0.208,-0.281 -0.247,-0.26 0.095,-0.119 0.249,-0.26 0.358,-0.374 2.283,-1.693 6.047,-0.147 8.319,0.751 0.589,0.231 0.876,-0.338 0.316,-0.67 -1.949,-1.154 -5.948,-4.197 -8.188,-6.194 -0.313,-0.275 -0.527,-0.607 -0.89,-0.913 -2.415,-4.266 -8.168,-1.764 -10.885,-2.252 -0.102,-0.018 -0.166,0.103 -0.092,0.175 m 10.98,5.899 c -0.059,1.242 -0.603,1.8 -0.999,2.208 -0.218,0.224 -0.427,0.436 -0.525,0.738 -0.236,0.714 0.008,1.51 0.66,2.143 1.974,1.840001 2.925,5.527001 2.538,9.861001 -0.291,3.287 -1.448,5.762 -2.671,8.384 -1.031,2.207004 -2.096,4.489004 -2.577,7.259009 -0.027,0.161 -0.01,0.33 0.056,0.481 1.021,2.433 1.135,6.196 -0.672,9.46 -0.461,-2.553 -1.053,-5.385 -1.97,-8.712 1.964,-4.488005 4.203,-11.750009 2.919,-17.668009 -0.325,-1.497 -1.304,-3.276 -2.387,-4.207 -0.208,-0.179 -0.402,-0.237 -0.495,-0.167 -0.084,0.061 -0.151,0.238 -0.062,0.444 0.55,1.266 0.879,2.599 1.226,4.276 1.125,5.443 -0.956,12.490004 -2.835,16.782009 l -0.116,0.259 -0.457,0.982 c -0.356,-2.014 -0.849,-3.950005 -1.33,-5.839005 -1.379,-5.407004 -2.679,-10.516004 -0.401,-16.255004 1.247,-3.137 1.483,-5.692001 1.672,-7.746001 0.116,-1.263 0.216,-2.355 0.526,-3.252 0.905,-2.605 3.062,-3.178 4.744,-2.852 1.632,0.316 3.24,1.593 3.156,3.421 z m -2.868,0.621 c 0.617,0.204 1.283,-0.131 1.487,-0.75 0.202,-0.617 -0.134,-1.283 -0.751,-1.487 -0.618,-0.204 -1.285,0.134 -1.487,0.751 -0.204,0.618 0.133,1.284 0.751,1.486 z"
|
||||
id="path41"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 4.1 KiB |
116
docs/docs/images/logo.svg
Normal file
|
@ -0,0 +1,116 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
viewBox="0 0 22.453405 50.000439"
|
||||
preserveAspectRatio="xMidYMid meet"
|
||||
version="1.1"
|
||||
id="svg45"
|
||||
sodipodi:docname="logo.svg"
|
||||
width="22.453405"
|
||||
height="50.000439"
|
||||
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
|
||||
<metadata
|
||||
id="metadata51">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs49">
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient5953">
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop5949" />
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop5951" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5953"
|
||||
id="radialGradient5957"
|
||||
cx="8.2885551"
|
||||
cy="24.835812"
|
||||
fx="8.2885551"
|
||||
fy="24.835812"
|
||||
r="6.5211034"
|
||||
gradientTransform="matrix(1,0,0,3.3690306,0,-58.836801)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="3840"
|
||||
inkscape:window-height="2032"
|
||||
id="namedview47"
|
||||
showgrid="false"
|
||||
inkscape:zoom="28.768"
|
||||
inkscape:cx="-4.6954753"
|
||||
inkscape:cy="29.45752"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="54"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="g43"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0" />
|
||||
<g
|
||||
id="g43"
|
||||
transform="translate(-13.01027,-34.240175)">
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="m 15.10726,34.707434 c 1.148,1.088 1.582,2.188 2.855,2.337 l 0.036,0.007 c -0.588,0.606 -1.089,1.402 -1.443,2.423 -0.379,1.096 -0.488,2.285 -0.614,3.659 -0.189,2.046 -0.401,4.364001 -1.556,7.269001 -2.486,6.258 -1.119,11.631 0.332,17.317 0.664,2.604 1.348,5.297 1.642,8.107 0.035,0.355 0.287,0.652 0.633,0.744 0.346,0.095 0.709,-0.035 0.922,-0.323 0.227,-0.313 0.524,-0.797 0.86,-1.424 0.84,3.323 1.355,6.131 1.783,8.697 0.126,0.73 1.048,0.973 1.517,0.41 2.881,-3.463 3.763,-8.636 2.184,-12.674 0.459,-2.433 1.402,-4.45 2.398,-6.583 0.536,-1.15 1.08,-2.318 1.55,-3.566 0.228,-0.084 0.569,-0.314 0.791,-0.441 l 1.706,-0.981 -0.256,1.052 c -0.112,0.461 0.171,0.929 0.635,1.04 0.457,0.118 0.93,-0.173 1.043,-0.632 l 0.68,-2.858 1.285,-2.95 c 0.19,-0.436 -0.009,-0.943 -0.446,-1.135 -0.44,-0.189 -0.947,0.01 -1.135,0.448 l -1.152,2.669 -2.383,1.372 c 0.235,-0.932 0.414,-1.919 0.508,-2.981 0.432,-4.859 -0.718,-9.074 -3.066,-11.266001 -0.163,-0.157 -0.208,-0.281 -0.247,-0.26 0.095,-0.119 0.249,-0.26 0.358,-0.374 2.283,-1.693 6.047,-0.147 8.319,0.751 0.589,0.231 0.876,-0.338 0.316,-0.67 -1.949,-1.154 -5.948,-4.197 -8.188,-6.194 -0.313,-0.275 -0.527,-0.607 -0.89,-0.913 -2.415,-4.266 -8.168,-1.764 -10.885,-2.252 -0.102,-0.018 -0.166,0.103 -0.092,0.175 m 10.98,5.899 c -0.059,1.242 -0.603,1.8 -0.999,2.208 -0.218,0.224 -0.427,0.436 -0.525,0.738 -0.236,0.714 0.008,1.51 0.66,2.143 1.974,1.840001 2.925,5.527001 2.538,9.861001 -0.291,3.287 -1.448,5.762 -2.671,8.384 -1.031,2.207 -2.096,4.489 -2.577,7.259 -0.027,0.161 -0.01,0.33 0.056,0.481 1.021,2.433 1.135,6.196 -0.672,9.46 -0.461,-2.553 -1.053,-5.385 -1.97,-8.712 1.964,-4.488 4.203,-11.75 2.919,-17.668 -0.325,-1.497 -1.304,-3.276 -2.387,-4.207 -0.208,-0.179 -0.402,-0.237 -0.495,-0.167 -0.084,0.061 -0.151,0.238 -0.062,0.444 0.55,1.266 0.879,2.599 1.226,4.276 1.125,5.443 -0.956,12.49 -2.835,16.782 l -0.116,0.259 -0.457,0.982 c -0.356,-2.014 -0.849,-3.95 -1.33,-5.839 -1.379,-5.407 -2.679,-10.516 -0.401,-16.255 1.247,-3.137 1.483,-5.692001 1.672,-7.746001 0.116,-1.263 0.216,-2.355 0.526,-3.252 0.905,-2.605 3.062,-3.178 4.744,-2.852 1.632,0.316 3.24,1.593 3.156,3.421 z m -2.868,0.621 c 0.617,0.204 1.283,-0.131 1.487,-0.75 0.202,-0.617 -0.134,-1.283 -0.751,-1.487 -0.618,-0.204 -1.285,0.134 -1.487,0.751 -0.204,0.618 0.133,1.284 0.751,1.486 z"
|
||||
id="path41"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill-opacity:0.80505413;fill:#000000" />
|
||||
<path
|
||||
style="fill:none;fill-opacity:0.45487366;stroke-width:0.03476084"
|
||||
d="m 8.8842581,46.780405 c -0.00984,-0.02868 -0.043593,-0.200744 -0.07501,-0.38237 C 8.4763396,44.473449 7.7181134,41.102144 7.1052676,38.821624 6.9172743,38.122066 6.9016277,38.264623 7.2593269,37.417928 8.0964501,35.436405 8.9270313,32.875565 9.4145271,30.773035 9.9595591,28.422357 10.217352,26.34615 10.216584,24.313443 10.215805,22.251865 9.9744538,20.591945 9.498671,19.375911 9.0317793,18.1826 8.2453903,16.986888 7.5080846,16.349203 7.2367529,16.114532 7.075992,16.057499 6.9494079,16.151001 c -0.1421016,0.104964 -0.1340253,0.292719 0.029806,0.692922 0.5587528,1.364905 1.1597396,3.812745 1.345981,5.482227 0.1196583,1.072627 0.1022399,2.945469 -0.04025,4.327725 -0.3165378,3.070644 -1.2552235,6.666418 -2.6225028,10.045885 -0.3049354,0.753701 -0.9032999,2.08565 -0.9369566,2.08565 -0.010457,0 -0.071712,-0.277652 -0.1361227,-0.617005 C 4.3814427,37.072962 4.0766926,35.764206 3.4055815,33.084632 2.3483469,28.863365 2.0696096,27.483313 1.8504628,25.385104 1.7724073,24.637766 1.7613535,22.252386 1.8329049,21.596172 2.020212,19.878339 2.3327524,18.561065 2.9256931,16.99036 3.4476314,15.607742 3.6667338,14.93025 3.9205869,13.914025 4.2747692,12.496163 4.4364363,11.439039 4.672405,8.9979684 4.8581198,7.0767681 4.9877272,6.3328495 5.2591921,5.6299378 5.7590756,4.3355744 6.6580043,3.4365659 7.8182844,3.0706178 c 1.8817993,-0.5935124 4.1273166,0.2744263 4.9488076,1.912816 0.216989,0.4327636 0.28057,0.726569 0.277694,1.2832057 -0.0021,0.4050386 -0.01731,0.5424868 -0.09075,0.8195898 -0.149766,0.5650768 -0.347811,0.8982425 -0.851308,1.4321305 -0.383946,0.4071208 -0.482686,0.5499718 -0.567933,0.8216553 -0.142224,0.4532665 -0.07886,1.0131629 0.165548,1.4629149 0.149896,0.275827 0.292306,0.454857 0.649791,0.81688 1.264032,1.280076 2.046753,3.233166 2.375194,5.926724 0.08934,0.732644 0.08886,3.068816 -7.92e-4,3.910595 -0.187862,1.763856 -0.575201,3.30088 -1.292091,5.127225 -0.317479,0.808808 -0.607504,1.468137 -1.330279,3.024193 -1.073206,2.310498 -1.480594,3.288763 -1.903564,4.571051 -0.3741818,1.13438 -0.7116474,2.525048 -0.7116474,2.932641 0,0.122527 0.042139,0.288666 0.1355513,0.534427 0.4394061,1.156048 0.6382171,2.302871 0.6403271,3.693666 0.0021,1.388675 -0.183399,2.532213 -0.6146444,3.788933 -0.2500385,0.728653 -0.7268454,1.759218 -0.7639255,1.65114 z M 11.103329,6.9363781 C 11.427791,6.7684832 11.640819,6.5015439 11.730501,6.1504868 11.875505,5.582877 11.547419,4.9637853 10.99024,4.7536271 c -0.280381,-0.1057549 -0.678638,-0.085279 -0.939614,0.04831 -0.9383249,0.4803108 -0.8622845,1.8158861 0.124492,2.1865664 0.246485,0.092591 0.697485,0.067265 0.928211,-0.052125 z"
|
||||
id="path5941"
|
||||
inkscape:connector-curvature="0"
|
||||
transform="translate(13.01027,34.240175)" />
|
||||
<path
|
||||
style="fill:none;fill-opacity:0.45487366;stroke-width:0.03476084"
|
||||
d="m 8.8842581,46.780405 c -0.00984,-0.02868 -0.043593,-0.200744 -0.07501,-0.38237 C 8.4763396,44.473449 7.7181134,41.102144 7.1052676,38.821624 6.9172743,38.122066 6.9016277,38.264623 7.2593269,37.417928 8.0964501,35.436405 8.9270313,32.875565 9.4145271,30.773035 9.9595591,28.422357 10.217352,26.34615 10.216584,24.313443 10.215805,22.251865 9.9744538,20.591945 9.498671,19.375911 9.0317793,18.1826 8.2453903,16.986888 7.5080846,16.349203 7.2367529,16.114532 7.075992,16.057499 6.9494079,16.151001 c -0.1421016,0.104964 -0.1340253,0.292719 0.029806,0.692922 0.5587528,1.364905 1.1597396,3.812745 1.345981,5.482227 0.1196583,1.072627 0.1022399,2.945469 -0.04025,4.327725 -0.3165378,3.070644 -1.2552235,6.666418 -2.6225028,10.045885 -0.3049354,0.753701 -0.9032999,2.08565 -0.9369566,2.08565 -0.010457,0 -0.071712,-0.277652 -0.1361227,-0.617005 C 4.3814427,37.072962 4.0766926,35.764206 3.4055815,33.084632 2.3483469,28.863365 2.0696096,27.483313 1.8504628,25.385104 1.7724073,24.637766 1.7613535,22.252386 1.8329049,21.596172 2.020212,19.878339 2.3327524,18.561065 2.9256931,16.99036 3.4476314,15.607742 3.6667338,14.93025 3.9205869,13.914025 4.2747692,12.496163 4.4364363,11.439039 4.672405,8.9979684 4.8581198,7.0767681 4.9877272,6.3328495 5.2591921,5.6299378 5.7590756,4.3355744 6.6580043,3.4365659 7.8182844,3.0706178 c 1.8817993,-0.5935124 4.1273166,0.2744263 4.9488076,1.912816 0.216989,0.4327636 0.28057,0.726569 0.277694,1.2832057 -0.0021,0.4050386 -0.01731,0.5424868 -0.09075,0.8195898 -0.149766,0.5650768 -0.347811,0.8982425 -0.851308,1.4321305 -0.383946,0.4071208 -0.482686,0.5499718 -0.567933,0.8216553 -0.142224,0.4532665 -0.07886,1.0131629 0.165548,1.4629149 0.149896,0.275827 0.292306,0.454857 0.649791,0.81688 1.264032,1.280076 2.046753,3.233166 2.375194,5.926724 0.08934,0.732644 0.08886,3.068816 -7.92e-4,3.910595 -0.187862,1.763856 -0.575201,3.30088 -1.292091,5.127225 -0.317479,0.808808 -0.607504,1.468137 -1.330279,3.024193 -1.073206,2.310498 -1.480594,3.288763 -1.903564,4.571051 -0.3741818,1.13438 -0.7116474,2.525048 -0.7116474,2.932641 0,0.122527 0.042139,0.288666 0.1355513,0.534427 0.4394061,1.156048 0.6382171,2.302871 0.6403271,3.693666 0.0021,1.388675 -0.183399,2.532213 -0.6146444,3.788933 -0.2500385,0.728653 -0.7268454,1.759218 -0.7639255,1.65114 z M 11.103329,6.9363781 C 11.427791,6.7684832 11.640819,6.5015439 11.730501,6.1504868 11.875505,5.582877 11.547419,4.9637853 10.99024,4.7536271 c -0.280381,-0.1057549 -0.678638,-0.085279 -0.939614,0.04831 -0.9383249,0.4803108 -0.8622845,1.8158861 0.124492,2.1865664 0.246485,0.092591 0.697485,0.067265 0.928211,-0.052125 z"
|
||||
id="path5943"
|
||||
inkscape:connector-curvature="0"
|
||||
transform="translate(13.01027,34.240175)" />
|
||||
<path
|
||||
style="fill:none;fill-opacity:0.45487366;stroke-width:0.03476084"
|
||||
d="m 8.8842581,46.780405 c -0.00984,-0.02868 -0.043593,-0.200744 -0.07501,-0.38237 C 8.4763396,44.473449 7.7181134,41.102144 7.1052676,38.821624 6.9172743,38.122066 6.9016277,38.264623 7.2593269,37.417928 8.0964501,35.436405 8.9270313,32.875565 9.4145271,30.773035 9.9595591,28.422357 10.217352,26.34615 10.216584,24.313443 10.215805,22.251865 9.9744538,20.591945 9.498671,19.375911 9.0317793,18.1826 8.2453903,16.986888 7.5080846,16.349203 7.2367529,16.114532 7.075992,16.057499 6.9494079,16.151001 c -0.1421016,0.104964 -0.1340253,0.292719 0.029806,0.692922 0.5587528,1.364905 1.1597396,3.812745 1.345981,5.482227 0.1196583,1.072627 0.1022399,2.945469 -0.04025,4.327725 -0.3165378,3.070644 -1.2552235,6.666418 -2.6225028,10.045885 -0.3049354,0.753701 -0.9032999,2.08565 -0.9369566,2.08565 -0.010457,0 -0.071712,-0.277652 -0.1361227,-0.617005 C 4.3814427,37.072962 4.0766926,35.764206 3.4055815,33.084632 2.3483469,28.863365 2.0696096,27.483313 1.8504628,25.385104 1.7724073,24.637766 1.7613535,22.252386 1.8329049,21.596172 2.020212,19.878339 2.3327524,18.561065 2.9256931,16.99036 3.4476314,15.607742 3.6667338,14.93025 3.9205869,13.914025 4.2747692,12.496163 4.4364363,11.439039 4.672405,8.9979684 4.8581198,7.0767681 4.9877272,6.3328495 5.2591921,5.6299378 5.7590756,4.3355744 6.6580043,3.4365659 7.8182844,3.0706178 c 1.8817993,-0.5935124 4.1273166,0.2744263 4.9488076,1.912816 0.216989,0.4327636 0.28057,0.726569 0.277694,1.2832057 -0.0021,0.4050386 -0.01731,0.5424868 -0.09075,0.8195898 -0.149766,0.5650768 -0.347811,0.8982425 -0.851308,1.4321305 -0.383946,0.4071208 -0.482686,0.5499718 -0.567933,0.8216553 -0.142224,0.4532665 -0.07886,1.0131629 0.165548,1.4629149 0.149896,0.275827 0.292306,0.454857 0.649791,0.81688 1.264032,1.280076 2.046753,3.233166 2.375194,5.926724 0.08934,0.732644 0.08886,3.068816 -7.92e-4,3.910595 -0.187862,1.763856 -0.575201,3.30088 -1.292091,5.127225 -0.317479,0.808808 -0.607504,1.468137 -1.330279,3.024193 -1.073206,2.310498 -1.480594,3.288763 -1.903564,4.571051 -0.3741818,1.13438 -0.7116474,2.525048 -0.7116474,2.932641 0,0.122527 0.042139,0.288666 0.1355513,0.534427 0.4394061,1.156048 0.6382171,2.302871 0.6403271,3.693666 0.0021,1.388675 -0.183399,2.532213 -0.6146444,3.788933 -0.2500385,0.728653 -0.7268454,1.759218 -0.7639255,1.65114 z M 11.103329,6.9363781 C 11.427791,6.7684832 11.640819,6.5015439 11.730501,6.1504868 11.875505,5.582877 11.547419,4.9637853 10.99024,4.7536271 c -0.280381,-0.1057549 -0.678638,-0.085279 -0.939614,0.04831 -0.9383249,0.4803108 -0.8622845,1.8158861 0.124492,2.1865664 0.246485,0.092591 0.697485,0.067265 0.928211,-0.052125 z"
|
||||
id="path5945"
|
||||
inkscape:connector-curvature="0"
|
||||
transform="translate(13.01027,34.240175)" />
|
||||
<path
|
||||
style="fill:#a7ac93;fill-opacity:0.97111911;stroke-width:0.03476084;stroke:url(#radialGradient5957)"
|
||||
d="m 8.8842581,46.780405 c -0.00984,-0.02868 -0.043593,-0.200744 -0.07501,-0.38237 C 8.4763396,44.473449 7.7181134,41.102144 7.1052676,38.821624 6.9172743,38.122066 6.9016277,38.264623 7.2593269,37.417928 8.0964501,35.436405 8.9270313,32.875565 9.4145271,30.773035 9.9595591,28.422357 10.217352,26.34615 10.216584,24.313443 10.215805,22.251865 9.9744538,20.591945 9.498671,19.375911 9.0317793,18.1826 8.2453903,16.986888 7.5080846,16.349203 7.2367529,16.114532 7.075992,16.057499 6.9494079,16.151001 c -0.1421016,0.104964 -0.1340253,0.292719 0.029806,0.692922 0.5587528,1.364905 1.1597396,3.812745 1.345981,5.482227 0.1196583,1.072627 0.1022399,2.945469 -0.04025,4.327725 -0.3165378,3.070644 -1.2552235,6.666418 -2.6225028,10.045885 -0.3049354,0.753701 -0.9032999,2.08565 -0.9369566,2.08565 -0.010457,0 -0.071712,-0.277652 -0.1361227,-0.617005 C 4.3814427,37.072962 4.0766926,35.764206 3.4055815,33.084632 2.3483469,28.863365 2.0696096,27.483313 1.8504628,25.385104 1.7724073,24.637766 1.7613535,22.252386 1.8329049,21.596172 2.020212,19.878339 2.3327524,18.561065 2.9256931,16.99036 3.4476314,15.607742 3.6667338,14.93025 3.9205869,13.914025 4.2747692,12.496163 4.4364363,11.439039 4.672405,8.9979684 4.8581198,7.0767681 4.9877272,6.3328495 5.2591921,5.6299378 5.7590756,4.3355744 6.6580043,3.4365659 7.8182844,3.0706178 c 1.8817993,-0.5935124 4.1273166,0.2744263 4.9488076,1.912816 0.216989,0.4327636 0.28057,0.726569 0.277694,1.2832057 -0.0021,0.4050386 -0.01731,0.5424868 -0.09075,0.8195898 -0.149766,0.5650768 -0.347811,0.8982425 -0.851308,1.4321305 -0.383946,0.4071208 -0.482686,0.5499718 -0.567933,0.8216553 -0.142224,0.4532665 -0.07886,1.0131629 0.165548,1.4629149 0.149896,0.275827 0.292306,0.454857 0.649791,0.81688 1.264032,1.280076 2.046753,3.233166 2.375194,5.926724 0.08934,0.732644 0.08886,3.068816 -7.92e-4,3.910595 -0.187862,1.763856 -0.575201,3.30088 -1.292091,5.127225 -0.317479,0.808808 -0.607504,1.468137 -1.330279,3.024193 -1.073206,2.310498 -1.480594,3.288763 -1.903564,4.571051 -0.3741818,1.13438 -0.7116474,2.525048 -0.7116474,2.932641 0,0.122527 0.042139,0.288666 0.1355513,0.534427 0.4394061,1.156048 0.6382171,2.302871 0.6403271,3.693666 0.0021,1.388675 -0.183399,2.532213 -0.6146444,3.788933 -0.2500385,0.728653 -0.7268454,1.759218 -0.7639255,1.65114 z M 11.103329,6.9363781 C 11.427791,6.7684832 11.640819,6.5015439 11.730501,6.1504868 11.875505,5.582877 11.547419,4.9637853 10.99024,4.7536271 c -0.280381,-0.1057549 -0.678638,-0.085279 -0.939614,0.04831 -0.9383249,0.4803108 -0.8622845,1.8158861 0.124492,2.1865664 0.246485,0.092591 0.697485,0.067265 0.928211,-0.052125 z"
|
||||
id="path5947"
|
||||
inkscape:connector-curvature="0"
|
||||
transform="translate(13.01027,34.240175)" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 16 KiB |
82
docs/docs/index.md
Normal file
|
@ -0,0 +1,82 @@
|
|||
# Welcome to Woodpecker
|
||||
|
||||
Woodpecker is a simple CI engine with great extensibility.
|
||||
|
||||
## .woodpecker.yml
|
||||
|
||||
- Place your pipeline in a file named `.woodpecker.yml` in your repository
|
||||
- Pipeline steps can be named as you like
|
||||
- Run any command in the commands section
|
||||
|
||||
```yaml
|
||||
# .woodpecker.yml
|
||||
pipeline:
|
||||
build:
|
||||
image: debian
|
||||
commands:
|
||||
- echo "This is the build step"
|
||||
a-test-step:
|
||||
image: debian
|
||||
commands:
|
||||
- echo "Testing.."
|
||||
```
|
||||
|
||||
### Build steps are containers
|
||||
|
||||
- Define any Docker image as context
|
||||
- Install the needed tools in custom Docker images, use them as context
|
||||
|
||||
```diff
|
||||
pipeline:
|
||||
build:
|
||||
- image: debian
|
||||
+ image: mycompany/image-with-awscli
|
||||
commands:
|
||||
- aws help
|
||||
```
|
||||
|
||||
### File changes are incremental
|
||||
|
||||
- Woodpecker clones the source code in the beginning pipeline
|
||||
- Changes to files are persisted through steps as the same volume is mounted to all steps
|
||||
|
||||
```yaml
|
||||
# .woodpecker.yml
|
||||
pipeline:
|
||||
build:
|
||||
image: debian
|
||||
commands:
|
||||
- touch myfile
|
||||
a-test-step:
|
||||
image: debian
|
||||
commands:
|
||||
- cat myfile
|
||||
```
|
||||
|
||||
## Plugins are straighforward
|
||||
|
||||
- If you copy the same shell script from project to project
|
||||
- Pack it into a plugin instead
|
||||
- And make the yaml declarative
|
||||
- Plugins are Docker images with your script as an entrypoint
|
||||
|
||||
```Dockerfile
|
||||
# Dockerfile
|
||||
FROM laszlocloud/kubectl
|
||||
COPY deploy /usr/local/deploy
|
||||
ENTRYPOINT ["/usr/local/deploy"]
|
||||
```
|
||||
|
||||
```bash
|
||||
# deploy
|
||||
kubectl apply -f $PLUGIN_TEMPLATE
|
||||
```
|
||||
|
||||
```yaml
|
||||
# .woodpecker.yml
|
||||
pipeline:
|
||||
deploy-to-k8s:
|
||||
image: laszlocloud/my-k8s-plugin
|
||||
template: config/k8s/service.yml
|
||||
```
|
||||
|
192
docs/docs/server-setup.md
Normal file
|
@ -0,0 +1,192 @@
|
|||
## Installation
|
||||
|
||||
The below [docker-compose](https://docs.docker.com/compose/) configuration can be used to start Woodpecker with a single agent.
|
||||
|
||||
It relies on a number of environment variables that you must set before running `docker-compose up`. The variables are described below.
|
||||
|
||||
```yaml
|
||||
# docker-compose.yml
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
woodpecker-server:
|
||||
image: laszlocloud/woodpecker-server:v0.9.0
|
||||
ports:
|
||||
- 80:8000
|
||||
- 9000
|
||||
volumes:
|
||||
- woodpecker-server-data:/var/lib/drone/
|
||||
restart: always
|
||||
environment:
|
||||
- DRONE_OPEN=true
|
||||
- DRONE_HOST=${DRONE_HOST}
|
||||
- DRONE_GITHUB=true
|
||||
- DRONE_GITHUB_CLIENT=${DRONE_GITHUB_CLIENT}
|
||||
- DRONE_GITHUB_SECRET=${DRONE_GITHUB_SECRET}
|
||||
- DRONE_SECRET=${DRONE_SECRET}
|
||||
|
||||
woodpecker-agent:
|
||||
image: laszlocloud/woodpecker-agent:v0.9.0
|
||||
command: agent
|
||||
restart: always
|
||||
depends_on:
|
||||
- woodpecker-server
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
environment:
|
||||
- DRONE_SERVER=woodpecker-server:9000
|
||||
- DRONE_SECRET=${DRONE_SECRET}
|
||||
|
||||
volumes:
|
||||
woodpecker-server-data:
|
||||
```
|
||||
|
||||
> Each agent is able to process one build by default.
|
||||
>
|
||||
> If you have 4 agents installed and connected to the Drone server, your system will process 4 builds in parallel.
|
||||
>
|
||||
> You can add more agents to increase the number of parallel builds or set the agent's `DRONE_MAX_PROCS=1` environment variable to increase the number of parallel builds for that agent.
|
||||
|
||||
|
||||
Woodpecker needs to know its own address.
|
||||
|
||||
You must therefore provide the address in `<scheme>://<hostname>` format. Please omit trailing slashes.
|
||||
|
||||
```diff
|
||||
services:
|
||||
woodpecker-server:
|
||||
image: laszlocloud/woodpecker-server:v0.9.0
|
||||
environment:
|
||||
- DRONE_OPEN=true
|
||||
+ - DRONE_HOST=${DRONE_HOST}
|
||||
- DRONE_GITHUB=true
|
||||
- DRONE_GITHUB_CLIENT=${DRONE_GITHUB_CLIENT}
|
||||
- DRONE_GITHUB_SECRET=${DRONE_GITHUB_SECRET}
|
||||
- DRONE_SECRET=${DRONE_SECRET}
|
||||
```
|
||||
|
||||
Agents require access to the host machine's Docker daemon.
|
||||
|
||||
```diff
|
||||
services:
|
||||
woodpecker-agent:
|
||||
image: laszlocloud/woodpecker-agent:v0.9.0
|
||||
command: agent
|
||||
restart: always
|
||||
depends_on: [ woodpecker-server ]
|
||||
+ volumes:
|
||||
+ - /var/run/docker.sock:/var/run/docker.sock
|
||||
```
|
||||
|
||||
Agents require the server address for agent-to-server communication.
|
||||
|
||||
```diff
|
||||
services:
|
||||
woodpecker-agent:
|
||||
image: laszlocloud/woodpecker-agent:v0.9.0
|
||||
command: agent
|
||||
restart: always
|
||||
depends_on: [ woodpecker-server ]
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
environment:
|
||||
+ - DRONE_SERVER=woodpecker-server:9000
|
||||
- DRONE_SECRET=${DRONE_SECRET}
|
||||
```
|
||||
|
||||
The server and agents use a shared secret to authenticate communication.
|
||||
|
||||
This should be a random string of your choosing and should be kept private. You can generate such string with `openssl rand -hex 32`.
|
||||
|
||||
```diff
|
||||
services:
|
||||
woodpecker-server:
|
||||
image: laszlocloud/woodpecker-server:v0.9.0
|
||||
environment:
|
||||
- DRONE_OPEN=true
|
||||
- DRONE_HOST=${DRONE_HOST}
|
||||
- DRONE_GITHUB=true
|
||||
- DRONE_GITHUB_CLIENT=${DRONE_GITHUB_CLIENT}
|
||||
- DRONE_GITHUB_SECRET=${DRONE_GITHUB_SECRET}
|
||||
+ - DRONE_SECRET=${DRONE_SECRET}
|
||||
woodpecker-agent:
|
||||
image: laszlocloud/woodpecker-agent:v0.9.0
|
||||
environment:
|
||||
- DRONE_SERVER=woodpecker-server:9000
|
||||
- DRONE_DEBUG=true
|
||||
+ - DRONE_SECRET=${DRONE_SECRET}
|
||||
```
|
||||
|
||||
Registration is closed by default.
|
||||
|
||||
This example enables open registration for users that are members of approved GitHub organizations.
|
||||
|
||||
```diff
|
||||
services:
|
||||
woodpecker-server:
|
||||
image: laszlocloud/woodpecker-server:v0.9.0
|
||||
environment:
|
||||
+ - DRONE_OPEN=true
|
||||
+ - DRONE_ORGS=dolores,dogpatch
|
||||
- DRONE_HOST=${DRONE_HOST}
|
||||
- DRONE_GITHUB=true
|
||||
- DRONE_GITHUB_CLIENT=${DRONE_GITHUB_CLIENT}
|
||||
- DRONE_GITHUB_SECRET=${DRONE_GITHUB_SECRET}
|
||||
- DRONE_SECRET=${DRONE_SECRET}
|
||||
```
|
||||
|
||||
Administrators should also be enumerated in your configuration.
|
||||
|
||||
```diff
|
||||
services:
|
||||
woodpecker-server:
|
||||
image: laszlocloud/woodpecker-server:v0.9.0
|
||||
environment:
|
||||
- DRONE_OPEN=true
|
||||
- DRONE_ORGS=dolores,dogpatch
|
||||
+ - DRONE_ADMIN=johnsmith,janedoe
|
||||
- DRONE_HOST=${DRONE_HOST}
|
||||
- DRONE_GITHUB=true
|
||||
- DRONE_GITHUB_CLIENT=${DRONE_GITHUB_CLIENT}
|
||||
- DRONE_GITHUB_SECRET=${DRONE_GITHUB_SECRET}
|
||||
- DRONE_SECRET=${DRONE_SECRET}
|
||||
```
|
||||
|
||||
|
||||
## Authentication
|
||||
|
||||
Authentication is done using OAuth and is delegated to one of multiple version control providers, configured using environment variables. The example above demonstrates basic GitHub integration.
|
||||
|
||||
See the complete reference for [Github](/administration/github), [Bitbucket Cloud](/administration/bitbucket), [Bitbucket Server](/administration/bitbucket_server) and [Gitlab](/administration/gitlab).
|
||||
|
||||
## Database
|
||||
|
||||
Woodpecker mounts a [data volume](https://docs.docker.com/storage/volumes/#create-and-manage-volumes) to persist the sqlite database.
|
||||
|
||||
See the [database settings](/administration/database) page to configure Postgresql or MySQL as database.
|
||||
|
||||
```diff
|
||||
services:
|
||||
woodpecker-server:
|
||||
image: laszlocloud/woodpecker-server:v0.9.0
|
||||
ports:
|
||||
- 80:8000
|
||||
- 9000
|
||||
+ volumes:
|
||||
+ - woodpecker-server-data:/var/lib/drone/
|
||||
restart: always
|
||||
```
|
||||
|
||||
## SSL
|
||||
|
||||
Woodpecker supports ssl configuration by mounting certificates into your container. See the [SSL guide](/administration/ssl).
|
||||
|
||||
Automated [Lets Encrypt](/administration/lets-encrypt) is also supported.
|
||||
|
||||
## Metrics
|
||||
|
||||
A [Prometheus endpoint](/administration/prometheus) is exposed.
|
||||
|
||||
## Behind a proxy
|
||||
|
||||
See the [proxy guide](/administration/proxy) if you want to see a setup behind Apache, Nginx, Caddy or ngrok.
|
26
docs/mkdocs.yml
Normal file
|
@ -0,0 +1,26 @@
|
|||
site_name: Woodpecker
|
||||
repo_name: 'laszlocph/woodpecker'
|
||||
repo_url: 'https://github.com/laszlocph/woodpecker'
|
||||
copyright: 'Creative Commons Attribution-ShareAlike 4.0 International Public License.<br />It is a derivative work of the https://github.com/drone/docs git repository'
|
||||
nav:
|
||||
- Home: index.md
|
||||
- Server setup: server-setup.md
|
||||
theme:
|
||||
name: 'material'
|
||||
logo: 'images/favicon.svg'
|
||||
favicon: 'images/favicon.svg'
|
||||
palette:
|
||||
primary: 'green'
|
||||
accent: 'red'
|
||||
markdown_extensions:
|
||||
- admonition
|
||||
- codehilite:
|
||||
linenums: true
|
||||
- pymdownx.inlinehilite
|
||||
|
||||
extra:
|
||||
social:
|
||||
- type: globe
|
||||
link: http://woodpecker.laszlo.cloud
|
||||
- type: twitter
|
||||
link: https://twitter.com/laszlocph
|
20
docs/requirements.txt
Normal file
|
@ -0,0 +1,20 @@
|
|||
backports-abc==0.5
|
||||
Click==7.0
|
||||
futures==3.3.0
|
||||
htmlmin==0.1.12
|
||||
Jinja2==2.10.3
|
||||
jsmin==2.2.2
|
||||
livereload==2.6.1
|
||||
Markdown==3.1.1
|
||||
MarkupSafe==1.1.1
|
||||
mkdocs==1.0.4
|
||||
mkdocs-markdownextradata-plugin==0.1.1
|
||||
mkdocs-material==4.4.3
|
||||
mkdocs-minify-plugin==0.2.1
|
||||
pep562==1.0
|
||||
Pygments==2.4.2
|
||||
pymdown-extensions==6.1
|
||||
PyYAML==5.1.2
|
||||
singledispatch==3.4.0.3
|
||||
six==1.13.0
|
||||
tornado==5.1.1
|
|
@ -80,7 +80,7 @@ type website struct {
|
|||
func (w *website) Register(mux *httptreemux.ContextMux) {
|
||||
h := http.FileServer(w.fs)
|
||||
h = setupCache(h)
|
||||
mux.Handler("GET", "/favicon.png", h)
|
||||
mux.Handler("GET", "/favicon.svg", h)
|
||||
mux.Handler("GET", "/static/*filepath", h)
|
||||
mux.NotFoundHandler = w.handleIndex
|
||||
}
|
||||
|
|
Before Width: | Height: | Size: 1.3 KiB |
1
web/src/public/favicon.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22"><path d="M1.263 2.744C2.41 3.832 2.845 4.932 4.118 5.08l.036.007c-.588.606-1.09 1.402-1.443 2.423-.38 1.096-.488 2.285-.614 3.659-.19 2.046-.401 4.364-1.556 7.269-2.486 6.258-1.12 11.63.332 17.317.664 2.604 1.348 5.297 1.642 8.107a.857.857 0 00.633.744.86.86 0 00.922-.323c.227-.313.524-.797.86-1.424.84 3.323 1.355 6.13 1.783 8.697a.866.866 0 001.517.41c2.88-3.463 3.763-8.636 2.184-12.674.459-2.433 1.402-4.45 2.398-6.583.536-1.15 1.08-2.318 1.55-3.566.228-.084.569-.314.79-.441l1.707-.981-.256 1.052a.864.864 0 001.678.408l.68-2.858 1.285-2.95a.863.863 0 10-1.581-.687l-1.152 2.669-2.383 1.372a18.97 18.97 0 00.508-2.981c.432-4.86-.718-9.074-3.066-11.266-.163-.157-.208-.281-.247-.26.095-.12.249-.26.358-.374 2.283-1.693 6.047-.147 8.319.75.589.232.876-.337.316-.67-1.95-1.153-5.948-4.196-8.188-6.193-.313-.275-.527-.607-.89-.913C9.825.555 4.072 3.057 1.355 2.569c-.102-.018-.166.103-.092.175m10.98 5.899c-.06 1.242-.603 1.8-1 2.208-.217.224-.426.436-.524.738-.236.714.008 1.51.66 2.143 1.974 1.84 2.925 5.527 2.538 9.86-.291 3.288-1.448 5.763-2.671 8.385-1.031 2.207-2.096 4.489-2.577 7.259a.853.853 0 00.056.48c1.02 2.434 1.135 6.197-.672 9.46a96.586 96.586 0 00-1.97-8.711c1.964-4.488 4.203-11.75 2.919-17.668-.325-1.497-1.304-3.276-2.387-4.207-.208-.18-.402-.237-.495-.167-.084.06-.151.238-.062.444.55 1.266.879 2.599 1.226 4.276 1.125 5.443-.956 12.49-2.835 16.782l-.116.259-.457.982c-.356-2.014-.85-3.95-1.33-5.84-1.38-5.406-2.68-10.515-.401-16.254 1.247-3.137 1.483-5.692 1.672-7.746.116-1.263.216-2.355.526-3.252.905-2.605 3.062-3.178 4.744-2.852 1.632.316 3.24 1.593 3.156 3.42zm-2.868.62a1.177 1.177 0 10.736-2.236 1.178 1.178 0 10-.736 2.237z"/></svg>
|
After Width: | Height: | Size: 1.7 KiB |
|
@ -87,7 +87,7 @@ module.exports = {
|
|||
filename: "static/vendor.[hash].js"
|
||||
}),
|
||||
new HtmlWebpackPlugin({
|
||||
favicon: "src/public/favicon.png",
|
||||
favicon: "src/public/favicon.svg",
|
||||
template: "src/index.html"
|
||||
})
|
||||
].concat(
|
||||
|
|