Compute Engine에서 분산형 빌드에 Jenkins 사용


이 가이드에서는 다음을 수행하는 방법을 보여줍니다.

  • Compute Engine에서 주문형 Jenkins 에이전트를 사용하여 빌드를 실행하는 Jenkins 지속적 통합 시스템을 만듭니다.
  • 빌드 아티팩트를 Cloud Storage에 저장합니다.
  • 수명 주기 정책을 적용하여 Cloud Storage의 오래된 빌드 아티팩트를 저렴한 스토리지 옵션으로 옮깁니다.

아키텍처

다음 다이어그램은 가이드 아키텍처를 대략적으로 보여줍니다.

서비스 계정이 Compute Engine을 통해 아티팩트를 Cloud Storage에 푸시하는 방법을 보여주는 아키텍처

이 다이어그램에서 서비스 계정이 추가된 Jenkins는 에이전트 인스턴스를 만들고 장기 저장을 위해 Cloud Storage에 아티팩트를 내보냅니다. Jenkins는 빌드가 실행되는 즉시 인스턴스를 프로비저닝합니다. 빌드 아티팩트가 오래될수록 다양한 스토리지 클래스를 거치면서 보관 비용을 제한합니다.

목표

  • Jenkins 빌드 실행을 위해 Packer를 사용하여 기본 이미지를 만듭니다.
  • Cloud Marketplace를 사용하여 Jenkins를 프로비저닝합니다.
  • 임시 빌드 에이전트를 배포하도록 Jenkins를 구성합니다.
  • 빌드 아티팩트를 Cloud Storage에 업로드합니다.
  • 수명 주기 정책을 구성하여 Cloud Storage 비용을 최적화합니다.

비용

이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

  • Compute Engine
  • Cloud Storage

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

가격 계산기를 사용하면 예상 사용량을 기준으로 예상 비용을 산출할 수 있습니다.

시작하기 전에

  1. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  3. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  4. Compute Engine API 사용 설정

    API 사용 설정

  5. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  6. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  7. Compute Engine API 사용 설정

    API 사용 설정

환경 설정

이 섹션에서는 가이드를 완료하는 데 필요한 인프라 및 ID를 구성합니다. 이 가이드의 나머지 부분은 Cloud Shell 내에서 실행됩니다.

Cloud Shell 열기

IAM 구성

ID 및 액세스 관리(IAM) 서비스 계정을 만들어 Jenkins에 권한을 위임합니다. Jenkins는 이 계정을 사용하여 Cloud Storage에 데이터를 저장하고 Compute Engine에서 인스턴스를 실행할 수 있습니다. Jenkins는 임시 인스턴스에서 빌드를 실행하고 Cloud Storage에 빌드 아티팩트를 저장합니다.

서비스 계정 만들기

  1. 서비스 계정을 만듭니다.

    gcloud iam service-accounts create jenkins --display-name jenkins
  2. 이후에 명령어에서 사용할 수 있도록 서비스 계정 이메일 주소 및 현재 Google Cloud 프로젝트 ID를 환경 변수에 저장합니다.

    export SA_EMAIL=$(gcloud iam service-accounts list \
        --filter="displayName:jenkins" --format='value(email)')
    export PROJECT=$(gcloud info --format='value(config.project)')
  3. 다음 역할을 서비스 계정에 결합합니다.

    gcloud projects add-iam-policy-binding $PROJECT \
        --role roles/storage.admin --member serviceAccount:$SA_EMAIL
    gcloud projects add-iam-policy-binding $PROJECT --role roles/compute.instanceAdmin.v1 \
        --member serviceAccount:$SA_EMAIL
    gcloud projects add-iam-policy-binding $PROJECT --role roles/compute.networkAdmin \
        --member serviceAccount:$SA_EMAIL
    gcloud projects add-iam-policy-binding $PROJECT --role roles/compute.securityAdmin \
        --member serviceAccount:$SA_EMAIL
    gcloud projects add-iam-policy-binding $PROJECT --role roles/iam.serviceAccountActor \
        --member serviceAccount:$SA_EMAIL

