Skip to content

Migrate from GitLab CI

See the comparison for the full table. Key conversions:

GitLab CI Slipway
.gitlab-ci.yml .slipway/*.yaml
stages: + job stage: stages: with nested jobs: (or flat jobs: with needs)
script:, before_script:, after_script: A list of steps with run: (use if: always() for after-script)
image: container: { image: ... }
services: services: with health:
rules: / only / except if: and trigger filters (on.push.branches, paths)
needs: needs:
parallel: matrix: matrix:
cache: with key: and paths: cache: with key, restore_keys, paths
artifacts: artifacts:
variables: env: (plain) or secrets (masked)
environment: name: environment: { name: ... }
when: manual An environment approval, or a manual trigger
retry: retry: { max, backoff, when }
timeout: timeout:
allow_failure: allow_failure:
tags: runs_on: labels
include: / extends: template: / extends:
id_tokens: permissions: { id_token: write }
CI_COMMIT_BRANCH, CI_COMMIT_SHA git.branch, git.sha

GitLab:

stages: [test, build, deploy]
variables: { GOFLAGS: -mod=readonly }
test:
stage: test
image: golang:1.27
cache: { key: { files: [go.sum] }, paths: [.cache/go] }
script: [go test ./...]
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_COMMIT_BRANCH == "main"
deploy_prod:
stage: deploy
environment: { name: production, url: https://api.example.com }
script: [./deploy.sh]
rules:
- if: $CI_COMMIT_BRANCH == "main"
when: manual

Slipway:

version: 1
name: api
on:
push: { branches: [main] }
pull_request:
env: { GOFLAGS: -mod=readonly }
stages:
- name: test
jobs:
- name: test
runs_on: [linux]
container: { image: golang:1.27 }
cache:
- key: go-${{ hashFiles("go.sum") }}
paths: [.cache/go]
steps:
- uses: slipway/checkout@v1
- run: go test ./...
- name: deploy
needs: [test]
jobs:
- name: deploy_prod
if: git.branch == "main"
environment: { name: production, url: "https://api.example.com", service: api }
steps:
- uses: slipway/checkout@v1
- run: ./deploy.sh

The when: manual becomes a protection rule on the production environment (one required approval from the deployer role) rather than a property of the job, so it also applies to promotions and CLI deploys.

  • GitLab’s CI/CD variables with masked or protected map to Slipway secrets, scoped by environment. Do not export values from the UI: recreate them from your secret manager or use external references.
  • GitLab merge request pipelines map to on: pull_request. Slipway posts the status back to the merge request.
  • Auto DevOps has no equivalent; define pipelines explicitly or use an org base template with extends:.
  • Keep the repository on GitLab. Slipway connects via a GitLab integration and does not require moving code.