Skip to content
Snippets Groups Projects
Commit 7913bf2c authored by Cameron Swords's avatar Cameron Swords :ghost:
Browse files

Increase end-to-end test coverage

parent 4f606dc4
No related branches found
No related tags found
1 merge request!151Increase end-to-end test coverage
verify-image-version:
stage: e2e
image: $LEGACY_IMAGE_TAG
image: alpine:${ALPINE_VERSION}
tags: ["saas-${OS}-medium-${ARCH}"]
parallel:
matrix:
- OS: linux
ARCH: amd64
- OS: linux
ARCH: arm64
script:
- STEP_RUNNER_HELP=$(/step-runner help)
- STEP_RUNNER_HELP=$(./out/bin/step-runner-${OS}-${ARCH} help)
- echo "$STEP_RUNNER_HELP"
- echo "$STEP_RUNNER_HELP" | grep -q "Step Runner version:" # expect version to be printed
- echo "$STEP_RUNNER_HELP" | grep -q -v "UNKNOWN" # version should be known
run-e2e:
stage: e2e
image: alpine:${ALPINE_VERSION}
script:
- >
./out/bin/step-runner-linux-amd64 run gitlab.com/gitlab-org/ci-cd/runner-tools/echo-step@cam/update-output-format \
--inputs echo='${{job.CI_MOCK_PIPELINE_ID}}' \
--job CI_MOCK_PIPELINE_ID=mock_pipeline_id \
--write-steps-results
- apk add jq
- ECHO_MESSAGE=$(jq -r '.subStepResults[0].outputs.echo' step-results.json)
- "[ $ECHO_MESSAGE == mock_pipeline_id ]"
artifacts:
access: developer
when: always
paths:
- step-results.json
##### Legacy Image tests
run-action-e2e:
stage: e2e
image: $LEGACY_IMAGE_TAG
services:
- docker:${DOCKER_VERSION}-dind
variables:
TMPDIR: /builds
DOCKER_HOST: tcp://docker:2375
run:
- name: say_hi
step: gitlab.com/components/action-runner@main
inputs:
action: mikefarah/yq@master
action_runner_image: registry.gitlab.com/components/action-runner:v0
inputs:
cmd: echo ["Hi, ${{job.CI_PROJECT_NAME}}!"] | yq .[0]
artifacts:
access: developer
when: always
paths:
- step-results.json
run-e2e legacy:
stage: e2e
image: $LEGACY_IMAGE_TAG
variables:
......@@ -16,14 +66,18 @@ run-e2e:
- name: ci_variables
step: gitlab.com/gitlab-org/ci-cd/runner-tools/echo-step@cam/update-output-format
inputs:
echo: "${{ job.CI_PIPELINE_ID }}"
echo: "${{job.CI_PIPELINE_ID}}"
artifacts:
access: developer
when: always
paths:
- step-results.json
verify-e2e:
verify-e2e legacy:
stage: e2e
needs: ["run-e2e"]
image: alpine:${ALPINE_VERSION}
needs: ["run-e2e legacy"]
script:
- apt update && apt install -y jq
- if [[ $(jq -r '.subStepResults[0].outputs.echo' step-results.json) != $CI_PIPELINE_ID ]]; then exit 1 ; fi
- apk add jq
- ECHO_MESSAGE=$(jq -r '.subStepResults[0].outputs.echo' step-results.json)
- "[ $ECHO_MESSAGE == $CI_PIPELINE_ID ]"
......@@ -2,5 +2,6 @@
variables:
IMAGE_TAG: $CI_REGISTRY_IMAGE/pipelines:$CI_PIPELINE_IID
LEGACY_IMAGE_TAG: ${IMAGE_TAG}-legacy
GO_VERSION: 1.22
DOCKER_VERSION: 27.3.1
GO_VERSION: "1.22"
DOCKER_VERSION: "27.3.1"
ALPINE_VERSION: "3.20"
......@@ -151,7 +151,7 @@ func run(options *Options) error {
}
func createGlobalCtx(options *Options) (*runner.GlobalContext, error) {
env, err := runner.NewEnvironmentFromOS()
env, err := runner.NewEnvironmentFromOS(excludeJobVars)
if err != nil {
return nil, err
......@@ -170,6 +170,13 @@ func createGlobalCtx(options *Options) (*runner.GlobalContext, error) {
return globalCtx, nil
}
func excludeJobVars(envName string) bool {
return strings.HasPrefix(envName, "CI_") ||
strings.HasPrefix(envName, "GITLAB_") ||
strings.HasPrefix(envName, "FF_") ||
strings.HasPrefix(envName, "DOCKER_ENV_")
}
func wrapStepsInSingleStep(ymlSteps []byte) (*schema.Step, error) {
def := &schema.Step{}
err := yaml.Unmarshal(ymlSteps, &def.Steps)
......
......@@ -24,7 +24,7 @@ type Environment struct {
// NewEnvironmentFromOS returns the environment variables found in the OS runtime.
// Variables can be filtered by name, passing no names will return all variables.
func NewEnvironmentFromOS(names ...string) (*Environment, error) {
func NewEnvironmentFromOS(rejectIf ...func(string) bool) (*Environment, error) {
vars := map[string]string{}
for _, nameValue := range os.Environ() {
......@@ -34,18 +34,16 @@ func NewEnvironmentFromOS(names ...string) (*Environment, error) {
return nil, fmt.Errorf("failed to parse environment variable: %s", nameValue)
}
if len(names) > 0 && !slices.Contains(names, name) {
continue
if acceptEnvName(name, rejectIf) {
vars[name] = value
}
vars[name] = value
}
return NewEnvironment(vars), nil
}
func NewEnvironmentFromOSWithKnownVars() (*Environment, error) {
return NewEnvironmentFromOS(
knownVars := []string{
"HTTPS_PROXY",
"HTTP_PROXY",
"LANG",
......@@ -63,7 +61,9 @@ func NewEnvironmentFromOSWithKnownVars() (*Environment, error) {
"http_proxy",
"https_proxy",
"no_proxy",
)
}
return NewEnvironmentFromOS(func(envName string) bool { return !slices.Contains(knownVars, envName) })
}
func NewEmptyEnvironment() *Environment {
......@@ -134,3 +134,13 @@ func (e *Environment) Mutate(env *Environment) {
e.mutations = append(e.mutations, env)
}
func acceptEnvName(name string, rejectIf []func(string) bool) bool {
for _, rejectIfFn := range rejectIf {
if rejectIfFn(name) {
return false
}
}
return true
}
......@@ -2,6 +2,7 @@ package runner
import (
"os"
"strings"
"testing"
"github.com/stretchr/testify/require"
......@@ -26,7 +27,19 @@ func TestNewEnvironment(t *testing.T) {
env, err := NewEnvironmentFromOSWithKnownVars()
require.NoError(t, err)
require.Equal(t, "en", env.Values()["LANG"])
require.NotContains(t, "FOO", env.Values())
require.NotContains(t, env.Values(), "FOO")
})
t.Run("excludes environment variables based on a predicate", func(t *testing.T) {
require.NoError(t, os.Setenv("INCLUDE_VALUE", "1"))
require.NoError(t, os.Setenv("EXCLUDE_VALUE", "2"))
defer func() { _ = os.Unsetenv("INCLUDE_VALUE") }()
defer func() { _ = os.Unsetenv("EXCLUDE_VALUE") }()
env, err := NewEnvironmentFromOS(func(envName string) bool { return strings.HasPrefix(envName, "EXCLUDE_") })
require.NoError(t, err)
require.Equal(t, "1", env.Values()["INCLUDE_VALUE"])
require.NotContains(t, env.Values(), "EXCLUDE_VALUE")
})
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment