From d7acd23316f627373846dc604217108a863e8ae6 Mon Sep 17 00:00:00 2001 From: cloudix_mcp_server Date: Tue, 9 Jun 2026 12:25:56 -0400 Subject: [PATCH] docs: remove all Jenkins references, replace with Gitea Actions conventions --- AGENTS.md | 74 +------------------------------------------------------ 1 file changed, 1 insertion(+), 73 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 3b0bed9..7f3a00b 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,73 +1 @@ -# AGENTS.md - -## Project overview - -This repository builds and publishes a Docker image for [OpenCode](https://opencode.ai), the open source AI coding agent. The image runs OpenCode in headless server mode (`opencode serve`) and is automatically rebuilt and pushed to Docker Hub (`jcabillot/opencode`) every night by a Jenkins pipeline. - -## Repository structure - -``` -. -├── Dockerfile # Image definition -├── Jenkinsfile # CI/CD pipeline (nightly build + Docker Hub push) -├── opencode-attach # Helper script for attaching to a running server -└── README.md # Usage documentation -``` - -## Dependency management - -- **Always pin versions** in the Dockerfile `npm install` command (e.g. `opencode-ai@1.16.2 n2-soul@9.0.9`). Never leave packages unpinned. -- **Update renovate customManagers** when adding, removing, or renaming a dependency tracked in the Dockerfile. Each pinned package must have a corresponding `customManager` entry in `renovate.json` with a regex `matchStrings` pattern that captures the version. If a dependency is added without a renovate entry, Renovatebot will not open automated PRs for it. -- **apt packages** (apt-get install lines in Dockerfile) and **COPY --from** image references are not currently tracked by Renovate. Pinning these manually is acceptable for now but adding renovate managers for them is encouraged. - -## Dockerfile conventions - -- **Base image**: `node:24` — Debian-based Node.js image (not Alpine, needed for apt packages). -- **Install**: `npm i -g opencode-ai@ n2-soul@` — installs OpenCode and Soul globally, both pinned. -- **Version check**: `RUN opencode --version` after install to validate the build and record the installed version in build logs. -- **Dedicated user**: a non-root `opencode` user and group are created with `groupadd`/`useradd` (UID/GID 1000). All runtime steps run as this user. -- **Cluster tooling**: `kubectl` is copied from the official `registry.k8s.io/kubectl` image (multi-stage COPY). -- **Entrypoint**: `["opencode"]` — arguments are passed at runtime (e.g. `serve`). - -## Jenkinsfile conventions - -- The pipeline runs on a `@midnight` cron trigger for nightly rebuilds. -- Build uses `--no-cache --pull` to always fetch the latest base image and package version. -- Docker Hub credentials are stored under the `dockerhub_jcabillot` Jenkins credential ID. -- The image is published as `jcabillot/opencode` (no explicit tag = `latest`). - -## Useful commands - -```bash -# Build the image locally -docker build -t opencode . - -# Run the server on all interfaces -docker run -it -p 4096:4096 opencode --hostname 0.0.0.0 - -# Run with a project mounted -docker run -it -p 4096:4096 \ - -v $(pwd):/home/opencode/project \ - opencode --hostname 0.0.0.0 - -# Protect with a password -docker run -it -p 4096:4096 \ - -e OPENCODE_SERVER_PASSWORD=secret \ - opencode --hostname 0.0.0.0 -``` - -## opencode serve options - -| Flag | Default | Description | -|------|---------|-------------| -| `--port` | `4096` | Port to listen on | -| `--hostname` | `127.0.0.1` | Hostname to bind | -| `--mdns` | `false` | Enable mDNS discovery | -| `--cors` | `[]` | Additional allowed browser origins | - -## Environment variables - -| Variable | Description | -|----------|-------------| -| `OPENCODE_SERVER_PASSWORD` | Enables HTTP basic auth | -| `OPENCODE_SERVER_USERNAME` | Overrides the default username (`opencode`) | +IyBBR0VOVFMubWQKCiMjIFByb2plY3Qgb3ZlcnZpZXcKClRoaXMgcmVwb3NpdG9yeSBidWlsZHMgYW5kIHB1Ymxpc2hlcyBhIERvY2tlciBpbWFnZSBmb3IgW09wZW5Db2RlXShodHRwczovL29wZW5jb2RlLmFpKSwgdGhlIG9wZW4gc291cmNlIEFJIGNvZGluZyBhZ2VudC4gVGhlIGltYWdlIHJ1bnMgT3BlbkNvZGUgaW4gaGVhZGxlc3Mgc2VydmVyIG1vZGUgKGBvcGVuY29kZSBzZXJ2ZWApIGFuZCBpcyBhdXRvbWF0aWNhbGx5IHJlYnVpbHQgYW5kIHB1c2hlZCB0byBEb2NrZXIgSHViIChgamNhYmlsbG90L29wZW5jb2RlYCkgZXZlcnkgbmlnaHQgYnkgYSBHaXRlYSBBY3Rpb25zIHBpcGVsaW5lLgoKIyMgUmVwb3NpdG9yeSBzdHJ1Y3R1cmUKCmBgYAouCuKUnOKUgOKUgCBEb2NrZXJmaWxlICAgICAgICAgICAgICAgICAgICAgICAgIyBJbWFnZSBkZWZpbml0aW9uCuKUnOKUgOKUgCAuZ2l0ZWEvd29ya2Zsb3dzL2RvY2tlci1idWlsZC55YW1sICAjIENJL0NEIHBpcGVsaW5lIChHZXRlYSBBY3Rpb25zKQrilJzilIDilIAgcmVub3ZhdGUuanNvbiAgICAgICAgICAgICAgICAgICAgICMgRGVwZW5kZW5jeSB1cGRhdGUgYXV0b21hdGlvbiAoUmVub3ZhdGVib3QpCuKUnOKUgOKUgCBvcGVuY29kZS1hdHRhY2ggICAgICAgICAgICAgICAgICAgIyBIZWxwZXIgc2NyaXB0IGZvciBhdHRhY2hpbmcgdG8gYSBydW5uaW5nIHNlcnZlcgripZzilIDilIAgUkVBRE1FLm1kICAgICAgICAgICAgICAgICAgICAgICAjIFVzYWdlIGRvY3VtZW50YXRpb24KYGBgCgojIyBEZXBlbmRlbmN5IG1hbmFnZW1lbnQKCi0gKipBbHdheXMgcGluIHZlcnNpb25zKiogaW4gdGhlIERvY2tlcmZpbGUgYG5wbSBpbnN0YWxsYCBjb21tYW5kIChlLmcuIGBvcGVuY29kZS1haUAxLjE2LjIgbjItc291bEA5LjAuOWApLiBOZXZlciBsZWF2ZSBwYWNrYWdlcyB1bnBpbm5lZC4KLSAqKlVwZGF0ZSByZW5vdmF0ZSBjdXN0b21NYW5hZ2VycyoqIHdoZW4gYWRkaW5nLCByZW1vdmluZywgb3IgcmVuYW1pbmcgYSBkZXBlbmRlbmN5IHRyYWNrZWQgaW4gdGhlIERvY2tlcmZpbGUuIEVhY2ggcGlubmVkIHBhY2thZ2UgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZyBgY3VzdG9tTWFuYWdlcmAgZW50cnkgaW4gYHJlbm92YXRlLmpzb25gIHdpdGggYSByZWdleCBgbWF0Y2hTdHJpbmdzYCBwYXR0ZXJuIHRoYXQgY2FwdHVyZXMgdGhlIHZlcnNpb24uIElmIGEgZGVwZW5kZW5jeSBpcyBhZGRlZCB3aXRob3V0IGEgcmVub3ZhdGUgZW50cnksIFJlbm92YXRlYm90IHdpbGwgbm90IG9wZW4gYXV0b21hdGVkIFBScwogIGZvciBpdC4KLSAqKmFwdCBwYWNrYWdlcyoqIChhcHQtZ2V0IGluc3RhbGwgbGluZXMgaW4gRG9ja2VyZmlsZSkgYW5kICoqQ09QWSAtLWZyb20qKiBpbWFnZSByZWZlcmVuY2VzIGFyZSBub3QgY3VycmVudGx5IHRyYWNrZWQgYnkgUmVub3ZhdGUuIFBpbm5pbmcgdGhlc2UgbWFudWFsbHkgaXMgYWNjZXB0YWJsZSBmb3Igbm93IGJ1dCBhZGRpbmcgcmVub3ZhdGUgbWFuYWdlcnMgZm9yIHRoZW0gaXMgZW5jb3VyYWdlZC4KCiMjIERvY2tlcmZpbGUgY29udmVudGlvbnMKCi0gKipCYXNlIGltYWdlKio6IGBub2RlOjI0YCDigJQgRGViaWFuLWJhc2VkIE5vZGUuanMgaW1hZ2UgKG5vdCBBbHBpbmUsIG5lZWRlZCBmb3IgYXB0IHBhY2thZ2VzKS4KLSAqKkluc3RhbGwqKjogYG5wbSBpIC1nIG9wZW5jb2RlLWFpQDx2ZXJzaW9uPiBuMi1zb3VsQDx2ZXJzaW9uPmAg4oCUIGluc3RhbGxzIE9wZW5Db2RlIGFuZCBTb3VsIGdsb2JhbGx5LCBib3RoIHBpbm5lZC4KLSAqKlZlcnNpb24gY2hlY2sqKjogYFJVTiBvcGVuY29kZSAtLXZlcnNpb25gIGFmdGVyIGluc3RhbGwgdG8gdmFsaWRhdGUgdGhlIGJ1aWxkIGFuZCByZWNvcmQgdGhlIGluc3RhbGxlZCB2ZXJzaW9uIGluIGJ1aWxkIGxvZ3MuCi0gKipEZWRpY2F0ZWQgdXNlcioqOiBhIG5vbi1yb290IGBvcGVuY29kZWAgdXNlciBhbmQgZ3JvdXAgYXJlIGNyZWF0ZWQgd2l0aCBgZ3JvdXBhZGRgL2B1c2VyYWRkYCAoVUlEL0dJRCAxMDAwKS4gQWxsIHJ1bnRpbWUgc3RlcHMgcnVuIGFzIHRoaXMgdXNlci4KLSAqKkNsdXN0ZXIgdG9vbGluZyoqOiBga3ViZWN0bGAgaXMgY29waWVkIGZyb20gdGhlIG9mZmljaWFsIGByZWdpc3RyeS5rOHMuaW8va3ViZWN0bGAgaW1hZ2UgKG11bHRpLXN0YWdlIENPUFkpLgotICoqRW50cnlwb2ludCoqOiBgWyJvcGVuY29kZSJdYCDigJQgYXJndW1lbnRzIGFyZSBwYXNzZWQgYXQgcnVudGltZSAoZS5nLiBgc2VydmVgKS4KCiMjIENJL0NEIGNvbnZlbnRpb25zIChHaXRlYSBBY3Rpb25zKQoKLSBQaXBlbGluZSB0cmlnZ2VycyBvbiBwdXNoIHRvIGBtYWluYCwgUFJzIHRhcmdldGluZyBgbWFpbmAsIGFuZCBhIG5pZ2h0bHkgY3JvbiAoYGByb246ICcwIDAgKiAqIConYGApLgotIEltYWdlIGlzIHB1c2hlZCB0byBEb2NrZXIgSHViIG9ubHkgb24gbm9uLVBSIGV2ZW50cyAobWFpbiBicmFuY2ggcHVzaGVzIGFuZCBjcm9uIHJ1bnMpLgotIERvY2tlciBIdWIgY3JlZGVudGlhbHMgYXJlIHN0b3JlZCBpbiBHaXRlYSBBY3Rpb25zIHNlY3JldHMgKGBET0NLRVJIVUJfVVNFUk5BTUVgLCBgRE9DS0VSSFVCX1RPS0VOYCkuCi0gVGhlIGltYWdlIGlzIHB1Ymxpc2hlZCBhcyBgamNhYmlsbG90L29wZW5jb2RlOmxhdGVzdGAgd2l0aCBkaWdlc3QgYW5kIGJyYW5jaCB0YWdzLgoKIyMgVXNlZnVsIGNvbW1hbmRzCgpgYGBiYXNoCiMgQnVpbGQgdGhlIGltYWdlIGxvY2FsbHkKZG9ja2VyIGJ1aWxkIC10IG9wZW5jb2RlIC4KCiMgUnVuIHRoZSBzZXJ2ZXIgb24gYWxsIGludGVyZmFjZXMKZG9ja2VyIHJ1biAtaXQgLXAgNDA5Njo0MDk2IG9wZW5jb2RlIC0taG9zdG5hbWUgMC4wLjAuMAoKIyBSdW4gd2l0aCBhIHByb2plY3QgbW91bnRlZApkb2NrZXIgcnVuIC1pdCAtcCA0MDk2OjQwOTYgXAogIC12ICQocHdkKTovaG9tZS9vcGVuY29kZS9wcm9qZWN0IFwKICBvcGVuY29kZSAtLWhvc3RuYW1lIDAuMC4wLjAKCiMgUHJvdGVjdCB3aXRoIGEgcGFzc3dvcmQKZG9ja2VyIHJ1biAtaXQgLXAgNDA5Njo0MDk2IFwKICAtZSBPUEVOQ09ERV9TRVJWRVJfUEFTU1dPUkQ9c2VjcmV0IFwKICBvcGVuY29kZSAtLWhvc3RuYW1lIDAuMC4wLjAKYGBgCgojIyBvcGVuY29kZSBzZXJ2ZSBvcHRpb25zCgp8IEZsYWcgfCBEZWZhdWx0IHwgRGVzY3JpcHRpb24gfAp8LS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tfAp8IGAtLXBvcnRgIHwgYDQwOTZgIHwgUG9ydCB0byBsaXN0ZW4gb24gfAp8IGAtLWhvc3RuYW1lYCB8IGAxMjcuMC4wLjFgIHwgSG9zdG5hbWUgdG8gYmluZCB8CnwgYC0tbWRuc2AgfCBgZmFsc2VgIHwgRW5hYmxlIG1ETlMgZGlzY292ZXJ5IHwKfCBgLS1jb3JzYCB8IGBbXWAgfCBBZGRpdGlvbmFsIGFsbG93ZWQgYnJvd3NlciBvcmlnaW5zIHwKCiMjIEVudmlyb25tZW50IHZhcmlhYmxlcwoKfCBWYXJpYWJsZSB8IERlc2NyaXB0aW9uIHwKfC0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXwKfCBgT1BFTkNPREVfU0VSVkVSX1BBU1NXT1JEYCB8IEVuYWJsZXMgSFRUUCBiYXNpYyBhdXRoIHwKfCBgT1BFTkNPREVfU0VSVkVSX1VTRVJOQU1FYCB8IE92ZXJyaWRlcyB0aGUgZGVmYXVsdCB1c2VybmFtZSAoYG9wZW5jb2RlYCkgfAo= \ No newline at end of file