1. 시작하기 전에
자습형 환경 설정
- Google Cloud Console에 로그인하여 새 프로젝트를 만들거나 기존 프로젝트를 재사용합니다. 아직 Gmail이나 Google Workspace 계정이 없는 경우 계정을 만들어야 합니다.
- 프로젝트 이름은 이 프로젝트 참가자의 표시 이름입니다. 이는 Google API에서 사용하지 않는 문자열이며 언제든지 업데이트할 수 있습니다.
- 프로젝트 ID는 모든 Google Cloud 프로젝트에서 고유해야 하며, 변경할 수 없습니다(설정된 후에는 변경할 수 없음). Cloud Console은 고유한 문자열을 자동으로 생성합니다. 일반적으로 신경 쓰지 않아도 됩니다. 대부분의 Codelab에서는 프로젝트 ID를 참조해야 하며(일반적으로
PROJECT_ID
로 식별됨), 마음에 들지 않는 경우 임의로 다시 생성하거나 직접 지정해서 사용할 수 있는지 확인하세요. 프로젝트가 생성되면 프로젝트 ID가 '고정'됩니다. - 세 번째 값은 일부 API에서 사용하는 프로젝트 번호입니다. 이 세 가지 값에 대한 자세한 내용은 문서를 참조하세요.
- 다음으로 Cloud 리소스/API를 사용하려면 Cloud Console에서 결제를 사용 설정해야 합니다. 이 Codelab 실행에는 많은 비용이 들지 않습니다. 이 튜토리얼을 마친 후 비용이 결제되지 않도록 리소스를 종료하려면 Codelab의 끝에 있는 '삭제' 안내를 따르세요. Google Cloud 새 사용자에게는 미화 $300 상당의 무료 체험판 프로그램에 참여할 수 있는 자격이 부여됩니다.
2. 작업공간 준비
- 다음 URL을 방문하여 Cloud Shell 편집기를 엽니다.
https://ide.cloud.google.com
- CLI에 프로젝트 이름이 설정되어 있는지 확인
gcloud config set project {{project-id}}
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
- API 사용 설정
gcloud services enable \
cloudbuild.googleapis.com \
secretmanager.googleapis.com
- CloudDeploy에 권한 제공
gcloud projects add-iam-policy-binding --member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" --role roles/clouddeploy.admin ${PROJECT_ID}
gcloud projects add-iam-policy-binding --member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" --role roles/container.developer ${PROJECT_ID}
gcloud projects add-iam-policy-binding --member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" --role roles/iam.serviceAccountUser ${PROJECT_ID}
gcloud projects add-iam-policy-binding --member="serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" --role roles/clouddeploy.jobRunner ${PROJECT_ID}
- 터미널 창에서 다음 명령어를 사용하여 애플리케이션 소스를 클론합니다.
git clone https://github.com/GoogleCloudPlatform/software-delivery-workshop.git
- 디렉터리로 변경하고 IDE 워크스페이스를 저장소 루트로 설정합니다.
cd software-delivery-workshop && rm -rf .git
cd delivery-platform && cloudshell workspace .
3. 사전 정의된 앱 템플릿 및 맞춤 앱 템플릿 활용
개발자는 조직 내에서 일반적으로 사용되는 템플릿 세트 중에서 선택할 수 있어야 합니다. 온보딩 프로세스를 통해 GitHub 계정에 저장된 중앙 집중식 템플릿 저장소 집합이 생성됩니다. 이후 단계에서 이러한 템플릿 저장소는 새 애플리케이션의 기반으로 사용하기 위해 복사되고 수정됩니다. 이 실습에서는 여기에 제공된 샘플 구조로 템플릿 저장소를 시드합니다. 샘플을 모델로 한 폴더를 더 추가하여 나만의 템플릿을 추가할 수 있습니다.
이 단계에서는 제공된 예시 파일에서 앱 템플릿을 보관할 자체 저장소를 만듭니다. GitHub와의 상호작용을 간소화하기 위한 도우미 스크립트가 제공됩니다.
템플릿 저장소를 채우는 데 사용되는 일회성 단계입니다. 이후 단계에서 이러한 저장소를 재사용합니다.
GitHub 액세스 구성
이 튜토리얼의 단계에서는 GitHub API를 호출하여 저장소를 만들고 구성합니다. 다음의 여러 단계에서 GitHub 사용자 이름과 개인 액세스 토큰이 필요합니다. 아래 스크립트를 사용하면 값을 가져와 나중에 사용할 수 있도록 로컬 변수로 저장할 수 있습니다.
source ./onboard-env.sh
echo Git Username: $GIT_USERNAME
echo Git Base URL: $GIT_BASE_URL
앱 템플릿 저장소 만들기
자체 기본 템플릿을 통합하는 방법을 보여주는 예로 샘플 애플리케이션 템플릿이 이 실습과 함께 제공됩니다. 이 단계에서는 GitHub 계정의 mcd-app-templates
저장소에 이러한 파일의 사본을 만듭니다.
- 템플릿을 작업 디렉터리에 복사
cp -R $BASE_DIR/resources/repos/app-templates $WORK_DIR
cd $WORK_DIR/app-templates
- GitHub 계정에서 빈 원격 저장소 만들기
$BASE_DIR/scripts/git/gh.sh create mcd-app-templates
- 템플릿 저장소를 원격 저장소에 푸시
git init && git symbolic-ref HEAD refs/heads/main && git add . && git commit -m "initial commit"
git remote add origin $GIT_BASE_URL/mcd-app-templates
git push origin main
- 작업 디렉터리 정리
cd $BASE_DIR
rm -rf $WORK_DIR/app-templates
공유 기본 구성 저장소 만들기
이 튜토리얼에서는 여러 팀에서 공유하는 기본 구성 파일을 사용한 다음 애플리케이션별 구성을 그 위에 오버레이하는 Kustomize라는 도구를 활용합니다. 이를 통해 플랫폼팀은 여러 팀과 환경으로 확장할 수 있습니다.
이 단계에서는 제공된 샘플에서 mcd-shared_kustomize
라는 공유 구성 저장소를 만듭니다.
- 템플릿을 작업 디렉터리에 복사
cp -R $BASE_DIR/resources/repos/shared-kustomize $WORK_DIR
cd $WORK_DIR/shared-kustomize
- GitHub 계정에서 빈 원격 저장소 만들기
$BASE_DIR/scripts/git/gh.sh create mcd-shared_kustomize
- 템플릿 저장소를 원격 저장소에 푸시
git init && git symbolic-ref HEAD refs/heads/main && git add . && git commit -m "initial commit"
git remote add origin $GIT_BASE_URL/mcd-shared_kustomize
git push origin main
- 작업 디렉터리 정리
cd $BASE_DIR
rm -rf $WORK_DIR/shared-kustomize
템플릿 저장소를 만들었으므로 이제 이를 사용하여 앱 인스턴스를 만들 수 있습니다.
4. 애플리케이션의 새 인스턴스 만들기
템플릿에서 새 애플리케이션을 생성하려면 템플릿 구조의 여러 파일에서 자리표시자 변수를 실제 값으로 교체해야 하는 경우가 많습니다. 대체가 완료되면 새 앱 인스턴스에 관한 새 저장소가 생성됩니다. 개발자가 일상적인 개발 과정에서 복제하고 함께 작업하는 이 앱 인스턴스 저장소입니다.
이 단계에서는 앱 템플릿의 값을 대체하고 결과 파일을 새 저장소에 게시합니다.
새 애플리케이션의 이름 정의
export APP_NAME=my-app
Golang 템플릿 저장소를 가져옵니다.
cd $WORK_DIR/
git clone -b main $GIT_BASE_URL/mcd-app-templates app-templates
rm -rf app-templates/.git
cd app-templates/golang
자리표시자 값 대체
온보딩에서 가장 일반적인 요구사항 중 하나는 템플릿의 변수를 애플리케이션에서 사용되는 실제 인스턴스로 교체하는 것입니다. 예를 들어 애플리케이션 이름을 제공합니다. 다음 명령어는 환경 변수에 저장된 값을 사용하여 모든 .tmpl 파일의 인스턴스를 만듭니다.
for template in $(find . -name '*.tmpl'); do envsubst < ${template} > ${template%.*}; done
새 저장소 만들기 및 업데이트된 파일 저장
- GitHub 계정에서 빈 원격 저장소 만들기
$BASE_DIR/scripts/git/gh.sh create ${APP_NAME}
- 템플릿 저장소를 원격 저장소에 푸시
git init && git symbolic-ref HEAD refs/heads/main && git add . && git commit -m "initial commit"
git remote add origin $GIT_BASE_URL/${APP_NAME}
git push origin main
이제 앱 인스턴스가 생성되었으므로 연속 빌드를 구현할 차례입니다.
5. 자동화된 파이프라인 실행 구성
지속적 통합 시스템의 핵심은 소스 제어 시스템에서 발생하는 이벤트를 기반으로 파이프라인 로직을 실행하는 기능입니다. 개발자가 저장소 이벤트의 코드를 커밋하면 다른 시스템의 프로세스를 트리거하도록 구성할 수 있는 코드가 실행됩니다.
이 단계에서는 사용자가 저장소에서 코드를 커밋하거나 태그할 때마다 Google Cloud Build를 호출하고 파이프라인을 실행하도록 GitHub를 구성합니다.
보안 액세스 사용 설정
애플리케이션 파이프라인에 대한 보안 액세스를 구성하려면 두 가지 요소가 필요합니다. 파이프라인에 고유한 API 키 및 보안 비밀입니다.
API 키
API 키는 지정된 API를 호출하는 클라이언트를 식별하는 데 사용됩니다. 이 경우 클라이언트는 GitHub입니다. 여기에서 다루지 않는 권장사항은 API 키의 범위를 클라이언트가 액세스할 특정 API로만 잠그는 것입니다. 이전 단계에서 키를 만들었습니다.
- 이 링크를 클릭하여 키를 검토할 수 있습니다.
- 다음 명령어를 실행하여 값이 설정되었는지 확인할 수 있습니다.
echo $API_KEY_VALUE
파이프라인 보안 비밀
보안 비밀은 호출자를 승인하고 호출자가 특정 Cloud Build 타겟 작업에 대한 권한을 보유하고 있는지 확인하는 데 사용됩니다. GitHub에 자체 파이프라인에만 액세스해야 하는 두 가지 저장소가 있을 수 있습니다. API_KEY는 github에서 사용할 수 있는 API (이 경우 Cloud Build API가 호출됨)를 제한하지만, secret는 클라이언트에서 실행할 수 있는 Cloud Build API의 작업을 제한합니다.
- 보안 비밀 이름, 위치, 값 정의
SECRET_NAME=${APP_NAME}-webhook-trigger-cd-secret
SECRET_PATH=projects/${PROJECT_NUMBER}/secrets/${SECRET_NAME}/versions/1
SECRET_VALUE=$(sed "s/[^a-zA-Z0-9]//g" <<< $(openssl rand -base64 15))
- 보안 비밀 만들기
printf ${SECRET_VALUE} | gcloud secrets create ${SECRET_NAME} --data-file=-
- Cloud Build에서 보안 비밀을 읽을 수 있도록 허용
gcloud secrets add-iam-policy-binding ${SECRET_NAME} \
--member=serviceAccount:service-${PROJECT_NUMBER}@gcp-sa-cloudbuild.iam.gserviceaccount.com \
--role='roles/secretmanager.secretAccessor'
Cloud Build 트리거 만들기
Cloud Build 트리거는 실제로 CICD 프로세스를 실행하는 구성입니다.
트리거를 올바르게 구성하려면 작업을 만들 때 몇 가지 키 값을 제공해야 합니다.
- 트리거의 이름과 구성 파일을 찾을 수 있는 위치를 정의합니다.
export TRIGGER_NAME=${APP_NAME}-clouddeploy-webhook-trigger
export BUILD_YAML_PATH=$WORK_DIR/app-templates/golang/build/cloudbuild-cd.yaml
- 공유 기본 구성 저장소의 위치를 정의합니다.
export KUSTOMIZE_REPO=${GIT_BASE_URL}/mcd-shared_kustomize
- 프로젝트의 컨테이너 레지스트리를 정의하는 onboard-env.sh 스크립트에 변수가 설정되었습니다. 아래 명령어로 값을 검토합니다.
echo $IMAGE_REPO
- 이전에 만든 변수를 사용하여 CloudBuild Webhook 트리거를 만듭니다. 애플리케이션 저장소 위치는 GitHub의 요청 본문에서 가져옵니다. 아래 값은 요청 본문에서 값이 있는 경로를 참조합니다.
gcloud alpha builds triggers create webhook \
`--name=${TRIGGER_NAME} \` `--substitutions='_APP_NAME='${APP_NAME}',_APP_REPO=$(body.repository.git_url),_CONFIG_REPO='${GIT_BASE_URL}'/'${CLUSTER_CONFIG_REPO}',_DEFAULT_IMAGE_REPO='${IMAGE_REPO}',_KUSTOMIZE_REPO='${GIT_BASE_URL}'/'${SHARED_KUSTOMIZE_REPO}',_REF=$(body.ref)' \` `--inline-config=$BUILD_YAML_PATH \` `--secret=${SECRET_PATH}`
- 이 링크로 이동하여 콘솔에서 새로 생성된 Cloud Build 트리거를 검토합니다.
- 다음 단계에서 GitHub에서 사용할 엔드포인트 URL의 변수를 정의합니다.
WEBHOOK_URL="https://cloudbuild.googleapis.com/v1/projects/${PROJECT_ID}/triggers/${TRIGGER_NAME}:webhook?key=${API_KEY_VALUE}&secret=${SECRET_VALUE}"
GitHub 웹훅 구성
- GitHub에서 웹훅 구성
$BASE_DIR/scripts/git/gh.sh create_webhook ${APP_NAME} $WEBHOOK_URL
- 애플리케이션 저장소로 이동하여 새로 구성된 웹훅을 검토합니다.
REPO_URL=${GIT_BASE_URL}/${APP_NAME}/settings/hooks
echo $REPO_URL
새 애플리케이션을 만드는 데 필요한 모든 단계를 수동으로 수행했으므로 이제 스크립트에서 자동화합니다.
6. 모든 온보딩 단계 자동화
실제로는 모든 새 애플리케이션에 대해 위의 각 단계를 실행하는 것은 불가능합니다. 대신 로직을 쉽게 실행할 수 있도록 스크립트에 통합해야 합니다. 위의 단계는 이미 스크립트에 포함되어 있습니다.
이 단계에서는 제공된 스크립트를 사용하여 새 애플리케이션을 만듭니다.
새 애플리케이션 만들기
- 올바른 디렉터리에 있는지 확인
cd $BASE_DIR
- 새 애플리케이션 만들기
export APP_NAME=demo-app
./app.sh create ${APP_NAME}
모든 단계가 자동으로 실행됩니다.
GitHub 저장소 검토
이제 GitHub에서 새 저장소를 검토할 수 있습니다.
- 다음 명령어를 실행하여 GitHub 저장소 URL을 가져옵니다.
echo ${GIT_BASE_URL}/demo-app
- 웹브라우저에서 URL을 열어 새 애플리케이션을 검토합니다.
- 아래 URL과 같이 템플릿 변수가 인스턴스 값으로 대체된 예를 참고하세요.
echo ${GIT_BASE_URL}/demo-app/blob/main/k8s/prod/deployment.yaml#L24
- 아래 URL에서 구성된 웹훅을 검토합니다.
echo ${GIT_BASE_URL}/demo-app/settings/hooks
CloudBuild 트리거 검토
스크립트에서 트리거가 자동으로 설정되었습니다.