서비스 계정 키 다운로드

이제 서비스 계정에 적절한 사용 권한을 부여했으므로 키를 만들고 다운로드해야 합니다. 키는 안전한 장소에 보관하십시오. 나중에 Compute Engine API로 인증하도록 JClouds 플러그인을 구성하는 단계에 사용됩니다.

  1. 키 파일을 만듭니다.

    gcloud iam service-accounts keys create jenkins-sa.json --iam-account $SA_EMAIL
  2. Cloud Shell에서 더보기 를 클릭한 다음 파일 다운로드를 클릭합니다.

  3. jenkins-sa.json을 입력합니다.

  4. 다운로드를 클릭하여 파일을 로컬에 저장합니다.

Jenkins 에이전트 이미지 만들기

Jenkins 실행자로 실행하는 데 필요한 소프트웨어와 도구가 포함된 재사용 가능한 Compute Engine 이미지를 만듭니다.

Cloud Shell용 SSH 키 만들기

이 가이드의 뒷부분에서는 Packer를 사용하여 이미지를 빌드합니다. 이렇게 하려면 ssh 명령어로 빌드 인스턴스와 통신해야 합니다. SSH 액세스를 사용 설정하려면 Cloud Shell에서 SSH 키를 만들고 업로드합니다.

  1. SSH 키 쌍을 만듭니다. 이미 있는 경우 이 명령어는 기존 키 쌍을 사용합니다. 그렇지 않으면 새로 만듭니다.

    ls ~/.ssh/id_rsa.pub || ssh-keygen -N ""
  2. 프로젝트의 메타데이터에 Cloud Shell 공개 SSH 키를 추가합니다.

    gcloud compute project-info describe \
        --format=json | jq -r '.commonInstanceMetadata.items[] | select(.key == "ssh-keys") | .value' > sshKeys.pub
    echo "$USER:$(cat ~/.ssh/id_rsa.pub)" >> sshKeys.pub
    gcloud compute project-info add-metadata --metadata-from-file ssh-keys=sshKeys.pub

기준 이미지 만들기

다음 단계는 Packer를 사용하여 Jenkins의 임시 빌드 실행자 역할을 하는 빌드 에이전트용 기준 가상 머신(VM) 이미지를 만드는 것입니다. 가장 기본적인 Jenkins 에이전트의 경우 자바만 설치하면 됩니다. Packer 구성의 provisioners 섹션에 셸 명령어를 추가하거나 다른 Packer 프로비저닝 도구를 추가하여 이미지를 맞춤설정할 수 있습니다.

  1. Cloud Shell에서 Packer의 최신 출시 버전을 다운로드하고 압축을 해제합니다. 다음 예시에서는 Packer 1.7.10을 사용합니다. Hashicorp 웹사이트를 확인하여 더 최신 버전이 있는지 확인할 수 있습니다.

    wget https://releases.hashicorp.com/packer/1.7.10/packer_1.7.10_linux_amd64.zip
    unzip packer_1.7.10_linux_amd64.zip
  2. Packer 이미지 빌드에 대한 구성 파일을 만듭니다.

    export PROJECT=$(gcloud info --format='value(config.project)')
    cat > jenkins-agent.json <<EOF
    {
      "builders": [
        {
          "type": "googlecompute",
          "project_id": "$PROJECT",
          "source_image_family": "ubuntu-2004-lts",
          "source_image_project_id": "ubuntu-os-cloud",
          "zone": "us-central1-a",
          "disk_size": "50",
          "image_name": "jenkins-agent-{{timestamp}}",
          "image_family": "jenkins-agent",
          "ssh_username": "ubuntu"
        }
      ],
      "provisioners": [
        {
          "type": "shell",
          "inline": ["sudo apt-get update && sudo apt-get install -y default-jdk"]
        }
      ]
    }
    EOF
    
  3. Packer를 실행하여 이미지를 빌드합니다.

    ./packer build jenkins-agent.json

    빌드가 완료되면 디스크 이미지의 이름이 jenkins-agent-[TIMESTAMP] 형식으로 표시됩니다. 여기에서 [TIMESTAMP]는 빌드가 시작된 세대 시간입니다.

    ==> Builds finished. The artifacts of successful builds are:
    --> googlecompute: A disk image was created: jenkins-agent-1612997575
    

