Gitlab CD: create-react-app сайт в docker контейнер

Fakeheal

Super Moderator
Здравейте,

имам един сайт на react (направен с create-react-app), чието репозитори е в Gitlab. Хостинга е дроплет в digital ocean. Искам при push-ването в определен бранч, да ми се деплойне сайтчето на този хостинг.

Състоянието, до което го докарах е:
- при пуш в определния бранч се изпълняват стейджовете ми
- при успешен инстал/билд/тест се копират файловете на сървъра
- извиква се docker restart my-container-name


По-долу са:
- gitlab-ci.yml
- docker-compose.staging.yml
- Dockerfile.staging

Код:
stages:
  - install
  - test
  - build
  - deploy

variables:
  REACT_APP_DOMAIN: my-domain.com
  REACT_APP_RELEASE_VERSION: staging

# в git repository-то има private git submodules за това ми трябва и ключ, който има
# достъп до submodules
.project_setup:
  image: node:12-alpine3.12
  before_script:
    - apk --no-cache add git openssh-client bash
    - eval `ssh-agent -s`
    - echo "$SSH_SUBMODULES_ed25519" | tr -d '\r' | ssh-add -
    - mkdir -p ~/.ssh
    - touch ~/.ssh/known_hosts
    - ssh-keyscan -t ed25519 gitlab.com >> ~/.ssh/known_hosts
    - ssh-keyscan -t ed25519 "$REACT_APP_DOMAIN" >> ~/.ssh/known_hosts
    - git submodule sync
    - git submodule update --init --recursive --remote


# инсталирам проекта, за да може после да пусна тестовете
# артифактите са ми dependency-тата, nginx настройките (в папката data),
# docker файловете: docker-compose.staging.yml, Docker.staging
install:
  extends: .project_setup
  stage: install
  script:
    - yarn install
  environment:
    name: staging
    url: $REACT_APP_DOMAIN
  rules:
    - if: $CI_COMMIT_BRANCH == "staging"
  artifacts:
    name: "artifacts"
    untracked: true
    expire_in: 60 mins
    paths:
      - .npm/
      - node_modules/
      - docker-compose.staging.yml
      - Dockerfile.staging
      - data

# пускаме тестове
test:
  extends: .project_setup
  stage: test
  script:
    - yarn test
  environment:
    name: staging
    url: $REACT_APP_DOMAIN
  rules:
    - if: $CI_COMMIT_BRANCH == "staging"
  dependencies:
    - install

# правим optimized build на сайтчето и копираме файловете
# накрая рескаме container-a ми
build:
  extends: .project_setup
  stage: build
  script:
    - CI=false yarn build
  artifacts:
    paths:
      - build
    expire_in: 60 mins
  environment:
    name: staging
    url: $REACT_APP_DOMAIN
  rules:
    - if: $CI_COMMIT_BRANCH == "staging"
  dependencies:
    - install

deploy:
  extends: .project_setup
  stage: deploy
  rules:
    - if: $CI_COMMIT_BRANCH == "staging"
  script:
    - scp -r ./build/* deployer@$REACT_APP_DOMAIN:/var/www/create-react-app/my-website
    - scp -r ./data deployer@$REACT_APP_DOMAIN:/var/www/create-react-app/my-website/
    - scp ./docker-compose.staging.yml deployer@$REACT_APP_DOMAIN:/var/www/create-react-app/my-website
    - scp ./Dockerfile.staging deployer@$REACT_APP_DOMAIN:/var/www/create-react-app/my-website
    - ssh deployer@$REACT_APP_DOMAIN mv /var/www/create-react-app/my-website/docker-compose.staging.yml /var/www/create-react-app/my-website/docker-compose.yml
    - ssh deployer@$REACT_APP_DOMAIN mv /var/www/create-react-app/my-website/Dockerfile.staging /var/www/create-react-app/my-website/Dockerfile
    - ssh deployer@$REACT_APP_DOMAIN docker restart my-container-name
  dependencies:
    - install
    - build

Код:
version: "3.7"

services:
  nginx:
    container_name: my-container-name
    build: .
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./data/nginx:/etc/nginx/conf.d
      - ./data/certbot/conf:/etc/letsencrypt
      - ./data/certbot/www:/var/www/certbot
  certbot:
    image: certbot/certbot
    volumes:
      - ./data/certbot/conf:/etc/letsencrypt
      - ./data/certbot/www:/var/www/certbot

Код:
FROM nginx:stable-alpine

COPY ./app/ /usr/share/nginx/html
COPY ./data/nginx/.htpasswd /etc/nginx/passwd/

CMD ["nginx", "-g", "daemon off;"]

Въпросите ми са няколко:
- docker restart my-container-name ще отрази ли промените по файловете на сайта (папка app/)
- docker restart my-container-name ще отрази ли промени по docker файловете: Dockerfile.staging, docker-compose.staging.yml
- има ли по-кратък път към дестинацията ми (описана в началото на поста) :D

Поздрави,
Ив'

PS: Сега като се замисля, може би .htpasswd, не трябва да е в git :D
 
Предполагам цялото нещо се пуска с docker-compose - ако е така, виж примерно тук:

Код:
docker-compose up --build --force-recreate --no-deps [-d] [<service_name>..]

Само с docker restart не мисля че ще стане - няма какво да му каже да rebuild-не image-a.
 
djman каза:
Предполагам цялото нещо се пуска с docker-compose - ако е така, виж примерно тук:

Код:
docker-compose up --build --force-recreate --no-deps [-d] [<service_name>..]

Само с docker restart не мисля че ще стане - няма какво да му каже да rebuild-не image-a.

Супер се получи с:
Код:
docker-compose -f docker-compose.yml up --force-recreate --build -d
:dance:
 

Горе