Running SQL Server Init Scripts in GitHub Actions
Question
How can I run init
scripts on SQL Server when using GitHub Actions services instead of the Atlas docker
blocks?
Answer
If you're using the init
attribute in the docker
block in your Atlas HCL config to run the init
script when starting the dev database (see below):
docker "sqlserver" "devdb" {
image = "mcr.microsoft.com/mssql/server:2019-latest"
mode = "database"
database = "master"
init = file("./init.sql")
}
env {
name = atlas.env
dev = docker.sqlserver.devdb.url
}
But you start the dev database using a service in the GitHub action, you can still execute your init
script using the following configuration:
name: CI - Verify schema migration
on:
push:
branches:
- master
pull_request:
branches:
- master
jobs:
validate:
runs-on: ubuntu-latest
env:
MSSQL_SA_PASSWORD: 'P@ssw0rd0995'
services:
sqlserver-2019:
image: mcr.microsoft.com/mssql/server:2019-latest
env:
ACCEPT_EULA: Y
MSSQL_PID: Developer
MSSQL_SA_PASSWORD: ${{ env.MSSQL_SA_PASSWORD }}
ports:
- 1433:1433
options: >-
--health-cmd "/opt/mssql-tools18/bin/sqlcmd -C -U sa -P \"${MSSQL_SA_PASSWORD}\" -Q \"SELECT 1\""
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- uses: actions/checkout@v4
- name: run init.sql on the SQL Server
run: |
cat ./init.sql | docker exec -i $(docker ps -qa -f 'publish=1433') bash -c '/opt/mssql-tools18/bin/sqlcmd -C -U sa -P $MSSQL_SA_PASSWORD -i /dev/stdin'
- name: atlas migrate lint
run: |
atlas migrate lint --dev-url='sqlserver://sa:${{ env.MSSQL_SA_PASSWORD }}@localhost:1433?database=master'