Jenkins 설치

이 섹션에서는 Cloud Marketplace를 사용하여 Jenkins 인스턴스를 프로비저닝합니다. 이전 섹션에서 만든 에이전트 이미지를 사용하도록 이 인스턴스를 맞춤설정하세요.

  1. Jenkins용 Cloud Marketplace 솔루션으로 이동합니다.

  2. 실행을 클릭합니다.

  3. 머신 유형 필드를 vCPU 4개, 메모리 15GB, n1-standard-4로 변경합니다.

    Jenkins 배포용 머신 유형 선택

  4. 배포를 클릭하고 Jenkins 인스턴스가 프로비저닝을 마칠 때까지 기다립니다. 끝나면 다음과 같은 내용이 표시됩니다.

    Jenkins가 배포되었습니다.

  5. 사이트 주소 링크를 클릭하여 브라우저에서 Jenkins 인스턴스를 엽니다.

  6. 세부정보 창에 표시된 관리자관리자 비밀번호를 사용하여 Jenkins에 로그인합니다.

    사용자 인증 정보 및 기타 배포 세부정보가 있는 세부정보 창

이제 Jenkins 인스턴스를 사용할 준비가 되었습니다.

Jenkins 플러그인 구성

Jenkins가 Compute Engine에서 주문형 에이전트를 만들고 Cloud Storage에 아티팩트를 저장하려면 플러그인이 필요합니다. 다음과 같이 플러그인을 설치하고 구성해야 합니다.

플러그인 설치

  1. Jenkins UI에서 Jenkins 관리를 선택합니다.
  2. 플러그인 관리를 클릭합니다.
  3. 사용 가능 탭을 클릭합니다.
  4. 필터 막대를 사용하여 다음 플러그인을 찾고 옆에 있는 상자를 선택합니다.

    • Compute Engine 플러그인
    • Cloud Storage 플러그인

    다음 이미지는 선택한 Cloud Storage 플러그인을 보여줍니다.

    Cloud Storage 플러그인

  5. 지금 다운로드 및 다시 시작한 후에 설치를 클릭합니다.

  6. 설치가 완료되고 실행 중인 작업이 없을 때 Jenkins 다시 시작 체크박스를 클릭합니다. Jenkins가 다시 시작되고 플러그인 설치가 완료됩니다.

플러그인 사용자 인증 정보 만들기

새 플러그인의 Google Credentials를 만들어야 합니다.

  1. Jenkins에 다시 로그인하고 Manage Jenkins(Jenkins 관리)를 클릭합니다.
  2. Credentials(사용자 인증 정보)를 클릭합니다.
  3. Store(스토어)에서 Jenkins를 클릭합니다.
  4. UI의 기본 창에서 글로벌 사용자 인증 정보(제한되지 않음)를 클릭합니다.
  5. Google 사용자 인증 정보를 만듭니다.

    1. 사용자 인증 정보 추가를 클릭합니다.
    2. 종류비공개 키의 Google 서비스 계정으로 설정합니다.
    3. 프로젝트 이름 필드에 Google Cloud 프로젝트 ID를 입력합니다.
    4. 파일 선택을 클릭합니다.
    5. Cloud Shell에서 이전에 다운로드한 jenkins-sa.json 파일을 선택합니다.
    6. 확인을 클릭합니다.

      JSON 키 사용자 인증 정보

  6. Jenkins를 클릭합니다.

Compute Engine 플러그인 구성

