자습서: Jenkins 및 Azure DevOps Services를 사용하여 Linux 가상 머신에 배포

CI(연속 통합) 및 CD(연속 배포)는 코드를 빌드, 릴리스 및 배포할 수 있는 파이프라인을 구성합니다. Azure DevOps Services는 Azure에 배포하기 위한 완전하고 완전한 기능을 갖춘 CI/CD 자동화 도구 집합을 제공합니다. Jenkins는 CI/CD 자동화를 제공하는 인기 있는 타사 CI/CD 서버 기반 도구입니다. Azure DevOps Services 및 Jenkins를 함께 사용하여 클라우드 앱 또는 서비스를 제공하는 방법을 사용자 지정할 수 있습니다.

이 자습서에서는 Jenkins를 사용하여 Node.js 웹앱을 빌드합니다. 그런 다음, Azure DevOps를 사용하여 배포합니다.

Linux VM(가상 머신)을 포함하는 배포 그룹에 연결합니다. 다음 방법에 대해 설명합니다.

  • 샘플 앱을 가져옵니다.
  • Jenkins 플러그 인 구성
  • Node.js용 Jenkins 프리스타일 프로젝트 구성.
  • Azure DevOps Services 통합을 위한 Jenkins를 구성합니다.
  • Jenkins 서비스 엔드포인트를 만듭니다.
  • Azure 가상 머신에 대한 배포 그룹 만들기
  • Azure Pipelines 릴리스 파이프라인을 만듭니다.
  • 수동 및 CI 트리거 배포를 실행합니다.

필수 조건

  • 배포 대상으로 Linux 가상 머신이 필요합니다. 자세한 내용은 Azure CLI사용하여 Linux VM 만들기 및 관리를 참조하세요.

  • 가상 컴퓨터의 인바운드 포트 80을 엽니다. 자세한 내용은 Azure Portal을 사용하여 네트워크 보안 그룹 만들기를 참조 하세요.

샘플 앱 가져오기

배포할 앱이 필요하며 Git 리포지토리에 저장됩니다. 이 자습서에서는 GitHub에서 제공되는 이 샘플 앱을 사용하는 것이 좋습니다. 이 자습서에는 Node.js 및 애플리케이션을 설치하는 데 사용되는 샘플 스크립트가 포함되어 있습니다. 사용자 고유의 리포지토리를 사용하려면 유사한 샘플을 구성해야 합니다.

이 앱의 포크를 만들고 이 자습서의 이후 단계에서 사용할 위치(URL)를 기록해 둡니다. 자세한 내용은 리포지토리 포크를 참조하세요.

참고 항목

이 앱은 Yeoman을 통해 빌드되었습니다. Express, bower 및 grunt를 사용합니다. 또한 종속성으로 일부 npm 패키지가 있습니다. 이 샘플에는 Nginx를 설정하고 앱을 배포하는 스크립트도 포함되어 있습니다. 가상 머신에서 실행됩니다. 특히 이 스크립트는 다음을 수행합니다.

  1. Node, Nginx 및 PM2를 설치합니다.
  2. Nginx 및 PM2를 구성합니다.
  3. 노드 앱을 시작합니다.

Jenkins 플러그 인 구성

먼저 NodeJSVS Team Services 연속 배포라는 두 개의 Jenkins 플러그 인을 구성해야 합니다.

  1. Jenkins 계정을 열고 Jenkins 관리를 선택합니다.
  2. Manage Jenkins(Jenkins 관리) 페이지에서 Manage Plugins(플러그 인 관리)를 선택합니다.
  3. 목록을 필터링하여 NodeJS 플러그 인을 찾고 Install without restart(다시 시작하지 않고 설치) 옵션을 선택합니다. Adding the NodeJS plug-in to Jenkins
  4. 목록을 필터링하여 VS Team Services 연속 배포 플러그 인을 찾고 Install without restart(다시 시작하지 않고 설치) 옵션을 선택합니다.
  5. Jenkins 대시보드로 돌아가서 Jenkins 관리를 선택합니다.
  6. Global Tool Configuration(글로벌 도구 구성)을 선택합니다. NodeJS를 찾고 NodeJS 설치를 선택합니다.
  7. Install automatically(자동으로 설치) 옵션을 선택한 다음 Name(이름) 값을 입력합니다.
  8. 저장을 선택합니다.

