[Hands On] OCI DevOps를 통한 CI/CD 파이프라인 구축

1. OCI DevOps란?

OCI DevOps는 Oracle Cloud Infrastructure(OCI)에서 제공하는 관리형 CI/CD(지속적 통합 및 배포) 서비스입니다. 애플리케이션 소스 코드 저장, 빌드, 테스트, 배포 등 전체 소프트웨어 개발 수명 주기를 자동화할 수 있는 다양한 도구와 기능을 제공합니다.

1.1 OCI DevOps 서비스 주요 기능

1. 소스 코드 관리

  • 코드 저장소: 애플리케이션 소스 코드를 안전하게 저장하고 관리할 수 있는 Git 기반 저장소를 제공합니다.
  • 코드 브랜치 관리: 기능 개발, 버그 수정 등을 위한 브랜치를 생성하고 병합할 수 있습니다.

2. 지속적 통합(CI)

  • 자동 빌드 및 테스트: 소스 코드 변경 시 자동으로 빌드 및 테스트를 수행하여 품질을 보장합니다. 
  • 다양한 언어 및 프레임워크 지원: Java, Node.js, Python 등 다양한 언어와 프레임워크를 지원합니다.

3. 지속적 배포(CD)

  • 자동 배포: 테스트를 통과한 코드를 자동으로 프로덕션 환경에 배포할 수 있습니다. 
  • 단계별 배포: 개발, 스테이징, 프로덕션 등 단계별로 배포 환경을 구성할 수 있습니다.

4. 모니터링 및 알림

  • 배포 상태 모니터링: 배포 프로세스와 애플리케이션 상태를 실시간으로 모니터링할 수 있습니다.
  • 알림 및 보고서: 배포 결과, 오류 등에 대한 알림을 받고 보고서를 생성할 수 있습니다.

1.2 OCI DevOps 서비스의 장점

OCI DevOps 서비스는 개발팀의 생산성과 애플리케이션 품질을 높일 수 있는 다음과 같은 장점이 있습니다.

  • 통합 솔루션: 소스 코드 관리, 빌드, 테스트, 배포 등 SDLC 전 과정을 하나의 통합 플랫폼에서 관리할 수 있습니다.
  • 자동화: 반복적인 작업을 자동화하여 개발 속도와 효율성을 높일 수 있습니다.
  • 확장성: OCI 인프라를 활용하여 필요에 따라 리소스를 확장할 수 있습니다.
  • 보안: OCI의 강력한 보안 기능을 활용하여 안전한 개발 환경을 구축할 수 있습니다.

2. Hands On

OCI DevOps 서비스를 통해 CI/CD 파이프라인을 구축하여 소스 코드 변경이 Compute의 샘플 애플리케이션에 자동으로 반영되는 실습을 진행할 예정입니다.

사전준비

1. OCI Notifications 설정

1.1 주제 및 구독 설정

OCI DevOps에서는 OCI Notifications 서비스의 “주제” 및 “구독” 설정이 필요합니다.
이 설정을 설정하면 등록한 이메일 주소로 OCI DevOps로부터 알림을 받을 수 있습니다.

OCI Notifications 정보
OCI Notifications는 안전하고, 신뢰성이 높고, 대기 시간이 짧고, 지속적으로 메시지를 전달하는 서비스입니다.
이번 실습에서는 이메일 주소만 전달해보지만, 그 밖에도 Slack/SMS/PagerDuty등에 통지할 수 있습니다.

1.1.1 토픽 만들기

개발자 서비스 > 애플리케이션 통합 > 통지

위와 같이 토픽을 하나 생성합니다.

1.1.2 구독 만들기

이메일로 전달받은 링크를 클릭하여 Confirm subscription을 하면 보류중에서 활성으로 바뀝니다.

2. 동적 그룹/정책 설정

2.1 동적 그룹 및 정책 만들기

여기에서는 OCI DevOps를 활용하기 위한 동적 그룹 및 정책을 생성합니다.

동적 그룹 및 정책 이해
Oracle Cloud Infrastrcture에는 동적 그룹이라는 개념이 있습니다.
또한 구성된 동적 그룹은 정책을 활용하여 OCI의 리소스와 인스턴스를 주체로 한 작업을 실현할 수 있습니다.

