조직에서 개발자 팀과 함께 Go 프로그래밍 언어를 사용하여 애플리케이션을 개발하고 있다고 가정해 보겠습니다. 모범 사례에 따르면 적절한 테스트를 생성하고 지속적인 통합 및 배포 전략을 개발해야 합니다.

제 튜토리얼을 꾸준히 따라가셨다면, 제가 작성한 글에서 Node.js 및 Jenkins를 사용한 연속 배포 파이프라인. 이번에는 개발 기술과 CI/CD 서비스로 변화를 시도합니다.

다음과 상호 작용하는 Golang 애플리케이션을 지속적으로 배포하는 방법을 살펴보겠습니다. 카우치베이스 인기 있는 트래비스 CI 서비스.

이 튜토리얼의 목표는 Couchbase와 통신하는 Golang 애플리케이션을 만드는 데 도움을 주는 것입니다. 이 애플리케이션에는 Travis CI가 트리거될 때 사용되는 적절한 단위 테스트가 있습니다. Travis CI에서 테스트가 성공하면 애플리케이션은 SSH를 사용하여 원격 서버에 자동으로 배포됩니다.

전제 조건으로, 사용 가능한 Couchbase Server 인스턴스가 하나 이상 있어야 합니다. 이 Couchbase Server 인스턴스는 배포 중에 사용됩니다.

Go와 Couchbase NoSQL로 애플리케이션 개발하기

이 예제를 위해 새로운 Golang 프로젝트를 만들겠습니다. 프로젝트의 어딘가에 $GOPATH 라는 파일을 만듭니다. main.go 를 클릭하고 다음을 포함합니다:

위의 코드는 간단하지만 이 튜토리얼을 진행하면서 크게 변경될 것입니다. 지금은 이 코드가 어떤 기능을 하는지 알아봅시다.

Couchbase를 사용하기 때문에 Go SDK를 구해야 합니다. 다음을 실행하여 설치할 수 있습니다:

Go SDK를 설치하면 프로젝트 가져오기에 추가할 수 있습니다.

이 프로젝트에는 매우 간단한 두 가지 함수가 있습니다. 문서를 검색하는 함수와 문서를 만드는 함수가 있습니다. 각 문서에는 사람 모델에 정의된 대로 구조체.

애플리케이션이 시작되면 환경 변수에 지정된 대로 Couchbase 클러스터에 연결됩니다. 마찬가지로 RBAC 계정이 인증되고 버킷이 열립니다.

데이터베이스가 준비되면 먼저 ID를 기반으로 한 문서를 가져옵니다:

문서가 존재한다고 가정하면 문서가 반환됩니다. 문서가 검색된 후에는 데이터베이스에 새 문서를 삽입합니다.

이제 왜 이런 함수를 만드는지 궁금하실 것입니다. 저희는 실제 SDK를 사용하는 것 외에 특별한 작업을 하고 있지 않습니다.

이러한 함수에 대해 상상력을 발휘해 보세요. 이 함수에 대한 테스트 케이스를 작성할 것이므로 복잡한 함수라고 가정해 보세요. 이 예제에서는 이해하기 쉽도록 단순하게 만들었습니다.

모의 데이터로 단위 테스트 설계하기

프로젝트의 기초가 마련되었으므로 애플리케이션에 대한 테스트 케이스 작성에 대해 생각해 볼 수 있습니다. 테스트 작성을 시작하기 전에, 애플리케이션의 main.go 파일을 생성했습니다.

열기 main.go 파일을 열고 다음을 포함하세요:

위의 코드에 약간의 변경 사항이 있음을 알 수 있습니다.

데이터베이스와 상호 작용하는 함수에 대한 테스트를 작성할 때 실제 데이터베이스를 대상으로 테스트하는 것은 좋은 생각이 아닐 수 있습니다. 대신 모의 데이터를 사용하는 것이 좋습니다. 하지만 너무 많은 단계를 거치지 않고 테스트를 작성하고 싶을 것입니다.

