Meine CI/CD-Pipeline, von der Verpflichtung bis zur Produktion
Bauen, testen, scannen, einsetzen, überprüfen. Eine komplette Pipeline, die Sie kopieren können.
Bauen, testen, scannen, einsetzen, überprüfen. Eine komplette Pipeline, die Sie kopieren können.

Wenn Sie zehn DevOps-Ingenieure bitten, eine CI/CD-Pipeline zu zeichnen, erhalten Sie zehn verschiedene Zeichnungen. Aber unterhalb haben gute Rohrleitungen die gleiche Form. Sie geben schnell Feedback, erkennen Probleme frühzeitig und machen die Bereitstellung langweilig.
Hier ist die Pipeline, die ich für einen typischen containerisierten Web-Service benutzen würde, Schritt für Schritt, mit einem Arbeitsbeispiel in GitHub Actions.
Das wichtigste Prinzip liegt im zweiten Schritt: Einmal bauen, überall das gleiche Artefakt einsetzen. Nie wieder für die Produktion. Was du getestet hast, ist das, was du verschiffst.
Eine gute Pipeline macht das Richtige automatisch und das Risiko sichtbar.
Eine verkleinerte Version von dem, wie das hier in GitHub Actions aussieht:
name: ci-cd
on:
pull_request:
push:
branches: [main]
permissions:
contents: read
env:
IMAGE: ghcr.io/my-org/shop-api
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@<sha> # v4
- uses: actions/setup-go@<sha> # v5
with:
go-version-file: go.mod
cache: true
- run: go vet ./...
- run: go test ./... -race -coverprofile=coverage.out
build:
needs: test
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
id-token: write # for keyless signing
outputs:
digest: ${{ steps.push.outputs.digest }}
steps:
- uses: actions/checkout@<sha> # v4
- uses: docker/setup-buildx-action@<sha> # v3
- uses: docker/login-action@<sha> # v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- id: push
uses: docker/build-push-action@<sha> # v6
with:
push: ${{ github.event_name == 'push' }}
tags: ${{ env.IMAGE }}:${{ github.sha }}
cache-from: type=gha
cache-to: type=gha,mode=max
- name: Scan image
uses: aquasecurity/trivy-action@<sha>
with:
image-ref: ${{ env.IMAGE }}:${{ github.sha }}
severity: HIGH,CRITICAL
ignore-unfixed: true
exit-code: "1"
deploy-staging:
if: github.event_name == 'push'
needs: build
runs-on: ubuntu-latest
environment: staging
steps:
- run: echo "Update the staging GitOps repo to ${{ github.sha }}"
- run: ./scripts/smoke-test.sh https://staging.example.com
deploy-production:
needs: deploy-staging
runs-on: ubuntu-latest
environment: production # requires approval in repo settings
steps:
- run: echo "Update the production GitOps repo to ${{ github.sha }}"
(Ersetzen <sha> mit festgegründeten commit-SHAs, wie in meinem Beitrag zum Sperren von GitHub-Aktionen beschrieben.)
Ein paar Details, die es wert sind, beachtet zu werden:
staging, production) können Genehmigungen verlangen und ihre eigenen Geheimnisse bewahren.kubectl - Ich bin direkt hier. Argo CD oder Flux wendet die Änderung an, die die Anmeldeinformationen von CI fernhält.Langsame Pipelines machen die Entwickler vertrauenslos. Ein paar Gewohnheiten lassen die Dinge schnell laufen:
cache-from / cache-to die oben stehenden Zeilen).Ein Rollback sollte so einfach wie ein Einsatz sein und geübt werden:
Wenn Ihre Pipeline nichts anderes tut, dann lassen Sie es dies tun: Führen Sie Tests an jeder Pull-Anfrage durch, erstellen Sie ein Bild pro Kommit, scannen Sie es, bereitstellen Sie genau dieses Bild automatisch zur Inszenierung und fördern Sie das gleiche Bild zur Produktion. Alles andere ist eine Verbesserung.
Meine Meinung: Bauen Sie einmal, testen Sie früh, setzen Sie überall dasselbe ein und wissen Sie immer, wie Sie zurückkehren.
Desly