자습서: Service Fabric 클러스터에 배포

이 자습서에서는 Jenkins 환경을 설정하는 몇 가지 가능한 방법과 빌드된 후 Service Fabric 클러스터에 애플리케이션을 배포하는 다양한 방법을 설명합니다. 다음 일반적인 단계에 따라 Jenkins를 성공적으로 구성하고, GitHub에서 변경 내용을 가져오고, 애플리케이션을 빌드하고, 클러스터에 배포합니다.

  1. 필수 구성 요소를 설치 해야 합니다.
  2. 그런 다음, 다음 섹션 중 하나의 단계에 따라 Jenkins를 설정합니다.
  3. Jenkins를 설정한 후에, Jenkins 작업 만들기 및 구성의 단계에 따라 애플리케이션이 변경될 때 Jenkins를 트리거하도록 GitHub를 설정하고, GitHub에서 변경 내용을 끌어오고 애플리케이션을 빌드하도록 빌드 단계의 Jenkins 작업 파이프라인을 구성합니다.
  4. 마지막으로 애플리케이션을 Service Fabric 클러스터에 배포하도록 Jenkins 작업 빌드 후 단계를 구성합니다. 클러스터에 애플리케이션을 배포하도록 Jenkins를 구성하는 방법에는 두 가지가 있습니다.

필수 조건

  • Git이 로컬로 설치되어 있는지 확인합니다. 운영 체제에 따라 Git 다운로드 페이지에서 적절한 Git 버전을 설치할 수 있습니다. Git을 접하는 경우 Git 설명서에서 자세히 알아보세요.
  • 이 문서에서는 GitHub https://github.com/Azure-Samples/service-fabric-java-getting-started 에서 Service Fabric 시작 샘플을 사용하여 애플리케이션을 빌드하고 배포합니다. 이 리포지토리를 포크하여 진행하거나 지침을 약간 수정하여 사용자 고유의 GitHub 프로젝트를 사용할 수 있습니다.

기존 Jenkins 환경에 Service Fabric 플러그 인 설치

Service Fabric 플러그 인을 기존 Jenkins 환경에 추가하는 경우 다음 단계를 수행해야 합니다.

  • Service Fabric CLI(sfctl). Jenkins가 CLI 명령을 실행할 수 있도록 사용자 수준이 아닌 시스템 수준에서 CLI를 설치합니다.
  • Java 애플리케이션을 배포하려면 Gradle 및 Open JDK 8.0을 모두 설치합니다.
  • .NET Core 2.0 애플리케이션을 배포하려면 .NET Core 2.0 SDK를 설치합니다.

사용자 환경에 필요한 필수 구성 요소를 설치한 후 Jenkins 마켓플레이스에서 Azure Service Fabric 플러그 인을 검색하여 설치할 수 있습니다.

이 플러그 인을 설치한 후에는 Jenkins 작업 만들기 및 구성으로 건너뜁니다.

Service Fabric 클러스터 내에서 Jenkins 설정

