That was smoothe af . <| sep |> ohhh . but I dont like how other people see me 😂 <| sep |> He ' s not going to get injured fight for 1 yard . <| sep |> We use a self hosted Gitlab , not gitlab . com , so I ' m not sure the specifics of gitlab . coms runners , but if they ' re running docker images that you choose to do testsbuildstasks there shouldn ' t be any difference . All they do is spin up the docker image you tell them to against the working directory . I spin up GCE servers eventually will move them to k 8 s pods that automatically register to the Gitlab server to take their jobs based on cpu usage . Then gitlab triggers those servers to spin up docker images that are assigned in my . gitlabci . yml steps to run the tasks I send it . Most people who aren ' t familiar with CI get stuck where you ' re stuck . Whatever it is that runs your builds runs them exactly like you do locally . Doesn ' t matter what language or what you ' re doing . The biggest headache is setting the environment variables , etc that are necessary via Docker ARGS and passing in gitlab variables . For instance when we run nodejs tests we have a docker container that has nodejs and npm installed so that it can start the nodejs service and run npm tests against it . Then we have a noderelease docker image that has whats needed to push our npm packages to npmjs if the prior testing stage passed . There are some environment variables , but beyond that it ' s as basic as that . If I wanted to do python builds and tests I would make a docker container that had python and pyenv installed . Then for the deployment step I have a simple Alpine Linux container that only has kubectl and its requirements installed so that it can run the kubectl commands . All this step does , because the previous steps build and pushed the new docker image to my registry , is update the k 8 s manfiest . yml with the new Docker tag and then send it to kubernetes .