Docker화된 GitLab CI 파이프라인에서 Rsync 및 SSH를 사용하는 방법

rsync는 효율적인 알고리즘을 사용하여 대역폭 소비를 최소화하는 널리 사용되는 파일 동기화 유틸리티입니다. rsync의 일반적인 역할 중 하나는 웹 사이트 빌드를 원격 프로덕션 서버에 배포하는 것입니다. rsync의 다재다능함과 GitLab CI 파이프라인에서 제공하는 자동화를 결합하는 방법은 다음과 같습니다.
파이프라인 실행자
GitLab CI는 여러 유형의 파이프라인 실행기를 지원합니다. 이는 작업이 실행될 환경을 정의합니다. shell 실행자는 기본값이며 호스트 시스템에서 베어 메탈을 실행합니다. 이를 통해 파이프라인은 추가 구성 없이 호스트에서 사용 가능한 모든 명령을 사용할 수 있습니다. 가장 널리 사용되는 Linux 배포판은 rsync가 설치된 상태로 제공되므로 이 접근 방식을 이해하기 쉽습니다.
불행하게도 shell 실행기는 강력한 격리를 제공하지 않으며 시간이 지남에 따라 호스트 환경을 오염시킬 수 있습니다. 더 나은 대안은 docker 실행기로 각 CI 작업에 대해 새로운 Docker 컨테이너를 가동합니다. 모든 작업은 호스트에 영향을 미치지 않는 깨끗한 환경에서 실행됩니다.
여기서 단점은 Docker 기본 이미지가 일반적으로 rsync 또는 ssh를 포함하지 않는다는 것입니다. ubuntu:latest와 같은 공식 OS 이미지도 이러한 명령 없이 최소 빌드로 제공됩니다. 이렇게 하면 종속성을 추가하고 파일을 rsync하는 파이프라인 스크립트가 약간 더 복잡해집니다.
파이프라인에 rsync를 추가하는 방법은 다음과 같습니다. 계속하기 전에 사용 가능한 Docker 기반 GitLab Runner가 있는지 확인하세요. 또한 사용할 준비가 된 GitLab 프로젝트가 있다고 가정합니다.
준비하기
rsync를 사용하여 원격 SSH 호스트에 연결하려면 사용 가능한 SSH 키 쌍이 필요합니다. ssh-keygen -t rsa를 실행하여 공개 및 개인 키를 생성할 수 있습니다. 연결할 서버에 공개 키를 복사합니다.
다음으로 생성된 개인 키를 클립보드에 복사합니다.
cat ~/.ssh/id_rsa | xclip -selection cGitLab 프로젝트로 이동하여 왼쪽 탐색 메뉴 하단의 설정을 클릭합니다. 하위 메뉴에서 “CI/CD” 항목을 클릭합니다. 결과 페이지에서 변수 섹션까지 아래로 스크롤합니다.

파란색 변수 추가 버튼을 클릭합니다. 키 필드에 새 변수 이름을 지정하십시오. 우리는 SSH_PRIVATE_KEY를 사용하고 있습니다. 선행 ----BEGIN 및 후행 -----END 줄을 포함하여 개인 키를 값 필드에 붙여넣습니다.

키를 CI 변수로 추가하면 나중에 파이프라인에서 참조할 수 있습니다. 파이프라인이 생성하는 컨테이너의 SSH 에이전트에 추가됩니다.
파이프라인 파일 추가
GitLab CI는 저장소에 있는 .gitlab-ci.yml 파일의 내용을 기반으로 작업을 실행합니다. GitLab은 자동으로 이 파일을 찾아 변경 사항을 분기에 푸시할 때 정의된 파이프라인을 실행합니다.
class="co4">deploy:class="co3">
stageclass="sy2">: deployclass="co3">
imageclass="sy2">: alpine:latestclass="co4">
scriptclass="sy2">:
- rsync -atv --delete --progress ./ user@example.com:/var/www/html이 .gitlab-ci.yml에는 rsync를 사용하여 작업 디렉토리의 내용을 /var/www/html에 동기화하는 작업이 포함되어 있습니다. example.com 서버. alpine:latest Docker 이미지를 빌드 환경으로 사용합니다. 파이프라인은 현재 rsync가 Alpine 이미지에 포함되어 있지 않기 때문에 실패합니다.
SSH 및 rsync 설치
Alpine은 종속성이 거의 없는 가벼운 이미지이기 때문에 작업을 위한 좋은 기반입니다. 이렇게 하면 GitLab이 작업 시작 시 이미지를 가져오는 동안 네트워크 사용이 줄어들어 파이프라인이 가속화됩니다. rsync가 작동하도록 하려면 이미지에 SSH 및 rsync를 추가한 다음 SSH 에이전트를 시작하고 이전에 생성한 프라이빗 키를 등록합니다.
class="co4">deploy:class="co3">
stageclass="sy2">: deployclass="co3">
imageclass="sy2">: alpine:latestclass="co4">
before_scriptclass="sy2">:
- apk update && apk add openssh-client rsync
- eval $class="br0">(ssh-agent -sclass="br0">)
- echo class="st0">"$SSH_PRIVATE_KEY" | ssh-add -class="co4">
scriptclass="sy2">:
- rsync -atv --delete --progress ./ user@example.com:/var/www/htmlOpenSSH 및 rsync는 Alpine의 apk 패키지 관리자를 사용하여 설치됩니다. SSH 인증 에이전트가 시작되고 개인 키가 ssh-add를 통해 추가됩니다. GitLab은 프로젝트 설정에서 정의한 값으로 SSH_PRIVATE_KEY 환경 변수를 자동으로 주입합니다. GitLab 변수 화면에서 다른 키를 사용한 경우 그에 따라 파이프라인을 조정해야 합니다.
호스트 확인 관리
SSH는 새 원격 호스트에 처음 연결할 때 대화식으로 확인 메시지를 표시합니다. 이는 이러한 프롬프트를 보거나 응답할 수 없는 CI 환경과 호환되지 않습니다.
이를 해결하기 위해 두 가지 옵션을 사용할 수 있습니다. 엄격한 호스트 키 확인을 비활성화하거나 미리 서버를 알려진 호스트로 등록합니다.
첫 번째 옵션의 경우 파이프라인의 before_script에 다음 줄을 추가합니다.
- echo class="st0">"Host *ntStrictHostKeyChecking no" >> ~/.ssh/config이것이 작동하는 동안 잠재적인 보안 위험이 있습니다. 공격자가 서버의 도메인이나 IP를 제어하는 경우 경고가 표시되지 않습니다. 호스트 키 확인을 사용하면 리모컨의 ID가 예상한 것인지 확인할 수 있습니다.
파이프라인 외부에 있는 자체 시스템에 연결하여 비대화형 방식으로 원격을 알려진 호스트로 추가할 수 있습니다. ~/.ssh/known_hosts 파일을 검사하고 원격 IP 또는 호스트 이름이 포함된 행을 찾으십시오. 이 줄을 복사하고 이전 절차를 사용하여 새 GitLab CI 변수를 추가합니다. 이 변수의 이름을 SSH_HOST_KEY로 지정합니다.
이제 before_script 섹션을 다음 줄로 업데이트합니다.
- echo class="st0">"$SSH_HOST_KEY" > ~/.ssh/known_hosts이제 확인 프롬프트를 받지 않고 서버에 연결할 수 있습니다. 코드를 GitLab 리포지토리로 푸시하고 파이프라인이 완료되는 것을 지켜보십시오.
추가 개선 사항
이 파이프라인은 Docker화된 환경에서 SSH 및 rsync를 시작하는 방법에 대한 간단한 예입니다. 준비 단계를 파이프라인 간에 재사용할 수 있는 Docker 이미지를 구성하는 전용 빌드 단계로 래핑하여 시스템을 추가로 개선할 수 있는 기회가 있습니다.
.gitlab-ci.yml은 또한 변수를 더 많이 사용함으로써 이점을 얻을 수 있습니다. 원격 서버의 호스트 이름(example.com), 디렉토리(/var/www/html) 및 사용자(user)를 GitLab CI로 추상화 변수는 파일을 깨끗하게 유지하는 데 도움이 되고 일반 리포지토리 브라우저가 환경 세부 정보를 보지 못하게 하며 파이프라인 파일을 편집하지 않고도 구성 값을 변경할 수 있습니다.
요약
GitLab CI 파이프라인에서 rsync를 사용하려면 필요한 종속성이 있는 빌드 환경을 형성하기 위해 약간의 수동 설정이 필요합니다. SSH 개인 키를 수동으로 주입하고 원격 서버를 알려진 호스트로 등록해야 합니다.
인기 있는 기본 이미지 위에 SSH 및 rsync를 롤링하는 커뮤니티 Docker 이미지를 사용할 수 있지만 궁극적으로 빌드에 대한 제어 권한이 줄어듭니다. 반드시 신뢰할 수 없는 이미지로 파이프라인의 공급망을 확장하고 있습니다. OS 기본 이미지로 시작하여 필요한 것을 추가하면 빌드에 대한 확신을 가질 수 있습니다.
관련기사:
- rsync를 사용하여 Linux 디렉터리를 원격 시스템에 백업하는 방법
- Rsync를 사용하여 전체 Linux 시스템을 백업하는 방법
- Rsync를 사용하여 SSH를 통해 부분적으로 전송된 파일 재개
- Linux에서 Rsync를 사용하여 파일 및 디렉터리 백업
- 초보자를 위한 Linux Rsync 명령 예
- Grsync - Rsync를 위한 간단한 그래픽 프런트엔드
- Rsync 스크립트를 사용하여 원격 Linux VPS에서 파일을 백업하는 방법
- Linux에서 Rsync를 사용하여 로컬 및 원격 디렉터리 동기화
- Linux에서 rsync 명령을 마스터하는 방법
- Linux에서 Rsync 명령의 15가지 실제 예
- Rsync를 사용하여 Linux와 Windows 간에 파일을 동기화하는 방법
- Rsync 3.4는 6 가지 보안 취약점에 대한 패치를 제공합니다.
- 실제 예가 포함된 Linux의 Rsync 명령
- scp 및 rsync를 사용하여 시스템 간에 파일을 전송하는 방법
- rsync를 사용하여 웹 사이트 미러링