Sobes.tech
Middle
98
questionbank

Какие проекты вы реализовывали с использованием GitLab CI?

Answer from AI

sobes.tech AI

Реализовал проекты по автоматизации CI/CD для различных типов приложений.

  1. Веб-приложение на Python/Django: Настроен конвейер CI/CD для автоматического тестирования (pytest), проверки стиля кода (flake8), сборки Docker-образа, пуша образа в GitLab Container Registry и деплоя в Kubernetes с использованием kubectl и Helm.

    # .gitlab-ci.yml
    stages:
      - test
      - build
      - deploy
    
    variables:
      DOCKER_DRIVER: overlay2
      DOCKER_TLS_CERTDIR: "/certs"
    
    test:
      stage: test
      image: python:3.9
      script:
        - pip install -r requirements.txt
        - pytest
        - flake8 .
    
    build:
      stage: build
      image: docker:latest
      services:
        - docker:dind
      script:
        - echo $CI_REGISTRY_PASSWORD | docker login -u $CI_REGISTRY_USER $CI_REGISTRY --password-stdin
        - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA .
        - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
    
    deploy:
      stage: deploy
      image: alpine/k8s:1.25.2
      before_script:
        - apk add gettext # For envsubst
        - echo "$KUBE_CONFIG" | base64 -d > $KUBE_CONFIG_PATH
      script:
        # Example deploy using kubectl
        - kubectl apply -f kubernetes/deployment.yaml -f kubernetes/service.yaml
        # Example deploy using Helm
        # - helm upgrade --install myapp ./helm/myapp --namespace default --set image.tag=$CI_COMMIT_SHORT_SHA
      variables:
        KUBE_CONFIG_PATH: $KUBECONFIG # Kubeconfig is stored in a CI/CD variable
      only:
        - main
    
  2. Микросервисы на Golang: Создан пайплайн для сборки Go-приложений, выполнения юнит-тестов, статического анализа кода (go vet, golint), сборки минималистичных статических Docker-образов (используя многостадийную сборку или scratch), пуша образов и деплоя в Docker Swarm или Kubernetes.

    # .gitlab-ci.yml
    stages:
      - test
      - build
      - deploy
    
    variables:
      # Disable CGO to build static binaries for smaller images
      CGO_ENABLED: 0
    
    test:
      stage: test
      image: golang:1.19
      script:
        - go test -v ./...
        - go vet ./...
        # - golint ./... # Example linters
    
    build:
      stage: build
      image: docker:latest
      services:
        - docker:dind
      script:
        - echo $CI_REGISTRY_PASSWORD | docker login -u $CI_REGISTRY_USER $CI_REGISTRY --password-stdin
        - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA . # Uses Dockerfile with multi-stage build
        - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
    
    deploy:
      stage: deploy
      image: docker/compose:1.29.2 # Example Docker Swarm deploy
      script:
        - docker stack deploy -c docker-compose.yml my_stack --resolve-image always
      only:
        - main
    
  3. Проект с инфраструктурой как кодом (Terraform): Автоматизировано применение Terraform-изменений. Пайплайн включает этапы планирования (terraform plan) на каждом пуше в merge request и применения (terraform apply) при слиянии в основную ветку. Использовались GitLab Managed Terraform state и GitLab Environment variables для хранения чувствительных данных.

    # .gitlab-ci.yml
    stages:
      - validate
      - plan
      - apply
    
    image:
      name: hashicorp/terraform:1.3.0
      entrypoint: ["/usr/bin/env", "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "/usr/bin/tf"]
    
    variables:
      TF_ROOT: ${CI_PROJECT_DIR}/terraform # Adjust if your terraform code is in a subdirectory
      TF_VAR_GITLAB_TOKEN: ${GITLAB_TOKEN} # Example: Passing GitLab API token
    
    before_script:
      - cd ${TF_ROOT}
      - gitlab-terraform init -upgrade # Handles state backend configuration
    
    validate:
      stage: validate
      script:
        - gitlab-terraform validate
    
    plan:
      stage: plan
      script:
        - gitlab-terraform plan
        - gitlab-terraform plan-json > plan.json # Generate plan in JSON for MR widget
      artifacts:
        reports:
          terraform: ${TF_ROOT}/plan.json # Enable MR widget integration
    
    apply:
      stage: apply
      script:
        - gitlab-terraform apply -auto-approve # Apply changes automatically
      only:
        - main # Only apply on merge to main branch
      dependencies:
        - plan
    
  4. Проект с фронтендом на Vue.js: Настроен пайплайн для сборки фронтенд-приложения (npm install, npm run build), линтинга (ESLint), запуска юнит-тестов (Jest), создания Docker-образа (nginx serving static files) и деплоя статики на S3 или в Nginx-контейнере.

    # .gitlab-ci.yml
    stages:
      - build
      - test
      - deploy
    
    build:
      stage: build
      image: node:16
      script:
        - npm ci
        - npm run build
    
    test:
      stage: test
      image: node:16
      needs: [build] # Ensure build stage runs first
      script:
        - npm ci
        - npm run lint
        - npm run test --ci --json --outputFile=report.json # Run tests and generate report
      artifacts:
        reports:
          junit: report.json # Integrate test results into MR/Pipeline view
    
    deploy:
      stage: deploy
      image: python:latest # Using Python for AWS CLI example
      script:
        # Example deploy to S3
        - pip install awscli
        - aws s3 sync ./dist s3://$S3_BUCKET_NAME --delete
      only:
        - main
      dependencies:
        - build # Ensure build artifacts are available
    

Во всех проектах применялись следующие практики:

  • Использование GitLab Runners (Shared или Specific VM/Docker).
  • Конфигурация с помощью .gitlab-ci.yml.
  • Работа с Docker образами через GitLab Container Registry.
  • Использование CI/CD Variables (Secret и Protected) для хранения учетных данных и конфигурации.
  • Настройка Environments для организации деплоев (Development, Staging, Production).
  • Создание Merge Request Pipelines для ранней валидации изменений.
  • Настройка расписаний для периодического запуска пайплайнов.
  • Использование GitLab Review Apps для динамического развертывания окружений для каждого Merge Request. (Особенно актуально для веб-приложений).
  • Интеграция с Snyk или другими инструментами для анализа уязвимостей (в некоторых проектах).

Эти проекты демонстрируют опыт в построении надежных и автоматизированных процессов доставки кода, охватывающих тестирование, сборку и деплой для разных стеков технологий и инфраструктур.