쉽게 테스트하기 위해 Couchbase 버킷을 나타내는 인터페이스를 만들 수 있습니다. 메인 코드에서는 실제 버킷을 사용하고 테스트 코드에서는 모의 버킷을 사용하겠습니다.

이 예제에서는 버킷의 인터페이스에 가능한 많은 SDK 기능 중 두 가지 기능만 포함되어 있습니다. 이 인터페이스는 실제 SDK에서 볼 수 있는 것과 일치합니다.

우리가 만든 두 가지 기능은 이제 데이터베이스 클래스.

만들기 main_test.go 파일을 열고 다음 코드가 포함되어 있는지 확인합니다:

위의 코드가 바로 우리 프로젝트에서 마법의 힘을 발휘하는 부분입니다. 부모 파일의 코드와 사용자 정의 테스트 코드를 혼합하여 사용합니다.

다음을 예로 들어 보겠습니다:

테스트할 때는 실제 Couchbase 버킷으로 작업하지 않을 것이므로 자체 더미를 만들어야 합니다. 구조체. 우리는 데이터베이스 데이터 구조를 사용하며, 상위 파일에서 버킷 인터페이스.

테스트가 시작되면 더미 버킷을 만들 수 있습니다:

이제 모의 버킷에는 실제 버킷과 같은 함수가 없으므로 인터페이스에 정의된 대로 함수를 만들어야 합니다. 다시 말해 삽입Get 함수입니다.

부터 시작하여 삽입 함수입니다:

테스트는 간단합니다. 키가 다음과 같은 문서를 제외한 모든 문서를 삽입해 보겠습니다. nraboy. 키에 따라 테스트가 성공하거나 실패합니다.

그리고 Get 함수도 비슷한 방식으로 작동합니다.

문서를 받으려고 할 때 다음과 같은 키가 필요합니다. nraboy. 올바른 키가 제공된 경우, 마샬링된 일부 데이터를 반환합니다. 변환 함수를 반환하고, 그렇지 않으면 오류를 반환합니다.

다시 말하지만, 이것은 버킷 작업을 위해 Go SDK에서 찾을 수 있는 모의 버전입니다. 인터페이스 함수가 생성되었으므로 두 개의 테스트 함수를 작성할 수 있습니다.

그리고 TestGetPersonDocument테스트 데이터베이스 변수를 사용하여 모의 버킷을 사용합니다. 그러나 이 버킷은 GetPersonDocument 에서 main.go 파일에 저장합니다. 부모 함수는 훨씬 더 복잡할 수 있지만 데이터베이스는 이제 모의 함수라는 점을 기억하세요.

함수 결과가 디코딩되면 사람 데이터 구조를 사용하여 지도 구조 패키지를 사용하세요. 맵구조 패키지 사용에 대한 자세한 내용은 다음에서 확인할 수 있습니다. 여기.

그리고 TestCreatePersonDocument 함수도 동일한 전략을 따릅니다. 우리는 모의 버킷을 사용하고 있지만 실제 사람 문서 만들기 함수입니다. 기능 삽입 는 테스트에서 생성한 내용을 사용합니다.

데이터베이스 상호 작용이 포함된 Golang 애플리케이션을 테스트하는 데는 그리 많은 것이 필요하지 않습니다. 가장 좋은 방법은 인터페이스를 만들고 함수와 데이터의 사용자 지정 모의 버전을 사용하는 것입니다.

트래비스 CI를 위한 YAML 구성 만들기

이제 몇 가지 단위 테스트가 포함된 Go 애플리케이션이 있습니다. 이제 Travis CI를 사용하여 애플리케이션을 자동으로 테스트하고 성공하면 배포할 수 있어야 합니다.

트래비스 CI는 YAML 구성 파일에서 작동합니다. 다음 구성을 예로 들어 보겠습니다:

