Ontwerp een GitHub Actions Workflow voor Geautomatiseerde Database Migraties
description
Met deze prompt kun je een betrouwbare en efficiënte GitHub Actions workflow ontwikkelen die automatische database migraties uitvoert. Dit lost het probleem op van handmatige en foutgevoelige migraties, verhoogt de consistentie van je databaseversies en integreert migratiebeheer naadloos in je CI/CD pipeline. Het is beter dan alternatieven omdat het specifiek rekening houdt met rollback strategieën en migratielogs, wat zorgt voor meer zekerheid tijdens deploys.
prompt
try_prompt
Help me een GitHub Actions workflow te ontwerpen die geautomatiseerde database migraties uitvoert als onderdeel van mijn CI/CD pipeline. Projecttype: <voer je projecttype in, bijvoorbeeld Node.js, Python>. Database type: <voer het type database in, bijvoorbeeld PostgreSQL, MySQL>. Migratie too ... more
generate_helper
...
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Hier is een voorstel voor een GitHub Actions workflow die geautomatiseerde database migraties uitvoert met Flyway in een Node.js-project met PostgreSQL. De workflow voert migraties uit bij elke push, logt de migratie-uitkomsten, voert een rollback uit bij fouten en slaat de logs op in een S3-bucket.
```yaml
name: CI met Database Migraties
on:
push:
branches:
- main # Pas aan naar jouw hoofdtak
jobs:
build:
runs-on: ubuntu-latest
env:
POSTGRES_HOST: localhost
POSTGRES_PORT: 5432
POSTGRES_DB: jouw_database_naam
POSTGRES_USER: jouw_db_gebruiker
POSTGRES_PASSWORD: jouw_db_wachtwoord
S3_BUCKET: jouw-s3-bucket
MIGRATION_LOG_PATH: migratie_log_$(date +%Y%m%d%H%M%S).log
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up Node.js
uses: actions/setup-node@v2
with:
node-version: '14' # Pas aan indien nodig
- name: Install dependencies
run: npm install
- name: Start PostgreSQL database
uses: harmon758/postgresql-action@v1
with:
postgresql-version: '13' # Pas aan indien nodig
connection-string: postgres://${{ env.POSTGRES_USER }}:${{ env.POSTGRES_PASSWORD }}@${{ env.POSTGRES_HOST }}:${{ env.POSTGRES_PORT }}/${
{ env.POSTGRES_DB }}
- name: Download Flyway CLI
run: |
wget -qO- https://repo1.maven.org/maven2/org/flywaydb/flyway-commandline/8.0.0/flyway-commandline-8.0.0-linux-x64.tar.gz | tar -xz
sudo ln -s $(pwd)/flyway-8.0.0/flyway /usr/local/bin/flyway
- name: Run Flyway Migration
id: flyway_migration
run: |
# Voer migratie uit en log de output
set +e
flyway -url=jdbc:postgresql://${{ env.POSTGRES_HOST }}:${{ env.POSTGRES_PORT }}/${{ env.POSTGRES_DB }} \
-user=${{ env.POSTGRES_USER }} \
-password=${{ env.POSTGRES_PASSWORD }} \
-locations=filesystem:./migraties \
-logLevel=info \
migrate > migratie_log.txt 2>&1
EXIT_CODE=$?
# Check op fouten
if [ $EXIT_CODE -ne 0 ]; then
echo "Migratie mislukt, uitvoeren rollback..."
flyway -url=jdbc:postgresql://${{ env.POSTGRES_HOST }}:${{ env.POSTGRES_PORT }}/${{ env.POSTGRES_DB }} \
-user=${{ env.POSTGRES_USER }} \
-password=${{ env.POSTGRES_PASSWORD }} \
-locations=filesystem:./migraties \
-logLevel=info \
undo >> migratie_log.txt 2>&1
exit $EXIT_CODE
fi
# Sla de log op in een variabele
cat migratie_log.txt
continue-on-error: false
- name: Upload migratie log naar S3
if: always()
uses: jakejarvis/s3-sync-action@v0.5.1
with:
args: --acl private migratie_log.txt s3://${{ env.S3_BUCKET }}/logs/${{ env.MIGRATION_LOG_PATH }}
env:
AWS_S3_BUCKET: ${{ env.S3_BUCKET }}
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_REGION: 'eu-west-1' # Pas aan indien nodig
- name: Run Tests
run: npm test
```
**Belangrijke punten:**
- Vervang placeholder-waarden zoals `jouw_database_naam`, `jouw_db_gebruiker`, `jouw_db_wachtwoord`, en `jouw-s3-bucket` door je eigen gegevens.
- Zorg dat je AWS credentials (`AWS_ACCESS_KEY_ID` en `AWS_SECRET_ACCESS_KEY`) als secrets hebt ingesteld in je GitHub repository.
- De migraties moeten in de map `./migraties` staan volgens de Flyway configuratie.
- De workflow voert een rollback uit bij migratiefouten (`undo`), zorg dat je migraties en undo scripts correct hebt ingesteld.
- Je kunt de Flyway CLI versie aanpassen afhankelijk van je voorkeur.
Mocht je aanvullende wensen of vragen hebben, dan help ik je graag verder!
provider: deepseek
model: deepseek-chat
Hier is een GitHub Actions workflow voor geautomatiseerde Flyway database migraties in je Node.js/PostgreSQL project:
```yaml
name: CI with Database Migrations
on: [push]
env:
AWS_REGION: 'eu-west-1' # Pas aan naar jouw regio
S3_BUCKET: 'jouw-migratie-logs-bucket' # Vervang met jouw bucket naam
jobs:
build:
runs-on: ubuntu-latest
services:
postgres:
image: postgres:13
env:
POSTGRES_PASSWORD: postgres
POSTGRES_DB: test_db
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
- 5432:5432
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '18'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
- name: Setup Flyway
run: |
wget -qO- https://repo1.maven.org/maven2/org/flywaydb/flyway-commandline/9.0.0/flyway-commandline-9.0.0-linux-x64.tar.gz | tar xvz
sudo ln -s $PWD/flyway-9.0.0/flyway /usr/local/bin/flyway
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ env.AWS_REGION }}
- name: Create Flyway configuration
run: |
cat > flyway.conf << EOF
flyway.url=jdbc:postgresql://localhost:5432/test_db
flyway.user=postgres
flyway.password=postgres
flyway.locations=filesystem:./migrations
flyway.outOfOrder=true
EOF
- name: Execute migrations with rollback capability
id: migrate
continue-on-error: true
run: |
set -e
# Start timing
START_TIME=$(date +%s)
# Create log file
LOG_FILE="flyway_migration_$(date +%Y%m%d_%H%M%S).log"
# Execute migration and capture output
echo "Starting Flyway migration..." | tee $LOG_FILE
flyway migrate -configFiles=flyway.conf 2>&1 | tee -a $LOG_FILE
MIGRATION_EXIT_CODE=${PIPESTATUS[0]}
END_TIME=$(date +%s)
DURATION=$((END_TIME - START_TIME))
echo "Migration duration: ${DURATION}s" | tee -a $LOG_FILE
if [ $MIGRATION_EXIT_CODE -eq 0 ]; then
echo "SUCCESS: Migration completed successfully" | tee -a $LOG_FILE
echo "status=success" >> $GITHUB_OUTPUT
else
echo "FAILED: Migration failed with exit code $MIGRATION_EXIT_CODE" | tee -a $LOG_FILE
echo "status=failed" >> $GITHUB_OUTPUT
echo "exit_code=$MIGRATION_EXIT_CODE" >> $GITHUB_OUTPUT
fi
# Upload log to S3
aws s3 cp $LOG_FILE s3://$S3_BUCKET/migration-logs/${GITHUB_SHA}/$LOG_FILE
exit $MIGRATION_EXIT_CODE
- name: Rollback on failure
if: steps.migrate.outputs.status == 'failed'
run: |
echo "Executing rollback due to migration failure..."
ROLLBACK_LOG="flyway_rollback_$(date +%Y%m%d_%H%M%S).log"
# Attempt repair first
flyway repair -configFiles=flyway.conf 2>&1 | tee $ROLLBACK_LOG
# Then attempt baseline if repair doesn't work
if [ ${PIPESTATUS[0]} -ne 0 ]; then
echo "Repair failed, attempting baseline..." | tee -a $ROLLBACK_LOG
flyway baseline -configFiles=flyway.conf 2>&1 | tee -a $ROLLBACK_LOG
fi
# Upload rollback log
aws s3 cp $ROLLBACK_LOG s3://$S3_BUCKET/rollback-logs/${GITHUB_SHA}/$ROLLBACK_LOG
echo "Rollback procedures completed"
```
## Vereiste GitHub Secrets:
- `AWS_ACCESS_KEY_ID` - AWS toegangssleutel
- `AWS_SECRET_ACCESS_KEY` - AWS geheim toegangssleutel
## Vereiste projectstructuur:
```
project/
├── migrations/
│ ├── V1__Initial_setup.sql
│ ├── V2__Add_users_table.sql
│ └── ...
└── flyway.conf
```
## Belangrijke kenmerken:
1. **Rollback functionaliteit**: Bij fouten worden repair en baseline commando's uitgevoerd
2. **Logging naar S3**: Alle migratie- en rollback logs worden opgeslagen in S3
3. **PostgreSQL service**: Geïntegreerde database voor testing
4. **Foutafhandeling**: Continue-on-error met gedetailleerde status tracking
5. **Flyway configuratie**: Aanpasbare database configuratie
Pas de database credentials, AWS regio en S3 bucket naam aan volgens jouw omgeving.