Node.js에 대한 Jenkins Freestyle 프로젝트 구성

  1. 새 항목을 선택합니다. 항목 이름을 입력합니다.
  2. 프리스타일 프로젝트를 선택합니다. 확인을 선택합니다.
  3. 소스 코드 관리 탭에서 Git을 선택하고 앱 코드가 포함된 리포지토리 및 분기의 세부 정보를 입력합니다.
    Add a repo to your build
  4. 빌드 트리거 탭에서 폴링 SCM을 선택하고 3분마다 변경 내용을 Git 리포지토리에 폴링하는 일정을 H/03 * * * * 입력합니다.
  5. 빌드 환경 탭에서 노드 및 npm bin/폴더 PATH 제공을 선택하고 NodeJS 설치 값을 선택합니다. npmrc 파일은 시스템 기본값을 사용하도록 설정된 상태로 둡니다.
  6. 빌드 탭에서 실행을 선택하고 명령을 npm install 입력하여 모든 종속성이 업데이트되었는지 확인합니다.

Azure DevOps Services 통합을 위한 Jenkins 구성

참고 항목

다음 단계에 사용하는 PAT(개인용 액세스 토큰)에 Azure DevOps Services의 릴리스 (읽기, 쓰기, 실행 및 관리) 권한이 포함되어 있는지 확인합니다.

  1. Azure DevOps Services 조직에 PAT가 아직 없으면 만듭니다. 이 정보는 Jenkins가 Azure DevOps Services 조직에 액세스하는 데 필요합니다. 이 섹션의 이후 단계에 대한 토큰 정보를 저장해야 합니다.

    토큰을 생성하는 방법을 알아보려면 azure DevOps Services에 대한 개인용 액세스 토큰을 만드는 어떻게 할까요? 읽어보세요.

  2. 빌드 후 작업 탭에서 빌드 후 작업 추가를 선택합니다. 아티팩트 보관을 선택합니다.

  3. Files to archive(보관할 파일)에 **/*를 입력하여 모든 파일을 포함합니다.

  4. 또 다른 작업을 만들려면 Add post-build action(빌드 후 작업 추가)을 선택합니다.

  5. TFS/Team Services에서 트리거 릴리스를 선택합니다. azure DevOps Services 조직의 URI(예: https://{your-organization-name}.visualstudio.com)를 입력합니다.

  6. 프로젝트 이름을 입력합니다.

  7. 릴리스 파이프라인의 이름을 선택합니다. (나중에 Azure DevOps Services에서 이 릴리스 파이프라인을 만듭니다.)

  8. 자격 증명을 선택하여 Azure DevOps Services 또는 Azure DevOps Server 환경에 연결합니다.

    • Azure DevOps Services를 사용하는 경우 사용자 이름을 비워 둡니다.
    • 온-프레미스 버전의 Azure DevOps Server를 사용하는 경우 사용자 이름과 암호를 입력합니다.
      Configuring Jenkins post-build actions
  9. Jenkins 프로젝트를 저장합니다.

Jenkins 서비스 엔드포인트 만들기

서비스 엔드포인트가 있으면 Azure DevOps Services에서 Jenkins에 연결할 수 있습니다.

  1. Azure DevOps Services에서 서비스 페이지를 열고 새 서비스 엔드포인트 목록을 열고 Jenkins를 선택합니다. Add a Jenkins endpoint
  2. 연결 이름을 입력합니다.
  3. Jenkins 서버의 URL을 입력하고 신뢰할 수 없는 SSL 인증서 수락 옵션을 선택합니다. 예제 URL은 http://{YourJenkinsURL}.westcentralus.cloudapp.azure.com.
  4. Jenkins 계정의 사용자 이름 및 암호를 입력합니다.
  5. 연결 확인을 선택하여 정보가 올바른지 검사.
  6. 확인을 선택하여 서비스 엔드포인트를 만듭니다.

Azure 가상 머신에 대한 배포 그룹 만들기

릴리스 파이프라인을 가상 머신에 배포할 수 있도록 Azure DevOps Services 에이전트를 등록하려면 배포 그룹이 필요합니다. 배포 그룹을 사용하면 배포를 위한 대상 컴퓨터의 논리적 그룹을 쉽게 정의하고 각 컴퓨터에 필요한 에이전트를 설치할 수 있습니다.

참고 항목

다음 절차에서는 필수 구성 요소를 설치하고 sudo 권한으로 스크립트를 실행하지 마세요.

  1. 빌드 및 릴리스 허브의 릴리스 탭을 열고 배포 그룹을 열고 + 새로 만들기를 선택합니다.
  2. 배포 그룹의 이름을 입력하고 원하는 경우 설명을 입력합니다. 그런 다음 만들기를 선택합니다.
  3. 배포 대상 가상 머신에 대한 운영 체제를 선택합니다. 예를 들어 Ubuntu 16.04+를 선택합니다.
  4. 인증을 위해 스크립트에서 개인용 액세스 토큰 사용을 선택합니다.
  5. 시스템 필수 구성 요소 링크를 선택합니다. 운영 체제에 대한 필수 구성 요소를 설치합니다.
  6. 스크립트를 클립보드로 복사하여 스크립트를 복사합니다.
  7. 배포 대상 가상 머신에 로그인하고 스크립트를 실행합니다. sudo 권한으로 스크립트를 실행하지 마세요.
  8. 설치가 끝나면 배포 그룹 태그를 묻는 메시지가 나타납니다. 기본값을 그대로 적용합니다.
  9. Azure DevOps Services에서 배포 그룹의 대상에서 새로 등록된 가상 머신에 대한 검사.

Azure Pipelines 릴리스 파이프라인 만들기

릴리스 파이프라인은 Azure Pipelines가 앱을 배포하는 데 사용하는 프로세스를 지정합니다. 이 예제에서는 셸 스크립트를 실행합니다.

Azure Pipelines에서 릴리스 파이프라인을 만들려면 다음을 수행합니다.

  1. 빌드 및 릴리스 허브의 릴리스 탭을 열고 릴리스 파이프라인 만들기를 선택합니다.
  2. 빈 프로세스로 시작하도록 선택하여 템플릿을 선택합니다.
  3. 아티팩트 섹션에서 + 아티팩트 추가를 선택하고 소스 형식으로 Jenkins를 선택합니다. Jenkins 서비스 엔드포인트 연결을 선택합니다. 그런 다음 Jenkins 원본 작업을 선택하고 추가를 선택합니다.
  4. 환경 1 옆에 있는 줄임표를 선택합니다. 배포 그룹 추가 단계를 선택합니다.
  5. 배포 그룹을 선택합니다.
  6. +를 선택하여 배포 그룹 단계에 작업을 추가합니다.
  7. 셸 스크립트 작업을 선택하고 추가를 선택합니다. 셸 스크립트 태스크는 Node.js를 설치하고 앱을 시작하기 위해 각 서버에서 실행되는 스크립트에 대한 구성을 제공합니다.
  8. 스크립트 경로에 $(System.DefaultWorkingDirectory)/Fabrikam-Node/deployscript.sh를 입력합니다.
  9. 고급을 선택한 다음 작업 디렉터리 지정을 사용하도록 설정합니다.
  10. 작업 디렉터리에 대해 $(System.DefaultWorkingDirectory)/Fabrikam-Node를 입력합니다.
  11. 릴리스 파이프라인 이름을 Jenkins에서 해당 빌드의 빌드 후 작업 탭에 지정한 이름으로 편집합니다. 소스 아티팩트를 업데이트할 때 Jenkins가 새 릴리스를 트리거하려면 이 이름이 필요합니다.
  12. 저장을 선택하고 확인을 선택하여 릴리스 파이프라인을 저장합니다.

수동 및 CI 트리거 배포 실행

  1. + 릴리스를 선택하고 릴리스 만들기를 선택합니다.
  2. 강조 표시된 드롭다운 목록에서 완료한 빌드를 선택하고 큐를 선택합니다.
  3. 팝업 메시지에서 릴리스 링크를 선택합니다. 예: "릴리스 릴리스 -1 이 만들어졌습니다."
  4. 로그 탭을 열어 릴리스 콘솔 출력을 확인합니다.
  5. 브라우저에서 배포 그룹에 추가한 서버 중 하나의 URL을 엽니다. 예를 들어 http://{your-server-ip-address}를 입력 합니다.
  6. 원본 Git 리포지토리로 이동하여 일부 변경된 텍스트로 파일 앱/views/index.jade에서 h1 머리글의 내용을 수정합니다.
  7. 변경 내용을 커밋합니다.
  8. 몇 분이 지나면 Azure DevOps의 릴리스 페이지에서 새 릴리스가 만들어진 것을 확인할 수 있습니다. 릴리스를 열어 배포가 진행되는지 확인합니다. 축하합니다!

Jenkins 플러그 인 문제 해결

Jenkins 플러그 인으로 버그가 발생하는 경우 특정 구성 요소에 대한 Jenkins JIRA문제를 제출합니다.

다음 단계

이 자습서에서는 빌드용 Jenkins 및 릴리스용 Azure DevOps Services를 사용하여 Azure에 앱 배포를 자동화했습니다. 다음 방법에 대해 알아보았습니다.

  • Jenkins에서 앱 빌드
  • Azure DevOps Services 통합을 위한 Jenkins를 구성합니다.
  • Azure 가상 머신에 대한 배포 그룹 만들기
  • VM을 구성하고 앱을 배포하는 Azure Pipeline을 만듭니다.

빌드 및 릴리스 단계 모두에 Azure Pipelines를 사용하는 방법에 대한 자세한 내용은 다음을 참조하세요.

VM에 배포할 YAML 기반 CI/CD 파이프라인을 제작하는 방법에 대해 알아보려면 다음 자습서로 이동하세요.