1. 개요
이 실습에서는 GenAI를 사용하여 JIRA 사용 스토리 구현을 자동화하는 솔루션을 빌드합니다.
학습할 내용
실험에는 다음과 같은 몇 가지 주요 부분이 있습니다.
- Gemini API와 통합하도록 Cloud Run 애플리케이션 배포
- JIRA용 Atlassian Forge 앱 만들기 및 배포
- GitLab 태스크 자동화를 위한 LangChain ReAct 에이전트
기본 요건
- 이 실습에서는 Cloud 콘솔 및 Cloud Shell 환경에 익숙하다고 가정합니다.
2. 설정 및 요건
Cloud 프로젝트 설정
- Google Cloud Console에 로그인하여 새 프로젝트를 만들거나 기존 프로젝트를 재사용합니다. 아직 Gmail이나 Google Workspace 계정이 없는 경우 계정을 만들어야 합니다.
- 프로젝트 이름은 이 프로젝트 참가자의 표시 이름입니다. 이는 Google API에서 사용하지 않는 문자열이며 언제든지 업데이트할 수 있습니다.
- 프로젝트 ID는 모든 Google Cloud 프로젝트에서 고유하며, 변경할 수 없습니다(설정된 후에는 변경할 수 없음). Cloud 콘솔은 고유한 문자열을 자동으로 생성합니다. 일반적으로는 신경 쓰지 않아도 됩니다. 대부분의 Codelab에서는 프로젝트 ID (일반적으로
PROJECT_ID
로 식별됨)를 참조해야 합니다. 생성된 ID가 마음에 들지 않으면 다른 임의 ID를 생성할 수 있습니다. 또는 직접 시도해 보고 사용 가능한지 확인할 수도 있습니다. 이 단계 이후에는 변경할 수 없으며 프로젝트 기간 동안 유지됩니다. - 참고로 세 번째 값은 일부 API에서 사용하는 프로젝트 번호입니다. 이 세 가지 값에 대한 자세한 내용은 문서를 참고하세요.
- 다음으로 Cloud 리소스/API를 사용하려면 Cloud 콘솔에서 결제를 사용 설정해야 합니다. 이 Codelab 실행에는 많은 비용이 들지 않습니다. 이 튜토리얼이 끝난 후에 요금이 청구되지 않도록 리소스를 종료하려면 만든 리소스 또는 프로젝트를 삭제하면 됩니다. Google Cloud 신규 사용자는 300달러(USD) 상당의 무료 체험판 프로그램에 참여할 수 있습니다.
환경 설정
Gemini 채팅을 엽니다.
또는 검색창에 'Gemini에게 물어보기'를 입력합니다.
Cloud AI Companion API를 사용 설정합니다.
'Start chatting
'를 클릭하고 샘플 질문 중 하나를 따르거나 직접 프롬프트를 입력하여 사용해 봅니다.
프롬프트 예시:
- Cloud Run을 5가지 주요 요점으로 설명합니다.
- Google Cloud Run 제품 관리자로서 학생에게 Cloud Run을 5가지 핵심사항으로 간단히 설명합니다.
- Google Cloud Run 제품 관리자로서 인증된 Kubernetes 개발자에게 Cloud Run을 5가지 핵심사항으로 간단히 설명합니다.
- Google Cloud Run 제품 관리자입니다. Cloud Run과 GKE 중 어느 것을 사용해야 하는지 선임 개발자에게 5가지 핵심 사항으로 설명합니다.
프롬프트 가이드에서 더 나은 프롬프트 작성에 대해 자세히 알아보세요.
Google Cloud를 위한 Gemini에서 사용자 데이터를 사용하는 방법
Google 개인 정보 보호 약정
Google은 업계 최초로 AI/ML 개인 정보 보호 약정을 발표했습니다. 여기에는 클라우드에 저장된 고객 데이터에 대해 고객이 최고 수준의 보안 및 제어 권한을 가져야 한다는 Google의 신념이 표명되어 있습니다.
제출 및 수신하는 데이터
분석하거나 완료하기 위해 Gemini에 제출하는 모든 입력 정보나 코드를 포함하여 Gemini에 묻는 질문을 프롬프트라고 합니다. Gemini로부터 받는 답변이나 코드 완성을 '응답'이라고 합니다. Gemini는 프롬프트나 해당 응답을 데이터로 사용하여 모델을 학습시키지 않습니다.
프롬프트 암호화
Gemini에 프롬프트를 제출하면 Gemini의 기본 모델에 입력으로 전송 중인 데이터가 암호화됩니다.
Gemini에서 생성된 프로그램 데이터
Gemini는 퍼스트 파티 Google Cloud 코드와 선택된 서드 파티 코드로 학습됩니다. Gemini가 제공하는 코드 완성, 생성, 분석을 포함해 코드의 보안, 테스트, 효과에 대한 책임은 사용자에게 있습니다.
Google에서 메시지를 처리하는 방식을 자세히 알아보세요.
3. 프롬프트 테스트 옵션
프롬프트를 테스트하는 방법에는 여러 가지가 있습니다.
Vertex AI Studio는 Google Cloud의 Vertex AI 플랫폼에 포함된 도구로, 생성형 AI 모델의 개발과 사용을 간소화하고 가속화하도록 설계되었습니다.
Google AI Studio는 프롬프트 엔지니어링 및 Gemini API를 프로토타입으로 제작하고 실험하기 위한 웹 기반 도구입니다.
- Gemini 웹 앱 (gemini.google.com)
Google Gemini 웹 앱 (gemini.google.com)은 Google의 Gemini AI 모델을 살펴보고 활용하는 데 도움이 되도록 설계된 웹 기반 도구입니다.
- Android용 Google Gemini 모바일 앱 및 iOS의 Google 앱
4. (선택사항 섹션) 서비스 계정 만들기
이러한 단계는 실습 설정 중에 실행되었으므로 실행할 필요가 없습니다.
이 단계는 서비스 계정 및 IAM 역할을 설정하는 방법을 보여주기 위해 포함되어 있습니다.
Google Cloud 콘솔로 돌아가 검색창 오른쪽에 있는 아이콘을 클릭하여 Cloud Shell을 활성화합니다.
열린 터미널에서 다음 명령어를 실행하여 새 서비스 계정과 키를 만듭니다.
이 서비스 계정을 사용하여 Cloud Run 애플리케이션에서 Vertex AI Gemini API를 호출합니다.
Qwiklabs 프로젝트 세부정보를 사용하여 프로젝트 세부정보를 구성합니다.
예: qwiklabs-gcp-00-2c10937585bb
gcloud config set project YOUR_QWIKLABS_PROJECT_ID
서비스 계정을 만들고 역할을 부여합니다.
PROJECT_ID=$(gcloud config get-value project)
SERVICE_ACCOUNT_NAME='vertex-client'
DISPLAY_NAME='Vertex Client'
KEY_FILE_NAME='vertex-client-key'
gcloud iam service-accounts create $SERVICE_ACCOUNT_NAME --project $PROJECT_ID --display-name "$DISPLAY_NAME"
gcloud projects add-iam-policy-binding $PROJECT_ID --member="serviceAccount:$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com" --role="roles/aiplatform.admin"
gcloud projects add-iam-policy-binding $PROJECT_ID --member="serviceAccount:$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com" --role="roles/aiplatform.user"
gcloud projects add-iam-policy-binding $PROJECT_ID --member="serviceAccount:$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com" --role="roles/cloudbuild.builds.editor"
gcloud projects add-iam-policy-binding $PROJECT_ID --member="serviceAccount:$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com" --role="roles/artifactregistry.admin"
gcloud projects add-iam-policy-binding $PROJECT_ID --member="serviceAccount:$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com" --role="roles/storage.admin"
gcloud projects add-iam-policy-binding $PROJECT_ID --member="serviceAccount:$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com" --role="roles/run.admin"
gcloud projects add-iam-policy-binding $PROJECT_ID --member="serviceAccount:$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com" --role="roles/secretmanager.secretAccessor"
gcloud iam service-accounts keys create $KEY_FILE_NAME.json --iam-account=$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com
승인하라는 메시지가 표시되면 '승인'을 클릭하여 계속합니다.
Vertex AI API 및 Gemini 채팅을 사용하기 위해 필요한 서비스를 사용 설정합니다.
gcloud services enable \
generativelanguage.googleapis.com \
aiplatform.googleapis.com \
cloudaicompanion.googleapis.com \
run.googleapis.com \
cloudresourcemanager.googleapis.com
Vertex AI API 및 Gemini 채팅을 사용하기 위해 필요한 서비스를 사용 설정합니다.
gcloud services enable \
artifactregistry.googleapis.com \
cloudbuild.googleapis.com \
runapps.googleapis.com \
workstations.googleapis.com \
servicemanagement.googleapis.com \
secretmanager.googleapis.com \
containerscanning.googleapis.com
(선택사항 섹션 끝)
5. Cloud Workstations에 액세스 권한 부여
Cloud Console에서 Cloud Workstations를 엽니다.
프로비저닝된 Qwiklabs 학생에게 Cloud Workstations 액세스 권한을 부여합니다.
이 프로젝트용으로 생성된 Qwiklabs 사용자 이름/이메일을 복사하여 주 구성원을 추가합니다. 워크스테이션을 선택하고 'PERMISSIONS
'를 클릭합니다.
아래 세부정보를 참조하세요.
'ADD PRINCIPAL
' 버튼을 클릭합니다.
Qwiklabs 학생의 이메일을 붙여넣고 'Cloud Workstations User
' 역할을 선택합니다.
'Start
'와 'Launch
'를 차례로 클릭하여 워크스테이션을 열고 내장 터미널을 사용하여 다음 단계를 진행합니다.
GitHub 저장소 클론
폴더를 만들고 GitHub 저장소를 클론합니다.
mkdir github
cd github
git clone https://github.com/GoogleCloudPlatform/genai-for-developers.git
'File / Open Folder
' 메뉴 항목을 사용하여 'github/genai-for-developers
'를 엽니다.
6. Gemini Code Assist 사용 설정
'Gemini' 아이콘을 클릭하고 오른쪽 하단에서 'Login to Google Cloud
'를 클릭합니다.
터미널에서 링크를 클릭하여 승인 흐름을 시작합니다.
'열기'를 클릭하여 링크를 따릅니다.
Qwiklabs 학생 계정을 선택하고 다음 화면에서 '로그인'을 클릭합니다.
인증 코드 복사:
터미널로 돌아가서 코드를 붙여넣습니다.
인증이 완료될 때까지 기다린 후 'Google 프로젝트 선택'을 클릭합니다.
팝업 창에서 Qwiklabs 프로젝트를 선택합니다.
예:
'devai-api/app/routes.py
' 파일을 연 다음 파일의 아무 곳이나 마우스 오른쪽 버튼으로 클릭하고 컨텍스트 메뉴에서 'Gemini > Explain
this"
'를 선택합니다.
선택한 파일에 대한 Gemini의 설명을 검토합니다.
7. LangChain 툴킷
LangChain 툴킷은 LangChain으로 애플리케이션 개발을 간소화하고 개선하도록 설계된 도구 모음입니다. 특정 툴킷에 따라 다양한 기능을 제공하지만 일반적으로 다음과 같은 작업에 도움이 됩니다.
- 외부 데이터 소스에 연결: API, 데이터베이스, 기타 외부 소스의 정보에 액세스하여 LangChain 애플리케이션에 통합합니다.
- 고급 프롬프트 기법: 사전 빌드된 프롬프트를 활용하거나 맞춤 프롬프트를 만들어 언어 모델과의 상호작용을 최적화합니다.
- 체인 생성 및 관리: 복잡한 체인을 쉽게 빌드하고 효율적으로 관리할 수 있습니다.
- 평가 및 모니터링: LangChain 애플리케이션 및 체인의 성능을 분석합니다.
인기 있는 LangChain 도구 키트는 다음과 같습니다.
- Agent Executor Toolkits: 웹 탐색이나 코드 실행과 같은 작업을 통해 실제 세계와 상호작용할 수 있는 에이전트를 개발하기 위한 도구입니다.
- 프롬프트 엔지니어링 도구 키트: 효과적인 프롬프트를 작성하기 위한 리소스 모음입니다.
GitLab 툴킷
이 실습에서는 GitLab 도구 키트를 사용하여 GitLab 병합 요청 생성을 자동화합니다.
Gitlab 도구 키트에는 LLM 에이전트가 gitlab 저장소와 상호작용할 수 있는 도구가 포함되어 있습니다. 이 도구는 python-gitlab
라이브러리의 래퍼입니다.
GitLab 툴킷은 다음 작업을 실행할 수 있습니다.
- 파일 만들기 - 저장소에 새 파일을 만듭니다.
- Read File: 저장소에서 파일을 읽습니다.
- 파일 업데이트: 저장소의 파일을 업데이트합니다.
- Create Pull Request(풀 요청 만들기): 봇의 작업 브랜치에서 기본 브랜치로 풀 요청을 만듭니다.
- Get Issue: 저장소에서 문제를 가져옵니다.
- Get Issue: 특정 문제에 관한 세부정보를 가져옵니다.
- 문제에 관한 의견: 특정 문제에 관한 의견을 게시합니다.
- 파일 삭제: 저장소에서 파일을 삭제합니다.
8. GitLab 저장소 및 도구 키트 구성
GitLab을 열고 새 공개 프로젝트를 만든 다음 'Settings / Access Tokens
'에서 프로젝트 액세스 토큰을 설정합니다.
다음 세부정보를 사용하세요.
- 토큰 이름:
devai-api-qwiklabs
- 역할:
Maintainer
- 범위 선택:
api
액세스 토큰 값을 노트북의 임시 파일에 복사하여 붙여넣습니다. 이 값은 다음 단계에서 사용됩니다.
9. Cloud Run에 애플리케이션 배포 준비
Cloud Workstations 인스턴스로 돌아가 기존 터미널을 사용하거나 새 터미널을 엽니다.
웹 기반 승인 흐름을 통해 사용자 계정의 액세스 사용자 인증 정보를 가져옵니다.
링크를 클릭하고 단계에 따라 인증 코드를 생성합니다.
gcloud auth login
Qwiklabs 프로젝트 세부정보를 사용하여 프로젝트 세부정보를 구성합니다.
예: qwiklabs-gcp-00-2c10937585bb
gcloud config set project YOUR-QWIKLABS-PROJECT-ID
나머지 환경 변수를 설정합니다.
export PROJECT_ID=$(gcloud config get-value project)
export LOCATION=us-central1
export REPO_NAME=devai-api
export SERVICE_NAME=devai-api
GitLab 통합에 필요한 환경 변수를 설정합니다.
export GITLAB_PERSONAL_ACCESS_TOKEN=gitlab-token
터미널에 민감한 정보가 노출되지 않도록 하려면 read -s
를 사용하는 것이 좋습니다. read -s
는 콘솔의 명령어 기록에 값이 표시되지 않고 환경 변수를 설정할 수 있는 안전한 방법입니다. 실행한 후 값을 붙여넣고 Enter 키를 눌러야 합니다.
이 명령어를 사용하려면 GitLab 사용자 ID와 저장소 이름을 업데이트해야 합니다.
예: export GITLAB_REPOSITORY="gitrey/qwiklabs-test"
export GITLAB_REPOSITORY="USERID/REPOSITORY"
나머지 환경 변수를 설정합니다.
export GITLAB_URL="https://gitlab.com"
export GITLAB_BRANCH="devai"
export GITLAB_BASE_BRANCH="main"
10. LangSmith LLM 추적 구성
LangSmith 계정을 만들고 설정 섹션에서 서비스 API 키를 생성합니다. https://docs.smith.langchain.com/
LangSmith 통합에 필요한 환경 변수를 설정합니다.
export LANGCHAIN_TRACING_V2=true
export LANGCHAIN_ENDPOINT="https://api.smith.langchain.com"
export LANGCHAIN_API_KEY=langchain-service-api-key
11. JIRA 구성
이 값은 이 실습에서 사용되지 않으므로 명령어를 실행하기 전에 특정 JIRA 프로젝트 값으로 업데이트할 필요가 없습니다.
Cloud Run 서비스 배포에 필요한 환경 변수를 설정합니다.
export JIRA_API_TOKEN=jira-token
export JIRA_USERNAME="YOUR-EMAIL"
export JIRA_INSTANCE_URL="https://YOUR-JIRA-PROJECT.atlassian.net"
export JIRA_PROJECT_KEY="YOUR-JIRA-PROJECT-KEY"
export JIRA_CLOUD=true
12. Cloud Run에 Devai-API 배포
현재 위치가 올바른 폴더인지 확인합니다.
cd ~/github/genai-for-developers/devai-api
이 실습에서는 권장사항에 따라 Secret Manager를 사용하여 Cloud Run에 액세스 토큰 및 LangChain API 키 값을 저장하고 참조합니다.
Secret Manager에 JIRA 액세스 토큰을 저장합니다.
echo -n $JIRA_API_TOKEN | \
gcloud secrets create JIRA_API_TOKEN \
--data-file=-
Secret Manager에 GitLab 액세스 토큰을 저장합니다.
echo -n $GITLAB_PERSONAL_ACCESS_TOKEN | \
gcloud secrets create GITLAB_PERSONAL_ACCESS_TOKEN \
--data-file=-
Secret Manager에 LangChain API 키를 저장합니다.
echo -n $LANGCHAIN_API_KEY | \
gcloud secrets create LANGCHAIN_API_KEY \
--data-file=-
Cloud Run에 애플리케이션을 배포합니다.
gcloud run deploy "$SERVICE_NAME" \
--source=. \
--region="$LOCATION" \
--allow-unauthenticated \
--service-account vertex-client \
--set-env-vars PROJECT_ID="$PROJECT_ID" \
--set-env-vars LOCATION="$LOCATION" \
--set-env-vars GITLAB_URL="$GITLAB_URL" \
--set-env-vars GITLAB_REPOSITORY="$GITLAB_REPOSITORY" \
--set-env-vars GITLAB_BRANCH="$GITLAB_BRANCH" \
--set-env-vars GITLAB_BASE_BRANCH="$GITLAB_BASE_BRANCH" \
--set-env-vars JIRA_USERNAME="$JIRA_USERNAME" \
--set-env-vars JIRA_INSTANCE_URL="$JIRA_INSTANCE_URL" \
--set-env-vars JIRA_PROJECT_KEY="$JIRA_PROJECT_KEY" \
--set-env-vars JIRA_CLOUD="$JIRA_CLOUD" \
--set-env-vars LANGCHAIN_TRACING_V2="$LANGCHAIN_TRACING_V2" \
--update-secrets="LANGCHAIN_API_KEY=LANGCHAIN_API_KEY:latest" \
--update-secrets="GITLAB_PERSONAL_ACCESS_TOKEN=GITLAB_PERSONAL_ACCESS_TOKEN:latest" \
--update-secrets="JIRA_API_TOKEN=JIRA_API_TOKEN:latest" \
--min-instances=1 \
--max-instances=3
Y
를 선택하여 Artifact Registry Docker 저장소를 만듭니다.
Deploying from source requires an Artifact Registry Docker repository to store built containers. A repository named [cloud-run-source-deploy] in
region [us-central1] will be created.
Do you want to continue (Y/n)? y
아래에서 gcloud run deploy SERVICE_NAME --source=.
흐름을 검토하세요. 자세히 알아보기
백그라운드에서 이 명령어는 Google Cloud의 buildpacks
및 Cloud Build
를 사용하여 머신에 Docker를 설치하거나 빌드팩 또는 Cloud Build를 설정할 필요 없이 소스 코드에서 자동으로 컨테이너 이미지를 빌드합니다. 즉, 위에서 설명한 단일 명령어에서는 gcloud builds submit
및 gcloud run deploy
명령어가 필요한 작업을 수행합니다.
Dockerfile을 제공한 경우(이 저장소에서 제공함) Cloud Build는 이를 사용하여 컨테이너 이미지를 빌드하고 빌드팩을 사용하여 컨테이너 이미지를 자동으로 감지하고 빌드하지 않습니다. 빌드팩에 관해 자세히 알아보려면 문서를 참고하세요.
Console에서 Cloud Build 로그를 검토합니다.
Artifact Registry에서 생성된 Docker 이미지를 검토합니다.
cloud-run-source-deploy/devai-api
를 열고 자동으로 감지된 취약점을 검토합니다. 수정사항이 있는 항목을 확인하고 설명에 따라 어떻게 수정할 수 있는지 확인합니다.
Cloud 콘솔에서 Cloud Run 인스턴스 세부정보를 검토합니다.
curl 명령어를 실행하여 엔드포인트를 테스트합니다.
curl -X POST \
-H "Content-Type: application/json" \
-d '{"prompt": "Create HTML, CSS and JavaScript using React.js framework to implement Login page with username and password fields, validation and documentation. Provide complete implementation, do not omit anything."}' \
$(gcloud run services list --filter="(devai-api)" --format="value(URL)")/generate
(선택사항 섹션) Cloud Workstation 설정
Cloud Workstations는 기본 제공 보안과 사전 구성되었지만 맞춤설정이 가능한 개발 환경을 갖춘 Google Cloud의 관리형 개발 환경을 제공합니다. 개발자가 소프트웨어를 설치하고 설정 스크립트를 실행하도록 요구하는 대신, 재현 가능한 방식으로 환경을 지정하는 워크스테이션 구성을 만들 수 있습니다. 워크스테이션 구성에 대한 모든 업데이트는 다음에 워크스테이션을 시작할 때 자동으로 워크스테이션에 적용됩니다. 개발자는 여러 로컬 코드 편집기 (예: VSCode 또는 IntelliJ IDEA Ultimate, PyCharm Professional과 같은 JetBrains IDE) 또는 SSH를 통해 워크스테이션에 액세스합니다.
Cloud Workstations는 다음과 같은 Google Cloud 리소스를 사용하여 개발 환경을 관리합니다.
- 워크스테이션 클러스터는 특정 리전의 워크스테이션 그룹 및 워크스테이션 그룹이 연결된 VPC 네트워크를 정의합니다. 워크스테이션 클러스터는 Google Kubernetes Engine(GKE) 클러스터와 관련이 없습니다.
- 워크스테이션 구성은 워크스테이션을 위한 템플릿 역할을 합니다. 워크스테이션 구성은 워크스테이션 가상 머신(VM) 인스턴스 유형, 영구 스토리지, 컨테이너 이미지 정의 환경, 사용할 IDE 또는 코드 편집기 등의 세부정보를 정의합니다. 관리자와 플랫폼팀은 Identity and Access Management (IAM) 규칙을 사용하여 팀 또는 개별 개발자에게 액세스 권한을 부여할 수도 있습니다.
- 워크스테이션은 클라우드 IDE, 언어 도구, 라이브러리 등을 제공하는 사전 구성된 개발 환경입니다. 워크스테이션은 필요에 따라 시작하거나 중지할 수 있으며, 세션 간에 데이터를 저장하기 위해 영구 디스크가 연결된 프로젝트의 Compute Engine VM에서 실행할 수 있습니다.
관리자와 플랫폼팀은 개발팀과 공유하는 워크스테이션 구성을 만듭니다. 각 개발자는 워크스테이션 구성에 따라 워크스테이션을 만듭니다.
이 실습에서는 브라우저 기반 IDE를 사용하지만 Cloud Workstations는 다른 일반적인 개발 인터페이스도 지원합니다.
- JetBrains Gateway를 통해 자체 로컬 JetBrains IDE를 사용할 수 있습니다.
- 로컬 VSCode를 사용하는 경우 SSH를 통해 원격 개발을 위해 워크스테이션에 액세스할 수도 있습니다.
- 로컬 머신에서 워크스테이션에 SSH 및 TCP 터널을 설정할 수도 있습니다.
(선택사항 섹션) 워크스테이션 클러스터 만들기
이러한 단계는 실습 설정 중에 실행되었으므로 실행할 필요가 없습니다.
이 단계에서는 Cloud Workstations 클러스터, 구성, 워크스테이션을 설정하는 방법을 보여줍니다.
이 섹션을 검토하고 Forge 플랫폼 섹션으로 이동합니다.
워크스테이션 클러스터 만들기:
gcloud workstations clusters create ws-cluster --region=us-central1
워크스테이션 구성 만들기
gcloud workstations configs create devai-config \
--cluster=ws-cluster \
--machine-type=e2-standard-8 \
--region=us-central1 \
--running-timeout=21600 \
--idle-timeout=1800 \
--container-predefined-image=codeoss \
--pd-disk-size=200 \
--pd-disk-type=pd-standard \
--service-account=$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com \
--pool-size=1
워크스테이션 만들기
gcloud workstations create devai-workstation \
--cluster=ws-cluster \
--config=devai-config \
--region=us-central1
Cloud Console에서 사용 가능한 워크스테이션을 확인합니다. 'devai-workstation
'을(를) 시작하고 실행합니다.
오른쪽 하단에서 'Gemini
'를 사용 설정하고 새 브라우저 탭에서 로그인 흐름을 따르세요. 그런 다음 생성된 코드를 콘솔에 다시 복사하여 로그인을 완료합니다.
왼쪽 패널에서 'Gemini
' 채팅을 열고 Gemini에게 다음과 같이 요청합니다.
'You are a Cloud Workstations Product Manager, tell me about Cloud Workstations
'.
'You are Cloud Workstations Product Manager, Can I create my custom Cloud Workstations image with my company tools so new developers can onboard in minutes?
'.
(선택사항 섹션 끝)
13. Forge 플랫폼
Forge는 개발자가 Jira, Confluence, Compass, Bitbucket과 같은 Atlassian 제품과 통합되는 앱을 빌드할 수 있는 플랫폼입니다.
Forge CLI 설치
터미널에서 아래 명령어를 실행합니다.
노드 버전 관리자 ( nvm)를 다운로드하고 현재 터미널 세션의 경로에서 사용할 수 있도록 합니다.
cd ~/github/genai-for-developers
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
nvm을 설치합니다.
터미널에서 다음을 실행하여 최신 Node.js LTS 버전을 선택합니다.
nvm install --lts
nvm use --lts
다음을 실행하여 Forge CLI를 전역적으로 설치합니다.
npm install -g @forge/cli
이 실습에서는 환경 변수를 사용하여 로그인합니다.
JIRA 프로젝트 설정
개인 계정을 사용하여 JIRA 프로젝트를 만들고 확인합니다.
기존 JIRA 프로젝트를 검토합니다. https://admin.atlassian.com/
개인 계정을 사용하여 새 JIRA 프로젝트를 만듭니다.
https://team.atlassian.com/your-work로 이동하여 아이콘을 클릭한 다음
를 선택합니다. 그런 다음 'JIRA Software' - 'Try it now'(지금 사용해 보기)를 선택합니다. 표시되는 메시지에 따라 프로젝트/사이트 생성을 완료합니다.
JIRA Software를 선택합니다.
새 프로젝트를 만듭니다.
14. Atlassian API 토큰
기존 Atlassian API 토큰을 만들거나 사용하여 CLI에 로그인합니다.
CLI는 명령어를 실행할 때 토큰을 사용합니다.
- https://id.atlassian.com/manage/api-tokens으로 이동합니다.
- Create API token(API 토큰 만들기)을 클릭합니다.
- API 토큰을 설명하는 라벨을 입력합니다. 예를 들어 forge-api-token이 있습니다.
- 만들기를 클릭합니다.
- 클립보드에 복사를 클릭하고 대화상자를 닫습니다.
Cloud Workstations 터미널에서 아래 명령어를 실행합니다.
Forge CLI에 로그인하여 Forge 명령어를 사용합니다.
JIRA/FORGE 이메일 주소를 설정합니다. 이메일 주소로 바꿉니다.
export FORGE_EMAIL=your-email
Forge API 토큰을 설정합니다. JIRA API 토큰으로 바꿉니다.
export FORGE_API_TOKEN=your-jira-api-token
아래 명령어를 실행하여 forge cli를 테스트합니다. 분석을 수집하라는 메시지가 표시되면 No
로 응답합니다.
forge settings set usage-analytics false
로그인되어 있는지 확인합니다.
forge whoami
샘플 출력.
Logged in as John Green (johngreen@email.com) Account ID: 123090:aaabbcc-076a-455c-99d0-d1aavvccdd
Forge 애플리케이션 만들기
현재 위치가 '~/github/genai-for-developers
' 폴더인지 확인합니다.
명령어를 실행하여 Forge 애플리케이션을 만듭니다.
forge create
메시지가 표시되면 다음 값을 사용합니다.
- 앱 이름:
devai-jira-ui-qwiklabs
- 카테고리 선택:
UI Kit
- 제품을 선택합니다.
Jira
- 템플릿을 선택합니다.
jira-issue-panel
애플리케이션 폴더로 변경합니다.
cd devai-jira-ui-qwiklabs/
배포 명령어를 실행합니다.
forge deploy
샘플 출력:
Deploying your app to the development environment. Press Ctrl+C to cancel. Running forge lint... No issues found. ✔ Deploying devai-jira-ui-qwiklabs to development... ℹ Packaging app files ℹ Uploading app ℹ Validating manifest ℹ Snapshotting functions ℹ Deploying to environment ✔ Deployed Deployed devai-jira-ui-qwiklabs to the development environment.
애플리케이션을 설치합니다.
forge install
메시지가 표시되면 다음 값을 사용합니다.
- 제품을 선택합니다.
Jira
- 사이트 URL(
your-domain.atlassian.net
)을 입력합니다.
샘플 출력:
Select the product your app uses. ? Select a product: Jira Enter your site. For example, your-domain.atlassian.net ? Enter the site URL: genai-for-developers.atlassian.net Installing your app onto an Atlassian site. Press Ctrl+C to cancel. ? Do you want to continue? Yes ✔ Install complete! Your app in the development environment is now installed in Jira on genai-for-developers.atlassian.net
JIRA 사이트를 열고 다음 설명이 포함된 새 JIRA 작업을 만듭니다.
Create HTML, CSS and JavaScript using React.js framework to implement Login page with username and password fields, validation and documentation. Provide complete implementation, do not omit anything.
작업을 열면 'devai-jira-ui-qwiklabs
' 버튼이 표시됩니다.
버튼을 클릭하고 UI에서 변경사항을 검토합니다.
Forge 백엔드 로그 보기
forge logs
Atlassian Developer Console
Atlassian Developer Console에서도 배포된 앱을 보고 관리할 수 있습니다.
로그 검토 - Development
환경으로 전환
Forge 애플리케이션 매니페스트 및 소스 코드 검토
'devai-jira-ui-qwiklabs/manifest.yml
' 파일을 열고 Gemini Code Assist를 사용하여 설명합니다.
설명을 검토합니다.
다음 파일을 열고 Gemini Code Assist에 설명을 요청합니다.
devai-jira-ui-qwiklabs/src/frontend/index.jsx
devai-jira-ui-qwiklabs/src/resolvers/index.js
DevAI API Cloud Run 엔드포인트로 Forge 앱 업데이트
GCP 프로젝트 ID가 설정되어 있는지 확인합니다.
gcloud config get project
그렇지 않은 경우 Qwiklabs 실습 페이지의 프로젝트 ID를 사용하여 GCP 프로젝트를 설정합니다.
예: qwiklabs-gcp-00-2c10937585bb
gcloud config set project YOUR_QWIKLABS_PROJECT_ID
Cloud Run 서비스 URL을 설정합니다.
export DEVAI_API_URL=$(gcloud run services list --filter="(devai-api)" --format="value(URL)")
forge variables set DEVAI_API_URL $DEVAI_API_URL
아래 명령어를 실행하여 확인합니다.
forge variables list
샘플 출력
Forge 애플리케이션 매니페스트 및 코드 업데이트
이러한 코드 스니펫은 저장소의 sample-devai-jira-ui
폴더에서 확인할 수 있습니다.
편집기에서 매니페스트 파일(devai-jira-ui-qwiklabs/manifest.yml
)을 엽니다.
파일 끝에 아래 줄을 추가합니다. Cloud Run 엔드포인트를 배포한 엔드포인트로 바꿉니다.
permissions:
scopes:
- read:jira-work
- write:jira-work
external:
fetch:
client:
- devai-api-gjerpi6qqq-uc.a.run.app/generate # replace with YOUR CLOUD RUN URL
편집기에서 리졸버/색인 파일(devai-jira-ui-qwiklabs/src/resolvers/index.js
)을 엽니다.
기존 getText
함수 뒤에 아래 줄을 추가합니다.
resolver.define('getApiKey', (req) => {
return process.env.LLM_API_KEY;
});
resolver.define('getDevAIApiUrl', (req) => {
return process.env.DEVAI_API_URL;
});
편집기에서 프런트엔드/색인 파일(devai-jira-ui-qwiklabs/src/frontend/index.jsx
)을 엽니다.
index.jsx
를 아래 콘텐츠로 바꿉니다. GitLab 사용자 ID/저장소 링크를 업데이트합니다.
YOUR-GIT-USERID 및 YOUR-GIT-REPO를 업데이트해야 하는 위치는 두 곳입니다.
파일에서 다음 줄을 검색하여 변경합니다.
https://gitlab.com/
YOUR-GIT-USERID/YOUR-GIT-REPO
/-/merge_requests
import React from 'react';
import ForgeReconciler, { Text, Link, useProductContext } from '@forge/react';
import { requestJira } from '@forge/bridge';
import { invoke } from '@forge/bridge';
import api, { route, assumeTrustedRoute } from '@forge/api';
// const apiKey = await invoke("getApiKey")
const devAIApiUrl = await invoke("getDevAIApiUrl")
const App = () => {
const context = useProductContext();
const [description, setDescription] = React.useState();
const fetchDescriptionForIssue = async () => {
const issueId = context?.extension.issue.id;
const res = await requestJira(`/rest/api/2/issue/${issueId}`);
const data = await res.json();
// const genAI = new GoogleGenerativeAI(apiKey);
// const model = genAI.getGenerativeModel({ model: "gemini-pro"});
// const prompt = `You are principal software engineer at Google and given requirements below to implement.\nPlease provide implementation details and documentation.\n\nREQUIREMENTS:\n\n${data.fields.description}`
// const result = await model.generateContent(prompt);
// const text = result.response.text();
// const jsonText = JSON.stringify(text);
const bodyGenerateData = `{"prompt": ${JSON.stringify(data.fields.description)}}`;
const generateRes = await api.fetch(devAIApiUrl+'/generate',
{
body: bodyGenerateData,
method: 'post',
headers: { 'Content-Type': 'application/json' },
}
)
const resData = await generateRes.text();
const jsonText = JSON.stringify(resData);
const bodyData = `{
"body": ${jsonText}
}`;
console.log("bodyData", bodyData)
// Add Gemini response as a comment on the JIRA issue
await requestJira(`/rest/api/2/issue/${issueId}/comment`, {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: bodyData
});
// Add link to the GitLab merge request page as a comment
await requestJira(`/rest/api/2/issue/${issueId}/comment`, {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: `{"body": "[GitLab Merge Request|https://gitlab.com/YOUR-GIT-USERID/YOUR-GIT-REPO/-/merge_requests]"}`
});
return "Response will be added as a comment. Please refresh in a few moments.";
};
React.useEffect(() => {
if (context) {
fetchDescriptionForIssue().then(setDescription);
}
}, [context]);
return (
<>
<Text>{description}</Text>
<Link href='https://gitlab.com/YOUR-GIT-USERID/YOUR-GIT-REPO/-/merge_requests' openNewTab={true}>GitLab Merge Request</Link>
</>
);
};
ForgeReconciler.render(
<React.StrictMode>
<App />
</React.StrictMode>
);
Forge 애플리케이션 재배포
package.json
파일에 종속 항목을 추가합니다.
"@forge/api": "4.0.0",
종속 항목을 설치합니다.
npm install
업데이트된 애플리케이션을 배포합니다.
forge deploy
샘플 출력:
ℹ Uploading app ℹ Validating manifest ℹ Snapshotting functions ℹ Deploying to environment ✔ Deployed Deployed devai-jira-ui-qwiklabs to the development environment. We've detected new scopes or egress URLs in your app. Run forge install --upgrade and restart your tunnel to put them into effect.
업데이트된 애플리케이션을 설치합니다.
forge install --upgrade
샘플 출력:
Upgrading your app on the Atlassian site. Your app will be upgraded with the following additional scopes: - read:jira-work - write:jira-work Your app will exchange data with the following urls: - devai-api-7su2ctuqpq-uc.a.run.app ? Do you want to continue? Yes ✔ Upgrade complete! Your app in the development environment is now the latest in Jira on genai-for-developers.atlassian.net.
Forge 애플리케이션 테스트
JIRA 프로젝트에서 기존 JIRA 작업을 열거나 새 JIRA 작업을 만듭니다.
이전 패널이 이미 추가된 경우 삭제해야 합니다.
'...
' 아이콘을 클릭하고 메뉴에서 삭제를 선택합니다. 그런 다음 버튼을 다시 클릭할 수 있습니다.
Jira 댓글 확인
DEVAI API에서 응답을 받으면 JIRA 문제에 댓글 2개가 추가됩니다.
- GitLab 병합 요청
- Gemini 사용자 스토리 구현 세부정보
'History
' 탭과 'Comments
' 탭 간에 전환하여 뷰를 새로고침합니다.
GitLab 병합 요청 생성 사용 설정
devai-api/app/routes.py
파일을 열고 generate_handler
메서드에서 아래 줄의 주석 처리를 삭제합니다.
print(f"{response.text}\n")
# resp_text = response.candidates[0].content.parts[0].text
# pr_prompt = f"""Create GitLab merge request using provided details below.
# Create new files, commit them and push them to opened merge request.
# When creating new files, remove the lines that start with ``` before saving the files.
# DETAILS:
# {resp_text}
# """
# print(pr_prompt)
# agent.invoke(pr_prompt)
Cloud Run 애플리케이션 재배포
현재 위치가 올바른 폴더인지 확인합니다.
cd ~/github/genai-for-developers/devai-api
동일한 터미널 세션을 사용하는 경우 모든 환경 변수가 여전히 설정되어 있을 수 있습니다.
터미널에서 'echo $GITLAB_REPOSITORY
'를 실행하여 확인합니다.
새 터미널 세션이 열렸다면 다음 단계에 따라 재설정하세요.
애플리케이션을 재배포하기 전에 필요한 환경 변수를 재설정해야 합니다.
이 명령어를 사용하려면 GitLab 사용자 ID와 저장소 이름을 업데이트해야 합니다.
export GITLAB_REPOSITORY="USERID/REPOSITORY"
나머지 환경 변수를 설정합니다.
export GITLAB_URL="https://gitlab.com"
export GITLAB_BRANCH="devai"
export GITLAB_BASE_BRANCH="main"
export LANGCHAIN_TRACING_V2=true
export LANGCHAIN_ENDPOINT="https://api.smith.langchain.com"
export LOCATION=us-central1
export REPO_NAME=devai-api
export SERVICE_NAME=devai-api
export PROJECT_ID=$(gcloud config get-value project)
export JIRA_USERNAME="YOUR-EMAIL"
export JIRA_INSTANCE_URL="https://YOUR-JIRA-PROJECT.atlassian.net"
export JIRA_PROJECT_KEY="YOUR-JIRA-PROJECT-KEY"
export JIRA_CLOUD=true
GitLab 도구 키트는 'devai
' 브랜치를 사용하여 병합 요청의 변경사항을 푸시합니다.
해당 브랜치를 이미 만들었는지 확인합니다.
Cloud Run에 애플리케이션을 배포합니다.
gcloud run deploy "$SERVICE_NAME" \
--source=. \
--region="$LOCATION" \
--allow-unauthenticated \
--service-account vertex-client \
--set-env-vars PROJECT_ID="$PROJECT_ID" \
--set-env-vars LOCATION="$LOCATION" \
--set-env-vars GITLAB_URL="$GITLAB_URL" \
--set-env-vars GITLAB_REPOSITORY="$GITLAB_REPOSITORY" \
--set-env-vars GITLAB_BRANCH="$GITLAB_BRANCH" \
--set-env-vars GITLAB_BASE_BRANCH="$GITLAB_BASE_BRANCH" \
--set-env-vars JIRA_USERNAME="$JIRA_USERNAME" \
--set-env-vars JIRA_INSTANCE_URL="$JIRA_INSTANCE_URL" \
--set-env-vars JIRA_PROJECT_KEY="$JIRA_PROJECT_KEY" \
--set-env-vars JIRA_CLOUD="$JIRA_CLOUD" \
--set-env-vars LANGCHAIN_TRACING_V2="$LANGCHAIN_TRACING_V2" \
--update-secrets="LANGCHAIN_API_KEY=LANGCHAIN_API_KEY:latest" \
--update-secrets="GITLAB_PERSONAL_ACCESS_TOKEN=GITLAB_PERSONAL_ACCESS_TOKEN:latest" \
--update-secrets="JIRA_API_TOKEN=JIRA_API_TOKEN:latest" \
--min-instances=1 \
--max-instances=3
엔드 투 엔드 통합 확인
버튼을 다시 클릭하여 JIRA 작업에서 프로세스를 시작하고 GitLab 저장소의 병합 요청 섹션과 LangSmith에서 출력을 확인합니다.
GitLab 병합 요청 세부정보
LangSmith LLM 트레이스
LangSmith 포털을 열고 JIRA 문제 생성 호출에 대한 LLM 트레이스를 검토합니다.
샘플 LangSmith LLM 트레이스
(선택사항 섹션) GitHub 저장소에 변경사항 푸시
GitHub 웹사이트로 이동하여 새 저장소를 만들어 이 실습의 변경사항을 개인 저장소에 푸시합니다.
Cloud Workstations 인스턴스로 돌아가서 터미널에서 Git 사용자 이름과 이메일을 설정합니다.
명령어를 실행하기 전에 값을 업데이트합니다.
git config --global user.name "Your Name"
git config --global user.email "your_email@example.com"
SSH 키를 생성하고 GitHub 저장소에 추가합니다.
명령어를 실행하기 전에 이메일을 업데이트하세요.
암호를 입력하고 키 생성을 완료하기 위해 Enter 키를 여러 번 누르지 마세요.
ssh-keygen -t ed25519 -C "your-email-address"
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
cat ~/.ssh/id_ed25519.pub
생성된 공개 키를 GitHub 계정에 추가합니다.
https://github.com/settings/keys를 열고 'New SSH key
'를 클릭합니다.
키 이름에는 'qwiklabs-key
'를 사용하고 마지막 명령어의 출력을 복사/붙여넣습니다.
터미널로 돌아가 변경사항을 커밋하고 푸시합니다.
cd ~/github/genai-for-developers
git remote rm origin
위에서 만든 저장소를 사용하여 원격 출처를 설정합니다.
저장소 URL로 바꿉니다.
git remote add origin git@github.com:YOUR-GITHUB-USERID/YOUR-GITHUB-REPO.git
변경사항을 추가, 커밋, 푸시합니다.
git add .
git commit -m "lab changes"
git push -u origin main
15. 축하합니다.
축하합니다. 실습을 완료했습니다.
학습한 내용
- Gemini API와 통합되도록 Cloud Run 애플리케이션을 배포하는 방법
- JIRA용 Atlassian Forge 앱을 만들고 배포하는 방법
- GitLab 작업 자동화에 LangChain ReAct 에이전트를 사용하는 방법
- LangSmith에서 LLM 트레이스를 검토하는 방법
다음 단계:
- 더 많은 실습 세션이 제공될 예정입니다.
삭제
이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.
프로젝트 삭제
비용이 청구되지 않도록 하는 가장 쉬운 방법은 튜토리얼에서 만든 프로젝트를 삭제하는 것입니다.
©2024 Google LLC All rights reserved. Google 및 Google 로고는 Google LLC의 상표입니다. 기타 모든 회사명 및 제품명은 해당 업체의 상표일 수 있습니다.