Service Fabric 클러스터 내부 또는 외부에서 Jenkins를 설정할 수 있습니다. 다음 섹션에서는 Azure Storage 계정을 사용하여 컨테이너 인스턴스의 상태를 저장하는 동안 클러스터 내에서 설정하는 방법을 보여 줍니다.

  1. Docker가 설치된 Service Fabric Linux 클러스터가 있는지 확인합니다. Azure에서 실행되는 Service Fabric 클러스터에는 Docker가 이미 설치되어 있습니다. 클러스터를 로컬로 실행하는 경우(OneBox 개발 환경) 명령을 사용하여 Docker가 컴퓨터에 docker info 설치되어 있는지 검사. 설치되지 않은 경우 다음 명령을 사용하여 설치합니다.

    sudo apt-get install wget
    wget -qO- https://get.docker.io/ | sh
    

    참고 항목

    8081 포트가 클러스터의 사용자 지정 엔드포인트로 지정되어 있는지 확인합니다. 로컬 클러스터를 사용하는 경우 호스트 컴퓨터에서 포트 8081이 열려 있고 공용 IP 주소가 있는지 확인합니다.

  2. 다음 명령을 사용하여 애플리케이션을 복제합니다.

    git clone https://github.com/suhuruli/jenkins-container-application.git
    cd jenkins-container-application
    
  3. 파일 공유에서 Jenkins 컨테이너의 상태를 유지합니다.

    1. 다음과 같은 sfjenkinsstorage1이름으로 클러스터와 동일한 지역에 Azure Storage 계정을 만듭니다.

    2. 스토리지 계정 아래에 다음과 같은 sfjenkins이름으로 파일 공유를 만듭니다.

    3. 파일 공유에 대한 커넥트 클릭하고 Linux에서 커넥트 아래에 표시되는 값을 적어둡니다. 값은 아래와 유사합니다.

      sudo mount -t cifs //sfjenkinsstorage1.file.core.windows.net/sfjenkins [mount point] -o vers=3.0,username=<username>,password=<storage-key>,dir_mode=0777,file_mode=0777
      

    참고 항목

    cifs 공유를 탑재하려면 클러스터 노드에 cifs-utils 패키지를 설치해야 합니다.

  4. 스크립트의 자리 표시자 값을 setupentrypoint.sh 2단계의 azure-storage 세부 정보로 업데이트합니다.

    vi JenkinsSF/JenkinsOnSF/Code/setupentrypoint.sh
    
    • [REMOTE_FILE_SHARE_LOCATION]을 위 2단계의 연결 출력 값인 //sfjenkinsstorage1.file.core.windows.net/sfjenkins로 바꿉니다.
    • 위의 2단계에서 값 vers=3.0,username=<username>,password=<storage-key>,dir_mode=0777,file_mode=0777 으로 바꿉 [FILE_SHARE_CONNECT_OPTIONS_STRING] 다.
  5. 보안 클러스터에만 해당:

    Jenkins에서 보안 클러스터에 애플리케이션 배포를 구성하려면 Jenkins 컨테이너 내에서 클러스터 인증서에 액세스할 수 있어야 합니다. ApplicationManifest.xml 파일의 ContainerHostPolicies 태그 아래에서 이 인증서 참조를 추가하고 지문 값을 클러스터 인증서로 업데이트합니다.

    <CertificateRef Name="MyCert" X509FindValue="[Thumbprint]"/>
    

    또한 ApplicationManifest.xml 파일의 ApplicationManifest(루트) 태그 아래에 다음 줄을 추가하고 클러스터 인증서의 지문으로 지문 값을 업데이트합니다.

    <Certificates>
      <SecretsCertificate X509FindType="FindByThumbprint" X509FindValue="[Thumbprint]" />
    </Certificates> 
    
  6. 클러스터에 커넥트 컨테이너 애플리케이션을 설치합니다.

    보안 클러스터

    sfctl cluster select --endpoint https://PublicIPorFQDN:19080  --pem [Pem] --no-verify # cluster connect command
    bash Scripts/install.sh
    

    이전 명령은 인증서를 PEM 형식으로 사용합니다. 인증서가 PFX 형식인 경우 다음 명령을 사용하여 변환할 수 있습니다. PFX 파일이 암호로 보호되지 않는 경우 passin 매개 변수를 .로 -passin pass:지정합니다.

    openssl pkcs12 -in cert.pfx -out cert.pem -nodes -passin pass:<password>
    

    안전하지 않은 클러스터

    sfctl cluster select --endpoint http://PublicIPorFQDN:19080 # cluster connect command
    bash Scripts/install.sh
    

    그러면 클러스터에 Jenkins 컨테이너가 설치되고 Service Fabric Explorer를 사용하여 모니터링할 수 있습니다.

    참고 항목

    Jenkins 이미지를 클러스터에서 다운로드하는 데 몇 분 정도 걸릴 수 있습니다.

  7. 브라우저에서 .로 http://PublicIPorFQDN:8081이동합니다. 로그인하는 데 필요한 초기 관리자 암호의 경로가 제공됩니다.

  8. Service Fabric Explorer를 확인하여 Jenkins 컨테이너가 실행 중인 노드를 확인합니다. SSH(Secure Shell)가 이 노드에 로그인합니다.

    ssh user@PublicIPorFQDN -p [port]
    
  9. 를 사용하여 docker ps -a컨테이너 인스턴스 ID를 가져옵니다.

  10. SSH(Secure Shell)는 컨테이너에 로그인하고 Jenkins 포털에 표시된 경로를 붙여넣습니다. 예를 들어 포털에서 경로를 PATH_TO_INITIAL_ADMIN_PASSWORD표시하는 경우 다음 명령을 실행합니다.

    docker exec -t -i [first-four-digits-of-container-ID] /bin/bash   # This takes you inside Docker shell
    
    cat PATH_TO_INITIAL_ADMIN_PASSWORD # This displays the password value
    
  11. Jenkins 시작 페이지에서 설치할 플러그 인 선택 옵션을 선택하고[없음] 검사 상자를 선택하고 설치를 클릭합니다.

  12. 사용자를 만들거나 관리자로 계속하도록 선택합니다.

