Pull to refresh
2
0

Писатель-программист

Send message

Я призналась еще в начале, что сама не писала test, но насколько я предполагаю, ответ ии плюс минус верный, учитывая мой небольшой опыт

Скорее всего вы правы, я в этом деле еще профан. А можете чуть более конкретно описать, как это сделать? Или может знаете пару хороших статей на этот счет?

Если использовать чуть более специализированные тесты, то:

Пишем что-то в docker-compose.test.yml:

version: '3'
services:
  app:
    image: myapp
    command: npm run test:integration  # Ваша команда
    depends_on:
      - postgres
  postgres:
    image: postgres:13
    environment:
      POSTGRES_PASSWORD: "test"

В пайплайне будет выглядеть так:

test_integration:
  script:
    - docker-compose -f docker-compose.test.yml up --abort-on-container-exit

Параллельный запуск тестов

stages:
  - build
  - test

unit_test:
  stage: test
  script: docker run --rm myapp npm test

integration_test:
  stage: test
  script: docker-compose -f docker-compose.test.yml up --abort-on-container-exit

e2e_test:
  stage: test
  script: docker run --rm myapp npm run test:e2e

Если честно, сама я такое не писала, но если чисто в теории, то в том же файле можно написать этап test.

Для GitLab CI (.gitlab-ci.yml):

stages:
  - build
  - test  # ← Новый этап
  - deploy

build:
  stage: build
  script:
    - docker build -t myapp .
    # Сохраняем образ для следующих этапов
    - docker save myapp > myapp.tar
  artifacts:
    paths:
      - myapp.tar

test:  # ← Вот этот новый блок
  stage: test
  script:
    - docker load < myapp.tar
    # Запускаем тесты внутри контейнера
    - docker run --rm myapp npm test  # Для Node.js
    # Или для других языков:
    # - docker run --rm myapp pytest    # Python
    # - docker run --rm myapp mvn test # Java

deploy:
  stage: deploy
  script:
    - ssh user@vm_ip "docker load < myapp.tar"
    - ssh user@vm_ip "docker run -d -p 3000:3000 --name myapp myapp"
  only:
    - master

Для GitHub Actions (.github/workflows/ci.yml):

jobs:
  build-and-test:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    
    - name: Build and test
      run: |
        docker build -t myapp .
        docker run --rm myapp npm test  # Тесты запускаются здесь
        
    - name: Prepare for deploy
      run: docker save myapp > myapp.tar
      
    - name: Upload artifact
      uses: actions/upload-artifact@v2
      with:
        name: app-image
        path: myapp.tar

  deploy:
    needs: build-and-test
    runs-on: ubuntu-latest
    steps:
    - uses: actions/download-artifact@v2
      with:
        name: app-image
        
    - name: Deploy
      run: |
        scp myapp.tar user@vm_ip:/tmp/
        ssh user@vm_ip "docker load < /tmp/myapp.tar"
        ssh user@vm_ip "docker run -d -p 3000:3000 --name myapp myapp"
  1. Сначала собираем образ

  2. Затем тестируем:

    • Загружаем собранный в билде образ из временного файла myapp.tar

    • Запускаем docker run --rm с командой тестов

    • Если тесты упадут - пайплайн остановится

  3. Деплоим только если тесты прошли (все тот же образ myapp.tar)

Information

Rating
Does not participate
Registered
Activity

Specialization

Backend Developer
Middle
SQL
C#
ASP.Net
OOP
PostgreSQL