위의 구성에서는 Go 1.8을 사용하고 있습니다. 스크립트 실행을 시작하기 전에 필요한 패키지를 다운로드해야 합니다. 필요한 패키지는 다음과 같습니다. sshpass 를 사용하여 일반 텍스트 비밀번호로 SSH를 할 수 있습니다. 결국에는 키를 사용하고 싶겠지만 이 예제에서는 키를 사용해도 괜찮습니다.

이후 sshpass 가 다운로드되었으면 테스트를 실행해야 합니다. 이 작업은 스크립트 섹션으로 이동합니다. 첫 번째 스크립트가 완료되면 프로젝트를 빌드할 수 있습니다.

두 스크립트가 모두 성공적으로 완료되었다고 가정하면 이제 배포에 집중하겠습니다.

배포를 위해 두 개의 다른 명령이 실행됩니다. 첫 번째 명령은 바이너리를 원격 서버로 복사하고 두 번째 명령은 원격 서버에서 해당 파일을 실행합니다.

두 배포 명령 모두 나중에 서버로 전달되는 CI/CD 프로세스의 환경 변수를 참조합니다.

이제 환경 변수를 설정하지 않은 것을 알 수 있습니다. 이러한 변수는 민감하므로 Git 리포지토리 내에서 일반 텍스트로 설정해서는 안 됩니다. 대신 트래비스 CI에 시크릿을 사용할 수 있습니다.

다운로드 travis CLI 도구를 설치합니다. 도구가 설치된 상태에서 다음을 실행합니다:

모든 정보를 YAML 파일에 일반 텍스트로 추가하는 대신 암호화하여 트래비스 CI가 이해할 수 있도록 합니다. 추가되는 YAML 구성은 다음과 같습니다:

이 키는 Git 리포지토리에 보관하고 안전하다고 느낄 수 있습니다. 더 안전한 방법은 SSH에 공개 키와 개인 키를 사용하는 것이지만, 이 예제에서는 이 방법도 괜찮습니다.

프로젝트를 푸시할 때 트래비스 CI 계정에 프로젝트를 연결했다고 가정하면 애플리케이션이 자동으로 테스트 및 배포됩니다.

지속적 배포를 통한 NoSQL의 중요성

모의 데이터를 데이터베이스로 사용하는 테스트를 만드는 방법을 살펴봤습니다. 하지만 정말 편리한 점은 데이터가 변경될 때 업그레이드 스크립트를 만들 필요가 없다는 것입니다. 관계형 데이터베이스에서는 테이블에 대한 변경 스크립트를 만들어야 합니다. Couchbase에서는 데이터 모델을 변경해야 하는 경우, 그냥 구조체 에 대한 사람 를 코드에 추가합니다.

결론

방금 Travis CI를 사용하여 Golang 프로젝트를 지속적으로 배포하는 방법을 살펴보셨습니다. 카우치베이스 NoSQL 데이터베이스. 지속적 통합 단계에서는 모의 데이터를 사용하여 애플리케이션을 테스트합니다. 테스트가 통과되고 프로젝트가 빌드되면 원격 서버로 푸시되어 실행됩니다.

이 튜토리얼에 사용된 예제는 다음에서 찾을 수 있습니다. GitHub. 프로젝트가 푸시되는 원격 서버가 제거되었다는 점에 유의하세요.

Couchbase를 사용한 Go에 대해 더 자세히 알아보시려면 카우치베이스 개발자 포털.

작성자

게시자 Nic Raboy, 개발자 옹호자, Couchbase

닉 라보이는 최신 웹 및 모바일 개발 기술을 옹호하는 사람입니다. 그는 Java, JavaScript, Golang 및 Angular, NativeScript, Apache Cordova와 같은 다양한 프레임워크에 대한 경험이 있습니다. Nic은 웹 및 모바일 개발을 보다 쉽게 이해할 수 있도록 자신의 개발 경험에 대해 글을 쓰고 있습니다.

댓글 남기기