2.1.1 OCI DevOps에서 사용하는 동적 그룹

OCI DevOps를 활용하는 데 필요한 동적 그룹을 만듭니다.
OCI DevOps에서 설정하는 동적 그룹은 다음과 같습니다.

동적 그룹규칙설명
OCI_DevOps_Dynamic_GroupAll {resource.type = ‘devopsrepository’, resource.compartment.id = ‘컴파트먼트 OCID’}OCI DevOps의 코드 저장소를 활용하는 데 필요한 동적 그룹
OCI_DevOps_Dynamic_GroupAll {resource.type = ‘devopsbuildpipeline’, resource.compartment.id = ‘컴파트먼트 OCID’}빌드 파이프라인을 활용하는 데 필요한 동적 그룹
OCI_DevOps_Dynamic_GroupAll {resource.type = ‘devopsdeploypipeline’, resource.compartment.id = ‘컴파트먼트 OCID’}배포 파이프라인을 활용하는 데 필요한 동적 그룹
2.1.2 OCI DevOps에서 사용하는 정책

OCI DevOps를 활용하는 데 필요한 정책을 만듭니다. 정책은 다음과 같습니다.

정책설명
Allow dynamic-group OCI_DevOps_Dynamic_Group to manage devops-family in compartment id 구획 OCIDOCI DevOps의 각 기능을 활용하는 데 필요한 정책
Allow dynamic-group OCI_DevOps_Dynamic_Group to manage all-artifacts in compartment id 구획 OCIDOCI DevOps가 OCIR 및 아티팩트 레지스트리를 관리하는 데 필요한 정책
Allow dynamic-group OCI_DevOps_Dynamic_Group to use ons-topics in compartment id 구획 OCIDOCI DevOps가 OCI Notifications 서비스를 활용하는 데 필요한 정책

이 핸즈온에서의 동적 그룹에 대해
이번에는 간편하게 핸즈온을 실시하기 위해 컴파트먼트 내의 모든 리소스와 인스턴스를 동적 그룹으로 포함하도록 설정 했습니다.
본래는 각 서비스의 타입을 지정해 동적 그룹을 작성하게 됩니다.

2.2 동적 그룹 및 정책 설정

이번 핸즈온에서는 스크립트를 이용하여 동적 그룹과 정책을 설정합니다.
샘플 코드를 다운로드합니다.
상단 메뉴에서 Cloud Shell 아이콘을 클릭하여 Cloud Shell을 시작합니다.

wget https://raw.githubusercontent.com/oracle-japan/devops-commons-script/master/common_prepare.sh
chmod +x ./common_prepare.sh
sh ./common_prepare.shd

위 명령어를 통해 정책 생성이 완료되었습니다.

3. 프로젝트

여기에서는 OCI DevOps 인스턴스를 만들고 프로젝트를 만듭니다.

3.1 프로젝트 만들기

OCI DevOps는 프로젝트별로 관리하는 메커니즘입니다. 먼저 프로젝트를 만듭니다.
개발자 서비스 > DevOps > 프로젝트
프로젝트 생성을 클릭하여 아래와 같이 새 DevOps 프로젝트를 생성합니다

프로젝트 이름 정보
프로젝트 이름은 테넌시에서 고유하므로 이름이 중복되어서는 안 됩니다.

빌드 및 배치 파이프라인을 실행하려면 로깅이 필요하므로, 로그 사용을 클릭합니다.

로그 상태가 활성화되었는지 확인합니다.

4. 인증 토큰 생성

OCI DevOps의 Git 리포지토리의 인증에 이용하는 인증 토큰을 취득합니다.
오른쪽 상단의 프로필 아이콘을 클릭하고 내 프로파일을 선택합니다.
ID > 내 프로파일 > 인증 토큰

설명을 작성한 후, 토큰을 생성합니다.

생성된 토큰을 복사하여 메모장 등에 붙여넣습니다.

본 실습

5. Compute 인스턴스 환경 구축

