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

Make agent usable for external backends #3270

Merged
merged 9 commits into from
Feb 8, 2024

Conversation

qwerty287
Copy link
Contributor

@qwerty287 qwerty287 commented Jan 24, 2024

Currently, you can extend agents with custom backends using go plugins (addons).

With #3268, this is migrated to RPC.

I don't think it's a good idea to use hashicorp go-plugins in the agent because they us RPC, but the agent uses gRPC too. So it's kinda duplicated.

Thus, I had the idea in this PR: Allow to import the agent as external package and run it with custom backends:

package main

import (
	"go.woodpecker-ci.org/woodpecker/v2/cmd/agent/core"
)

func main() {
	core.RunAgent(<your backend>)
}

This takes care of everything else and allows you to easily develop your own backend.

This replaces the addon approach for backends.

@qwerty287 qwerty287 added agent refactor delete or replace old code labels Jan 24, 2024
@anbraten
Copy link
Member

anbraten commented Jan 24, 2024

Instead of compiling all backends (currently docker, local, kubernetes) into one agent and allowing to select at runtime using env var, only compile one backend which is then automatically executed.

I am not sure about that point. Sure it would be a bit smaller (afaik it isn't that large anyways), but the maintenance overhead for us (building, releasing, adjusting them, ...) separatley and for instance admins (downloading the correct agent, upps I got the wrong agent ...) could be expected to increase quite a bit.

I don't think it's a good idea to use hashicorp go-plugins in the agent because they us RPC, but the agent uses gRPC too. So it's kinda duplicated.

However both connections use totally different settings, scopes etc. I think we could allow custom agents to reuse the official agent code as a lib they can hook into, but would leave the standard agent as it is.

@qwerty287
Copy link
Contributor Author

I am not sure about that point. Sure it would be a bit smaller (afaik it isn't that large anyways), but the maintenance overhead for us (building, releasing, adjusting them, ...) and for instance admins (downloading the correct agent, upps I got the wrong agent ...) could be expected to increase quite a bit.

Fine, I can undo it (if more people respond).

However both connections use totally different settings, scopes etc. I think we could allow custom agents to reuse the official agent code as a lib they can hook into, but would leave the standard agent as it is.

So you say it would also be fine to connect the backend via RPC to agent?

@anbraten
Copy link
Member

So you say it would also be fine to connect the backend via RPC to agent?

That could also work, but I was mainly referring to the idea that the agent could also be use a lib. Where someone could add their own backend as well.

Apart from that are there currently any attempts to add a custom backend?

@qwerty287
Copy link
Contributor Author

Apart from that are there currently any attempts to add a custom backend?

Not that I know of, but we have many open issues with new backends used only by a few users.

@qwerty287 qwerty287 changed the title Make agent usable for external backends and only compile one backend Make agent usable for external backends Jan 28, 2024
@woodpecker-bot
Copy link
Collaborator

woodpecker-bot commented Jan 28, 2024

Deployment of preview was successful: https://woodpecker-ci-woodpecker-pr-3270.surge.sh

Copy link

codecov bot commented Jan 28, 2024

Codecov Report

Attention: 6 lines in your changes are missing coverage. Please review.

Comparison is base (5cedc95) 35.74% compared to head (485b6de) 36.31%.
Report is 2 commits behind head on main.

Files Patch % Lines
pipeline/backend/docker/docker.go 0.00% 2 Missing ⚠️
pipeline/backend/kubernetes/kubernetes.go 0.00% 2 Missing ⚠️
pipeline/backend/local/local.go 0.00% 2 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #3270      +/-   ##
==========================================
+ Coverage   35.74%   36.31%   +0.56%     
==========================================
  Files         227      223       -4     
  Lines       15107    14796     -311     
==========================================
- Hits         5400     5373      -27     
+ Misses       9308     9031     -277     
+ Partials      399      392       -7     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@qwerty287 qwerty287 marked this pull request as ready for review January 28, 2024 13:51
@qwerty287 qwerty287 requested a review from a team January 28, 2024 13:51
@qwerty287 qwerty287 modified the milestones: 2.3.0, 2.4.0 Jan 28, 2024
@qwerty287
Copy link
Contributor Author

@anbraten I removed the part to only support one backend. It's possible now to create an own custom agent with as many backends you want, selectable via env var.

@qwerty287 qwerty287 merged commit f92f8b1 into woodpecker-ci:main Feb 8, 2024
7 of 8 checks passed
@qwerty287 qwerty287 deleted the modular-agent branch February 8, 2024 15:33
@woodpecker-bot woodpecker-bot mentioned this pull request Feb 8, 2024
1 task
anbraten added a commit that referenced this pull request Mar 19, 2024
## [2.4.0](https://github.com/woodpecker-ci/woodpecker/releases/tag/2.4.0) - 2024-03-19

### 🔒 Security

- Improve security context handling
[[#3482](#3482)]
- fix(deps): update module github.com/moby/moby to v24.0.9+incompatible
[[#3323](#3323)]

### ✨ Features

- Cli setup command
[[#3384](#3384)]
- Add bitbucket datacenter (server) support
[[#2503](#2503)]
- Cli updater
[[#3382](#3382)]

### 📚 Documentation

- Delete docs for v0.15.x
[[#3508](#3508)]
- Add deployment plugin
[[#3495](#3495)]
- Bump follow-redirects and fix broken anchors
[[#3488](#3488)]
- fix: plugin doc page not found
[[#3480](#3480)]
- Documentation improvements
[[#3376](#3376)]
- fix(deps): update docs npm deps non-major
[[#3455](#3455)]
- Add "Sonatype Nexus" plugin
[[#3446](#3446)]
- Add blog post
[[#3439](#3439)]
- Add "Gradle Wrapper Validation" plugin
[[#3435](#3435)]
- Add blog post
[[#3410](#3410)]
- Extend core ideas documentation
[[#3405](#3405)]
- docs: fix contributions link
[[#3363](#3363)]
- Update/fix some docs
[[#3359](#3359)]
- chore(deps): update dependency marked to v12
[[#3325](#3325)]

### 🐛 Bug Fixes

- Fix skip setup for some general cli commands
[[#3498](#3498)]
- Move generic agent flags to cmd/agent/core
[[#3484](#3484)]
- Fix usage of WOODPECKER_DATABASE_DATASOURCE_FILE
[[#3404](#3404)]
- Set pull-request id and labels on pr-closed event
[[#3442](#3442)]
- Update org name on login
[[#3409](#3409)]
- Do not alter secret key upper-/lowercase
[[#3375](#3375)]
- fix: can't run multiple services on k8s
[[#3395](#3395)]
- Fix agent polling
[[#3378](#3378)]
- Remove empty strings from slice before parsing agent config
[[#3387](#3387)]
- Set correct link for commit
[[#3368](#3368)]
- Fix schema links
[[#3369](#3369)]
- Fix correctly handle gitlab pr closed events
[[#3362](#3362)]
- fix: update schema event_enum to remove error warning when.event
[[#3357](#3357)]
- Fix version check on next
[[#3340](#3340)]
- Ignore gitlab merge request events without code changes
[[#3338](#3338)]
- Ignore gitlab push events without commits
[[#3339](#3339)]
- Consider gitlab inherited permissions
[[#3308](#3308)]
- fix: agent panic when node is terminated during step execution
[[#3331](#3331)]

### 📈 Enhancement

- Enable golangci linter gomnd
[[#3171](#3171)]
- Apply "grpcnotrace" go build tag
[[#3448](#3448)]
- Simplify store interfaces
[[#3437](#3437)]
- Deprecate alternative names on secrets
[[#3406](#3406)]
- Store workflows/steps for blocked pipeline
[[#2757](#2757)]
- Parse email from Gitea webhook
[[#3420](#3420)]
- Replace http types on forge interface
[[#3374](#3374)]
- Prevent agent deletion when it's still running tasks
[[#3377](#3377)]
- Refactor internal services
[[#915](#915)]
- Lint for event filter and deprecate `exclude`
[[#3222](#3222)]
- Allow editing all environment variables in pipeline popups
[[#3314](#3314)]
- Parse backend options in backend
[[#3227](#3227)]
- Make agent usable for external backends
[[#3270](#3270)]
- Add no branches text
[[#3312](#3312)]
- Add loading spinner to repo list
[[#3310](#3310)]

### Misc

- Post on mastodon when releasing a new version
[[#3509](#3509)]
- chore(deps): update dependency alpine_3_18/ca-certificates to
v20240226
[[#3501](#3501)]
- fix(deps): update module github.com/google/go-github/v59 to v60
[[#3493](#3493)]
- fix(deps): update dependency @intlify/unplugin-vue-i18n to v3
[[#3492](#3492)]
- chore(deps): update dependency vue-tsc to v2
[[#3491](#3491)]
- chore(deps): update dependency eslint-config-airbnb-typescript to v18
[[#3490](#3490)]
- chore(deps): update web npm deps non-major
[[#3489](#3489)]
- fix(deps): update golang (packages)
[[#3486](#3486)]
- fix(deps): update module google.golang.org/protobuf to v1.33.0
[security]
[[#3487](#3487)]
- chore(deps): update docker.io/techknowlogick/xgo docker tag to
go-1.22.1
[[#3476](#3476)]
- chore(deps): update docker.io/golang docker tag to v1.22.1
[[#3475](#3475)]
- Update prettier version
[[#3471](#3471)]
- chore(deps): update woodpeckerci/plugin-ready-release-go docker tag to
v1.1.0 [[#3464](#3464)]
- chore(deps): lock file maintenance
[[#3465](#3465)]
- chore(deps): update postgres docker tag to v16.2
[[#3461](#3461)]
- chore(deps): update lycheeverse/lychee docker tag to v0.14.3
[[#3429](#3429)]
- fix(deps): update golang (packages)
[[#3430](#3430)]
- More `when` filters
[[#3407](#3407)]
- Apply `documentation`/`ui` label to corresponding renovate updates
[[#3400](#3400)]
- chore(deps): update dependency eslint-plugin-simple-import-sort to v12
[[#3396](#3396)]
- chore(deps): update typescript-eslint monorepo to v7 (major)
[[#3397](#3397)]
- fix(deps): update module github.com/google/go-github/v58 to v59
[[#3398](#3398)]
- chore(deps): update docker.io/techknowlogick/xgo docker tag to
go-1.22.0
[[#3392](#3392)]
- chore(deps): update docker.io/golang docker tag
[[#3391](#3391)]
- fix(deps): update golang (packages)
[[#3393](#3393)]
- chore(deps): update docker.io/woodpeckerci/plugin-docker-buildx docker
tag to v3.1.0
[[#3394](#3394)]
- Add link checking
[[#3371](#3371)]
- Apply `dependencies` label to all PRs
[[#3358](#3358)]
- chore(deps): update docker.io/woodpeckerci/plugin-docker-buildx docker
tag to v3.0.1
[[#3324](#3324)]

---------

Co-authored-by: 6543 <m.huber@kithara.com>
Co-authored-by: Anbraten <6918444+anbraten@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
agent refactor delete or replace old code
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants