각 환경에있는 코드 버전을 어떻게 추적 할 수 있습니까?


14

우리 팀은 현재 다음과 같은 상당히 간단한 분기 / 배치 프로세스를 사용합니다.

                ┌────────┐ ┌────┐ ┌──────┐
 Environments:  │  DEV   │ │ QA │ │ PROD │
                └────────┘ └────┘ └──────┘

                     ▲       ▲       ▲
                     │       │       │

                ┌────────┐ ┌────┐ ┌──────┐
 Builds:        │  DEV   │ │ QA │ │ PROD │
                └────────┘ └────┘ └──────┘

                     ▲       ▲       ▲
                     │       │       │

                ┌────────┐ ┌────┐ ┌──────┐
 Branches:      │ master │ │ qa │ │ prod │
                └────────┘ └────┘ └──────┘

각 환경에는 자체 분기 ( git 사용 )와 해당 분기를 사용하는 자체 빌드가 있습니다. 한 환경에서 다른 환경으로 (예 : DEV에서 QA로) 홍보하려는 경우 master지점을 병합하고 qa새 QA 빌드 (QA 환경에 자동으로 배포)를 시작합니다.

우리는 전용 브랜치를 가지지 않고 각 환경에 맞게 구축하는 새로운 프로세스로의 전환을 고려하고 있습니다. 대신, 단일 릴리스 빌드는 "배포 패키지"를 생성 한 다음 모든 환경에 배포 할 수 있습니다. 우리는 일반적인 워크 플로가 다음과 같이 보일 것이라고 상상하고 있습니다.

                ┌────────┐     ┌────┐     ┌──────┐
 Environments:  │  DEV   │ ──► │ QA │ ──► │ PROD │
                └────────┘     └────┘     └──────┘

                      ▲ 
                       \ 

                        ┌───────────────┐
 Builds:                │ release build │
                        └───────────────┘

                                ▲
                                │

                ┌────────┐ ┌─────────┐
 Branches:      │ master │ │ release │
                └────────┘ └─────────┘

한 환경에서 다른 환경으로의 승격은 더 이상 소스 제어에서 처리되지 않습니다. 오히려 이미 구축 된 바이너리 ( "배포 패키지")를 가져 와서 새로운 환경에 드롭합니다.

이 새로운 시스템을 사용하면 모든 환경에 빌드를 배포 할 수 있으며 몇 가지 장점이 있습니다. 예를 들어, DEV 및 QA에서 PROD 버그 수정을 테스트하는 것은 쉽지 않습니다. 현재 시스템은 브랜치를 롤백하지 않고 쉽게 할 수있는 방법을 제공하지 않습니다. 우리는 분명히 피하고 싶습니다.

이 새로운 시스템의 가장 큰 단점은 더 이상 어떤 환경에 어떤 코드가 있는지 추적하는 자동 방법이 없다는 것입니다. PROD에서 수정해야 할 경우 더 이상 현재 프로덕션 코드베이스와 동기화되는 전용 분기가 없습니다. QA도 마찬가지입니다. 진행중인 작업을 방해하지 않고 QA로 빠른 변경 사항을 적용하려는 경우 master더 이상 QA 환경의 현재 상태를 반영하는 지점이 없습니다.

각 환경에 어떤 코드가 있는지 어떻게 추적 할 수 있습니까?

고려중인 몇 가지 옵션 :

  • 어떤 커밋이 어떤 환경에 있는지 추적하기 위해 git 태그 를 사용
  • 빌드에서 사용하는 git commit을 각 배포 패키지에 포함

Hudson 또는 Jenkins와 같은 CI 시스템이 있습니까? 빌드 된 태그를 git에 푸시 할 수 있습니까? (허드슨과 젠킨스 용 플러그인이 있다는 것을 알고 있습니다 ... 다른 사람들에 대해서는 확실하지 않습니다).

@MichaelT 우리는 빌드에 MSBuild를, 배포 에는 Octopus Deploy 를 사용합니다. Octopus가 사용자 정의 Powershell 배포 스크립트를 사용하여 git 저장소를 조작 할 수 있다고 확신합니다.
Nathan Friend

답변:


14

Git 태그는 릴리즈를 지정하기 위해 실제로 사용하려는 것입니다. 그 이유는 그것들이 당신에게 의미가 있으며 상태 배포 코드와 빌드 서버가 가질 수있는 정보 (빌드 번호와 같은) 사이의 연결을 신속하게 인식하는 데 사용될 수 있기 때문입니다.