Jenkins를 설정한 후에는 Jenkins 작업 만들기 및 구성으로 건너뜁니다.

Service Fabric 클러스터 외부에서 Jenkins 설정

Service Fabric 클러스터 내부 또는 외부에서 Jenkins를 설정할 수 있습니다. 다음 섹션에서는 클러스터 외부에서 설정하는 방법을 보여줍니다.

  1. 터미널에서 실행 docker info 하여 Docker가 컴퓨터에 설치되어 있는지 확인합니다. 출력은 Docker 서비스가 실행 중인지를 나타냅니다.

  2. Docker가 설치되어 있지 않으면 다음 명령을 실행합니다.

    sudo apt-get install wget
    wget -qO- https://get.docker.io/ | sh
    
  3. Service Fabric Jenkins 컨테이너 이미지를 끌어옵니다. docker pull rapatchi/jenkins:latest 이 이미지는 Service Fabric Jenkins 플러그 인이 미리 설치되어 있습니다.

  4. 다음 컨테이너 이미지를 실행합니다. docker run -itd -p 8080:8080 rapatchi/jenkins:latest

  5. 컨테이너 이미지 인스턴스 ID를 가져옵니다. 명령 docker ps –a를 사용하여 모든 Docker 컨테이너를 나열할 수 있습니다.

  6. 다음 단계를 사용하여 Jenkins 포털에 로그인합니다.

    1. 호스트에서 Jenkins 셸에 로그인합니다. 컨테이너 ID의 처음 네 자리 숫자를 사용합니다. 예를 들어 컨테이너 ID 2d24a73b5964가 있으면 .를 사용합니다 2d24.

      docker exec -it [first-four-digits-of-container-ID] /bin/bash
      
    2. Jenkins 셸에서 컨테이너 인스턴스에 대한 관리자 암호를 가져옵니다.

      cat /var/jenkins_home/secrets/initialAdminPassword
      
    3. Jenkins 대시보드에 로그인하려면 웹 브라우저 http://<HOST-IP>:8080에서 다음 URL을 엽니다. 이전 단계의 암호를 사용하여 Jenkins의 잠금을 해제합니다.

    4. (선택 사항) 처음으로 로그인한 후에는 사용자 고유의 사용자 계정을 만들어 다음 단계에 사용할 수 있습니다. 또는 관리자 계정을 계속 사용할 수 있습니다. 사용자를 만드는 경우 해당 사용자를 계속 사용해야 합니다.

  7. 새 SSH 키를 생성하고 SSH 에이전트에 추가하는 단계를 사용하여 Jenkins와 함께 작동하도록 GitHub를 설정합니다.

    • GitHub에서 제공되는 지침을 사용하여 SSH 키를 생성하고 SSH 키를 리포지토리를 호스팅하는 GitHub 계정에 추가합니다.

    • (호스트가 아닌) Jenkins Docker 셸에서 이전 링크에 언급된 명령을 실행합니다.

    • 호스트에서 Jenkins 셸에 로그인하려면 다음 명령을 사용합니다.

      docker exec -t -i [first-four-digits-of-container-ID] /bin/bash
      

Jenkins 컨테이너 이미지가 호스트되는 클러스터 또는 컴퓨터에 공용 IP 주소가 있는지 확인합니다. 그러면 Jenkins 인스턴스가 GitHub에서 알림을 받을 수 있습니다.

Jenkins를 설정한 후 다음 섹션 인 Jenkins 작업을 만들고 구성합니다.

Jenkins 작업 만들기 및 구성

이 섹션의 단계에서는 GitHub 리포지토리의 변경 내용에 응답하고, 변경 내용을 가져오고, 빌드하도록 Jenkins 작업을 구성하는 방법을 보여줍니다. 이 섹션의 끝부분에는 개발/테스트 환경 또는 프로덕션 환경에 배포하는지 여부에 따라 애플리케이션을 배포하도록 작업을 구성하는 최종 단계로 안내됩니다.

  1. Jenkins 대시보드에서 새 항목을 클릭합니다.

  2. 항목 이름을 입력합니다(예: MyJob). 자유로운 프로젝트를 선택하고 확인을 클릭합니다.

  3. 작업 구성 페이지가 열립니다. (Jenkins 대시보드에서 구성에 도착하려면 작업을 클릭한 다음 구성).

  4. 일반 탭에서 GitHub 프로젝트 상자를 검사 GitHub 프로젝트 URL을 지정합니다. 이 URL은 Jenkins CI/CD(연속 통합, 연속 배포) 흐름과 통합하려는 Service Fabric Java 애플리케이션을 호스트합니다(예: https://github.com/{your-github-account}/service-fabric-java-getting-started).

  5. 소스 코드 관리 탭에서 Git을 선택합니다. Jenkins CI/CD 흐름과 통합하려는 Service Fabric Java 애플리케이션을 호스트하는 리포지토리 URL을 지정합니다(예: https://github.com/{your-github-account}/service-fabric-java-getting-started). 빌드할 분기(예 /master: )를 지정할 수도 있습니다.

  6. Jenkins와 통신하도록 GitHub 리포지토리를 구성합니다.

    1. GitHub 리포지토리 페이지에서 설정>인터레이션 및 서비스로 이동합니다.

    2. 서비스 추가를 선택하고 Jenkins를 입력한 다음 Jenkins-GitHub 플러그 인을 선택합니다.

    3. Jenkins Webhook URL을 입력합니다(기본적으로 http://<PublicIPorFQDN>:8081/github-webhook/이여야 함). 서비스 추가/업데이트를 클릭합니다.

    4. 테스트 이벤트가 사용자의 Jenkins 인스턴스로 전송됩니다. GitHub의 웹후크에서 녹색 확인 표시가 나타나고 프로젝트가 빌드됩니다.

  7. Jenkins의 빌드 트리거 탭에서 원하는 빌드 옵션을 선택합니다. 이 예제를 위해, 리포지토리로 푸시할 때마다 빌드를 트리거해야 하므로 GITScm 폴링에 대한 GitHub 후크 트리거를 선택합니다. (이전에는 이 옵션이 호출 되었습니다.변경 내용이 GitHub에 푸시되면 빌드합니다.)

  8. 빌드 탭에서 Java 애플리케이션 또는 .NET Core 애플리케이션을 빌드하는지 여부에 따라 다음 중 하나를 수행합니다.

    • Java 애플리케이션의 경우: 빌드 추가 단계 드롭다운에서 Gradle 스크립트 호출을 선택합니다. 고급을 클릭합니다. 고급 메뉴에서 애플리케이션의 루트 빌드 스크립트 경로를 지정합니다. 지정된 경로에서 build.gradle을 선택하면 이에 따라 적절하게 작동합니다. ActorCounter 애플리케이션의 경우 ${WORKSPACE}/reliable-services-actor-sample/Actors/ActorCounter입니다.

      Service Fabric Jenkins 빌드 작업

    • .NET Core 애플리케이션의 경우: 빌드 추가 단계 드롭다운에서 실행을 선택합니다. 표시되는 명령 상자에서 먼저 디렉터리를 파일이 있는 build.sh 경로로 변경해야 합니다. 디렉터리가 변경되면 스크립트를 build.sh 실행하여 애플리케이션을 빌드할 수 있습니다.

      cd /var/jenkins_home/workspace/[Job Name]/[Path to build.sh]  
      ./build.sh
      

      다음 스크린샷에서는 CounterServiceApplication이라는 Jenkins 작업 이름을 사용하여 카운터 서비스를 빌드하는 데 사용되는 명령 예제를 보여 줍니다.

      서비스를 빌드하는 데 사용되는 명령의 예

  9. 빌드 후 작업에서 Service Fabric 클러스터에 앱을 배포하도록 Jenkins를 구성하려면 Jenkins 컨테이너에 해당 클러스터의 인증서 위치가 필요합니다. Jenkins 컨테이너가 클러스터 내부 또는 외부에서 실행되는지 여부에 따라 다음 중 하나를 선택하고 클러스터 인증서의 위치를 확인합니다.

    • 클러스터 내부에서 실행되는 Jenkins: 인증서 경로는 컨테이너 내에서 Certificates_JenkinsOnSF_Code_MyCert_PEM 환경 변수의 값을 에코하여 찾을 수 있습니다.

      echo $Certificates_JenkinsOnSF_Code_MyCert_PEM
      
    • 클러스터 외부에서 실행되는 Jenkins의 경우: 다음 단계에 따라 클러스터 인증서를 컨테이너에 복사합니다.

      1. 인증서는 PEM 형식이어야 합니다. PEM 파일이 없는 경우 인증서 PFX 파일에서 만들 수 있습니다. PFX 파일이 암호로 보호되어 있지 않으면 호스트에서 다음 명령을 실행합니다.

        openssl pkcs12 -in clustercert.pfx -out clustercert.pem -nodes -passin pass:
        

        PFX 파일이 암호로 보호된 경우 매개 변수에 -passin 암호를 포함합니다. 예시:

        openssl pkcs12 -in clustercert.pfx -out clustercert.pem -nodes -passin pass:<password>
        
      2. Jenkins 컨테이너에 대한 컨테이너 ID를 가져오려면 호스트에서 docker ps를 실행합니다.

      3. 다음 Docker 명령을 사용하여 PEM 파일을 컨테이너에 복사합니다.

        docker cp clustercert.pem [first-four-digits-of-container-ID]:/var/jenkins_home
        

당신은 거의 끝났어! Jenkins 작업을 계속 열어 둡니다. 유일한 다시 기본 작업은 Service Fabric 클러스터에 애플리케이션을 배포하도록 빌드 후 단계를 구성하는 것입니다.

  • 개발 또는 테스트 환경에 배포하려면 클러스터 관리 엔드포인트사용하여 배포 구성의 단계를 수행합니다.
  • 프로덕션 환경에 배포하려면 Azure 자격 증명을 사용하여 배포 구성의 단계를 수행합니다.

클러스터 관리 엔드포인트를 사용하여 배포 구성

개발 및 테스트 환경의 경우 클러스터 관리 엔드포인트를 사용하여 애플리케이션을 배포할 수 있습니다. 애플리케이션을 배포하기 위해 클러스터 관리 엔드포인트를 사용하여 빌드 후 작업을 구성하려면 최소한의 설정이 필요합니다. 프로덕션 환경에 배포하는 경우 배포 중에 사용할 Microsoft Entra 서비스 주체를 구성하기 위해 Azure 자격 증명을 사용하여 배포 구성으로 건너뜁니다.

  1. Jenkins 작업에서 빌드 후 작업 탭을 클릭합니다.

  2. 빌드 후 작업 드롭다운에서 Service Fabric 프로젝트 배포를 선택합니다.

  3. Service Fabric 클러스터 구성에서 Service Fabric 관리 엔드포인트 채우기 라디오 단추를 선택합니다.

  4. 관리 호스트의 경우 클러스터에 대한 연결 엔드포인트를 입력합니다(예: {your-cluster}.eastus.cloudapp.azure.com).

  5. 클라이언트 키 및 클라이언트 인증서의 경우 Jenkins 컨테이너에 PEM 파일의 위치를 입력합니다. 예를 들면 다음과 같습니다/var/jenkins_home/clustercert.pem. (Jenkins 작업 만들기 및 구성의 마지막 단계에서 인증서의 위치를 복사했습니다.)

  6. 애플리케이션 구성 아래에서 애플리케이션 이름, 애플리케이션 유형 및 (상대)애플리케이션 매니페스트 경로 필드를 구성합니다.

    Service Fabric Jenkins 빌드 후 작업 관리 엔드포인트 구성

  7. 구성 확인을 클릭합니다. 확인에 성공하면 저장을 클릭합니다. 이제 Jenkins 작업 파이프라인이 완전히 구성되었습니다. 다음 단계로 건너뛰어 배포를 테스트합니다.

Azure 자격 증명을 사용하여 배포 구성

프로덕션 환경의 경우 애플리케이션을 배포하도록 Azure 자격 증명을 구성하는 것이 좋습니다. 이 섹션에서는 빌드 후 작업에서 애플리케이션을 배포하는 데 사용할 Microsoft Entra 서비스 주체를 구성하는 방법을 보여 줍니다. 서비스 주체를 디렉터리의 역할에 할당하여 Jenkins 작업의 권한을 제한할 수 있습니다.

개발 및 테스트 환경의 경우, 애플리케이션을 배포하도록 Azure 자격 증명이나 클러스터 관리 엔드포인트를 구성할 수 있습니다. 클러스터 관리 엔드포인트를 구성하는 방법에 대한 자세한 내용은 클러스터 관리 엔드포인트를 사용하여 배포 구성을 참조 하세요.

  1. Microsoft Entra 서비스 주체를 만들고 Azure 구독에서 권한을 할당하려면 포털 사용의 단계에 따라 Microsoft Entra 애플리케이션 및 서비스 주체를 만듭니다. 다음에 주의하세요.

  2. Jenkins 작업으로 돌아가 빌드 후 작업 탭을 클릭합니다.

  3. 빌드 후 작업 드롭다운에서 Service Fabric 프로젝트 배포를 선택합니다.

  4. Service Fabric 클러스터 구성에서 Service Fabric 클러스터 선택을 클릭합니다. Azure 자격 증명 옆의 추가를 클릭합니다. Jenkins를 클릭하여 Jenkins 자격 증명 공급자를 선택합니다.

  5. Jenkins 자격 증명 공급자의 종류 드롭다운에서 Microsoft Azure 서비스 주체를 선택합니다.

  6. 1단계에서 서비스 주체를 설정할 때 저장한 값을 사용하여 다음 필드를 설정합니다.

    • 클라이언트 ID: 애플리케이션 ID
    • 클라이언트 암호: 애플리케이션 키
    • 테넌트 ID: 디렉터리 ID
    • 구독 ID: 구독 ID
  7. Jenkins에서 자격 증명을 선택하는 데 사용하는 설명 ID와 간략한 설명을 입력합니다. 그런 후 서비스 주체 확인을 클릭합니다. 확인에 성공하면 추가를 클릭합니다.

    Service Fabric Jenkins에서 Azure 자격 증명 입력

  8. Service Fabric 클러스터 구성으로 돌아가서 Azure 자격 증명에 대해 새 자격 증명이 선택되어 있는지 확인합니다.

  9. 리소스 그룹 드롭다운에서 애플리케이션을 배포할 클러스터의 리소스 그룹을 선택합니다.

  10. Service Fabric 드롭다운에서 애플리케이션을 배포할 클러스터를 선택합니다.

  11. 클라이언트 키클라이언트 인증서의 경우 Jenkins 컨테이너에 PEM 파일의 위치를 입력합니다. 예: /var/jenkins_home/clustercert.pem.

  12. 애플리케이션 구성 아래에서 애플리케이션 이름, 애플리케이션 유형 및 (상대)애플리케이션 매니페스트 경로 필드를 구성합니다. Service Fabric Jenkins 빌드 후 작업 - Azure 자격 증명 구성

  13. 구성 확인을 클릭합니다. 확인에 성공하면 저장을 클릭합니다. 이제 Jenkins 작업 파이프라인이 완전히 구성되었습니다. 다음 단계를 계속 진행하여 배포를 테스트합니다.

Jenkins 플러그 인 문제 해결

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

시도할 아이디어

이제 GitHub 및 Jenkins가 구성됩니다. 리포지https://github.com/Azure-Samples/service-fabric-java-getting-started토리의 포크에서 reliable-services-actor-sample/Actors/ActorCounter 프로젝트를 몇 가지 샘플로 변경하는 것이 좋습니다. 원격 master 분기(또는 사용하도록 구성된 분기)에 변경 내용을 푸시합니다. 그러면 사용자가 구성한 Jenkins 작업이 MyJob트리거됩니다. GitHub에서 변경 내용을 가져오고, 빌드하고, 빌드 후 작업에서 지정한 클러스터에 애플리케이션을 배포합니다.

다음 단계