Введение

В разделе GitOps мы представили, как интегрировать KCL с GitOps. В этом разделе мы продолжим предоставлять образцы решений для интеграции KCL и CI. Мы надеемся реализовать сквозной процесс разработки приложений, используя контейнеры, непрерывную интеграцию (CI) для генерации и GitOps для непрерывного развертывания (CD). В этой схеме мы используем приложение Flask и действия Github в качестве примеров.

Примечание. В этом решении можно использовать любое контейнерное приложение и различные системы непрерывной интеграции, такие как Gitlab CI, Jenkins CI и т. д.

Общий рабочий процесс выглядит следующим образом:

  • Разработайте код приложения и отправьте его в репозиторий GitHub для запуска CI.
  • Действия GitHub создают образы контейнеров из кода приложения и помещают их в реестр контейнеров docker.io.
  • GitHub Actions автоматически синхронизирует и обновляет файл развертывания манифеста KCL на основе версии образа контейнера в реестре контейнеров docker.io.

Как

1. Получить пример

Мы помещаем исходный код приложения и код развертывания инфраструктуры в разные репозитории, которые могут поддерживаться разными ролями для достижения разделения задач.

  • Получить код приложения
git clone https://github.com/kcl-lang/flask-demo.io.git/
cd flask-demo

Это веб-приложение, написанное на Python. Мы можем использовать Dockerfile в каталоге приложения для создания образа контейнера этого приложения, а также использовать Github CI для автоматического создания образа с именем flask_demo, конфигурация CI выглядит следующим образом.

# This is a basic workflow to help you get started with Actions
name: CI
# Controls when the workflow will run
on:
  # Triggers the workflow on push or pull request events but only for the main branch
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]
  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  # This workflow contains a single job called "build"
  build:
    # The type of runner that the job will run on
    runs-on: ubuntu-latest
    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:
      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - uses: actions/checkout@v2
      
      - name: Docker Login
        uses: docker/[email protected]
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}
          logout: true
      # Runs a set of commands using the runners shell
      - name: build image
        run: |
          make image
          docker tag flask_demo:latest ${{ secrets.DOCKER_USERNAME }}/flask_demo:${{ github.sha }}
          docker push ${{ secrets.DOCKER_USERNAME }}/flask_demo:${{ github.sha }}
      # Trigger KCL manifest
      - name: Trigger CI
        uses: InformaticsMatters/[email protected]
        with:
          ci-owner: kcl-lang
          ci-repository: flask-demo-kcl-manifests
          ci-ref: refs/heads/main
          ci-user: kcl-bot
          ci-user-token: ${{ secrets.DEPLOY_ACCESS_TOKEN }}
          ci-name: CI
          ci-inputs: >-
            image=${{ secrets.DOCKER_USERNAME }}/flask_demo
            sha-tag=${{ github.sha }}

Нам нужен рабочий процесс в репозитории исходного кода, чтобы автоматически запускать рабочий процесс в репозитории манифеста развертывания. На этом этапе нам нужно создать secrets.DEPLOY_ACCESS_TOKEN с разрешениями на операцию Github CI, а информацию об учетной записи Docker Hub push secrets.DOCKER_USERNAME и secrets.DOCKER_PASSWORD можно настроить в настройках Secrets and variables Github, как показано на следующем рисунке.

2. Зафиксируйте код приложения

После отправки в репозиторий flask-demo Github автоматически создаст образ контейнера и отправит его в концентратор Docker. Затем он также инициирует действие репозитория flask-demo-kcl-manifest и изменит значение изображения в репозитории манифеста развертывания через KCL Automation API. Теперь давайте создадим отправку в репозиторий flask-demo, и мы увидим, что отправка кода запускает процесс Github CI для репозитория приложений.

3. Автоматическое обновление конфигурации

После завершения процесса Github CI в репозитории приложений в репозитории, где хранится конфигурация KCL, будет запущено автоматическое обновление конфигурации CI, которое будет отправлено в основную ветвь репозитория flask-demo-kcl-manifests. Информация о коммите выглядит следующим образом

  • Мы можем получить исходный код манифеста развертывания для компиляции и проверки.
git clone https://github.com/kcl-lang/flask-demo-kcl-manifests.git/
cd flask-demo-kcl-manifests
git checkout main && git pull && kcl

Выходной YAML

apiVersion: apps/v1
kind: Deployment
metadata:
  name: flask_demo
  labels:
    app: flask_demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: flask_demo
  template:
    metadata:
      labels:
        app: flask_demo
    spec:
      containers:
        - name: flask_demo
          image: "kcllang/flask_demo:6428cff4309afc8c1c40ad180bb9cfd82546be3e"
          ports:
            - protocol: TCP
              containerPort: 5000
---
apiVersion: v1
kind: Service
metadata:
  name: flask_demo
  labels:
    app: flask_demo
spec:
  type: NodePort
  selector:
    app: flask_demo
  ports:
    - port: 5000
      protocol: TCP
      targetPort: 5000

Из приведенной выше конфигурации видно, что изображение ресурса действительно автоматически обновляется до нового созданного значения изображения. Кроме того, мы также можем использовать плагин Argo CD KCL для автоматической синхронизации данных из репозитория Git и развертывания приложения в кластере Kubernetes.

Резюме

Интегрируя KCL и Github CI, мы можем автоматизировать модификацию и конфигурацию развертывания любого образа выходного контейнера приложения, чтобы обеспечить сквозной процесс разработки приложений и повысить эффективность развертывания исследований и разработок.