diff --git a/act/common/git/git.go b/act/common/git/git.go index 31972cee..3c64098f 100644 --- a/act/common/git/git.go +++ b/act/common/git/git.go @@ -305,7 +305,7 @@ func gitOptions(token string) (fetchOptions git.FetchOptions, pullOptions git.Pu func NewGitCloneExecutor(input NewGitCloneExecutorInput) common.Executor { return func(ctx context.Context) error { logger := common.Logger(ctx) - logger.Infof(" \u2601 git clone '%s' # ref=%s", input.URL, input.Ref) + logger.Infof("git clone '%s' # ref=%s", input.URL, input.Ref) logger.Debugf(" cloning %s to %s", input.URL, input.Dir) defer acquireCloneLock(input.Dir)() diff --git a/act/container/docker_build.go b/act/container/docker_build.go index b1beb1fd..44c1692a 100644 --- a/act/container/docker_build.go +++ b/act/container/docker_build.go @@ -25,9 +25,9 @@ func NewDockerBuildExecutor(input NewDockerBuildExecutorInput) common.Executor { return func(ctx context.Context) error { logger := common.Logger(ctx) if input.Platform != "" { - logger.Infof("%sdocker build -t %s --platform %s %s", logPrefix, input.ImageTag, input.Platform, input.ContextDir) + logger.Infof("docker build -t %s --platform %s %s", input.ImageTag, input.Platform, input.ContextDir) } else { - logger.Infof("%sdocker build -t %s %s", logPrefix, input.ImageTag, input.ContextDir) + logger.Infof("docker build -t %s %s", input.ImageTag, input.ContextDir) } if common.Dryrun(ctx) { return nil diff --git a/act/container/docker_logger.go b/act/container/docker_logger.go index 42875d98..b2d7bc5c 100644 --- a/act/container/docker_logger.go +++ b/act/container/docker_logger.go @@ -26,8 +26,6 @@ type dockerMessage struct { Progress string `json:"progress"` } -const logPrefix = " \U0001F433 " - func logDockerResponse(logger logrus.FieldLogger, dockerResponse io.ReadCloser, isError bool) error { if dockerResponse == nil { return nil diff --git a/act/container/docker_pull.go b/act/container/docker_pull.go index 71515be1..eaf98a78 100644 --- a/act/container/docker_pull.go +++ b/act/container/docker_pull.go @@ -24,7 +24,7 @@ import ( func NewDockerPullExecutor(input NewDockerPullExecutorInput) common.Executor { return func(ctx context.Context) error { logger := common.Logger(ctx) - logger.Debugf("%sdocker pull %v", logPrefix, input.Image) + logger.Debugf("docker pull %v", input.Image) if common.Dryrun(ctx) { return nil diff --git a/act/container/docker_run.go b/act/container/docker_run.go index 3aa891dc..818e5aa9 100644 --- a/act/container/docker_run.go +++ b/act/container/docker_run.go @@ -53,7 +53,7 @@ func NewContainer(input *NewContainerInput) ExecutionsEnvironment { func (cr *containerReference) ConnectToNetwork(name string) common.Executor { return common. - NewDebugExecutor("%sdocker network connect %s %s", logPrefix, name, cr.input.Name). + NewDebugExecutor("docker network connect %s %s", name, cr.input.Name). Then( common.NewPipelineExecutor( cr.connect(), @@ -90,7 +90,7 @@ func supportsContainerImagePlatform(ctx context.Context, cli client.APIClient) b func (cr *containerReference) Create(capAdd, capDrop []string) common.Executor { return common. - NewInfoExecutor("%sdocker create image=%s platform=%s entrypoint=%+q cmd=%+q network=%+q", logPrefix, cr.input.Image, cr.input.Platform, cr.input.Entrypoint, cr.input.Cmd, cr.input.NetworkMode). + NewInfoExecutor("docker create image=%s platform=%s entrypoint=%+q cmd=%+q network=%+q", cr.input.Image, cr.input.Platform, cr.input.Entrypoint, cr.input.Cmd, cr.input.NetworkMode). Then( common.NewPipelineExecutor( cr.connect(), @@ -102,7 +102,7 @@ func (cr *containerReference) Create(capAdd, capDrop []string) common.Executor { func (cr *containerReference) Start(attach bool) common.Executor { return common. - NewInfoExecutor("%sdocker run image=%s platform=%s entrypoint=%+q cmd=%+q network=%+q", logPrefix, cr.input.Image, cr.input.Platform, cr.input.Entrypoint, cr.input.Cmd, cr.input.NetworkMode). + NewInfoExecutor("docker run image=%s platform=%s entrypoint=%+q cmd=%+q network=%+q", cr.input.Image, cr.input.Platform, cr.input.Entrypoint, cr.input.Cmd, cr.input.NetworkMode). Then( common.NewPipelineExecutor( cr.connect(), @@ -125,7 +125,7 @@ func (cr *containerReference) Start(attach bool) common.Executor { func (cr *containerReference) Pull(forcePull bool) common.Executor { return common. - NewInfoExecutor("%sdocker pull image=%s platform=%s username=%s forcePull=%t", logPrefix, cr.input.Image, cr.input.Platform, cr.input.Username, forcePull). + NewInfoExecutor("docker pull image=%s platform=%s username=%s forcePull=%t", cr.input.Image, cr.input.Platform, cr.input.Username, forcePull). Then( NewDockerPullExecutor(NewDockerPullExecutorInput{ Image: cr.input.Image, @@ -147,7 +147,7 @@ func (cr *containerReference) Copy(destPath string, files ...*FileEntry) common. func (cr *containerReference) CopyDir(destPath, srcPath string, useGitIgnore bool) common.Executor { return common.NewPipelineExecutor( - common.NewInfoExecutor("%sdocker cp src=%s dst=%s", logPrefix, srcPath, destPath), + common.NewInfoExecutor("docker cp src=%s dst=%s", srcPath, destPath), cr.copyDir(destPath, srcPath, useGitIgnore), func(ctx context.Context) error { // If this fails, then folders have wrong permissions on non root container @@ -177,7 +177,7 @@ func (cr *containerReference) UpdateFromImageEnv(env *map[string]string) common. func (cr *containerReference) Exec(command []string, env map[string]string, user, workdir string) common.Executor { return common.NewPipelineExecutor( - common.NewInfoExecutor("%sdocker exec cmd=[%s] user=%s workdir=%s", logPrefix, strings.Join(command, " "), user, workdir), + common.NewInfoExecutor("docker exec cmd=[%s] user=%s workdir=%s", strings.Join(command, " "), user, workdir), cr.connect(), cr.find(), cr.exec(command, env, user, workdir), diff --git a/act/container/docker_volume.go b/act/container/docker_volume.go index 475fe7e2..f91bce83 100644 --- a/act/container/docker_volume.go +++ b/act/container/docker_volume.go @@ -42,7 +42,7 @@ func NewDockerVolumeRemoveExecutor(volumeName string, force bool) common.Executo func removeExecutor(volume string, force bool) common.Executor { return func(ctx context.Context) error { logger := common.Logger(ctx) - logger.Debugf("%sdocker volume rm %s", logPrefix, volume) + logger.Debugf("docker volume rm %s", volume) if common.Dryrun(ctx) { return nil diff --git a/act/runner/command.go b/act/runner/command.go index 7552109b..477738c0 100644 --- a/act/runner/command.go +++ b/act/runner/command.go @@ -120,7 +120,7 @@ func (rc *RunContext) setOutput(ctx context.Context, kvPairs map[string]string, result, ok := rc.StepResults[stepID] if !ok { - logger.Infof(" \U00002757 no outputs used step '%s'", stepID) + logger.Infof("No outputs registered for step '%s'", stepID) return } diff --git a/act/runner/reusable_workflow.go b/act/runner/reusable_workflow.go index 9cdf8bc7..e008931e 100644 --- a/act/runner/reusable_workflow.go +++ b/act/runner/reusable_workflow.go @@ -278,7 +278,7 @@ func setReusedWorkflowCallerResult(rc *RunContext, runner Runner) common.Executo rc.caller.setReusedWorkflowJobResult(rc.JobName, reusedWorkflowJobResult) } else { rc.result(reusedWorkflowJobResult) - logger.WithField("jobResult", reusedWorkflowJobResult).Infof("\U0001F3C1 Job %s", reusedWorkflowJobResultMessage) + logger.WithField("jobResult", reusedWorkflowJobResult).Infof("Job %s", reusedWorkflowJobResultMessage) } } diff --git a/act/runner/run_context.go b/act/runner/run_context.go index 9a82ebe3..dd21767c 100644 --- a/act/runner/run_context.go +++ b/act/runner/run_context.go @@ -193,7 +193,7 @@ func (rc *RunContext) GetBindsAndMounts() ([]string, map[string]string) { func (rc *RunContext) startHostEnvironment() common.Executor { return func(ctx context.Context) error { logger := common.Logger(ctx) - rawLogger := logger.WithField("raw_output", true) + rawLogger := logger.WithField(rawOutputField, true) logWriter := common.NewLineWriter(rc.commandHandler(ctx), func(s string) bool { if rc.Config.LogOutput { rawLogger.Infof("%s", s) @@ -260,11 +260,24 @@ func (rc *RunContext) startHostEnvironment() common.Executor { } } +// printStartJobContainerGroup mirrors actions/runner's "Starting job container" +// section: emit the group header and summary, return a closer for ::endgroup::. +func printStartJobContainerGroup(ctx context.Context, image, name, network string) func() { + rawLogger := common.Logger(ctx).WithField(rawOutputField, true) + rawLogger.Infof("::group::Starting job container") + rawLogger.Infof("image: %s", image) + rawLogger.Infof("name: %s", name) + rawLogger.Infof("network: %s", network) + return func() { + rawLogger.Infof("::endgroup::") + } +} + func (rc *RunContext) startJobContainer() common.Executor { return func(ctx context.Context) error { logger := common.Logger(ctx) image := rc.platformImage(ctx) - rawLogger := logger.WithField("raw_output", true) + rawLogger := logger.WithField(rawOutputField, true) logWriter := common.NewLineWriter(rc.commandHandler(ctx), func(s string) bool { if rc.Config.LogOutput { rawLogger.Infof("%s", s) @@ -279,7 +292,6 @@ func (rc *RunContext) startJobContainer() common.Executor { return fmt.Errorf("failed to handle credentials: %s", err) } - logger.Infof("\U0001f680 Start image=%s", image) name := rc.jobContainerName() // For gitea, to support --volumes-from in options. // We need to set the container name to the environment variable. @@ -424,6 +436,7 @@ func (rc *RunContext) startJobContainer() common.Executor { return errors.New("Failed to create job container") } + defer printStartJobContainerGroup(ctx, image, name, networkName)() return common.NewPipelineExecutor( rc.pullServicesImages(rc.Config.ForcePull), rc.JobContainer.Pull(rc.Config.ForcePull), @@ -753,7 +766,7 @@ func (rc *RunContext) isEnabled(ctx context.Context) (bool, error) { img := rc.platformImage(ctx) if img == "" { for _, platformName := range rc.runsOnPlatformNames(ctx) { - l.Infof("\U0001F6A7 Skipping unsupported platform -- Try running with `-P %+v=...`", platformName) + l.Infof("Skipping unsupported platform -- Try running with `-P %+v=...`", platformName) } return false, nil } diff --git a/act/runner/run_context_test.go b/act/runner/run_context_test.go index eba104ac..b2e2e087 100644 --- a/act/runner/run_context_test.go +++ b/act/runner/run_context_test.go @@ -5,6 +5,7 @@ package runner import ( + "bytes" "context" "fmt" "os" @@ -12,6 +13,7 @@ import ( "strings" "testing" + "gitea.com/gitea/runner/act/common" "gitea.com/gitea/runner/act/exprparser" "gitea.com/gitea/runner/act/model" @@ -635,3 +637,25 @@ func TestCreateContainerNameBoundedForLongMatrixInput(t *testing.T) { assert.LessOrEqual(t, len(name+"-network"), 255) assert.LessOrEqual(t, len(name+"-job1234567890"), 255) } + +func TestPrintStartJobContainerGroupGolden(t *testing.T) { + buf := &bytes.Buffer{} + logger := log.New() + logger.SetOutput(buf) + logger.SetLevel(log.InfoLevel) + logger.SetFormatter(&jobLogFormatter{color: cyan}) + entry := logger.WithFields(log.Fields{"job": "j1"}) + ctx := common.WithLogger(context.Background(), entry) + + printStartJobContainerGroup(ctx, "node:20", "GITEA-WORKFLOW-build-JOB-test", "gitea-runner-network")() + + want := strings.Join([]string{ + "[j1] | ::group::Starting job container", + "[j1] | image: node:20", + "[j1] | name: GITEA-WORKFLOW-build-JOB-test", + "[j1] | network: gitea-runner-network", + "[j1] | ::endgroup::", + "", + }, "\n") + assert.Equal(t, want, buf.String()) +}