Skip to content

Latest commit

 

History

History
423 lines (303 loc) · 11.7 KB

migrating-from-gitlab-cicd-to-github-actions.md

File metadata and controls

423 lines (303 loc) · 11.7 KB
title intro redirect_from versions type topics shortTitle
Migrating from GitLab CI/CD to GitHub Actions
{% data variables.product.prodname_actions %} and GitLab CI/CD share several configuration similarities, which makes migrating to {% data variables.product.prodname_actions %} relatively straightforward.
/actions/learn-github-actions/migrating-from-gitlab-cicd-to-github-actions
/actions/migrating-to-github-actions/migrating-from-gitlab-cicd-to-github-actions
/actions/migrating-to-github-actions/manual-migrations/migrating-from-gitlab-cicd-to-github-actions
fpt ghes ghec
*
*
*
tutorial
GitLab
Migration
CI
CD
Migrate from GitLab CI/CD

{% data reusables.actions.enterprise-github-hosted-runners %}

Introduction

GitLab CI/CD and {% data variables.product.prodname_actions %} both allow you to create workflows that automatically build, test, publish, release, and deploy code. GitLab CI/CD and {% data variables.product.prodname_actions %} share some similarities in workflow configuration:

  • Workflow configuration files are written in YAML and are stored in the code's repository.
  • Workflows include one or more jobs.
  • Jobs include one or more steps or individual commands.
  • Jobs can run on either managed or self-hosted machines.

There are a few differences, and this guide will show you the important differences so that you can migrate your workflow to {% data variables.product.prodname_actions %}.

Jobs

Jobs in GitLab CI/CD are very similar to jobs in {% data variables.product.prodname_actions %}. In both systems, jobs have the following characteristics:

  • Jobs contain a series of steps or scripts that run sequentially.
  • Jobs can run on separate machines or in separate containers.
  • Jobs run in parallel by default, but can be configured to run sequentially.

You can run a script or a shell command in a job. In GitLab CI/CD, script steps are specified using the script key. In {% data variables.product.prodname_actions %}, all scripts are specified using the run key.

Below is an example of the syntax for each system.

GitLab CI/CD syntax for jobs

{% raw %}

job1:
  variables:
    GIT_CHECKOUT: "true"
  script:
    - echo "Run your script here"

{% endraw %}

{% data variables.product.prodname_actions %} syntax for jobs

jobs:
  job1:
    steps:
      - uses: {% data reusables.actions.action-checkout %}
      - run: echo "Run your script here"

Runners

Runners are machines on which the jobs run. Both GitLab CI/CD and {% data variables.product.prodname_actions %} offer managed and self-hosted variants of runners. In GitLab CI/CD, tags are used to run jobs on different platforms, while in {% data variables.product.prodname_actions %} it is done with the runs-on key.

Below is an example of the syntax for each system.

GitLab CI/CD syntax for runners

{% raw %}

windows_job:
  tags:
    - windows
  script:
    - echo Hello, %USERNAME%!

linux_job:
  tags:
    - linux
  script:
    - echo "Hello, $USER!"

{% endraw %}

{% data variables.product.prodname_actions %} syntax for runners

{% raw %}

windows_job:
  runs-on: windows-latest
  steps:
    - run: echo Hello, %USERNAME%!

linux_job:
  runs-on: ubuntu-latest
  steps:
    - run: echo "Hello, $USER!"

{% endraw %}

For more information, see "AUTOTITLE."

Docker images

Both GitLab CI/CD and {% data variables.product.prodname_actions %} support running jobs in a Docker image. In GitLab CI/CD, Docker images are defined with an image key, while in {% data variables.product.prodname_actions %} it is done with the container key.

Below is an example of the syntax for each system.

GitLab CI/CD syntax for Docker images

{% raw %}

my_job:
  image: node:10.16-jessie

{% endraw %}

{% data variables.product.prodname_actions %} syntax for Docker images

{% raw %}

jobs:
  my_job:
    container: node:10.16-jessie

{% endraw %}

For more information, see "AUTOTITLE."

Condition and expression syntax

GitLab CI/CD uses rules to determine if a job will run for a specific condition. {% data variables.product.prodname_actions %} uses the if keyword to prevent a job from running unless a condition is met.

Below is an example of the syntax for each system.

GitLab CI/CD syntax for conditions and expressions

{% raw %}

deploy_prod:
  stage: deploy
  script:
    - echo "Deploy to production server"
  rules:
    - if: '$CI_COMMIT_BRANCH == "master"'

{% endraw %}

{% data variables.product.prodname_actions %} syntax for conditions and expressions

{% raw %}

jobs:
  deploy_prod:
    if: contains( github.ref, 'master')
    runs-on: ubuntu-latest
    steps:
      - run: echo "Deploy to production server"

{% endraw %}

For more information, see "AUTOTITLE."

Dependencies between Jobs

Both GitLab CI/CD and {% data variables.product.prodname_actions %} allow you to set dependencies for a job. In both systems, jobs run in parallel by default, but job dependencies in {% data variables.product.prodname_actions %} can be specified explicitly with the needs key. GitLab CI/CD also has a concept of stages, where jobs in a stage run concurrently, but the next stage will start when all the jobs in the previous stage have completed. You can recreate this scenario in {% data variables.product.prodname_actions %} with the needs key.

Below is an example of the syntax for each system. The workflows start with two jobs named build_a and build_b running in parallel, and when those jobs complete, another job called test_ab will run. Finally, when test_ab completes, the deploy_ab job will run.

GitLab CI/CD syntax for dependencies between jobs

{% raw %}

stages:
  - build
  - test
  - deploy

build_a:
  stage: build
  script:
    - echo "This job will run first."

build_b:
  stage: build
  script:
    - echo "This job will run first, in parallel with build_a."

test_ab:
  stage: test
  script:
    - echo "This job will run after build_a and build_b have finished."

deploy_ab:
  stage: deploy
  script:
    - echo "This job will run after test_ab is complete"

{% endraw %}

{% data variables.product.prodname_actions %} syntax for dependencies between jobs

{% raw %}

jobs:
  build_a:
    runs-on: ubuntu-latest
    steps:
      - run: echo "This job will be run first."

  build_b:
    runs-on: ubuntu-latest
    steps:
      - run: echo "This job will be run first, in parallel with build_a"

  test_ab:
    runs-on: ubuntu-latest
    needs: [build_a,build_b]
    steps:
      - run: echo "This job will run after build_a and build_b have finished"

  deploy_ab:
    runs-on: ubuntu-latest
    needs: [test_ab]
    steps:
      - run: echo "This job will run after test_ab is complete"

{% endraw %}

For more information, see "AUTOTITLE."

Scheduling workflows

Both GitLab CI/CD and {% data variables.product.prodname_actions %} allow you to run workflows at a specific interval. In GitLab CI/CD, pipeline schedules are configured with the UI, while in {% data variables.product.prodname_actions %} you can trigger a workflow on a scheduled interval with the "on" key.

For more information, see "AUTOTITLE."

Variables and secrets

GitLab CI/CD and {% data variables.product.prodname_actions %} support setting variables in the pipeline or workflow configuration file, and creating secrets using the GitLab or {% data variables.product.product_name %} UI.

For more information, see "AUTOTITLE" and "AUTOTITLE."

Caching

GitLab CI/CD and {% data variables.product.prodname_actions %} provide a method in the configuration file to manually cache workflow files.

{% ifversion actions-caching %}

Below is an example of the syntax for each system.

GitLab CI/CD syntax for caching

{% raw %}

image: node:latest

cache:
  key: $CI_COMMIT_REF_SLUG
  paths:
    - .npm/

before_script:
  - npm ci --cache .npm --prefer-offline

test_async:
  script:
    - node ./specs/start.js ./specs/async.spec.js

{% endraw %}

{% data variables.product.prodname_actions %} syntax for caching

jobs:
  test_async:
    runs-on: ubuntu-latest
    steps:
    - name: Cache node modules
      uses: {% data reusables.actions.action-cache %}
      with:
        path: ~/.npm
        key: {% raw %}v1-npm-deps-${{ hashFiles('**/package-lock.json') }}{% endraw %}
        restore-keys: v1-npm-deps-

{% else %}

{% data reusables.actions.caching-availability %}

{% endif %}

Artifacts

Both GitLab CI/CD and {% data variables.product.prodname_actions %} can upload files and directories created by a job as artifacts. In {% data variables.product.prodname_actions %}, artifacts can be used to persist data across multiple jobs.

Below is an example of the syntax for each system.

GitLab CI/CD syntax for artifacts

{% raw %}

script:
artifacts:
  paths:
    - math-homework.txt

{% endraw %}

{% data variables.product.prodname_actions %} syntax for artifacts

- name: Upload math result for job 1
  uses: {% data reusables.actions.action-upload-artifact %}
  with:
    name: homework
    path: math-homework.txt

For more information, see "AUTOTITLE."

Databases and service containers

Both systems enable you to include additional containers for databases, caching, or other dependencies.

In GitLab CI/CD, a container for the job is specified with the image key, while {% data variables.product.prodname_actions %} uses the container key. In both systems, additional service containers are specified with the services key.

Below is an example of the syntax for each system.

GitLab CI/CD syntax for databases and service containers

{% raw %}

container-job:
  variables:
    POSTGRES_PASSWORD: postgres
    # The hostname used to communicate with the
    # PostgreSQL service container
    POSTGRES_HOST: postgres
    # The default PostgreSQL port
    POSTGRES_PORT: 5432
  image: node:10.18-jessie
  services:
    - postgres
  script:
    # Performs a clean installation of all dependencies
    # in the `package.json` file
    - npm ci
    # Runs a script that creates a PostgreSQL client,
    # populates the client with data, and retrieves data
    - node client.js
  tags:
    - docker

{% endraw %}

{% data variables.product.prodname_actions %} syntax for databases and service containers

jobs:
  container-job:
    runs-on: ubuntu-latest
    container: node:10.18-jessie

    services:
      postgres:
        image: postgres
        env:
          POSTGRES_PASSWORD: postgres

    steps:
      - name: Check out repository code
        uses: {% data reusables.actions.action-checkout %}

      # Performs a clean installation of all dependencies
      # in the `package.json` file
      - name: Install dependencies
        run: npm ci

      - name: Connect to PostgreSQL
        # Runs a script that creates a PostgreSQL client,
        # populates the client with data, and retrieves data
        run: node client.js
        env:
          # The hostname used to communicate with the
          # PostgreSQL service container
          POSTGRES_HOST: postgres
          # The default PostgreSQL port
          POSTGRES_PORT: 5432

For more information, see "AUTOTITLE."