Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

K8s secrets reference from step #3655

Merged
merged 27 commits into from
Jun 23, 2024
Merged

Conversation

zc-devs
Copy link
Contributor

@zc-devs zc-devs commented Apr 27, 2024

Part of #3582

Pipeline:

skip_clone: true
steps:
  secret-test:
    image: alpine
    commands:
      - echo $$AWS_ACCESS_KEY_ID
      - echo $$AWS_SECRET_ACCESS_KEY
    backend_options:
      kubernetes:
        secretNames:
          - test-secret

Test secret:

apiVersion: v1
kind: Secret
metadata:
  name: test-secret
  namespace: test-woodpecker-runtime
data:
  AWS_ACCESS_KEY_ID: N0lrZHNzb0xleGFtcGxlNkpJVnZDRXE=
  AWS_SECRET_ACCESS_KEY: TXk0WE5BYXNleGFtcGxldXRKRHNUWHc=
type: Opaque
  1. Default Agent config.

In log I see warning:

{"level":"debug","time":"2024-04-27T18:17:49Z","caller":"/src/pipeline/backend/kubernetes/pod.go:166","message":"Secret names were defined in backend options, but its using disallowed by instance configuration "}

WP output:

+ echo $AWS_ACCESS_KEY_ID

+ echo $AWS_SECRET_ACCESS_KEY

  1. Allowing native secrets.

Agent config:

data:
  WOODPECKER_BACKEND: kubernetes
  WOODPECKER_BACKEND_K8S_NATIVE_SECRETS_ALLOW_FROM_STEP: 'true'
  ...

WP output:

+ echo $AWS_ACCESS_KEY_ID
7IkdssoLexample6JIVvCEq
+ echo $AWS_SECRET_ACCESS_KEY
My4XNAasexampleutJDsTXw

@qwerty287 qwerty287 added enhancement improve existing features backend/kubernetes labels Apr 28, 2024
@qwerty287
Copy link
Contributor

Not sure how complex this is to implement, but if you use internal secrets and print them out to the logs, they're replaced with ********. Can we apply something similar here too? If not, this needs a warning in the docs.

Also, in my opinion WOODPECKER_BACKEND_K8S_NATIVE_SECRETS_ALLOW_FROM_STEP is way too long for an env name - wouldn't WOODPECKER_BACKEND_K8S_ALLOW_NATIVE_SECRETS be enough?

As an alternative to native support, maybe we could implement http service extension doing this? This feature is still in development and not supported yet. I understand however if you would like to support it natively.

@zc-devs
Copy link
Contributor Author

zc-devs commented Apr 28, 2024

if you use internal secrets and print them out to the logs, they're replaced with ********

I know, i know... Also thought about it and decided to warn in the docs too.
Now we don't have secrets to find them in the logs. However, when second part is implemented, this is achievable.

WOODPECKER_BACKEND_K8S_ALLOW_NATIVE_SECRETS

Will take it.

http service extension doing this?

Extension or external service?
I don't like extensions :) but like idea of external (micro)service. It might be useful in terms of duplication of masking secrets logic, at least.

Seems, I cannot manage it alone.
Is there some example / skeleton of service? I have ideas of service implementation, though. So I can do it, but need the Go "template". Also help with Server-side code might be needed.
How it should be organized? In this repo? Then probably POC branch is needed? Otherwise separate repo?

Edit
Can the external secrets work with internal at the same time?

@qwerty287
Copy link
Contributor

qwerty287 commented Apr 28, 2024

As I wrote, external services are not yet available and still in development... They'll work similar to config extensions (https://woodpecker-ci.org/docs/administration/external-configuration-api) but with possibility so set on them global/org/user/repo level.
We can extend this to be able to use both internal and external secrets combined together.
But probably this feature will take some more time to complete...

@zc-devs
Copy link
Contributor Author

zc-devs commented Apr 28, 2024

But probably this feature will take some more time to complete

Let's give this PR a try then. Could you add build_image label, please?

@dominic-p, could you test then?

@qwerty287 qwerty287 added the build_pr_images If set, the CI will build images for this PR and push to Dockerhub label Apr 28, 2024
@dominic-p
Copy link
Contributor

Thanks for working on this! I'm ready to test this PR as soon as we get an image published.

@zc-devs
Copy link
Contributor Author

zc-devs commented May 1, 2024

