diff --git a/CHANGELOG.md b/CHANGELOG.md index 66473b9..41776da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,10 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [v2.0.0-alpha.16] +- Add `stage.*.container.skip_workspace` boolean parameter to skip mounting the current working directory when using the docker plugin +- Do not pass the PATH and host environment variables to the child docker container + ## [v2.0.0-alpha.14] - Fixes `depends_on` not being respected on modules. diff --git a/examples/terraform/.terraform.lock.hcl b/examples/terraform/.terraform.lock.hcl index eb172d3..5fbce90 100644 --- a/examples/terraform/.terraform.lock.hcl +++ b/examples/terraform/.terraform.lock.hcl @@ -2,20 +2,20 @@ # Manual edits may be lost in future updates. provider "registry.terraform.io/hashicorp/random" { - version = "3.5.1" + version = "3.6.0" hashes = [ - "h1:VSnd9ZIPyfKHOObuQCaKfnjIHRtR7qTw19Rz8tJxm+k=", - "zh:04e3fbd610cb52c1017d282531364b9c53ef72b6bc533acb2a90671957324a64", - "zh:119197103301ebaf7efb91df8f0b6e0dd31e6ff943d231af35ee1831c599188d", - "zh:4d2b219d09abf3b1bb4df93d399ed156cadd61f44ad3baf5cf2954df2fba0831", - "zh:6130bdde527587bbe2dcaa7150363e96dbc5250ea20154176d82bc69df5d4ce3", - "zh:6cc326cd4000f724d3086ee05587e7710f032f94fc9af35e96a386a1c6f2214f", + "h1:R5Ucn26riKIEijcsiOMBR3uOAjuOMfI1x7XvH4P6B1w=", + "zh:03360ed3ecd31e8c5dac9c95fe0858be50f3e9a0d0c654b5e504109c2159287d", + "zh:1c67ac51254ba2a2bb53a25e8ae7e4d076103483f55f39b426ec55e47d1fe211", + "zh:24a17bba7f6d679538ff51b3a2f378cedadede97af8a1db7dad4fd8d6d50f829", + "zh:30ffb297ffd1633175d6545d37c2217e2cef9545a6e03946e514c59c0859b77d", + "zh:454ce4b3dbc73e6775f2f6605d45cee6e16c3872a2e66a2c97993d6e5cbd7055", "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", - "zh:b6d88e1d28cf2dfa24e9fdcc3efc77adcdc1c3c3b5c7ce503a423efbdd6de57b", - "zh:ba74c592622ecbcef9dc2a4d81ed321c4e44cddf7da799faa324da9bf52a22b2", - "zh:c7c5cde98fe4ef1143bd1b3ec5dc04baf0d4cc3ca2c5c7d40d17c0e9b2076865", - "zh:dac4bad52c940cd0dfc27893507c1e92393846b024c5a9db159a93c534a3da03", - "zh:de8febe2a2acd9ac454b844a4106ed295ae9520ef54dc8ed2faf29f12716b602", - "zh:eab0d0495e7e711cca367f7d4df6e322e6c562fc52151ec931176115b83ed014", + "zh:91df0a9fab329aff2ff4cf26797592eb7a3a90b4a0c04d64ce186654e0cc6e17", + "zh:aa57384b85622a9f7bfb5d4512ca88e61f22a9cea9f30febaa4c98c68ff0dc21", + "zh:c4a3e329ba786ffb6f2b694e1fd41d413a7010f3a53c20b432325a94fa71e839", + "zh:e2699bc9116447f96c53d55f2a00570f982e6f9935038c3810603572693712d0", + "zh:e747c0fd5d7684e5bfad8aa0ca441903f15ae7a98a737ff6aca24ba223207e2c", + "zh:f1ca75f417ce490368f047b63ec09fd003711ae48487fba90b4aba2ccf71920e", ] } diff --git a/internal/ci/stage_run.go b/internal/ci/stage_run.go index 2c53759..f04fbad 100644 --- a/internal/ci/stage_run.go +++ b/internal/ci/stage_run.go @@ -498,7 +498,7 @@ func (s *Stage) run(conductor *Conductor, evalCtx *hcl.EvalContext, options ...r envStrings := s.processEnvironmentVariables(conductor, environment, cfg, tmpDir, paramsGo) - cmd, d := s.parseExecCommand(conductor, evalCtx, cfg, envStrings, stream) + cmd, d := s.parseExecCommand(conductor, evalCtx, cfg, stream) diags.Extend(d) if diags.HasErrors() { return diags.Diagnostics() @@ -507,6 +507,7 @@ func (s *Stage) run(conductor *Conductor, evalCtx *hcl.EvalContext, options ...r logger.Tracef("script: %.30s... ", cmd.String()) if s.Container == nil { + cmd.Env = append(os.Environ(), envStrings...) s.process = cmd logger.Tracef("running command: %.30s...", cmd.String()) if !cfg.Behavior.DryRun { @@ -520,6 +521,7 @@ func (s *Stage) run(conductor *Conductor, evalCtx *hcl.EvalContext, options ...r fmt.Println(cmd.String()) } } else { + cmd.Env = envStrings d := s.executeDocker(conductor, evalCtx, cmd, cfg) diags.Extend(d) } @@ -587,8 +589,9 @@ func (s *Stage) executeDocker(conductor *Conductor, evalCtx *hcl.EvalContext, cm } logger.Trace("parsing container arguments") - binds := []string{ - fmt.Sprintf("%s:/workspace", cmd.Dir), + var binds []string + if !s.Container.SkipWorkspace { + binds = append(binds, fmt.Sprintf("%s:/workspace", cmd.Dir)) } logger.Trace("parsing container volumes") @@ -614,11 +617,11 @@ func (s *Stage) executeDocker(conductor *Conductor, evalCtx *hcl.EvalContext, cm logger.Trace("dry run check") if cfg.Behavior.DryRun { - fmt.Println(ui.Blue("docker:run.image"), ui.Green(image)) - fmt.Println(ui.Blue("docker:run.workdir"), ui.Green("/workspace")) - fmt.Println(ui.Blue("docker:run.volume"), ui.Green(cmd.Dir+":/workspace")) - fmt.Println(ui.Blue("docker:run.stdin"), ui.Green(s.Container.Stdin)) - fmt.Println(ui.Blue("docker:run.args"), ui.Green(cmd.String())) + fmt.Println(ui.Blue("# docker:run.image"), ui.Green(image)) + fmt.Println(ui.Blue("# docker:run.workdir"), ui.Green("/workspace")) + fmt.Println(ui.Blue("# docker:run.volume"), ui.Green(cmd.Dir+":/workspace")) + fmt.Println(ui.Blue("# docker:run.stdin"), ui.Green(s.Container.Stdin)) + fmt.Println(ui.Blue("# docker:run.args"), ui.Green(cmd.String())) return diags } @@ -631,12 +634,9 @@ func (s *Stage) executeDocker(conductor *Conductor, evalCtx *hcl.EvalContext, cm logger.Trace("creating container") resp, err := cli.ContainerCreate(conductor.Context(), &dockerContainer.Config{ - Image: image, - Cmd: cmd.Args, - WorkingDir: "/workspace", - Volumes: map[string]struct{}{ - "/workspace": {}, - }, + Image: image, + WorkingDir: "/workspace", + Cmd: cmd.Args, Tty: true, AttachStdout: true, AttachStderr: true, @@ -766,7 +766,7 @@ func (s *Stage) parseEnvironmentVariables(conductor *Conductor, evalCtx *hcl.Eva return environment, diags } -func (s *Stage) parseExecCommand(conductor *Conductor, evalCtx *hcl.EvalContext, cfg *runnable.Config, envStrings []string, outputBuffer io.Writer) (*exec.Cmd, hcl.Diagnostics) { +func (s *Stage) parseExecCommand(conductor *Conductor, evalCtx *hcl.EvalContext, cfg *runnable.Config, outputBuffer io.Writer) (*exec.Cmd, hcl.Diagnostics) { var diags hcl.Diagnostics logger := conductor.Logger().WithField("stage", s.Id) @@ -832,7 +832,6 @@ func (s *Stage) parseExecCommand(conductor *Conductor, evalCtx *hcl.EvalContext, cmd := exec.CommandContext(conductor.Context(), cmdHcl.command, cmdHcl.args...) cmd.Stdout = io.MultiWriter(logger.Writer(), outputBuffer) cmd.Stderr = io.MultiWriter(logger.Writer(), outputBuffer) - cmd.Env = append(os.Environ(), envStrings...) cmd.Dir = dir return cmd, diags } @@ -970,11 +969,16 @@ func (s *Stage) hclEndpoint(conductor *Conductor, evalCtx *hcl.EvalContext) ([]s conductor.Eval().Mutex().RUnlock() var entrypoint []string + if d.HasErrors() { diags = diags.Extend(d) - } else if entrypointRaw.IsNull() { - entrypoint = nil - } else if !entrypointRaw.CanIterateElements() { + return nil, diags + } + + if entrypointRaw.IsNull() { + return nil, diags + } + if !entrypointRaw.CanIterateElements() { diags = diags.Append(&hcl.Diagnostic{ Severity: hcl.DiagError, Summary: "entrypoint must be a list of strings", @@ -982,11 +986,12 @@ func (s *Stage) hclEndpoint(conductor *Conductor, evalCtx *hcl.EvalContext) ([]s Subject: s.Container.Entrypoint.Range().Ptr(), EvalContext: evalCtx, }) - } else { - v := entrypointRaw.AsValueSlice() - for _, e := range v { - entrypoint = append(entrypoint, e.AsString()) - } + return nil, diags + } + + v := entrypointRaw.AsValueSlice() + for _, e := range v { + entrypoint = append(entrypoint, e.AsString()) } return entrypoint, diags } diff --git a/internal/ci/stage_schema.go b/internal/ci/stage_schema.go index 6ec1c2f..a8c9b97 100644 --- a/internal/ci/stage_schema.go +++ b/internal/ci/stage_schema.go @@ -44,6 +44,9 @@ type StageContainer struct { // Volumes have a list of host path volume mapping which is bound on docker run Volumes StageContainerVolumes `hcl:"volume,block" json:"volumes"` + // SkipWorkspace allows you to skip mounting the workspace directory + SkipWorkspace bool `hcl:"skip_workspace,optional" json:"skip_workspace"` + // Ports have a list of ports that needs to be exposed from the container Ports StageContainerPorts `hcl:"port,block" json:"ports"`