From 7f71524496b657f0b317781d31b4fb3c4f8fbf18 Mon Sep 17 00:00:00 2001 From: hookenz Date: Wed, 10 Jan 2024 09:47:32 +1300 Subject: [PATCH] use docker run for agent update --- .env.example | 4 ++++ .gitignore | 3 ++- Makefile | 3 +++ Tiltfile | 45 ++++++++++++++++++++++++++++++++++++ docker-compose.yaml | 20 ++++++++++++++++ edge/stack/stack.go | 8 +++++++ exec/docker_compose_stack.go | 16 +++++++++++++ go.mod | 4 ++-- go.sum | 8 +++---- 9 files changed, 104 insertions(+), 7 deletions(-) create mode 100644 .env.example create mode 100644 Tiltfile create mode 100644 docker-compose.yaml diff --git a/.env.example b/.env.example new file mode 100644 index 000000000..56cbdf5da --- /dev/null +++ b/.env.example @@ -0,0 +1,4 @@ +EDGE=1 +EDGE_ID=789e6e1d-9bb5-43ba-8056-49038c5ec008 +EDGE_KEY=aHR0cHM6Ly8xOTIuMTY4LjE2Ny4yMDc6OTQ0M3wxOTIuMTY4LjE2Ny4yMDc6ODAwMHxxTEtraFI4WGk5S1Fhbk5rSnJLZlhyRitHaEw4czE4cjVMUnpDMlRPb2F3PXwz +TZ=Pacific/Auckland diff --git a/.gitignore b/.gitignore index 5fc404e57..b57bed547 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ dist /.vscode/ .idea .DS_Store -go.work.sum \ No newline at end of file +go.work.sum +.env diff --git a/Makefile b/Makefile index e4a3944f0..8149f9d49 100644 --- a/Makefile +++ b/Makefile @@ -33,6 +33,9 @@ credential-helper: ## Build the credential helper (used by edge private registri download-binaries: ## Download dependant binaries @./setup.sh $(PLATFORM) $(ARCH) +dev-container: download-binaries ## Build and start a dev container (requires tilt. http://tilt.dev) + @tilt up + ##@ Dependencies tidy: ## Tidy up the go.mod file diff --git a/Tiltfile b/Tiltfile new file mode 100644 index 000000000..b75870e08 --- /dev/null +++ b/Tiltfile @@ -0,0 +1,45 @@ +local_resource( + 'build_agent', + cmd="make agent", + deps=['*.go', + 'agent.go', + 'build', + 'chisel', + 'cmd', + 'config', + 'constants', + 'crypto', + 'dist', + 'docker', + 'edge', + 'exec', + 'filesystem', + 'ghw', + 'healthcheck', + 'http', + 'internals', + 'kubernetes', + 'net', + 'nomad', + 'os', + 'release.sh', + 'serf', + 'static' + ], + ignore=[ + 'dist', + '/**/*_test.go' + ], +) + +docker_compose('docker-compose.yaml') + +docker_build('portainer-agent', + '.', + only = ['dist', 'build', 'static', 'config'], + dockerfile='build/linux/alpine.Dockerfile', + live_update = [ + sync('./dist', '/app'), + sync('./static', '/app/static'), + restart_container() + ]) diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 000000000..98a05844b --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,20 @@ +# To customize this, add environment options in .env +# see .env.example for example + +version: "3.9" +services: + agent: + image: portainer-agent + container_name: portainer_edge_agent_dev + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - /var/lib/docker/volumes:/var/lib/docker/volumes + - /usr/share/zoneinfo:/usr/share/zoneinfo + - /:/host + - portainer_agent_data:/data + restart: always + env_file: + - .env + +volumes: + portainer_agent_data: diff --git a/edge/stack/stack.go b/edge/stack/stack.go index 735dee1f7..9ec80c2c0 100644 --- a/edge/stack/stack.go +++ b/edge/stack/stack.go @@ -358,6 +358,14 @@ func (manager *StackManager) performActionOnStack(queueSleepInterval time.Durati } } + agentUpgrade := stack.EdgeUpdateID != 0 + if agentUpgrade { + stack.EnvVars = append(stack.EnvVars, portainer.Pair{ + Name: "_agentUpgrade", + Value: "true", + }) + } + manager.deployStack(ctx, stack, stackName, stackFileLocation) case actionDelete: stackFileLocation = fmt.Sprintf("%s/%s", SuccessStackFileFolder(stack.FileFolder), stack.FileName) diff --git a/exec/docker_compose_stack.go b/exec/docker_compose_stack.go index deaf33770..e8a3df9d7 100644 --- a/exec/docker_compose_stack.go +++ b/exec/docker_compose_stack.go @@ -2,10 +2,12 @@ package exec import ( "context" + "slices" "github.com/portainer/agent" libstack "github.com/portainer/portainer/pkg/libstack" "github.com/portainer/portainer/pkg/libstack/compose" + "github.com/rs/zerolog/log" ) // DockerComposeStackService represents a service for managing stacks by using the Docker binary. @@ -30,6 +32,20 @@ func NewDockerComposeStackService(binaryPath string) (*DockerComposeStackService // Deploy executes the docker stack deploy command. func (service *DockerComposeStackService) Deploy(ctx context.Context, name string, filePaths []string, options agent.DeployOptions) error { + + // TODO: this should probably be implemented as an edge job in future. + agentUpgrade := slices.Contains(options.Env, "_agentUpgrade") + if agentUpgrade { + log.Debug().Msgf("Detected portainer agent upgrade") + return service.deployer.Run(ctx, filePaths, "updater", libstack.RunOptions{ + Options: libstack.Options{ + ProjectName: name, + WorkingDir: options.WorkingDir, + Env: options.Env, + }, + }) + } + return service.deployer.Deploy(ctx, filePaths, libstack.DeployOptions{ Options: libstack.Options{ ProjectName: name, diff --git a/go.mod b/go.mod index d2fb7f9c9..a032eadb4 100644 --- a/go.mod +++ b/go.mod @@ -24,7 +24,7 @@ require ( github.com/mitchellh/mapstructure v1.5.0 github.com/opencontainers/image-spec v1.1.0-rc5 github.com/pkg/errors v0.9.1 - github.com/portainer/portainer v0.6.1-0.20231227185441-27e997fe0d1e + github.com/portainer/portainer v0.6.1-0.20240109020621-68dddbabbfaa github.com/rs/zerolog v1.29.0 github.com/wI2L/jsondiff v0.2.0 gopkg.in/alecthomas/kingpin.v2 v2.2.6 @@ -116,7 +116,7 @@ require ( golang.org/x/sys v0.15.0 // indirect golang.org/x/term v0.15.0 // indirect golang.org/x/text v0.14.0 // indirect - golang.org/x/time v0.1.0 // indirect + golang.org/x/time v0.5.0 // indirect golang.org/x/tools v0.16.1 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/protobuf v1.32.0 // indirect diff --git a/go.sum b/go.sum index 5e66315ae..824425826 100644 --- a/go.sum +++ b/go.sum @@ -277,8 +277,8 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/portainer/portainer v0.6.1-0.20231227185441-27e997fe0d1e h1:XWtJUsjPDJ8F2SsYBrPT+M9bleZG3wZx652jzCEB+zo= -github.com/portainer/portainer v0.6.1-0.20231227185441-27e997fe0d1e/go.mod h1:73Zf/oSGvxq8/u0AdmXGWwyiUytLz3LbUygJF3KjgmM= +github.com/portainer/portainer v0.6.1-0.20240109020621-68dddbabbfaa h1:1Khny+FwWWEkY8DYDBeHDCrRuoWlMMxtoQIZ52R22xM= +github.com/portainer/portainer v0.6.1-0.20240109020621-68dddbabbfaa/go.mod h1:L+FcDxUE5tztHmIZd8rCeuPwI15IOPgj7RXRSXTDiks= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= @@ -419,8 +419,8 @@ golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.1.0 h1:xYY+Bajn2a7VBmTM5GikTmnK8ZuX8YgnQCqZpbBNtmA= -golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=