And this too

@dominic-p
Copy link
Contributor

Ok, I was able to test this tonight, and it seems to be working as expected! I was able to successfully build and push my first image to my local repo! 🎉🎉🎉

I did run into one snag. As I mentioned, my main use case for this feature is to provide container image registry credentials to my build script. These credentials are currently stored in a Kubernetes registry cred secret. This kind of secret uses the hardcoded key .dockerconfigjson to reference its data. The issue is that with the current implementation we wind up with an environment variable with a dot in its name. I had a hard time using it since env variable names really aren't supposed to have dots in them.

I was able to work around the issue with printenv, but it's kind of awkward. I'm not sure if this problem is worth fixing in the current iteration of this feature or not. Maybe we can just add a short blurb to the documentation about it? Or, a simple solution might be to replace any special characters in the secret key names with underscores and then document that convention?

@zc-devs
Copy link
Contributor Author

zc-devs commented May 3, 2024

Could you provide an example?

  1. Secret.
  2. Build tool (kaniko, buildx, etc.) and its configuration.

I use kaniko debug image and plain secret:

    secrets:
      - docker_usr
      - docker_pwd

kaniko requires Docker auth file in /kaniko/.docker/config.json, so I create this file manually:

DOCKER_AUTHS=$(printf '{"auths":{"%s":{"auth":"%s"}}}' "$REGISTRY" "$AUTH")
printf '%s' "$DOCKER_AUTHS" > "/kaniko/.docker/config.json"

In my use-case it could be requirements:

  1. Existing dockerconfigjson secret
  2. Mount as file to /kaniko/.docker/config.json

Current implementation treat .dockerconfigjson as env var. Suppose it is DOCKER_AUTHS instead. What do you do next? Do you write it in a file and point your build tool to it?

@dominic-p
Copy link
Contributor

Thanks for the detailed feedback.

Here's an example secret from my cluster:

apiVersion: v1
type: kubernetes.io/dockerconfigjson
kind: Secret
metadata:
  name: reg-cred
  namespace: woodpcker
data:
  .dockerconfigjson: <base64 encoded JSON auth file here>

And, here's a portion of the build script that would use it. I'm using buildah to build my container images via a standard shell script.

#!/bin/sh

# Create a working container
dev=$(buildah from docker.io/alpine)

# ... build the image

# Save credentials in temporary file

# You would like to do something like this, but, of course, it won't work
# echo "$.dockerconfigjson" > /tmp/.dockerconfigjson

printenv ".dockerconfigjson" > /tmp/.dockerconfigjson

# Save and push the image to our local registry
buildah commit $dev "$name"

buildah push --authfile /tmp/.dockerconfigjson "$name" "docker://$registry_url/$name"

So, the simplest workflow for me is to simply dump the reg-cred secret data into a temporary file and then reference it as shown above.

Of course, I could use a a regular Opaque secret and build the docker config JSON as you showed in your example (or reference the username and password with buildah push --creds), but since I already have the JSON in an existing secret it would be nice to leverage it. One benefit of doing it this way is that Kubernetes requires you to use this kind of secret in spec.imagePullSecrets. So, I can use the same secret to push to the local registry and pull from it.

At the end of the day, this is not a big deal. There are many usable workarounds. I just wanted to point out the awkwardness that you get when you wind up with an env variable that has a dot in its name.

@zc-devs
Copy link
Contributor Author

zc-devs commented May 6, 2024

Thanks for explanation. This PR have to be reworked then. Meantime I move it to a draft.

@zc-devs zc-devs marked this pull request as draft May 6, 2024 18:54
@dominic-p
Copy link
Contributor

Sure thing. My personal preference would be to release this as-is and then iterate from there. Even in its current form it's enough for my use case. But, I can understand if you want to wait until it's a bit more complete.

@zc-devs
Copy link
Contributor Author

zc-devs commented May 6, 2024

iterate from there

Sure. But we have to decide on syntax.

# Conflicts:
#	pipeline/backend/kubernetes/kubernetes.go
#	pipeline/backend/kubernetes/pod.go
#	pipeline/backend/kubernetes/pod_test.go
@zc-devs zc-devs marked this pull request as ready for review June 3, 2024 18:06
@zc-devs
Copy link
Contributor Author

zc-devs commented Jun 3, 2024

