Native Step Runner Integration for Docker Executor
What does this MR do?
This MR adds native step-runner integration to the docker executor. "Native integration" here means the docker executor will run steps via the step-runner gRPC service.
The bulk of this code is the Dialer
implementation that tunnels gRPC request through a text-based docker exec
call. This code is absolutely heinous, and mostly involves reconciling the type required by grpc.WithContextDialer()
and the type returned by ContainerExecAttach()
. This code will eventually be moved to a new step-runner-client
project, but it lived here for now.
The rest of this code is plumbing; detecting when native steps integration is enables and adjusting the execution path accordingly to use the new execution code.
Enabling this feature is done via a single feature flag, FF_USE_NATIVE_STEPS
. This flag enables/disables the feature for all executors. We could also do it on a per-executor basis via executor config. I'm amenable to changing the flag name if other's don't like it.
There's also an integration test to run steps jobs. There are a handful of cases there.
Notes:
- I've deliberately kept the changes to the execution path to a minimum to avoid breaking other executors.
- This MR assumes the step-runner binary is in the execution environment
- This MR is best reviewed commit-at-a-time; each commits has lots of explanations.
Why was this MR needed?
To implement
- Create RunRequest payload from CI job (#37413 - closed)
- Execute CI job via Step Runner service - Docker... (#37414 - closed)
What's the best way to test this MR?
There's an integration test in this MR. ALternatively one could run a pipeline like so (see https://gitlab.com/avonbertoldi/test-project/-/tree/step-runner-docker-integration).
Click to expand
stages:
- test
variables:
FF_USE_NATIVE_STEPS: true
script steps:
stage: test
image:
name: registry.gitlab.com/gitlab-org/step-runner:v0
run:
- name: script1
script: pwd
- name: script2
script: env
- name: script3
script: ls -Rlah --ignore .git ../
local steps:
stage: test
image:
name: registry.gitlab.com/gitlab-org/step-runner:v0
run:
- name: ls
step: ./steps/ls
inputs:
opts: -lah
- name: local_echo
step: ./steps/echo
inputs:
message: Oh hello jimmy!?
# This jobs requires `privileged = true` on the executor
# I haven't got this job to pass yet
action step:
stage: test
services:
- docker:24.0.5-dind
variables:
DOCKER_HOST: tcp://docker:2376
image:
name: registry.gitlab.com/gitlab-org/step-runner:v0
run:
- name: action
step: ./steps/action
remote step:
stage: test
image:
name: registry.gitlab.com/gitlab-org/step-runner:v0
run:
- name: remote_hello_world
step: "https://gitlab.com/gitlab-org/ci-cd/runner-tools/echo-step@91141a6e"
inputs:
echo: hello world