여기에서는 샘플 응용 프로그램을 실행하는 Compute 인스턴스를 만듭니다.

5.1 인스턴스 생성

컴퓨트 > 인스턴스

#!/bin/bash
sudo setenforce permissive
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload

이외의 옵션값은 모두 기본값으로 설정한 뒤 인스턴스를 생성한다.

생성된 인스턴스의 퍼블릭 IP 주소를 메모장 등에 기록해놓습니다.

5.2 네트워크 구성

외부에서 샘플 응용 프로그램에 액세스하기위한 VCN의 보안 목록을 설정합니다.

이전 인스턴스 생성과 동시에 생성된 VCN을 클릭후, 표시된 서브넷도 클릭합니다.

연결되어 있는 보안 목록에 수신 규칙을 추가합니다.

6. OCI DevOps 환경 구축

6.1. 샘플 애플리케이션 및 관련 자료 다운로드

Cloud Shell을 시작하고 다음 명령을 실행합니다.

wget https://orasejapan.objectstorage.ap-tokyo-1.oci.customer-oci.com/n/orasejapan/b/oci-devops-handson/o/compute%2Foci-devops-compute.zip
unzip compute_oci-devops-compute.zip

6.2. 정책 설정

여기에서는 2번에서 설정했던 정책에 추가로 필요한 정책을 설정합니다.

6.2.1 OCI DevOps에서 사용하는 동적 그룹

본 핸즈온에서 이용하기 위해 추가로 필요한 동적 그룹을 작성합니다.
이번에 설정할 동적 그룹은 다음과 같습니다.

동적 그룹규칙설명
OCI_DevOps_Dynamic_Group_Computeinstance.compartment.id = ‘컴파트먼트 OCID’구획의 모든 인스턴스를 포함하는 동적 그룹

본 핸즈온에서의 동적 그룹에 대하여
이번에는 간편하게 핸즈온을 실시하기 위해 컴파트먼트 내의 모든 리소스와 인스턴스를 동적 그룹으로 포함하는 설정을 실시하고 있습니다.
본래는 각 서비스의 타입을 지정해 동적 그룹을 만들게 됩니다.

6.2.2 OCI DevOps에서 사용하는 정책

본 핸즈온에서 이용하기 위해 추가로 필요한 정책을 작성합니다.

정책은 다음과 같습니다.

정책설명
Allow dynamic-group OCI_DevOps_Dynamic_Group_Compute to use instance-agent-command-execution-family in compartment id 컴파트먼트 OCID대상 Compute에 대한 명령 실행을 허용하는 정책
Allow dynamic-group OCI_DevOps_Dynamic_Group_Compute to manage instance-agent-command-family in compartment id 컴파트먼트 OCID대상 Compute에 대한 명령 실행을 허용하는 정책
Allow dynamic-group OCI_DevOps_Dynamic_Group_Compute to read instance-family in compartment id 컴파트먼트 OCIDCompute에 대한 참조를 허용하는 정책
6.2.3 정책 설정

여기서는 2번에서 설정한 정책에 이번 핸즈온에 필요한 정책을 추가합니다.
Cloud Shell을 시작하고 다음 명령을 실행합니다.

chmod +x devops-template-for-compute/prepare/prepare.sh
./devops-template-for-compute/prepare/prepare.sh

6.3 DevOps 설정

6.3.1 환경 등록

3번에서 생성한 DevOps 프로젝트를 클릭하고 환경 생성을 합니다.

인스턴스 그룹을 만들고, 인스턴스 추가를 선택하여 5.1에서 생성한 인스턴스를 넣어줍니다.

6.3.2 Git 리포지토리 생성

OCI DevOps의 코드 리포지토리는 OCI DevOps에 자체 개인 코드 리포지토리를 만듭니다.

생성한 DevOps 프로젝트를 클릭하고 코드 저장소를 생성합니다.

저장소를 생성한 후, 복제를 클릭하여 CloudShell을 통해 oci-devops-handson 리포지토리를 가져옵니다.

6.3.3. 샘플 애플리케이션 푸시

샘플 애플리케이션을 방금 만든 Git 저장소로 푸시합니다.