Agent config:

  WOODPECKER_BACKEND_K8S_ALLOW_NATIVE_SECRETS: 'true'

Secret:

apiVersion: v1
kind: Secret
metadata:
  name: test-secret
  namespace: test-woodpecker-runtime
data:
  AWS_ACCESS_KEY_ID: N0lrZHNzb0xleGFtcGxlNkpJVnZDRXE=
  AWS_SECRET_ACCESS_KEY: TXk0WE5BYXNleGFtcGxldXRKRHNUWHc=
type: Opaque

Pipeline:

skip_clone: true
steps:
  secret-test:
    image: alpine
    commands:
      - echo $$AWS_ACCESS_KEY_ID
      - echo $$AWS_SECRET_ACCESS_KEY
    backend_options:
      kubernetes:
        secrets:
          - name: test-secret

Output:

+ echo $AWS_ACCESS_KEY_ID
7IkdssoLexample6JIVvCEq
+ echo $AWS_SECRET_ACCESS_KEY
My4XNAasexampleutJDsTXw

@qwerty287
Copy link
Contributor

I have some kind of issue with the kubernetes approach of options that could be/are dangerous.

We currently have an env var option for everyone of them, just like WOODPECKER_BACKEND_K8S_ALLOW_NATIVE_SECRETS. The docker backend is doing it differently: You can't use the feature as long as the repo isn't trusted. If it's trusted you can use these features.

I prefer the docker approach. It's configurable from ui and can be set per repo. Also, kubernetes and docker backends should work in a similar way and why do we have the trusted option if we don't use, but rather add new env options?

Yes, I know that this is currently not really possible and we would have to do some refactoring for the backends first, but just wanted to point that out. So nothing to do here, just some discussion (probably it's better to move that to it's own thread).

@dominic-p
Copy link
Contributor

Sure thing. It looks like the pipelines are currently waiting for approval. Once we have a new image built with the latest version of the PR I can test it.

@dominic-p
Copy link
Contributor

I'm not sure why the docker publish failed.

Canceled: grpc: the client connection is closing

Maybe a network error of some kind?

@qwerty287
Copy link
Contributor

qwerty287 commented Jun 21, 2024

Was successful now. @zc-devs please fix the linters: https://ci.woodpecker-ci.org/repos/3780/pipeline/17390/31

@qwerty287
Copy link
Contributor

The formatting is still not successful: https://ci.woodpecker-ci.org/repos/3780/pipeline/17420/31#L230

@zc-devs
Copy link
Contributor Author

zc-devs commented Jun 21, 2024

File is not gci-ed with --skip-generated -s standard -s default -s prefix(go.woodpecker-ci.org/woodpecker) --custom-order (gci)

Which command should I run?

@qwerty287
Copy link
Contributor

That's the import order/grouping. You can do that manually, never did that with a command. I can give you more details what you have to fix tomorrow

@6543 6543 enabled auto-merge (squash) June 22, 2024 16:06
@lafriks
Copy link
Contributor

lafriks commented Jun 22, 2024

Might be a bit late to the party but just a question why we do not implement defining such secrets in woodpecker secret section where instead of value there would be option to provide where to get secret value from (be it k8s secret, hashicorp vault etc) and then in pipeline just define secret as we already do.
With adding more and more runner specific options to pipeline syntax it will become less portable and harder to use

@6543
Copy link
Member

6543 commented Jun 22, 2024

☝️ if there is an api / interface for it - that would be best

I remember to have created an issue: "add more secret provider" or so ...

@6543
Copy link
Member

6543 commented Jun 22, 2024

anyway that's still a good enouth solution for now, and later we can move this into a more generic solution if it exists

@anbraten
Copy link
Member

☝️ if there is an api / interface for it - that would be best

#3349

@lafriks
Copy link
Contributor

lafriks commented Jun 22, 2024

In this case this probably can't be received at server side, it would still be for agent to bind when starting step so process would still be the same, my main point is that adding such definitions to pipeline makes them hard to maintain if things changes in future, so my suggestion would be just moving definition to server side but resolving value in this case would be still be on specific agent runner (like docker would not still be able to resolve k8s secrets)

Copy link
Contributor

@qwerty287 qwerty287 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should fix gci