그것이 당신이 찾고있는 대답이지만 문제의 절반 만 해결합니다. 다른 하나는 "이봐, 여기 .[wje]ar서버에 배포 된 것인데 어떤 빌드에서 나온 것입니까?" 우리는 개발자와 qa 또는 prod에 다른 버전의 응용 프로그램을 배포하지 않을 것임을 알고 있습니다. 권리?

질문의 해당 부분에 대한 해결책은 빌드 서버가 정보를 매니페스트에 넣도록하는 것입니다. 내가 앞에있는 maven과 svn 예제에서 나온 것 :

<manifestEntries>
    <Specification-Title>${project.name}</Specification-Title>
    <Specification-Version>${project.version}</Specification-Version>
    <Build-Number>${build.number}</Build-Number>
    <Build-Id>${build.id}</Build-Id>
    <Svn-Revison>${svn.revision}</Svn-Revison>
</manifestEntries>

그것은 maven-war-plugin 아카이브 구성에 있습니다. 그러나 다른 플러그인에서도 찾을 수 있습니다. 그런 다음 허드슨에서 maven 빌드 호출의 일부는 다음과 같습니다.

-Dbuild.number=${BUILD_NUMBER}
-Dsvn.revision=${SVN_REVISION}
-Dbuild.id=${BUILD_ID}

이것은 maven이 픽업하는 정의를 설정합니다. 그런 다음 서버에 배포 된 MANIFEST.MF 파일을보고 어떤 버전인지 확인하면됩니다.

있다 자식 플러그인 , 제공하는 등 환경 변수 값의 유사한 세트 :

  • GIT_COMMIT -현재의 SHA
  • GIT_BRANCH -원격 저장소 이름 (기본값은 origin)이며 현재 사용중인 분기 이름 (예 : "origin / master"또는 "origin / foo")

이 두 가지 방법을 조합하면 빌드 번호를 쉽게 확인할 수 있으며 (빌드 번호는 계속 진행되고 sha 체크섬과 달리 의미가 있기 때문에) 빌드 된 특정 git commit을 쉽게 식별 할 수 있습니다.


3

완전히 다른 접근법은 versions완전히 아이디어를 무시하는 것입니다 . 다른 구성 가능한 동작을 가진 "하나의 버전"만 있습니다. 유일한 차이점은 공통 코드베이스가 있다는 것입니다. 프로덕션 환경에서도 진행중인 작업을 배포 할 수 있습니다. 하지만 활성화되지는 않습니다.

차이점은 제품에서 사용 가능한 여러 기능 세트로 요약됩니다.

비활성화 / 활성화는 기능 토글을 통해 수행됩니다. .

거꾸로 : 전체 릴리스 프로세스가 간소화됩니다. 항상 통합 버전의 소프트웨어를 제공하고 있습니다. 모든 기능은 항상master . 추가 분기가 필요하지 않습니다.

병합 할 필요가없는 브랜치가 없기 때문에 병합 기능에 어려움이 없습니다. 어떤 브랜치에 어떤 기능이 있는지 혼동되지 않으며 다른 브랜치의 기능에 의존하거나 충돌 할 수 있습니다. 모든 부분은 마음대로 활성화 될 수 있습니다. 롤백 조차 더 이상 필요하지 않습니다. 스위치의 전환 일뿐 입니다.

나는 그것이 코드베이스에 효과가 있는지 모른다 : 코드 품질 및 개발자 규율 측면에서 전제 조건이 상당히 높다- 기능핵심 기능 이 된 후 "정리" 를 처리해야 하며 많은 토글관리 해야합니다. 더 큰 혼란을 방지 .

아마도 그것은 당신을 위해 작동합니다.


그러나 다른 저장소 상태를 다른 서버에 배포하는 것은 어떻습니까? QA 박스에서 실행되는 코드가 버그를 재현 할 수 있도록 프로덕션에서 실행되는 코드와 동일합니까? 개발자가 개발자 상자에 푸시 한 코드가 QA가 실행되는 코드와 동일합니까?

1
질문은 다르게 요청해야합니다. 특별한 구성의 재현 가능한 "지금"버그가 있다면, 고칠 수 있습니다. 그렇지 않다면-버그가 중요합니까? 항상 작업 (및 통합 코드)을 추진합니다.
토마스 정크

-1

우리는 maven을 사용하여 매니페스트 파일에 버전을 넣습니다. 그런 다음 응용 프로그램에 웹 응용 프로그램 인 경우 버전을 표시하거나 웹 서비스에 대한 / version 엔드 포인트가 있어야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.