GitLab CI/CD에서 SCP를 통한 배포와 함께 Composer 및 npm 스크립트 실행하기
이 가이드는 GitLab CI/CD를 사용하여 npm 스크립트를 통해 자산을 컴파일하는 동안 PHP 프로젝트의 종속성을 빌드하는 방법을 다룹니다.
자신만의 이미지에서 사용자 지정 PHP 및 Node.js 버전을 만드는 것이 가능하지만, 간결함을 위해 PHP와 Node.js가 설치된 기존 Docker 이미지를 사용합니다.
image: tetraweb/php
다음 단계는 zip/unzip 패키지를 설치하고 composer를 사용할 수 있도록 하는 것입니다. 이를 before_script
섹션에 추가합니다:
before_script:
- apt-get update
- apt-get install zip unzip
- php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
- php composer-setup.php
- php -r "unlink('composer-setup.php');"
이것은 모든 요구 사항이 준비되었는지 확인합니다. 다음으로 composer install
을 실행하여 모든 PHP 종속성을 가져오고, npm install
로 Node.js 패키지를 로드합니다. 그런 다음 npm
스크립트를 실행합니다. 이들을 before_script
섹션에 추가해야 합니다:
before_script:
# ...
- php composer.phar install
- npm install
- npm run deploy
특히 이 경우, npm deploy
스크립트는 다음을 수행하는 Gulp 스크립트입니다:
- CSS 및 JS 컴파일
- 스프라이트 생성
- 다양한 자산(이미지, 글꼴) 복사
- 일부 문자열 교체
이 모든 작업은 모든 파일을 build
폴더에 넣으며, 이는 라이브 서버에 배포할 준비가 되어 있습니다.
라이브 서버로 파일 전송하는 방법
여러 가지 옵션(예: rsync, SCP 또는 SFTP)이 있습니다. 지금은 SCP를 사용하세요.
작동하려면 GitLab CI/CD 변수를 추가해야 합니다(gitlab.example/your-project-name/variables
에서 접근 가능). 이 변수의 이름을 STAGING_PRIVATE_KEY
로 지정하고 서버의 private SSH 키로 설정합니다.
보안 팁
업데이트가 필요한 폴더에 오직 접근할 수 있는 사용자를 생성하세요.
변수를 생성한 후, 해당 키가 실행 시 Docker 컨테이너에 추가되었는지 확인합니다:
before_script:
# - ....
- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
- mkdir -p ~/.ssh
- eval $(ssh-agent -s)
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
순서대로, 이는 다음을 의미합니다:
-
ssh-agent
가 사용 가능한지 확인하고, 그렇지 않으면 설치합니다. -
~/.ssh
폴더를 생성합니다. - bash를 실행하는지 확인합니다.
- 호스트 확인을 비활성화합니다(서버에 처음 연결할 때 사용자 수락을 요청하지 않으며, 모든 작업이 처음 연결과 같기 때문에 필요합니다).
그리고 이것이 기본적으로 before_script
섹션에서 필요한 모든 것입니다.
배포하는 방법
앞서 언급했듯이, Docker 이미지에서 build
폴더를 서버로 배포해야 합니다. 이를 위해 새로운 작업을 만들겠습니다:
stage_deploy:
artifacts:
paths:
- build/
rules:
- if: $CI_COMMIT_BRANCH == "dev"
script:
- ssh-add <(echo "$STAGING_PRIVATE_KEY")
- ssh -p22 server_user@server_host "mkdir htdocs/wp-content/themes/_tmp"
- scp -P22 -r build/* server_user@server_host:htdocs/wp-content/themes/_tmp
- ssh -p22 server_user@server_host "mv htdocs/wp-content/themes/live htdocs/wp-content/themes/_old && mv htdocs/wp-content/themes/_tmp htdocs/wp-content/themes/live"
- ssh -p22 server_user@server_host "rm -rf htdocs/wp-content/themes/_old"
세분화된 설명은 다음과 같습니다:
-
rules:if: $CI_COMMIT_BRANCH == "dev"
는 이 빌드가dev
브랜치에 무언가가 푸시될 때만 실행됨을 의미합니다. 이 블록을 완전히 제거하고 모든 푸시에서 실행되도록 할 수 있지만, 아마도 당신이 원하지 않을 것입니다. -
ssh-add ...
우리가 웹 UI에서 추가한 private 키를 Docker 컨테이너에 추가합니다. -
ssh
를 통해 연결하고 새로운_tmp
폴더를 생성합니다. -
scp
를 통해 연결하고npm
스크립트로 생성된build
폴더를 이전에 생성한_tmp
폴더로 업로드합니다. - 다시
ssh
를 통해 연결하고live
폴더를_old
폴더로 이동한 다음_tmp
를live
로 이동합니다. - SSH에 연결하여
_old
폴더를 제거합니다.
아티팩트는 무엇인가요? GitLab CI/CD에 build
디렉토리를 유지하도록 지시합니다(나중에 필요에 따라 다운로드할 수 있습니다).
왜 이렇게 하는가
만약 당신이 이것을 스테이지 서버에만 사용하고 있다면, 두 단계로 할 수 있습니다:
- ssh -p22 server_user@server_host "rm -rf htdocs/wp-content/themes/live/*"
- scp -P22 -r build/* server_user@server_host:htdocs/wp-content/themes/live
문제는 서버에 앱이 없는 짧은 시간이 있다는 것입니다.
따라서, 프로덕션 환경에서는 특정 시간에 기능이 있는 앱이 있도록 추가 단계를 사용합니다.
다음 단계
이 프로젝트는 WordPress 프로젝트였으므로 실제 코드 스니펫이 포함되어 있습니다. 당신이 추구할 수 있는 몇 가지 아이디어는 다음과 같습니다:
- 기본 브랜치에 대해 약간 다른 스크립트를 사용하면 해당 브랜치에서 프로덕션 서버로 배포하고 다른 브랜치에서 스테이지 서버로 배포할 수 있습니다.
- 라이브로 푸시하는 대신 WordPress 공식 저장소에 푸시할 수 있습니다.
- i18n 텍스트 도메인을 즉석에서 생성할 수 있습니다.
우리의 최종 .gitlab-ci.yml
은 다음과 같습니다:
stage_deploy:
image: tetraweb/php
artifacts:
paths:
- build/
rules:
- if: $CI_COMMIT_BRANCH == "dev"
before_script:
- apt-get update
- apt-get install zip unzip
- php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
- php composer-setup.php
- php -r "unlink('composer-setup.php');"
- php composer.phar 설치
- npm install
- npm run deploy
- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
- mkdir -p ~/.ssh
- eval $(ssh-agent -s)
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
script:
- ssh-add <(echo "$STAGING_PRIVATE_KEY")
- ssh -p22 server_user@server_host "mkdir htdocs/wp-content/themes/_tmp"
- scp -P22 -r build/* server_user@server_host:htdocs/wp-content/themes/_tmp
- ssh -p22 server_user@server_host "mv htdocs/wp-content/themes/live htdocs/wp-content/themes/_old && mv htdocs/wp-content/themes/_tmp htdocs/wp-content/themes/live"
- ssh -p22 server_user@server_host "rm -rf htdocs/wp-content/themes/_old"