ls
oci-devops-handson  oci-devops-compute  compute%2Foci-devops-compute.zip

위에서 가져온 oci-devops-handson 디렉토리(혹은 생성한 코드 리포지토리名)가 있는지 확인합니다.

cp -R oci-devops-compute/* ./oci-devops-handson
cd ./oci-devops-handson

6.1에서 다운로드한 샘플 코드를 oci-devops-handson 디렉토리에 복사합니다.

git config --global user.email "<user_email>"
git config --global user.name "<user_name>"
git add -A .
git commit -m "first commit"
git branch -M main
git push -u origin main

파일을 커밋한 후에 main 브랜치로 푸시합니다.

코드 저장소에 들어가면 파일이 잘 푸시된 것을 확인할 수 있습니다.

6.3.4 아티팩트 레지스트리 작성 및 배치 구성 파일 등록

OCI DevOps에서 Compute에 배포 할 때 사용할 배포 구성 파일을 아티팩트 레지스트리에 등록합니다.
이 등록된 구성 파일을 사용하여 OCI DevOps에서 자동으로 Compute에 배포할 수 있습니다.
개발자 서비스 > 아티팩트 레지스트리

저장소 생성을 클릭하기 위와 같이 아티팩트 레지스트리를 생성합니다.
불변 아티팩트를 체크 해제합니다.

아티팩트 경로, 버전, 업로드 메소드를 위와 같이 설정한 뒤, ./<file-name>을 deploy_spec.yaml가 존재하는 경로로 변경한 뒤 Cloud Shell에 입력합니다.

이것으로 아티팩트 레지스트리 작성 및 배치 구성 파일 등록을 완료하였습니다.

6.3.5 아티팩트 레지스트리 등록

OCI DevOps에서 설정한 OCIR 및 아티팩트 레지스트리를 사용할 수 있도록 설정합니다.
개발자메뉴 > DevOps > 프로젝트

자신의 프로젝트를 클릭하고 아티팩트를 선택합니다.

아티팩트 추가를 클릭하여 위와 같이 설정합니다.
아티팩트 레지스트리 저장소와 아티팩트는 옆의 선택 버튼을 클릭해, 이전에 이미 만들어 두었던 저장소와 아티팩트를 각각 선택합니다.

아티팩트 추가 버튼을 눌러 아티팩트를 하나 더 생성합니다.

devops-demo-app-jar 아티팩트를 마지막으로 아티팩트 레지스트리 등록이 완료하였습니다.

7. CI/CD 파이프라인 구축

7.1 CI 파이프라인 구축

OCI DevOps에서 사용하는 가상 머신에서 코드 리포지토리에서 소스를 다운로드하여 Maven 빌드, 아티팩트 리포지토리에 Jar 파일을 저장하는 일련의 흐름을 빌드 파이프라인으로 만듭니다.
먼저 컨테이너 이미지 빌드를 수행하는 “관리 빌드”단계를 만듭니다.

생성한 프로젝트를 선택 후. 빌드 파이프라인을 클릭합니다.

위와 같이 빌드 파이프라인을 생성합니다.

단계 추가를 클릭한 뒤, 관리형 빌드를 선택하고 다음으로 넘어갑니다.

스테이지 이름과 빌드 실행기 구성을 선택하고(본 실습에서는 기본 구성으로 진행) 기본 코드 저장소에서 선택 버튼을 클릭하여 이전에 생성해두었던 oci-devops-handson OCI 코드 저장소를 선택합니다.

그런 다음 빌드된 Jar 파일을 아티팩트 저장소에 저장하는 아티팩트 전달 단계를 작성합니다.
더하기 부분을 클릭하고 단계 추가를 선택합니다.

아티팩트 전달을 선택한 뒤, 스테이지 이름을 작성하고 기존에 만들었던 아티팩트를 선택합니다.

빌드 구성/결과 아티팩트 이름으로 handson_jar을 기입하고 단계를 추가해줍니다.

이것으로 CI 파이프라인 구축을 완료하였습니다.

7.2 CD 파이프라인 구축

여기서는 Compute 인스턴스에 아티팩트 리포지토리에 저장된 Jar 파일을 배포하는 배포 파이프라인을 구축합니다.

배치 파이프라인을 클릭하고 파이프 라인을 생성합니다.

단계를 추가합니다.

위와 같은 옵션으로 스테이지를 추가하면 CD 파이프라인 구축이 완료됩니다.

7.3 CI 파이프라인과 CD 파이프라인 연결

여기에서는 CI 파이프라인에서 CD 파이프라인을 킥하는 설정을 추가하고 CI/CD 파이프라인을 연결해 갑니다.

생성해놓은 빌드 파이프라인을 클릭하고 단계를 추가해줍니다.

배치 파이프라인을 클릭하여 이전에 생성했던 파이프라인을 선택합니다.

이것으로 CI 파이프라인과 CD 파이프라인 연결이 완료됩니다.

7.4 트리거 생성

여기에서는 OCI DevOps의 Git 저장소에 대한 변경을 트리거로 하여 CI 파이프라인을 시작하도록 설정합니다.

이전 생성한 DevOps 프로젝트를 클릭합니다.

트리거 생성을 클릭하고 이름과 소스 접속 방식을 지정합니다.

코드 저장소는 선택 버튼을 클릭하여 앞서 생성한 oci-devops-handson 저장소를 선택합니다.

작업 추가 버튼을 클릭하여 앞서 생성한 빌드 파이프라인을 선택한 뒤, 이벤트 옵션에서 푸시를 선택합니다.

이것으로 트리거 생성을 완료했습니다.

8. 파이프라인 실행

이전 단계까지 애플리케이션 코드에 대한 변경이 코드 리포지토리 업데이트(git push)를 트리거로 하여 자동으로 Compute에 배포하는 CI/CD 파이프라인을 구축할 수 있었으므로 동작 확인을 합니다.

cd oci-devops-handson
cp src/main/resources/static/images/header_new.jpg src/main/resources/static/images/header.jpg 

Cloud Shell을 시작해서 먼저 응용 프로그램 코드를 변경합니다. 이번에는 응용 프로그램에서 사용하는 헤더 이미지를 변경합니다.

git add .
git commit -m "Changing the image"
git push

위와 같이 git push로 트리거된 로그가 표시됩니다.

배포가 완료되면 Compute의 공용 IP에 브라우저에서 액세스합니다.
이번 샘플 어플리케이션은 8080포트로 서비스 되고 있기 때문에 아래와 같은 URL을 브라우저에 입력하여 확인할 수 있습니다.
http://192.123.xxx.xxx:8080

다음과 같이 애플리케이션이 표시됩니다.

이런 식으로 코드 리포지토리 변경을 트리거에 자동으로 응용 프로그램을 빌드하고 Compute에 배포하는 파이프 라인을 만들 수 있었습니다.

3. 결론

이번 핸즈온으로 OCI DevOps 서비스를 통해 CI/CD 환경을 구축하여 소스 코드 변경이 Compute의 샘플 애플리케이션에 자동으로 반영되는지 확인할 수 있었습니다. OCI DevOps 서비스는 개발팀의 생산성과 애플리케이션 품질을 높이는 데 도움이 될 수 있는 통합 솔루션입니다.

소스 코드 관리, 빌드, 테스트, 배포 등 SDLC 전 과정을 자동화하고 확장성 및 보안성을 확보할 수 있습니다. 이 서비스를 활용하면 개발 프로세스를 효율적으로 관리할 수 있을 것입니다. 또한 OCI 서비스와의 연계를 통해 컨테이너 기반 배포, 마이크로 서비스 아키텍처 등 클라우드 네이티브 애플리케이션 개발에 활용할 수 있습니다.

4. 참고 문서

  • https://www.oracle.com/kr/devops/devops-service/
  • https://oracle-japan.github.io/ocitutorials/cloud-native/devops-for-commons/
  • https://oracle-japan.github.io/ocitutorials/cloud-native/devops-for-beginners-compute/
  • https://docs.oracle.com/ko/solutions/ci-cd-pipe-oci-devops/index.html#GUID-A70082F0-DFB8-43F2-8189-60B11BA258E1

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다