From a5bdc40751b6202bbaad33a64cfe3b3e2cc0a9a5 Mon Sep 17 00:00:00 2001 From: Yvonnick Esnault Date: Thu, 16 Dec 2021 22:03:14 +0100 Subject: [PATCH] doc: migrate 0.50.0 (#6039) * doc: migrate 0.50.0 Signed-off-by: Yvonnick Esnault --- contrib/worker-models/README.md | 4 +- ...official-1.13.yml => go-official-1.17.yml} | 4 +- .../demo-usage-service-postgresql/README.md | 2 +- .../workflow.yml | 6 +- .../demo-workflow-hello-world/README.md | 2 +- .../demo-workflow-hello-world/workflow.yml | 6 +- .../demo-workflow-skeleton/README.md | 2 +- .../demo-workflow-skeleton/workflow.yml | 6 +- docker-compose.yml | 36 +++-- docs/content/docs/components/cdn.md | 128 ++++++++++++++++-- .../concepts/files/worker_model-syntax.md | 8 +- .../docker-compose/docker-compose.md | 16 +-- .../docker-compose/full-example.md | 16 +-- docs/content/hosting/upgrade/migrate_0.50.md | 121 +++++++++++++++++ docs/static/images/cdn_logs_get.png | Bin 55615 -> 0 bytes docs/static/images/cdn_logs_receive.png | Bin 48541 -> 0 bytes go.mod | 1 + tests/Makefile | 5 +- tests/test.sh | 2 +- tools/smtpmock/go.mod | 22 +-- tools/smtpmock/go.sum | 67 ++++++--- tools/smtpmock/server/api.go | 4 +- 22 files changed, 353 insertions(+), 105 deletions(-) rename contrib/worker-models/{go-official-1.13.yml => go-official-1.17.yml} (73%) create mode 100644 docs/content/hosting/upgrade/migrate_0.50.md delete mode 100644 docs/static/images/cdn_logs_get.png delete mode 100644 docs/static/images/cdn_logs_receive.png diff --git a/contrib/worker-models/README.md b/contrib/worker-models/README.md index a2be229619..8fa25030b0 100644 --- a/contrib/worker-models/README.md +++ b/contrib/worker-models/README.md @@ -8,9 +8,9 @@ See https://ovh.github.io/cds/docs/concepts/worker-model/ ```bash # import a worker model -cdsctl worker model import ./go-official-1.13.yml +cdsctl worker model import ./go-official-1.17.yml # or with a remote file -cdsctl worker model import https://raw.githubusercontent.com/ovh/cds/master/contrib/worker-models/go-official-1.13.yml +cdsctl worker model import https://raw.githubusercontent.com/ovh/cds/master/contrib/worker-models/go-official-1.17.yml ``` diff --git a/contrib/worker-models/go-official-1.13.yml b/contrib/worker-models/go-official-1.17.yml similarity index 73% rename from contrib/worker-models/go-official-1.13.yml rename to contrib/worker-models/go-official-1.17.yml index 13fcbad1b9..8c81b0873d 100644 --- a/contrib/worker-models/go-official-1.13.yml +++ b/contrib/worker-models/go-official-1.17.yml @@ -1,6 +1,6 @@ -name: go-official-1.13 +name: go-official-1.17 group: shared.infra -image: golang:1.13 +image: golang:1.17 description: official from https://hub.docker.com/_/golang/ type: docker pattern_name: basic_unix \ No newline at end of file diff --git a/contrib/workflow-templates/demo-usage-service-postgresql/README.md b/contrib/workflow-templates/demo-usage-service-postgresql/README.md index c0b180ba4f..5bd41f7d33 100644 --- a/contrib/workflow-templates/demo-usage-service-postgresql/README.md +++ b/contrib/workflow-templates/demo-usage-service-postgresql/README.md @@ -17,7 +17,7 @@ If you want to import it, you have to be CDS Administrator on your CDS Instance. This template uses a pre-requisite binary `apt-get`, you need a [worker model](https://ovh.github.io/cds/docs/concepts/worker-model/) with this capability on you CDS Instance. -``` bash +```sh # import from github cdsctl template push https://raw.githubusercontent.com/ovh/cds/master/contrib/workflow-templates/demo-usage-service-postgresql/demo-usage-service-postgresql.yml ``` diff --git a/contrib/workflow-templates/demo-usage-service-postgresql/workflow.yml b/contrib/workflow-templates/demo-usage-service-postgresql/workflow.yml index 890d851741..83ff8e09a1 100644 --- a/contrib/workflow-templates/demo-usage-service-postgresql/workflow.yml +++ b/contrib/workflow-templates/demo-usage-service-postgresql/workflow.yml @@ -1,3 +1,5 @@ name: [[.name]] -version: v1.0 -pipeline: demo-service-postgresql +version: v2.0 +workflow: + demo-service-postgresql: + pipeline: demo-service-postgresql diff --git a/contrib/workflow-templates/demo-workflow-hello-world/README.md b/contrib/workflow-templates/demo-workflow-hello-world/README.md index 8d65a27ebb..b4ee68d94b 100644 --- a/contrib/workflow-templates/demo-workflow-hello-world/README.md +++ b/contrib/workflow-templates/demo-workflow-hello-world/README.md @@ -18,7 +18,7 @@ This template is linked to group: `shared.infra` If you want to import it, you have to be CDS Administrator on your CDS Instance. -``` bash +```sh # import from github cdsctl template push https://raw.githubusercontent.com/ovh/cds/master/contrib/workflow-templates/demo-workflow-hello-world/demo-workflow-hello-world.yml ``` diff --git a/contrib/workflow-templates/demo-workflow-hello-world/workflow.yml b/contrib/workflow-templates/demo-workflow-hello-world/workflow.yml index 3a6ad4c390..571c6f4d9e 100644 --- a/contrib/workflow-templates/demo-workflow-hello-world/workflow.yml +++ b/contrib/workflow-templates/demo-workflow-hello-world/workflow.yml @@ -1,5 +1,5 @@ name: [[.name]] -version: v1.0 +version: v2.0 workflow: build: pipeline: build-[[.id]] @@ -27,10 +27,10 @@ workflow: - success depends_on: - fork - deploy-prod: + deploy-prod: pipeline: deploy-[[.id]] application: [[.name]] - environment: [[.name]]-prod + environment: [[.name]]-prod when: - manual - success diff --git a/contrib/workflow-templates/demo-workflow-skeleton/README.md b/contrib/workflow-templates/demo-workflow-skeleton/README.md index d16cdf3dec..9d51378eb0 100644 --- a/contrib/workflow-templates/demo-workflow-skeleton/README.md +++ b/contrib/workflow-templates/demo-workflow-skeleton/README.md @@ -14,7 +14,7 @@ This template is linked to group: `shared.infra` If you want to import it, you have to be CDS Administrator on your CDS Instance. -``` bash +```sh # import from github cdsctl template push https://raw.githubusercontent.com/ovh/cds/master/contrib/workflow-templates/demo-workflow-skeleton/demo-workflow-skeleton.yml ``` diff --git a/contrib/workflow-templates/demo-workflow-skeleton/workflow.yml b/contrib/workflow-templates/demo-workflow-skeleton/workflow.yml index 3a6ad4c390..571c6f4d9e 100644 --- a/contrib/workflow-templates/demo-workflow-skeleton/workflow.yml +++ b/contrib/workflow-templates/demo-workflow-skeleton/workflow.yml @@ -1,5 +1,5 @@ name: [[.name]] -version: v1.0 +version: v2.0 workflow: build: pipeline: build-[[.id]] @@ -27,10 +27,10 @@ workflow: - success depends_on: - fork - deploy-prod: + deploy-prod: pipeline: deploy-[[.id]] application: [[.name]] - environment: [[.name]]-prod + environment: [[.name]]-prod when: - manual - success diff --git a/docker-compose.yml b/docker-compose.yml index cfdb50f9a2..c1a9aa04a6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,19 +11,22 @@ services: POSTGRES_PASSWORD: cds POSTGRES_USER: cds POSTGRES_DB: cds + volumes: + - cds-postgres-volume:/var/lib/postgresql/data cds-db-init: image: postgres:14.0 command: > - sh -exc " - PGPASSWORD=cds psql -h cds-db -p 5432 -U cds -d cds -c \"CREATE SCHEMA IF NOT EXISTS cdn AUTHORIZATION cds;\";" + sh -exc "PGPASSWORD=cds psql -h cds-db -p 5432 -U cds -d cds -c \"CREATE SCHEMA IF NOT EXISTS cdn AUTHORIZATION cds;\";" links: - cds-db cds-cache: image: redis:alpine - command: redis-server --requirepass cds + command: redis-server --requirepass cds --save 60 1 restart: always + volumes: + - cds-redis-volume:/data elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:6.7.2 @@ -50,7 +53,13 @@ services: cds-prepare: image: ${CDS_DOCKER_IMAGE:-ovhcom/cds-engine:latest} command: > - sh -c " + bash -c " + if [ ! -f /app/conf/conf.toml ]; then + /app/cds-engine-linux-amd64 config new api cdn ui hooks repositories vcs elasticsearch hatchery:local hatchery:swarm > /app/conf/conf.toml; + else + echo '/!\ Config file already exists'; + fi; + chown -R cds:cds /app/conf /app/artifacts /app/repositories /app/cdn-buffer /app/cdn-storage; /app/cds-engine-linux-amd64 config new > /app/conf/conf.toml; mkdir -p /app/artifacts /app/repositories /app/hatchery-local; chown -R cds:cds /app/conf /app/artifacts /app/repositories /app/hatchery-local /app/cdn-buffer /app/cdn-storage; @@ -60,12 +69,7 @@ services: api.cache.redis.password=cds \ api.database.host=cds-db \ api.download.directory=/app \ - api.url.api=http://${HOSTNAME}:8081 \ - api.url.ui=http://${HOSTNAME}:8080 \ api.log.level=info \ - api.smtp.disable=false \ - api.smtp.port=2023 \ - api.smtp.host=smtpmocksrv \ cdn.cache.redis.host=cds-cache:6379 \ cdn.cache.redis.password=cds \ cdn.storageUnits.buffers.redis.redis.host=cds-cache:6379 \ @@ -103,7 +107,6 @@ services: elasticsearch.elasticsearch.indexEvents=cds-index-events \ elasticsearch.elasticsearch.indexMetrics=cds-index-metrics \ elasticsearch.elasticsearch.url=http://elasticsearch:9200 \ - ui.url=http://${HOSTNAME}:8080 \ ui.enableServiceProxy=true \ ui.api.http.url=http://cds-api:8081 \ ui.hooksURL=http://cds-hooks:8083 \ @@ -282,13 +285,6 @@ services: ports: - "127.0.0.1:2375:2375" - smtpmocksrv: - build: - context: ./tools/smtpmock - ports: - - "2023:2023" - - "2024:2024" - kibana: image: docker.elastic.co/kibana/kibana-oss:6.7.2 ports: @@ -297,10 +293,12 @@ services: - elasticsearch volumes: + cds-postgres-volume: + cds-redis-volume: + cds-elasticsearch-volume: + cds-conf-volume: cds-artifacts-volume: cds-repositories-volume: cds-hatchery-local-volume: - cds-conf-volume: - cds-elasticsearch-volume: cds-cdn-buffer-volume: cds-cdn-storage-volume: diff --git a/docs/content/docs/components/cdn.md b/docs/content/docs/components/cdn.md index fd18f457e7..bf8ecdf555 100644 --- a/docs/content/docs/components/cdn.md +++ b/docs/content/docs/components/cdn.md @@ -4,36 +4,138 @@ weight: 3 --- ## What's CDN -CDN is a service dedicated to receive and store CDS's logs. In a near future, it will also be able to manage artifacts and cache used by your jobs. + +CDN is a service dedicated to receive and store CDS's logs and artifacts. CDN stores the list of all known log or artifact items in a Postgres database and communicates with storage backends to store the contents of those items. These backends are call units and there are two types of units in CDN: * Buffer unit: To store logs and artifacts of incoming jobs, these units are designed to be fast for read / write operations, but with limited capacity. -* Storage Unit: to store complete job's logs and artifact. +* Storage Unit: to store complete job's logs and artifacts. -When logs or file are received by CDN, it will first store these items in its buffer. Then, when the item is fully received, it will be moved to one of the configured storage units. +When logs or file are received by CDN from a cds worker, it will first store these items in its buffer. Then, when the item is fully received, it will be moved to one of the configured storage units. If the CDN service is configured with multiple storage units, each unit periodically checks for missing items and synchronizes these items from other units. +CDS UI and CLI communicate with CDN to get entire logs, or stream them. + +## Supported units +* Buffer (type: log): Redis. +* Buffer (type: file): Local, NFS +* Storage: Local, Swift, S3, Webdav ## Configuration -Like any other CDS service, CDN requires to be authenticated with a consumer. The required scopes are Service, Worker and RunExecution. +Like any other CDS service, CDN requires to be authenticated with a consumer. The required scopes are `Service`, `Worker` and `RunExecution`. + +You can generate a configuration file with the `engine` binary: + +```sh +$ engine config new cdn > cds-configuration.toml +``` You must have at least one storage unit, one file buffer and one log buffer to be able to run CDN. -## Supported units -* Buffer (type: log): Redis. -* Buffer (type: file): Local. -* Storage: Local, Swift, S3, Webdav, CDS (cds unit is used for migration purpose and will be removed in future release). +### CDN artifact configuration +#### Storage Unit Buffer -## Use case +You must have a `storageUnits.buffers` , one for the type `log`, another for the type `file`. -Workers and hatcheries communicate with CDN, sending step logs and service log. +Type `log`: -![CDN_RECEIVE](/images/cdn_logs_receive.png?width=600px) +```toml + [cdn.storageUnits.buffers.redis] + bufferType = "log" -CDS UI and CLI communicate with CDN to get entire logs, or stream them. + [cdn.storageUnits.buffers.redis.redis] + host = "aaa@instance0,instance1,instance2" + password = "your-password" +``` + +Type `file`: + +```toml + [cdn.storageUnits.buffers.local-buffer] + + # it can be 'log' to receive logs or 'file' to receive artifacts + bufferType = "file" + + [cdn.storageUnits.buffers.local-buffer.local] + path = "/var/lib/cds-engine/cdn-buffer" +``` + +To multi-instanciate the cdn service, you can use a NFS for the bufferType file, example: + +```toml + [cdn.storageUnits.buffers.buffer-nfs] + bufferType = "file" + + [cdn.storageUnits.buffers.buffer-nfs.nfs] + host = "w.x.y.z" + targetPartition = "/zpool-partition/cdn" + userID = 0 + groupID = 0 + + [[cdn.storageUnits.buffers.buffer-nfs.nfs.encryption]] + Cipher = "aes-gcm" + Identifier = "nfs-buffer-id" + ## enter a key here, 32 lenght + Key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + Sealed = false +``` + +#### Storage Units Storage + +The storage unit 'storage' store the artifacts. +You can use `Local`, `Swift`, `S3`, `Webdav` + +Example of storage unit `local`: + +```toml + [cdn.storageUnits.storages] + + [cdn.storageUnits.storages.local] + + # flag to disabled backend synchronization + disableSync = false + + # global bandwith shared by the sync processes (in Mb) + syncBandwidth = 128 + + # number of parallel sync processes + syncParallel = 2 + + [cdn.storageUnits.storages.local.local] + path = "/tmp/cds/local-storage" + + [[cdn.storageUnits.storages.local.local.encryption]] + Cipher = "aes-gcm" + Identifier = "cdn-storage-local" + LocatorSalt = "xxxxxxxxx" + SecretValue = "xxxxxxxxxxxxxxxxx" + Timestamp = 0 +``` + +Example of storage unit `swift`: +``` + [cdn.storageUnits.storages] + + [cdn.storageUnits.storages.swift] + syncParallel = 6 + syncBandwidth = 1000 + + [cdn.storageUnits.storages.swift.swift] + address = "https://xxx.yyy.zzz/v3" + username = "foo" + password = "your-password-here" + tenant = "your-tenant-here" + domain = "Default" + region = "XXX" + containerPrefix = "prod" -![CDN_GET](/images/cdn_logs_get.png?width=600px) + [[cdn.storageUnits.storages.swift.swift.encryption]] + Cipher = "aes-gcm" + Identifier = "swift-backend-id" + LocatorSalt = "XXXXXXXX" + SecretValue = "XXXXXXXXXXXXXXXX" +``` \ No newline at end of file diff --git a/docs/content/docs/concepts/files/worker_model-syntax.md b/docs/content/docs/concepts/files/worker_model-syntax.md index c903be062f..98ee6837db 100644 --- a/docs/content/docs/concepts/files/worker_model-syntax.md +++ b/docs/content/docs/concepts/files/worker_model-syntax.md @@ -8,9 +8,9 @@ card: Example: ```yml -name: go-official-1.13 +name: go-official-1.17 group: shared.infra -image: golang:1.13 +image: golang:1.17 description: official from https://hub.docker.com/_/golang/ type: docker pattern_name: basic_unix @@ -19,13 +19,13 @@ pattern_name: basic_unix Import a worker model: ```bash -cdsctl worker model import ./go-official-1.13.yml +cdsctl worker model import ./go-official-1.17.yml ``` or with a remote file: ```bash -cdsctl worker model import https://raw.githubusercontent.com/ovh/cds/{{< param "version" "master" >}}/contrib/worker-models/go-official-1.13.yml +cdsctl worker model import https://raw.githubusercontent.com/ovh/cds/{{< param "version" "master" >}}/contrib/worker-models/go-official-1.17.yml ``` {{< note >}} diff --git a/docs/content/hosting/ready-to-run/docker-compose/docker-compose.md b/docs/content/hosting/ready-to-run/docker-compose/docker-compose.md index db42061d2a..f3a619024e 100644 --- a/docs/content/hosting/ready-to-run/docker-compose/docker-compose.md +++ b/docs/content/hosting/ready-to-run/docker-compose/docker-compose.md @@ -36,28 +36,24 @@ $ export CDS_DOCKER_IMAGE=ovhcom/cds-engine:{{< param "version" "latest" >}} $ docker pull ovhcom/cds-engine:{{< param "version" "latest" >}} # Create PostgreSQL database, redis and elasticsearch -$ docker-compose up --no-recreate -d cds-db cds-cache elasticsearch dockerhost +$ docker-compose up -d cds-db cds-cache elasticsearch dockerhost # check if database is up, the logs must contain "LOG: database system is ready to accept connections" $ docker-compose logs| grep 'database system is ready to accept connections' # you should have this line after few seconds: cds-db_1 | LOG: database system is ready to accept connections -$ docker-compose up --no-recreate cds-db-init -$ docker-compose up --no-recreate cds-migrate +$ docker-compose up cds-db-init +$ docker-compose up cds-migrate # You should have this log: "cdstest_cds-migrate_1 exited with code 0" # prepare initial configuration. $ docker-compose up cds-prepare -# disable the smtp server -$ export CDS_EDIT_CONFIG="api.smtp.disable=true" -$ docker-compose up cds-edit-config - # run API $ docker-compose up -d cds-api # the INIT_TOKEN variable will be used by cdsctl to create first admin user -$ TOKEN_CMD=$(docker logs cdstest_cds-prepare_1|grep TOKEN) && $TOKEN_CMD +$ TOKEN_CMD=$(docker logs $(docker-compose ps -q cds-prepare) | grep INIT_TOKEN) && $TOKEN_CMD # if you have this error: "command too long: export INIT_TOKEN=....", # you can manually execute the command "export INIT_TOKEN=...." @@ -69,7 +65,7 @@ $ ./cdsctl signup --api-url http://localhost:8081 --email admin@localhost.local # enter a strong password # verify the user -$ VERIFY_CMD=$(docker-compose logs cds-api|grep 'cdsctl signup verify'|cut -d '$' -f2|xargs) && ./$VERIFY_CMD +$ VERIFY_CMD=$(docker-compose logs cds-api | grep 'cdsctl signup verify' | cut -d '$' -f2 | xargs) && ./$VERIFY_CMD # if you have this error: "such file or directory: ./cdsctl signup verify --api-url...", # you can manually execute the command "./cdsctl signup verify --api-url..." @@ -88,7 +84,7 @@ $ ./cdsctl user me $ docker-compose up -d cds-ui cds-cdn cds-hooks cds-elasticsearch cds-hatchery-swarm # create first worker model -$ ./cdsctl worker model import https://raw.githubusercontent.com/ovh/cds/{{< param "version" "master" >}}/contrib/worker-models/go-official-1.13.yml +$ ./cdsctl worker model import https://raw.githubusercontent.com/ovh/cds/{{< param "version" "master" >}}/contrib/worker-models/go-official-1.17.yml # import Import a workflow template $ ./cdsctl template push https://raw.githubusercontent.com/ovh/cds/{{< param "version" "master" >}}/contrib/workflow-templates/demo-workflow-hello-world/demo-workflow-hello-world.yml diff --git a/docs/content/hosting/ready-to-run/docker-compose/full-example.md b/docs/content/hosting/ready-to-run/docker-compose/full-example.md index 10f3d138de..3fccf3b898 100644 --- a/docs/content/hosting/ready-to-run/docker-compose/full-example.md +++ b/docs/content/hosting/ready-to-run/docker-compose/full-example.md @@ -193,15 +193,13 @@ export HOSTNAME=$(hostname) export CDS_DOCKER_IMAGE=ovhcom/cds-engine:{{< param "version" "latest" >}} docker pull ovhcom/cds-engine:{{< param "version" "latest" >}} -docker-compose up --no-recreate -d cds-db cds-cache elasticsearch dockerhost +docker-compose up -d cds-db cds-cache elasticsearch dockerhost sleep 3 docker-compose logs| grep 'database system is ready to accept connections' -docker-compose up --no-recreate cds-db-init -docker-compose up --no-recreate cds-migrate +docker-compose up cds-db-init +docker-compose up cds-migrate sleep 3 docker-compose up cds-prepare -export CDS_EDIT_CONFIG="api.smtp.disable=true" -docker-compose up cds-edit-config export CDS_EDIT_CONFIG="vcs.servers.github.github.clientId=${CDS_GITHUB_CLIENT_ID} vcs.servers.github.github.clientSecret=${CDS_GITHUB_CLIENT_SECRET} " docker-compose up cds-edit-config export CDS_EDIT_CONFIG="api.url.api=http://localhost:8081 api.url.ui=https://${CDS_DOMAIN_NAME} hatchery.swarm.commonConfiguration.api.http.url=http://cds-api:8081" @@ -210,12 +208,12 @@ export CDS_EDIT_CONFIG="hatchery.swarm.commonConfiguration.api.http.url=https:// docker-compose up cds-edit-config docker-compose up -d cds-api sleep 3 -TOKEN_CMD=$(docker logs debian_cds-prepare_1|grep TOKEN) && $TOKEN_CMD +TOKEN_CMD=$(docker logs $(docker-compose ps -q cds-prepare) | grep INIT_TOKEN) && $TOKEN_CMD curl 'http://localhost:8081/download/cdsctl/linux/amd64?variant=nokeychain' -o cdsctl chmod +x cdsctl # this line will ask a password for admin user ./cdsctl signup --api-url http://localhost:8081 --email admin@localhost.local --username admin --fullname admin -VERIFY_CMD=$(docker-compose logs cds-api|grep 'cdsctl signup verify'|cut -d '$' -f2|xargs) && ./$VERIFY_CMD +VERIFY_CMD=$(docker-compose logs cds-api | grep 'cdsctl signup verify' | cut -d '$' -f2 | xargs) && ./$VERIFY_CMD # this line returns the RING of user, must be ADMIN ./cdsctl user me @@ -319,14 +317,14 @@ openstack security group rule list default export CDS_EDIT_CONFIG="api.auth.local.signupDisabled=true" docker-compose up cds-edit-config -# theh, restart api +# then, restart api export HOSTNAME=$(hostname) docker-compose restart cds-api ``` ### Reinstall all CDS on the same VM -``` bash +```sh # with user debian # delete all containers and volumes docker rm -f `docker ps -aq` && docker volume prune diff --git a/docs/content/hosting/upgrade/migrate_0.50.md b/docs/content/hosting/upgrade/migrate_0.50.md new file mode 100644 index 0000000000..ba8c3c18c6 --- /dev/null +++ b/docs/content/hosting/upgrade/migrate_0.50.md @@ -0,0 +1,121 @@ +--- +title: "Migrate 0.50" +weight: 1 +--- + +## Migrate an existing instance + +Before upgrading your CDS Instance: +- You have to backup your databases: cds and cdn databases. +- You have to install the version 0.49.0 if you use the 0.48 version. +- The backend cds-backend have to be removed from the cdn configuration. + +## PostgreSQL + +PostgreSQL 14 is now recommanded + +## CDN Service + +This release introduced the CDN Artifacts. This means that all artifacts upload / download will be done through the CDN service. +This is not enabled by default, you have to enable that with a feature flipping. The version 0.51 will use the CDN service to manage artifacts by default. + +### How to configure the new CDN artifact service? + +Some configuration have to be added to the cdn service to manage artifacts. + +You have to add a `storageUnits.buffers` with the type "file". +```toml + [cdn.storageUnits.buffers.local-buffer] + + # it can be 'log' to receive logs or 'file' to receive artifacts + bufferType = "file" + + [cdn.storageUnits.buffers.local-buffer.local] + path = "/var/lib/cds-engine/cdn-buffer" +``` + +To multi-instanciate the cdn service, you can use a NFS for the bufferType file, example: + +```toml + [cdn.storageUnits.buffers.buffer-nfs] + bufferType = "file" + + [cdn.storageUnits.buffers.buffer-nfs.nfs] + host = "w.x.y.z" + targetPartition = "/zpool-partition/cdn" + userID = 0 + groupID = 0 + + [[cdn.storageUnits.buffers.buffer-nfs.nfs.encryption]] + Cipher = "aes-gcm" + Identifier = "nfs-buffer-id" + ## enter a key here, 32 lenght + Key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + Sealed = false +``` + +## How to enable the CDS Artifact? + +Make sure you have configured cdn in the paragraph above, then enable it with this command: + +```sh +cat < feature.yaml +name: cdn-artifact +rule: return true +EOF +cdsctl admin feature import feature.yaml +``` + +In the next release (0.51.0), you don't need to use the feature flipping `cdn-artifact` to enable cdn artifact. + +### How to migrate existing artifacts to the new backend? + +If you want to migrate some artifacts to the new backend, you can use cdsctl: +```sh +$ cdsctl workflow artifact cdn-migrate +``` +This command will migrate artifacts for one workflow run. + +## Workflow Runs : Purge and Retention + +The default retention rule have to be added in api configuration: + +```toml + [api.workflow] + + # Default rule for workflow run retention policy, this rule can be overridden on each workflow. + # Example: 'return run_days_before < 365' keeps runs for one year. + defaultRetentionPolicy = "return run_days_before < 365" +``` +Documentation: https://ovh.github.io/cds/docs/concepts/workflow/retention/ + +## Spawning worker : MaxAttemptsNumberBeforeFailure + +A new hatchery configuration attribute is available to control the maximum attempts to start a same job. + +Example on the `hatchery.local`: + +```toml + [hatchery.local.commonConfiguration.provision] + + # Maximum attempts to start a same job. -1 to disable failing jobs when to many attempts + # maxAttemptsNumberBeforeFailure = 5 +``` + +## CDS Binaries lazy loading + +`downloadFromGitHub` and `supportedOSArch` are added. This will allow you to download cds workers / cdsctl from GitHub if it's not in already downloaded into the `directory`. + +```toml + [api.download] + + # this directory contains cds binaries. If it's empty, cds will download binaries from GitHub (property downloadFromGitHub) or from an artifactory instance (property artifactory) to it + directory = "/var/lib/cds-engine" + + # allow downloading binaries from GitHub + downloadFromGitHub = true + + # example: ["darwin/amd64","darwin/arm64","linux/amd64","windows/amd64"]. If empty, all os / arch are supported: windows,darwin,linux,freebsd,openbsd and amd64,arm,386,arm64,ppc64le + supportedOSArch = [] +``` + diff --git a/docs/static/images/cdn_logs_get.png b/docs/static/images/cdn_logs_get.png deleted file mode 100644 index cdaa57373ff9b6aaf0a19862ba488c32aefabee1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55615 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 diff --git a/docs/static/images/cdn_logs_receive.png b/docs/static/images/cdn_logs_receive.png deleted file mode 100644 index 0373515e6a54311c5c9f5e82fd5afa643e206b29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48541 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 mO~}POy1&-;|MQP7{W(F<*Cq58WNh;Cxw2A${f}.output 2>&1 diff --git a/tools/smtpmock/go.mod b/tools/smtpmock/go.mod index 7fe4793f1f..0b9eff087b 100644 --- a/tools/smtpmock/go.mod +++ b/tools/smtpmock/go.mod @@ -3,9 +3,9 @@ module github.com/ovh/cds/tools/smtpmock go 1.17 require ( - github.com/dgrijalva/jwt-go v3.2.0+incompatible github.com/fsamin/smtp v0.0.0-20190904085838-54a7c428d4f9 - github.com/labstack/echo v3.3.10+incompatible + github.com/golang-jwt/jwt v3.2.2+incompatible + github.com/labstack/echo/v4 v4.6.1 github.com/pkg/errors v0.8.1 github.com/satori/go.uuid v1.2.0 github.com/urfave/cli/v2 v2.1.1 @@ -14,17 +14,17 @@ require ( require ( github.com/BurntSushi/toml v0.3.1 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d // indirect - github.com/golang-jwt/jwt v3.2.2+incompatible // indirect - github.com/labstack/gommon v0.3.0 // indirect - github.com/mattn/go-colorable v0.1.2 // indirect - github.com/mattn/go-isatty v0.0.9 // indirect + github.com/labstack/gommon v0.3.1 // indirect + github.com/mattn/go-colorable v0.1.12 // indirect + github.com/mattn/go-isatty v0.0.14 // indirect github.com/russross/blackfriday/v2 v2.0.1 // indirect github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect - github.com/valyala/fasttemplate v1.0.1 // indirect - golang.org/x/crypto v0.0.0-20190829043050-9756ffdc2472 // indirect - golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 // indirect - golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a // indirect - golang.org/x/text v0.3.0 // indirect + github.com/valyala/fasttemplate v1.2.1 // indirect + golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b // indirect + golang.org/x/net v0.0.0-20211215060638-4ddde0e984e9 // indirect + golang.org/x/sys v0.0.0-20211214234402-4825e8c3871d // indirect + golang.org/x/text v0.3.7 // indirect + golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 // indirect gopkg.in/yaml.v2 v2.2.2 // indirect ) diff --git a/tools/smtpmock/go.sum b/tools/smtpmock/go.sum index 7d798cbcc4..fe5c44c469 100644 --- a/tools/smtpmock/go.sum +++ b/tools/smtpmock/go.sum @@ -2,23 +2,28 @@ github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fsamin/smtp v0.0.0-20190904085838-54a7c428d4f9 h1:mrsrfaVJ42WA/bOYc+TB2/EbSB0W6vEkIrCDXnm/60I= github.com/fsamin/smtp v0.0.0-20190904085838-54a7c428d4f9/go.mod h1:BzEGArrdGbhhTMh5+83jlF5fb/QHfWh0tmBn2iXTouw= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/labstack/echo v3.3.10+incompatible h1:pGRcYk231ExFAyoAjAfD85kQzRJCRI8bbnE7CX5OEgg= -github.com/labstack/echo v3.3.10+incompatible/go.mod h1:0INS7j/VjnFxD4E2wkz67b8cVwCLbBmJyDaka6Cmk1s= -github.com/labstack/gommon v0.3.0 h1:JEeO0bvc78PKdyHxloTKiF8BD5iGrH8T6MSeGvSgob0= +github.com/labstack/echo/v4 v4.6.1 h1:OMVsrnNFzYlGSdaiYGHbgWQnr+JM7NG+B9suCPie14M= +github.com/labstack/echo/v4 v4.6.1/go.mod h1:RnjgMWNDB9g/HucVWhQYNQP9PvbYf6adqftqryo7s9k= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= -github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU= +github.com/labstack/gommon v0.3.1 h1:OomWaJXm7xR6L1HmEtGyQf26TEn7V6X88mktX9kee9o= +github.com/labstack/gommon v0.3.1/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9 h1:d5US/mDsogSGW37IV293h//ZFaeajb69h+EHFsv2xGg= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -30,27 +35,49 @@ github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdh github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/urfave/cli/v2 v2.1.1 h1:Qt8FeAtxE/vfdrLmR3rxR6JRE0RoVmbXu8+6kZtYU4k= github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.0.1 h1:tY9CJiPnMXf1ERmG2EyK7gNUd+c6RKGD0IfU8WdUSz8= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190829043050-9756ffdc2472 h1:Gv7RPwsi3eZ2Fgewe3CBsuOebPwO27PoXzRpJPsvSSM= -golang.org/x/crypto v0.0.0-20190829043050-9756ffdc2472/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4= +github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b h1:QAqMVf3pSa6eeTsuklijukjXBlj7Es2QQplab+/RbQ4= +golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210913180222-943fd674d43e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211215060638-4ddde0e984e9 h1:kmreh1vGI63l2FxOAYS3Yv6ATsi7lSTuwNSVbGfJV9I= +golang.org/x/net v0.0.0-20211215060638-4ddde0e984e9/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a h1:aYOabOQFp6Vj6W1F80affTUvO9UxmJRx8K0gsfABByQ= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210910150752-751e447fb3d0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211214234402-4825e8c3871d h1:1oIt9o40TWWI9FUaveVpUvBe13FNqBNVXy3ue2fcfkw= +golang.org/x/sys v0.0.0-20211214234402-4825e8c3871d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 h1:Hir2P/De0WpUhtrKGGjvSb2YxUgyZ7EFOSLIcSSpiwE= +golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/tools/smtpmock/server/api.go b/tools/smtpmock/server/api.go index be2867de2c..35756ae253 100644 --- a/tools/smtpmock/server/api.go +++ b/tools/smtpmock/server/api.go @@ -5,8 +5,8 @@ import ( "fmt" "net/http" - "github.com/labstack/echo" - "github.com/labstack/echo/middleware" + "github.com/labstack/echo/v4" + "github.com/labstack/echo/v4/middleware" "github.com/pkg/errors" "github.com/ovh/cds/tools/smtpmock"