에이전트 인스턴스를 프로비저닝하는 데 사용하는 사용자 인증 정보로 Google Compute Engine 플러그인을 구성합니다.

  1. Manage Jenkins(Jenkins 관리)를 클릭합니다.
  2. Manage Nodes and Clouds(노드 및 클라우드 관리)를 클릭합니다.
  3. Configure Clouds(클라우드 구성)를 클릭합니다.
  4. Add a new Cloud(새 Cloud 추가)를 클릭합니다.
  5. Compute Engine을 클릭합니다.
  6. 다음 설정을 지정하고 [YOUR_PROJECT_ID]를 Google Cloud 프로젝트 ID로 바꿉니다.

    • 이름: gce
    • 프로젝트 ID: [YOUR_PROJECT_ID]
    • 인스턴스 한도: 8
  7. 서비스 계정 사용자 인증 정보 드롭다운 목록에서 서비스 계정을 선택합니다. 이 계정은 Google Cloud 프로젝트 ID로 표시됩니다.

Jenkins 인스턴스 구성 설정

이제 Compute Engine 플러그인이 구성되었으므로 Jenkins 인스턴스 구성을 설정하여 다양한 빌드를 구성할 수 있습니다.

  1. Configure Clouds(클라우드 구성) 페이지에서 Instance Configurations(인스턴스 구성)Add(추가) 를 클릭합니다.
  2. 다음 일반 설정을 입력합니다.

    • 이름: ubuntu-2004
    • 설명: Ubuntu agent
    • 라벨: ubuntu-2004
  3. 위치 설정에 다음을 입력합니다.

    • 리전<: us-central1
    • 영역: us-central1-f
  4. 고급를 클릭합니다.

  5. 머신 구성에서 머신 유형n1-standard-1로 선택합니다.

  6. 네트워킹에서 다음 설정을 선택합니다.

    • 네트워크: 기본 설정 그대로 둡니다.
    • 서브네트워크: 기본 설정 그대로 둡니다.
    • 외부 IP 연결?를 선택합니다.
  7. 부팅 디스크 설정에서 다음을 선택합니다.

    • 이미지 프로젝트에서 Google Cloud 프로젝트를 선택합니다.
    • 이미지 이름에서 이전에 Packer를 사용하여 빌드한 이미지를 선택합니다.
  8. 저장를 클릭하여 구성 변경사항을 유지합니다.

    Jenkins의 Compute Engine 구성

Jenkins 작업을 만들어 구성 테스트

Jenkins는 ubuntu-2004 라벨이 지정된 에이전트가 필요한 작업이 트리거되면 인스턴스를 자동으로 시작하도록 구성되어 있습니다. 구성이 예상대로 작동하는지를 테스트하는 작업을 만듭니다.

  1. Jenkins 인터페이스에서 새 작업 만들기를 클릭합니다.
  2. 항목 이름으로 test를 입력합니다.
  3. 프리스타일 프로젝트를 클릭한 다음 확인을 클릭합니다.
  4. 필요한 경우 동시 빌드 실행이 프로젝트를 실행할 수 있는 위치 제한 상자를 선택합니다.
  5. 라벨 표현식 필드에 ubuntu-2004를 입력합니다.
  6. 빌드 섹션에서 빌드 단계 추가를 클릭합니다.
  7. 셸 실행을 클릭합니다.
  8. 명령어 상자에 테스트 문자열을 입력합니다.

    echo "Hello world!"

    Jenkins의 명령어 상자에 입력된 Hello World

  9. 저장을 클릭합니다.

  10. 지금 빌드를 클릭하여 빌드를 시작합니다.

    지금 빌드

Cloud Storage에 빌드 아티팩트 업로드

향후 분석 또는 테스트를 위해 빌드 아티팩트를 저장할 수 있습니다. Jenkins 작업을 구성하여 아티팩트를 생성하고 Cloud Storage에 업로드합니다. 빌드 로그가 동일한 버킷에 업로드됩니다.

  1. Cloud Shell에서 아티팩트용 스토리지 버킷을 만듭니다.

    export PROJECT=$(gcloud info --format='value(config.project)')
    gsutil mb gs://$PROJECT-jenkins-artifacts
  2. Jenkins UI의 작업 목록에서 테스트를 클릭합니다.

  3. 구성을 클릭합니다.

  4. 빌드에서 명령어 텍스트 필드를 다음으로 설정합니다.

    env > build_environment.txt
  5. 빌드 후 작업에서 빌드 후 작업 추가를 클릭합니다.

  6. Cloud Storage 플러그인을 클릭합니다.

  7. 스토리지 위치 필드에 아티팩트 경로를 입력합니다. 이 때 [YOUR_PROJECT_ID]를 Google Cloud 프로젝트 ID로 대체합니다.

    gs://[YOUR_PROJECT_ID]-jenkins-artifacts/$JOB_NAME/$BUILD_NUMBER
  8. 작업 추가를 클릭합니다.

  9. 기본 업로드를 클릭합니다.

  10. 파일 패턴 필드에 build_environment.txt를 입력합니다.

  11. 스토리지 위치 필드에 스토리지 경로를 입력합니다. 이 때 [YOUR_PROJECT_ID]를 Google Cloud 프로젝트 ID로 대체합니다.

    gs://[YOUR_PROJECT_ID]-jenkins-artifacts/$JOB_NAME/$BUILD_NUMBER

    Cloud Storage 플러그인의 빌드 후 작업

  12. 저장을 클릭합니다.

  13. 지금 빌드를 클릭하여 새 빌드를 시작합니다. 이 빌드는 이전에 프로비저닝한 Compute Engine 인스턴스에서 실행됩니다. 빌드가 완료되면 구성된 Cloud Storage 버킷에 아티팩트 파일 build_environment.txt를 업로드합니다.

  14. Cloud Shell에서 gsutil을 사용하여 빌드 아티팩트를 확인합니다.

    export PROJECT=$(gcloud info --format='value(config.project)')
    gsutil cat gs://$PROJECT-jenkins-artifacts/test/2/build_environment.txt

객체 수명 주기 관리 구성

최근 빌드 아티팩트에 액세스할 확률이 높을 것입니다. 자주 액세스하지 않는 객체에 대한 비용을 절약하려면 객체 수명 주기 관리를 사용하여 아티팩트를 고성능 스토리지 클래스에서 저렴하고 지연 시간이 긴 스토리지 클래스로 이전합니다.

  1. Cloud Shell에서 모든 객체를 30일 후에 Nearline 스토리지로 이전하고 365일 후에 Nearline 객체를 Coldline 스토리지로 이전하는 수명 주기 구성 파일을 만듭니다.

    cat > artifact-lifecycle.json <<EOF
    {
    "lifecycle": {
      "rule": [
      {
        "action": {
          "type": "SetStorageClass",
          "storageClass": "NEARLINE"
        },
        "condition": {
          "age": 30,
          "matchesStorageClass": ["MULTI_REGIONAL", "STANDARD", "DURABLE_REDUCED_AVAILABILITY"]
        }
      },
      {
        "action": {
          "type": "SetStorageClass",
          "storageClass": "COLDLINE"
        },
        "condition": {
          "age": 365,
          "matchesStorageClass": ["NEARLINE"]
        }
      }
    ]
    }
    }
    EOF
  2. 아티팩트 저장소 버킷에 구성 파일을 업로드합니다.

    export PROJECT=$(gcloud info --format='value(config.project)')
    gsutil lifecycle set artifact-lifecycle.json gs://$PROJECT-jenkins-artifacts

삭제

  1. 아직 실행 중인 모든 Jenkins 에이전트를 삭제합니다.

    gcloud compute instances list --filter=metadata.jclouds-group=ubuntu-2004 --uri | xargs gcloud compute instances delete
  2. Cloud Deployment Manager를 사용하여 Jenkins 인스턴스를 삭제합니다.

    gcloud deployment-manager deployments delete jenkins-1
  3. Cloud Storage 버킷을 삭제합니다.

    export PROJECT=$(gcloud info --format='value(config.project)')
    gsutil -m rm -r gs://$PROJECT-jenkins-artifacts
  4. 서비스 계정을 삭제합니다.

    export SA_EMAIL=$(gcloud iam service-accounts list --filter="displayName:jenkins" --format='value(email)')
    gcloud iam service-accounts delete $SA_EMAIL

다음 단계