Optimaliseer mijn GitHub Actions workflow voor geavanceerde deployment strategieën
description
Met deze prompt krijg je een op maat gemaakte GitHub Actions workflow die geavanceerde deployment strategieën ondersteunt, waardoor je uitvaltijd minimaliseert en de betrouwbaarheid van je applicaties verhoogt. Dit helpt je complexe deploymentprocessen te automatiseren en risico's bij updates te verminderen, wat beter is dan standaard eenvoudige deployment workflows.
prompt
Help me mijn GitHub Actions workflow te ontwerpen of verbeteren die geavanceerde deployment strategieën ondersteunt zoals blue-green deployment, canary releases of rolling updates. Workflow details: < ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Hier is een voorbeeld van hoe je jouw GitHub Actions workflow kunt verbeteren om een blue-green deployment strategie op AWS ECS te ondersteunen. Ik voeg een aparte job toe voor de deployment, waarbij je met behulp van AWS CLI en ECS kunt switchen tussen de blauwe en groene omgeving.
```yaml
name: CI en Blue-Green Deployment
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Installeer dependencies
run: npm install
- name: Voer tests uit
run: npm test
- name: Build Docker image
run: |
docker build -t mijn-app:${{ github.sha }} .
- name: Login op DockerHub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Push Docker image
run: |
docker push mijn-dockerhub-gebruiker/mijn-app:${{ github.sha }}
deploy:
needs: build
runs-on: ubuntu-latest
env:
AWS_REGION: jouw-aws-regio
CLUSTER_NAME: jouw-cluster-naam
SERVICE_NAME: jouw-service-naam
TARGET_GROUP_ARN: arn:aws:elasticloadbalancing:REGIO:ACCOUNT_ID:targetgroup/target-group-name/target-group-id
steps:
- name: Configureer AWS CLI
uses: aws-actions/configure-aws-credentials@v1
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: Nieuwe taakdefinitie maken
run: |
# Maak een nieuwe taakdefinitie met de nieuwe image
# Bijvoorbeeld door de bestaande taakdefinitie op te halen en te updaten
TASK_DEFINITION=$(aws ecs describe-task-definition --task-definition ${{ env.SERVICE_NAME }})
# Hier pas je de container image aan
NEW_TASK_DEF=$(echo "$TASK_DEFINITION" | jq --arg IMAGE "mijn-dockerhub-gebruiker/mijn-app:${{ github.sha }}" '
.taskDefinition |
.containerDefinitions[0].image |= $IMAGE
')
# Registreer nieuwe taakdefinitie
echo "$NEW_TASK_DEF" > new-task-def.json
aws ecs register-task-definition --cli-input-json file://new-task-def.json
- name: Nieuwe service deployment (blue-green)
run: |
# Verkrijg de nieuwste taakdefinitie-naam
NEW_TASK_DEF_FAMILY=$(jq -r '.taskDefinition.family' new-task-def.json)
# Update de service om de nieuwe taakdefinitie te gebruiken
aws ecs update-service --cluster ${{ env.CLUSTER_NAME }} --service ${{ env.SERVICE_NAME }} --task-definition $NEW_TASK_DEF_FAMILY
# Blue-green deployment: voeg een nieuwe target group toe en switch de load balancer
# Dit vereist dat je ALB en target groups hebt ingesteld voor blue en green
# Bijvoorbeeld:
# aws elbv2 modify-listener --listener-arn arn:aws:elasticloadbalancing:REGIO:ACCOUNT_ID:listener/app/your-listener --default-actions '[{"Type":"forward","TargetGroupArn":"TARGET_GROUP_GREEN"}]'
# Wacht tot de nieuwe deployment klaar is (optioneel)
# Switch traffic naar de nieuwe target group
# aws elbv2 modify-listener ...
# Optioneel: verwijder oude target group of doe roll-back indien nodig
```
**Toelichting:**
- De workflow bouwt een Docker-image en pusht deze naar DockerHub.
- Tijdens deployment wordt een nieuwe ECS taakdefinitie gemaakt met de nieuwe image.
- Vervolgens wordt de service geüpdatet en kan je de load balancer configuratie aanpassen om verkeer naar de nieuwe omgeving (groen) te sturen, waardoor blue-green deployment wordt gerealiseerd.
- Het gebruik van ALB en target groups is essentieel voor een blue-green setup.
**Aanpassingen:**
- Vul je eigen AWS regio, clusternaam, service naam, en target group ARN in.
- Zorg dat je AWS credentials in GitHub secrets hebt ingesteld.
- Mogelijk moet je nog extra logica toevoegen voor het beheren van de traffic switch en rollback.
Wil je dat ik ook voorbeeld scripts voor Canary releases of rolling updates toevoeg?
provider: deepseek
model: deepseek-chat
Hier is een verbeterde GitHub Actions workflow voor blue-green deployment op AWS ECS:
```yaml
name: CI/CD Pipeline
on:
push:
branches: [main]
pull_request:
branches: [main]
env:
AWS_REGION: eu-west-1
ECS_CLUSTER: your-cluster-name
ECS_SERVICE: your-service-name
CONTAINER_NAME: your-container-name
DOCKER_IMAGE: your-ecr-repo/image:latest
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
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: Build Docker image
run: docker build -t ${{ env.DOCKER_IMAGE }} .
- 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: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2
- name: Push image to ECR
run: |
docker push ${{ env.DOCKER_IMAGE }}
blue-green-deployment:
needs: build-and-test
runs-on: ubuntu-latest
environment: production
steps:
- 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: Blue-Green Deployment naar ECS
run: |
# Maak nieuwe task definition aan
aws ecs register-task-definition \
--family ${{ env.ECS_SERVICE }} \
--network-mode awsvpc \
--requires-compatibilities FARGATE \
--cpu 256 \
--memory 512 \
--execution-role-arn ${{ secrets.ECS_TASK_EXECUTION_ROLE }} \
--container-definitions '[
{
"name": "${{ env.CONTAINER_NAME }}",
"image": "${{ env.DOCKER_IMAGE }}",
"portMappings": [
{
"containerPort": 80,
"protocol": "tcp"
}
],
"essential": true
}
]'
# Start blue-green deployment
aws ecs deploy \
--cluster ${{ env.ECS_CLUSTER }} \
--service ${{ env.ECS_SERVICE }} \
--task-definition ${{ env.ECS_SERVICE }} \
--codedeploy-role-arn ${{ secrets.CODEDEPLOY_ROLE_ARN }} \
--codedeploy-appspec appspec.yaml
- name: Wacht op deployment succes
run: |
# Controleer deployment status
aws ecs wait services-stable \
--cluster ${{ env.ECS_CLUSTER }} \
--services ${{ env.ECS_SERVICE }}
post-deployment-validation:
needs: blue-green-deployment
runs-on: ubuntu-latest
steps:
- name: Health check
run: |
# Voer gezondheidschecks uit op nieuwe deployment
# Pas aan naar jouw gezondheidscheck endpoint
curl -f https://your-service.com/health || exit 1
- name: Smoke tests
run: |
# Voer smoke tests uit
npm run smoke-tests
```
**Belangrijke aanpassingen en verbeteringen:**
1. **AWS CodeDeploy integratie** voor native blue-green deployment ondersteuning
2. **Omgevingsvariabelen** voor betere configureerbaarheid
3. **Docker build en push** geïntegreerd in de pipeline
4. **Health checks en validatie** na deployment
5. **Veiligheidsmaatregelen** met environment protection
6. **Cache optimalisatie** voor snellere builds
**Benodigde secrets in GitHub:**
- `AWS_ACCESS_KEY_ID`
- `AWS_SECRET_ACCESS_KEY`
- `ECS_TASK_EXECUTION_ROLE`
- `CODEDEPLOY_ROLE_ARN`
**Extra bestand nodig: `appspec.yaml`** voor CodeDeploy configuratie.
Wil je dat ik ook voorbeelden maak voor canary releases of rolling updates?