개요
이 실습에서는 GitHub, Cloud Build, 빌드 트리거, Artifact Registry를 사용하여 지속적 통합 파이프라인을 빌드합니다.

목표
이 실습에서는 다음 작업을 수행하는 방법을 알아봅니다.
- GitHub에서 Git 저장소 만들기
- 간단한 Python 애플리케이션 만들기
- Cloud Shell에서 웹 애플리케이션 테스트
- Docker 빌드 정의하기
- Cloud Build 및 Artifact Registry로 Docker 이미지 관리하기
- 트리거를 사용하여 빌드 자동화하기
- 빌드 변경사항 테스트하기
기본 요건
GitHub 계정이 없다면 GitHub 계정을 만들어야 합니다.
권장사항
- 기존 GitHub 계정이 있는 경우 이를 사용합니다. GitHub는 새 계정을 스팸으로 차단할 가능성이 높습니다.
- 계정이 스팸으로 표시될 가능성을 줄이려면 GitHub 계정에 2단계 인증을 설정하세요.
R
실습 환경 설정
각 실습에서는 정해진 기간 동안 새 Google Cloud 프로젝트와 리소스 집합이 무료로 제공됩니다.
-
시크릿 창을 사용하여 Qwiklabs에 로그인합니다.
-
실습 사용 가능 시간(예: 1:15:00
)을 참고하여 해당 시간 내에 완료합니다.
일시중지 기능은 없습니다. 필요한 경우 다시 시작할 수 있지만 처음부터 시작해야 합니다.
-
준비가 되면 실습 시작을 클릭합니다.
-
실습 사용자 인증 정보(사용자 이름 및 비밀번호)를 기록해 두세요. Google Cloud Console에 로그인합니다.
-
Google Console 열기를 클릭합니다.
-
다른 계정 사용을 클릭한 다음, 안내 메시지에 이 실습에 대한 사용자 인증 정보를 복사하여 붙여넣습니다.
다른 사용자 인증 정보를 사용하는 경우 오류가 발생하거나 요금이 부과됩니다.
-
약관에 동의하고 리소스 복구 페이지를 건너뜁니다.
작업 1. Git 저장소 만들기
먼저 GitHub를 사용하여 Git 저장소를 만듭니다. 이 Git 저장소는 소스 코드를 저장하는 데 사용됩니다. 마지막에는 코드가 푸시될 때 지속적 통합 파이프라인을 시작하는 빌드 트리거를 만듭니다.
-
Cloud 콘솔을 클릭하고 새 탭에서 Cloud Shell 활성화(
)를 클릭합니다.
- 메시지가 표시되면 계속을 클릭합니다.
- 다음 명령어를 실행하여 GitHub CLI를 설치합니다.
curl -sS https://webi.sh/gh | sh
- GitHub CLI에 로그인합니다.
gh auth login
Enter
키를 눌러 기본 옵션을 수락합니다. CLI 도구의 안내에 따라 GitHub 웹사이트를 통해 로그인합니다.
- 로그인되었는지 확인합니다.
gh api user -q ".login"
로그인에 성공하면 GitHub 사용자 이름이 출력됩니다.
-
GITHUB_USERNAME
변수 만들기
GITHUB_USERNAME=$(gh api user -q ".login")
- 환경 변수가 만들어졌는지 확인합니다.
echo ${GITHUB_USERNAME}
변수를 만들었다면 GitHub 사용자 이름이 출력됩니다.
- 전역 Git 사용자 인증 정보를 설정합니다.
git config --global user.name "${GITHUB_USERNAME}"
git config --global user.email "${USER_EMAIL}"
이 명령어는 Cloud Shell 터미널의 Git 사용자를 만듭니다.
-
devops-repo라는 비어 있는 GitHub 저장소를 만듭니다.
gh repo create devops-repo --private
- Cloud Shell에 다음 명령어를 입력하여
gcp-course
라는 폴더를 만듭니다.
mkdir gcp-course
- 방금 만든 폴더로 변경합니다.
cd gcp-course
- 이제 방금 만든 빈 저장소를 클론합니다. 메시지가 표시되면 승인을 클릭합니다.
gh repo clone devops-repo
참고: 빈 저장소를 클론했다는 경고가 표시될 수 있습니다. 이 시점에 예상되는 경고입니다.
- 이전 명령어로
devops-repo
라는 빈 폴더가 만들어졌습니다. 해당 폴더로 변경합니다.
cd devops-repo
작업 2. 간단한 Python 애플리케이션 만들기
이제 관리할 소스 코드가 필요합니다. 따라서 간단한 Python Flask 웹 애플리케이션을 만들어 보겠습니다. 애플리케이션은 'hello world'보다 약간 더 나은 수준이지만 빌드할 파이프라인을 테스트하기에는 충분합니다.
- Cloud Shell에서 편집기 열기(
)를 클릭하여 코드 편집기를 엽니다.
- 왼쪽 탐색기 트리에서 gcp-course > devops-repo 폴더를 선택합니다.
-
devops-repo를 클릭합니다.
-
새 파일을 클릭합니다.
- 파일 이름을
main.py
로 지정하고 Enter 키를 누릅니다.
- 다음 코드를 방금 만든 파일에 붙여넣습니다.
from flask import Flask, render_template, request
app = Flask(__name__)
@app.route("/")
def main():
model = {"title": "Hello DevOps Fans."}
return render_template('index.html', model=model)
if __name__ == "__main__":
app.run(host='0.0.0.0', port=8080, debug=True, threaded=True)
- 변경사항을 저장하려면 Ctrl + S를 누릅니다.
-
devops-repo
폴더를 클릭합니다.
-
새 폴더를 클릭합니다.
- 폴더 이름을
templates
로 지정하고 Enter 키를 누릅니다.
-
templates
폴더를 마우스 오른쪽 버튼으로 클릭하고 layout.html
이라는 이름으로 새 파일을 만듭니다.
- 다음 코드를 추가하고 이전과 마찬가지로 파일을 저장합니다.
<!doctype html>
<html lang="en">
<head>
<title>{{model.title}}</title>
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css">
</head>
<body>
<div class="container">
{% block content %}{% endblock %}
<footer></footer>
</div>
</body>
</html>
-
또한 templates 폴더에 index.html
이라는 새 파일을 추가합니다.
-
다음 코드를 추가하고 이전과 마찬가지로 파일을 저장합니다.
{% extends "layout.html" %}
{% block content %}
<div class="jumbotron">
<div class="container">
<h1>{{model.title}}</h1>
</div>
</div>
{% endblock %}
-
Python에서 애플리케이션 기본 요건은 pip를 사용하여 관리됩니다. 이제 이 애플리케이션에 대한 요구사항을 나열하는 파일을 추가해 보겠습니다.
-
devops-repo 폴더(templates 폴더 아님)에서 새 파일을 만들고 다음을 해당 파일에 추가한 다음 requirements.txt
라는 이름으로 저장합니다.
Flask>=2.0.3
- 이제 몇 개의 파일이 생겼으므로 저장소에 저장합니다. 먼저, 생성한 모든 파일을 로컬 Git 저장소에 추가해야 합니다. 터미널 열기를 클릭하고 Cloud Shell에서 다음 코드를 입력합니다.
cd ~/gcp-course/devops-repo
git add --all
- 저장소에 변경사항을 커밋하려면 본인 확인이 필요합니다. 개인 정보와 함께 다음 명령어를 입력합니다(Gmail 주소나 다른 이메일 주소만 사용할 수 있음).
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
- 이제 변경사항을 로컬로 커밋합니다.
git commit -a -m "Initial Commit"
- 변경사항을 로컬로 커밋했지만 Cloud Source Repositories에서 만든 Git 저장소는 업데이트하지 않았습니다. 다음 명령어를 입력하여 변경사항을 클라우드로 푸시합니다.
git push origin main
-
GitHub 웹페이지를 새로고침합니다. 방금 만든 파일이 표시됩니다.
작업 3. Docker 빌드 정의하기
Docker를 사용하는 첫 번째 단계는 Dockerfile이라는 파일을 만드는 것입니다. 이 파일은 Docker 컨테이너가 구성되는 방식을 정의합니다. 지금 만들어 보겠습니다.
-
편집기 열기를 클릭하고 gcp-course/devops-repo 폴더를 펼칩니다. devops-repo 폴더를 선택한 상태에서 새 파일을 클릭하고 새 파일 이름을 Dockerfile로 지정합니다.
Dockerfile 파일은 컨테이너 빌드 방법을 정의하는 데 사용됩니다.
- 파일 맨 위에 다음을 입력합니다.
FROM python:3.9
이것은 기본 이미지입니다. 기본 이미지를 여러 개 선택할 수 있습니다. 이 경우 Python에 이미 설치된 기본 이미지를 사용합니다.
- 다음을 입력합니다.
WORKDIR /app
COPY . .
이 줄들은 현재 폴더의 소스 코드를 컨테이너 이미지의 /app 폴더로 복사합니다.
- 다음을 입력합니다.
RUN pip install gunicorn
RUN pip install -r requirements.txt
이 줄들은 pip를 사용하여 Python 애플리케이션의 요구사항을 컨테이너에 설치합니다. Gunicorn은 웹 앱을 실행하는 데 사용될 Python 웹 서버입니다.
- 다음을 입력합니다.
ENV PORT=80
CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 main:app
환경 변수는 애플리케이션이 실행될 포트를 설정합니다(이 경우 80). 마지막 줄은 gunicorn 웹 서버를 사용하여 웹 앱을 실행합니다.
- 완성된 파일이 다음과 같은지 확인하고 저장합니다.
FROM python:3.9
WORKDIR /app
COPY . .
RUN pip install gunicorn
RUN pip install -r requirements.txt
ENV PORT=80
CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 main:app
작업 4. Cloud Build 및 Artifact Registry로 Docker 이미지 관리하기
Docker 이미지를 빌드한 다음 어딘가에 저장해야 합니다. Cloud Build 및 Artifact Registry를 사용합니다.
-
터미널 열기를 클릭하여 Cloud Shell로 돌아갑니다. 현재 위치가 올바른 폴더인지 확인합니다.
cd ~/gcp-course/devops-repo
- Cloud Shell 환경 변수 DEVSHELL_PROJECT_ID에는 현재 프로젝트 ID가 자동으로 저장되어 있습니다. Artifact Registry에 이미지를 저장하려면 프로젝트 ID가 필요합니다. 프로젝트 ID를 보려면 다음 명령어를 입력합니다.
echo $DEVSHELL_PROJECT_ID
- 다음 명령어를 입력하여 devops-repo라는 이름의 Artifact Registry 저장소를 만듭니다.
gcloud artifacts repositories create devops-repo \
--repository-format=docker \
--location={{{ project_0.default_region | "REGION" }}}
- Artifact Registry Docker 저장소에 인증하도록 Docker를 구성하려면 다음 명령어를 입력합니다.
gcloud auth configure-docker {{{ project_0.default_region | "REGION" }}}-docker.pkg.dev
- Cloud Build를 사용하여 이미지를 만들고 Artifact Registry에 저장하려면 다음 명령어를 입력합니다.
gcloud builds submit --tag {{{ project_0.default_region | "REGION" }}}-docker.pkg.dev/$DEVSHELL_PROJECT_ID/devops-repo/devops-image:v0.1 .
명령어의 환경 변수를 유심히 살펴보세요. 이미지는 Artifact Registry에 저장됩니다.
-
Google Cloud 콘솔 제목 표시줄의 검색창에 Artifact Registry를 입력한 다음 검색 결과에서 Artifact Registry를 클릭합니다.
-
Artifact Registry 옆에 있는 고정 아이콘을 클릭합니다.
-
devops-repo를 클릭합니다.
-
devops-image를 클릭합니다. 그러면 이미지가 나열됩니다.
-
Google Cloud 콘솔 제목 표시줄의 검색창에 Cloud Build를 입력한 다음 검색 결과에서 Cloud Build를 클릭합니다.
-
Cloud Build 옆에 있는 고정 아이콘을 클릭합니다.
-
빌드가 기록에 표시됩니다.
이제 Compute Engine 가상 머신에서 이 이미지를 실행해 보겠습니다.
-
탐색 메뉴에서 Compute Engine > VM 인스턴스를 클릭합니다.
-
인스턴스 만들기를 클릭하여 VM을 만듭니다.
-
인스턴스 만들기 페이지에서 다음을 지정하고 나머지 설정은 기본값으로 둡니다.
속성 |
값 |
OS 및 스토리지 > 컨테이너 |
'컨테이너 배포' 클릭 |
컨테이너 이미지 |
'-docker.pkg.dev//devops-repo/devops-image:v0.1'을 선택하고 '선택'을 클릭 |
네트워킹 > 방화벽 |
HTTP 트래픽 허용 |
-
만들기를 클릭합니다.
-
VM이 시작되면 VM의 외부 IP 주소를 클릭합니다. 브라우저 탭이 열리고 페이지에 Hello DevOps Fans
가 표시됩니다.
참고: VM이 만들어진 후 Docker 컨테이너가 시작되기까지 1분 정도 기다려야 할 수도 있습니다.
- 이제 변경사항을 Git 저장소에 저장해 보겠습니다. Cloud Shell에서 다음을 입력하여 올바른 폴더에 있는지 확인하고 새 Dockerfile을 Git에 추가합니다.
cd ~/gcp-course/devops-repo
git add --all
- 변경사항을 로컬로 커밋합니다.
git commit -am "Added Docker Support"
- 변경사항을 Cloud Source Repositories로 푸시합니다.
git push origin main
내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.
Cloud Build 및 Artifact Registry로 Docker 이미지 관리하기
작업 5. 트리거를 사용하여 빌드 자동화하기
-
탐색 메뉴에서 Cloud Build를 클릭합니다. 빌드 기록 페이지가 열리고 기록에 하나 이상의 빌드가 표시됩니다.
-
설정을 클릭합니다.
-
서비스 계정 드롭다운에서 @.iam.gserviceaccount.com을 선택합니다.
-
선호하는 서비스 계정으로 설정 옵션을 사용 설정합니다. Cloud Build
서비스의 상태를 사용으로 설정합니다.
-
왼쪽 탐색에서 트리거로 이동하여 트리거 만들기를 클릭합니다.
-
다음 사항을 지정합니다.
이름: devops-trigger
리전:
저장소에서 새 저장소 연결을 클릭합니다.
-
저장소 연결 창에서 GitHub(Cloud Build GitHub 앱)를 선택하고 '계속'을 클릭합니다.
- {your github username}/devops-repo를 저장소로 선택하고 '확인'을 클릭한 다음 {your github username}/devops-repo(GitHub 앱)를 선택합니다.
- 이용약관에 동의하고 연결을 클릭합니다.
브랜치: .*(모든 브랜치)
구성 유형: Cloud Build 구성 파일(yaml 또는 json)
위치: 인라인
-
편집기 열기를 클릭하고 아래에 언급된 코드를 삽입한 후 완료를 클릭합니다.
steps:
- name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', '{{{project_0.default_region|REGION}}}-docker.pkg.dev/{{{project_0.project_id|Project ID}}}/devops-repo/devops-image:$COMMIT_SHA', '.']
images:
- '{{{project_0.default_region|REGION}}}-docker.pkg.dev/{{{project_0.project_id|Project ID}}}/devops-repo/devops-image:$COMMIT_SHA'
options:
logging: CLOUD_LOGGING_ONLY
-
서비스 계정에서 내 프로젝트 ID로 시작하는 서비스 계정(@.iam.gserviceaccount.com과 유사)을 선택하고 만들기를 클릭합니다.
-
트리거를 테스트하려면 실행을 클릭한 다음 트리거 실행을 클릭합니다.
-
기록 링크를 클릭하면 빌드가 실행되는 것을 볼 수 있습니다. 빌드가 완료될 때까지 기다린 다음 해당 링크를 클릭하여 세부정보를 확인합니다.
-
아래로 스크롤하여 로그를 확인합니다. 여기에 있는 빌드의 출력은 머신에서 실행하는 경우 볼 수 있는 내용입니다.
-
Artifact Registry 서비스로 돌아갑니다. devops-repo > devops-image 폴더에 새로운 이미지가 표시됩니다.
-
Cloud Shell 코드 편집기로 돌아갑니다. gcp-course/devops-repo
폴더에서 main.py
파일을 찾습니다.
-
main() 함수에서 title 속성을 아래와 같이 "Hello Build Trigger."
로 변경합니다.
@app.route("/")
def main():
model = {"title": "Hello Build Trigger."}
return render_template("index.html", model=model)
- 다음 명령어를 사용하여 변경사항을 커밋합니다.
cd ~/gcp-course/devops-repo
git commit -a -m "Testing Build Trigger"
- 다음을 입력하여 변경사항을 Cloud Source Repositories에 푸시합니다.
git push origin main
- Cloud 콘솔의 Cloud Build 서비스로 돌아갑니다. 실행 중인 다른 빌드가 표시됩니다.
내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.
트리거를 사용하여 빌드를 자동화합니다.
작업 6. 빌드 변경사항 테스트하기
-
빌드가 완료되면 클릭하여 세부정보를 확인합니다.
-
실행 세부정보를 클릭합니다.
-
이미지 이름을 클릭하면 Artifact Registry의 이미지 페이지로 리디렉션됩니다.
-
창 상단에서 이미지 이름 옆에 있는 경로 복사를 클릭합니다. 복사한 경로는 다음 단계에서 필요합니다. 형식은 다음과 같이 표시됩니다.
{{{project_0.default_region | Lab Region }}}-docker.pkg.dev/{{{project_0.project_id|Project ID}}}/devops-demo/devops-image@sha256:8aede81a8b6ba1a90d4d808f509d05ddbb1cee60a50ebcf0cee46e1df9a54810
참고: 다이제스트에 있는 이미지 이름을 사용하지 마세요.
-
Compute Engine 서비스로 이동합니다. 이전에 했던 것처럼 이 이미지를 테스트할 새 가상 머신을 만듭니다. 컨테이너 배포를 클릭하고 방금 복사한 이미지를 붙여 넣습니다.
-
HTTP 트래픽 허용을 선택합니다.
-
머신이 생성되면 브라우저에서 VM의 외부 IP 주소로 요청을 전송하여 변경사항을 테스트합니다. 새 메시지가 표시됩니다.
참고: Docker 컨테이너가 시작되려면 VM이 만들어진 후 몇 분 정도 기다려야 할 수도 있습니다.
내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.
빌드 변경사항을 테스트합니다.
수고하셨습니다
이 실습에서는 GitHub, Cloud Build, 빌드 트리거, Artifact Registry를 사용하여 지속적 통합 파이프라인을 빌드했습니다.
실습 종료하기
실습을 완료하면 실습 종료를 클릭합니다. Google Cloud Skills Boost에서 사용된 리소스를 자동으로 삭제하고 계정을 지웁니다.
실습 경험을 평가할 수 있습니다. 해당하는 별표 수를 선택하고 의견을 입력한 후 제출을 클릭합니다.
별점의 의미는 다음과 같습니다.
- 별표 1개 = 매우 불만족
- 별표 2개 = 불만족
- 별표 3개 = 중간
- 별표 4개 = 만족
- 별표 5개 = 매우 만족
의견을 제공하고 싶지 않다면 대화상자를 닫으면 됩니다.
의견이나 제안 또는 수정할 사항이 있다면 지원 탭을 사용하세요.
Copyright 2025 Google LLC All rights reserved. Google 및 Google 로고는 Google LLC의 상표입니다. 기타 모든 회사명 및 제품명은 해당 업체의 상표일 수 있습니다.