pipeline/backend/kubernetes/secrets.go Outdated Show resolved Hide resolved
pipeline/backend/kubernetes/secrets_test.go Outdated Show resolved Hide resolved
@6543 6543 merged commit 7bc38a1 into woodpecker-ci:main Jun 23, 2024
7 checks passed
@zc-devs zc-devs deleted the 3582-k8s-secrets-p1 branch June 23, 2024 16:42
@woodpecker-bot
Copy link
Collaborator

@woodpecker-bot woodpecker-bot mentioned this pull request Jun 22, 2024
1 task
6543 pushed a commit that referenced this pull request Jul 18, 2024
## [2.7.0](https://github.com/woodpecker-ci/woodpecker/releases/tag/v2.7.0) - 2024-07-18

### 🔒 Security

- Add blocklist of environment variables who could alter execution of plugins [[#3934](#3934)]
- Make sure plugins only mount the workspace base in a predefinde location [[#3933](#3933)]
- Disallow to set arbitrary environments for plugins [[#3909](#3909)]
- Use proper oauth state [[#3847](#3847)]
- Enhance token checking [[#3842](#3842)]
- Bump github.com/hashicorp/go-retryablehttp v0.7.5 -> v0.7.7 [[#3834](#3834)]

### ✨ Features

- Gracefully shutdown server [[#3896](#3896)]
- Gracefully shutdown agent [[#3895](#3895)]
- Convert urls in logs to links  [[#3904](#3904)]
- Allow login using multiple forges [[#3822](#3822)]
- Global and organization registries [[#1672](#1672)]
- Cli get repo from git remote [[#3830](#3830)]
- Add api for forges [[#3733](#3733)]

### 📈 Enhancement

- Cli fix pipeline logs [[#3913](#3913)]
- Migrate to github.com/urfave/cli/v3 [[#2951](#2951)]
- Allow to change the working directory also for plugins and services [[#3914](#3914)]
- Remove `unplugin-icons` [[#3809](#3809)]
- Release windows binaries as zip file [[#3906](#3906)]
- Convert to openapi 3.0 [[#3897](#3897)]
- Enhance pipeline list [[#3898](#3898)]
- Add user registries UI [[#3888](#3888)]
- Sort users by login [[#3891](#3891)]
- Exclude dummy backend in production [[#3877](#3877)]
- Fix deploy task env [[#3878](#3878)]
- Get default branch and show message in pipeline list [[#3867](#3867)]
- Add timestamp for last work done by agent [[#3844](#3844)]
- Adjust logger types [[#3859](#3859)]
- Cleanup state reporting [[#3850](#3850)]
- Unify DB tables/columns [[#3806](#3806)]
- Let webhook pass on pipeline parsing error [[#3829](#3829)]
- Exclude mocks from release build [[#3831](#3831)]
- K8s secrets reference from step [[#3655](#3655)]

### 🐛 Bug Fixes

- Handle empty repositories in gitea when listing PRs [[#3925](#3925)]
- Update alpine package dep for docker images [[#3917](#3917)]
- Don't report error if agent was terminated gracefully [[#3894](#3894)]
- Let agents continuously report their health [[#3893](#3893)]
- Ignore warnings for cli exec [[#3868](#3868)]
- Correct favicon states [[#3832](#3832)]
- Cleanup of the login flow and tests [[#3810](#3810)]
- Fix newlines in logs [[#3808](#3808)]
- Fix authentication error handling [[#3807](#3807)]

### 📚 Documentation

- Streamline docs for new users [[#3803](#3803)]
- Add mastodon verification [[#3843](#3843)]
- chore(deps): update docs npm deps non-major [[#3837](#3837)]
- fix(deps): update docs npm deps non-major [[#3824](#3824)]
- Add openSUSE package [[#3800](#3800)]
- chore(deps): update docs npm deps non-major [[#3798](#3798)]
- Add "Docker Tags" Plugin [[#3796](#3796)]
- chore(deps): update dependency marked to v13 [[#3792](#3792)]
- chore: fix some comments [[#3788](#3788)]

### Misc

- chore(deps): update web npm deps non-major [[#3930](#3930)]
- chore(deps): update dependency vitest to v2 [[#3905](#3905)]
- fix(deps): update module github.com/google/go-github/v62 to v63 [[#3910](#3910)]
- chore(deps): update docker.io/woodpeckerci/plugin-docker-buildx docker tag to v4.1.0 [[#3908](#3908)]
- Update plugin-git and add renovate trigger [[#3901](#3901)]
- chore(deps): update docker.io/mstruebing/editorconfig-checker docker tag to v3.0.3 [[#3903](#3903)]
- fix(deps): update golang-packages [[#3875](#3875)]
- chore(deps): lock file maintenance [[#3876](#3876)]
- [pre-commit.ci] pre-commit autoupdate [[#3862](#3862)]
- Add dummy backend [[#3820](#3820)]
- chore(deps): update dependency replace-in-file to v8 [[#3852](#3852)]
- Update forgejo sdk [[#3840](#3840)]
- chore(deps): lock file maintenance [[#3838](#3838)]
- Allow to set dist dir using env var [[#3814](#3814)]
- chore(deps): lock file maintenance [[#3805](#3805)]
- chore(deps): update docker.io/lycheeverse/lychee docker tag to v0.15.1 [[#3797](#3797)]
@woodpecker-bot woodpecker-bot mentioned this pull request Jul 19, 2024
1 task
6543 pushed a commit to 6543-forks/woodpecker that referenced this pull request Sep 5, 2024
6543 pushed a commit to 6543-forks/woodpecker that referenced this pull request Sep 5, 2024
## [2.7.0](https://github.com/woodpecker-ci/woodpecker/releases/tag/v2.7.0) - 2024-07-18

### 🔒 Security

- Add blocklist of environment variables who could alter execution of plugins [[woodpecker-ci#3934](woodpecker-ci#3934)]
- Make sure plugins only mount the workspace base in a predefinde location [[woodpecker-ci#3933](woodpecker-ci#3933)]
- Disallow to set arbitrary environments for plugins [[woodpecker-ci#3909](woodpecker-ci#3909)]
- Use proper oauth state [[woodpecker-ci#3847](woodpecker-ci#3847)]
- Enhance token checking [[woodpecker-ci#3842](woodpecker-ci#3842)]
- Bump github.com/hashicorp/go-retryablehttp v0.7.5 -> v0.7.7 [[woodpecker-ci#3834](woodpecker-ci#3834)]

### ✨ Features

- Gracefully shutdown server [[woodpecker-ci#3896](woodpecker-ci#3896)]
- Gracefully shutdown agent [[woodpecker-ci#3895](woodpecker-ci#3895)]
- Convert urls in logs to links  [[woodpecker-ci#3904](woodpecker-ci#3904)]
- Allow login using multiple forges [[woodpecker-ci#3822](woodpecker-ci#3822)]
- Global and organization registries [[woodpecker-ci#1672](woodpecker-ci#1672)]
- Cli get repo from git remote [[woodpecker-ci#3830](woodpecker-ci#3830)]
- Add api for forges [[woodpecker-ci#3733](woodpecker-ci#3733)]

### 📈 Enhancement

- Cli fix pipeline logs [[woodpecker-ci#3913](woodpecker-ci#3913)]
- Migrate to github.com/urfave/cli/v3 [[woodpecker-ci#2951](woodpecker-ci#2951)]
- Allow to change the working directory also for plugins and services [[woodpecker-ci#3914](woodpecker-ci#3914)]
- Remove `unplugin-icons` [[woodpecker-ci#3809](woodpecker-ci#3809)]
- Release windows binaries as zip file [[woodpecker-ci#3906](woodpecker-ci#3906)]
- Convert to openapi 3.0 [[woodpecker-ci#3897](woodpecker-ci#3897)]
- Enhance pipeline list [[woodpecker-ci#3898](woodpecker-ci#3898)]
- Add user registries UI [[woodpecker-ci#3888](woodpecker-ci#3888)]
- Sort users by login [[woodpecker-ci#3891](woodpecker-ci#3891)]
- Exclude dummy backend in production [[woodpecker-ci#3877](woodpecker-ci#3877)]
- Fix deploy task env [[woodpecker-ci#3878](woodpecker-ci#3878)]
- Get default branch and show message in pipeline list [[woodpecker-ci#3867](woodpecker-ci#3867)]
- Add timestamp for last work done by agent [[woodpecker-ci#3844](woodpecker-ci#3844)]
- Adjust logger types [[woodpecker-ci#3859](woodpecker-ci#3859)]
- Cleanup state reporting [[woodpecker-ci#3850](woodpecker-ci#3850)]
- Unify DB tables/columns [[woodpecker-ci#3806](woodpecker-ci#3806)]
- Let webhook pass on pipeline parsing error [[woodpecker-ci#3829](woodpecker-ci#3829)]
- Exclude mocks from release build [[woodpecker-ci#3831](woodpecker-ci#3831)]
- K8s secrets reference from step [[woodpecker-ci#3655](woodpecker-ci#3655)]

### 🐛 Bug Fixes

- Handle empty repositories in gitea when listing PRs [[woodpecker-ci#3925](woodpecker-ci#3925)]
- Update alpine package dep for docker images [[woodpecker-ci#3917](woodpecker-ci#3917)]
- Don't report error if agent was terminated gracefully [[woodpecker-ci#3894](woodpecker-ci#3894)]
- Let agents continuously report their health [[woodpecker-ci#3893](woodpecker-ci#3893)]
- Ignore warnings for cli exec [[woodpecker-ci#3868](woodpecker-ci#3868)]
- Correct favicon states [[woodpecker-ci#3832](woodpecker-ci#3832)]
- Cleanup of the login flow and tests [[woodpecker-ci#3810](woodpecker-ci#3810)]
- Fix newlines in logs [[woodpecker-ci#3808](woodpecker-ci#3808)]
- Fix authentication error handling [[woodpecker-ci#3807](woodpecker-ci#3807)]

### 📚 Documentation

- Streamline docs for new users [[woodpecker-ci#3803](woodpecker-ci#3803)]
- Add mastodon verification [[woodpecker-ci#3843](woodpecker-ci#3843)]
- chore(deps): update docs npm deps non-major [[woodpecker-ci#3837](woodpecker-ci#3837)]
- fix(deps): update docs npm deps non-major [[woodpecker-ci#3824](woodpecker-ci#3824)]
- Add openSUSE package [[woodpecker-ci#3800](woodpecker-ci#3800)]
- chore(deps): update docs npm deps non-major [[woodpecker-ci#3798](woodpecker-ci#3798)]
- Add "Docker Tags" Plugin [[woodpecker-ci#3796](woodpecker-ci#3796)]
- chore(deps): update dependency marked to v13 [[woodpecker-ci#3792](woodpecker-ci#3792)]
- chore: fix some comments [[woodpecker-ci#3788](woodpecker-ci#3788)]

### Misc

- chore(deps): update web npm deps non-major [[woodpecker-ci#3930](woodpecker-ci#3930)]
- chore(deps): update dependency vitest to v2 [[woodpecker-ci#3905](woodpecker-ci#3905)]
- fix(deps): update module github.com/google/go-github/v62 to v63 [[woodpecker-ci#3910](woodpecker-ci#3910)]
- chore(deps): update docker.io/woodpeckerci/plugin-docker-buildx docker tag to v4.1.0 [[woodpecker-ci#3908](woodpecker-ci#3908)]
- Update plugin-git and add renovate trigger [[woodpecker-ci#3901](woodpecker-ci#3901)]
- chore(deps): update docker.io/mstruebing/editorconfig-checker docker tag to v3.0.3 [[woodpecker-ci#3903](woodpecker-ci#3903)]
- fix(deps): update golang-packages [[woodpecker-ci#3875](woodpecker-ci#3875)]
- chore(deps): lock file maintenance [[woodpecker-ci#3876](woodpecker-ci#3876)]
- [pre-commit.ci] pre-commit autoupdate [[woodpecker-ci#3862](woodpecker-ci#3862)]
- Add dummy backend [[woodpecker-ci#3820](woodpecker-ci#3820)]
- chore(deps): update dependency replace-in-file to v8 [[woodpecker-ci#3852](woodpecker-ci#3852)]
- Update forgejo sdk [[woodpecker-ci#3840](woodpecker-ci#3840)]
- chore(deps): lock file maintenance [[woodpecker-ci#3838](woodpecker-ci#3838)]
- Allow to set dist dir using env var [[woodpecker-ci#3814](woodpecker-ci#3814)]
- chore(deps): lock file maintenance [[woodpecker-ci#3805](woodpecker-ci#3805)]
- chore(deps): update docker.io/lycheeverse/lychee docker tag to v0.15.1 [[woodpecker-ci#3797](woodpecker-ci#3797)]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
backend/kubernetes build_pr_images If set, the CI will build images for this PR and push to Dockerhub enhancement improve existing features
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants