Migrating from GitHub Actions to Semaphore#
This document provides an overview of how to migrate your CI/CD from GitHub Actions to Semaphore.
Why migrate to Semaphore?#
Semaphore and GitHub Actions are modern CI/CD tools. Both tools allow you to create workflows and build, test and deploy software.
While the two products share many similarities, here’s what sets Semaphore apart from GitHub Actions:
- Faster builds. With the help of Semaphore, you can cut down your build time in half.
- End-to-end continuous delivery. With features like parametrized promotions and deployment queues, your team has the power to deploy to any environment, painlessly.
- Increased developer productivity. Graphical Workflow Builder allows for an easy pipeline setup and editing. SSH debugging enables fast error recovery.
Semaphore and GitHub Actions have a lot in common in terms of configuration and setup. This makes migrating to Semaphore from GitHub Actions easy and straightforward.
There are other features that set Semaphore apart from other CI/CD tools. Start a free 14-day trial or book a demo to see Semaphore in action.
Key concepts#
Using Docker containers#
Both Github Actions and Semaphore support running jobs inside of a Docker container.
Semaphore provides a series of convenience Docker images that are hosted on the Semaphore Container Registry. Using these images results in much faster downloads since the images will be pulled from the Semaphore Container Registry.
To see how to work with a Docker environment, refer to Custom CI/CD Environment with Docker. To see all available convenience images, refer to Semaphore Registry Images.
Using variables and secrets#
Both Github Actions and Semaphore support adding environment variables to the jobs by configuring the pipeline file.
Github Actions and Semaphore also support creating secrets via the UI. Additionally, Semaphore allows for creating and editing secrets using the sem CLI.
To see how to add environment variables to the jobs, refer to Environment variables. To see how to create encrypted secrets, refer to Using Secrets.
Caching#
Both Github Actions and Semaphore support manually caching files. An example from each platform is shown below:
Github Actions | Semaphore |
---|---|
- name: Cache gems
uses: actions/cache@v2
with:
path: vendor/bundle
key: bundle-gems-${{ hashFiles('**/Gemfile.lock') }}
restore-keys: bundle-gems-
|
- name: Cache gems
commands:
- cache restore bundle-gems-$(checksum Gemfile.lock)
- bundle install --deployment --path vendor/bundle
- cache store bundle-gems-$(checksum Gemfile.lock) vendor/bundle
|
Additionally, Semaphore provides a method to automatically store or restore dependencies into or from default paths. This feature works with various languages and dependency managers.
To see how to use the cache mechanism, refer to Caching.
Artifacts#
Both Github Actions and Semaphore support a method to persist data between jobs called Artifacts.
An example from each platform is shown below:
Github Actions | Semaphore |
---|---|
- name: Upload test.log
uses: actions/upload-artifact@v2
with:
name: Make
path: test.log
- name: Download test.log
uses: actions/download-artifact@v2
with:
name: Unit tests
|
- name: Make
commands:
- artifact push job test.log
- name: Unit tests
commands:
- artifact pull job test.log
|
Additionally, Semaphore allows the creation of Artifacts at the job, workflow and project level.
To see more details about this feature, refer to Artifacts.
Specifying language versions#
Both Github Actions and Semaphore allow you to use specific language versions. Github Actions uses the ruby-setup action while Semaphore incorporates sem-version in its toolbox.
Examples from each platform are shown below:
Github Actions | Semaphore |
---|---|
steps:
- uses: ruby/setup-ruby@v1
with:
ruby-version: '3.1'
|
jobs:
- name: Using sem-version
commands:
- sem-version ruby 3.1
|
To see more details about the sem-version tool, refer to Selecting language versions.
Using databases#
Both Github Actions and Semaphore support starting a database via Docker container. Github Actions uses service containers while Semaphore incorporates sem-service in its toolbox.
Examples from each platform are shown below:
Github Actions | Semaphore |
---|---|
jobs:
runner-job:
runs-on: ubuntu-latest
services:
redis:
image: redis
ports:
- 6379:6379
|
jobs:
- name: Redis
commands:
- sem-service start redis
|
To see how to use sem-service and all the supported databases and other services, refer to sem-service: Managing Databases and Services on Linux.
Complete example#
Github Actions | Semaphore |
---|---|
name: Containers
on: [push]
jobs:
build:
runs-on: ubuntu-latest
env:
PGHOST: localhost
PGUSER: administrate
RAILS_ENV: test
services:
postgres:
image: postgres:10.1-alpine
env:
POSTGRES_USER: administrate
POSTGRES_DB: ruby25
POSTGRES_PASSWORD: ""
ports:
- 5432:5432
steps:
- uses: actions/checkout@v2
- name: Setup Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: ‘3.1’
- name: Cache dependencies
uses: actions/cache@v2
with:
path: vendor/bundle
key: bundle-gems-${{ hashFiles('**/Gemfile.lock') }}
- name: Install postgres headers
run: |
sudo apt-get update
sudo apt-get install libpq-dev
- name: Install dependencies
run: bundle install --path vendor/bundle
- name: Setup environment configuration
run: cp .sample.env .env
- name: Setup database
run: bundle exec rake db:setup
- name: Run tests
run: bundle exec rake
|
version: v1.0
name: Example pipeline
agent:
machine:
type: e1-standard-2
os_image: ubuntu1804
blocks:
- name: Setup
task:
jobs:
- name: Bundle
commands:
- checkout
- cache restore
- sem-version ruby 3.1
- sem-service start postgres 10
- sudo apt-get update
- sudo apt-get install libpq-dev
- bundle install --path vendor/bundle
- cp .sample.env .env
- bundle exec rake db:setup
- bundle exec rake
|