Java 버전 관리 전략


Java 버전 관리 전략
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
버전 관리 시스템을 구현하기위한 좋은 전략.
나는 잠시 동안 버전 관리 소프트웨어로 고심하고있다. 나는 명명 규칙에 대해 이야기하는 것이 아니라, 빌드 시스템에서 버전을 실제로 적용하는 방법에 대해 이야기하고 있습니다.
일반적으로 major. minor. maintenance - [출시 유형] 즉 1.0.2-rc1을 사용합니다.
문제는 버전 번호를 관리하는 것입니다. 나는 여러 가지 방법 (빌드 파일, 속성 파일, 데이터베이스 등)에 붙어 있지만 정말 잘 작동 아무것도 찾지 못했습니다.
나는 누군가가 이것에 대해 좋은 아이디어를 가지고 있는지 궁금해. 또한 사람들이 어떻게 버전을 공개하는지 궁금해합니다. 즉 버전 1.0.0-rc1을 릴리스 / 배포하면이 릴리스에서 발견 된 버그가 1.0.0 (다음 / 프로덕션 릴리스)에 기록됩니다.
Microsoft는 & lt; major & gt; & lt; minor & gt;를 사용합니다. & lt; patch & gt; - & lt; 빌드 번호 & gt; (또는 변형).
& lt; major & gt; & lt; minor & gt; & lt; buildnumber & gt;를 사용하는 것이 좋습니다.
제가 일하는 곳에서 우리는 Maven 시스템을 사용합니다 : 순간 알림 (SNAPSHOT)에서 변경되는 "진행중인"버전과 정식으로 출시 된 버전을 개발할 수있게 해주는 artifact [-major-minor-revision] [- SNAPSHOT] . 몇 가지 예는 다음과 같습니다.
-services-1.0.0-SNAPSHOT. jar - web-2.3.11.war crm-2.5.0.ear.
SNAPSHOT이 있으면 SNAPSHOT이 전체 테스트 세트를 통과하지 못했거나 개발자 테스트 일뿐입니다. SNAPSHOT이 없다면 릴리스 후보자입니다. 우리는 배포 후보자의 저장소를 유지하고 가장 최근의 배포자는 테스터가 만족하면 배포를 위해 보내집니다.
이 모든 것은 Maven 아래의 빌드 파일에있는 몇 가지 간단한 항목으로 관리 할 수 ​​있습니다. Maven2 튜토리얼을 참조하십시오.
이것은 아마도 지금은 죽은 게시물이지만, 어쨌든 나는 두 센트를 추가 할 것입니다. 저는 빌드 번호가 그것을 보는 모든 사람들에게 의미가 있어야한다는 의견입니다. 그래서 개인적으로 이것은 버전 이름을 지정하는 좋은 방법이라고 생각합니다.
major. minor. patch. revision - 예 1.1.4.2342.
주 / 부 번호는 매우 자명합니다. 그러나 세 번째 숫자의 관점에서 볼 때 여전히 고객에게 무엇인가를 의미해야합니다. 이 새로운 버전을 고객에게 선보였습니다. 그러나 고객에게 몇 가지 버그를 수정 했으므로 새 부 번호로는 가치가 없습니다. 그래서 우리는 패치 번호를 증가 시켰습니다.
네 번째 숫자는 대개 고객에게 절대적으로 의미가 없기 때문에 귀하와 귀하의 회사에서 그것을 보는 다른 사람들에게 유용 할 수 있습니다. 그래서 우리는 그 숫자가 SVN 개정 번호입니다. 어떤 버전이 해당 버전을 담당했는지 정확하게 알려주므로 언제든지 다시 만들 수 있습니다. 분기 코드는 분명히 이것을 달성하지만 100 % 확신 할 수는 없습니다.
또한 모든 숫자로 된 버전 번호의 또 다른 장점은 거의 모든 연속 빌드 시스템에 쉽게 통합된다는 것입니다.
어쨌든 그건 내 두 센트 야.
Jira / Bamboo 솔루션의 +1. 태깅 (Tagging) 작업이 원하는 것의 80 %이지만, (필자의 목적에 따라) 빌드에 대한 유일한 추가 정보는 Subversion Release이다.
릴리즈 / 버전 정보를 수동으로 유지하는 것은 고질적 인 고통입니다. JIRA가 구동하도록하는 것은 좋은 생각입니다.
마지막 질문에서 버그 / 결함이 기록되고 버전을 릴리스하는 위치 :
Defect / Issue는 나타나는 릴리스에 대해 기록됩니다. 1.0.0-rc1의 결함은 1.0.0-rc1에 대해 기록됩니다. JIRA는 계획된 릴리즈 (이 경우 1.0.0)를 갖는 'Fix-For'필드를 가지고 있습니다 (또는 아마도 추가했습니다). 결함 / 문제가 충분히 심각하면 다른 'rc'릴리즈를 추가해야 할 수도 있습니다. 릴리스는 중대한 치명적인 결함 / 문제가없고 고객 (또는 경영진)이 나머지 문제가 지연 될 수 있다는 데 동의하는 경우에 릴리스됩니다.
JIRA를 통해 이것을 관리하는 것의 장점은 릴리스 추가, 변경 로그 생성 등이 상당히 자동화되어 있다는 것입니다.
& lt; major & gt; & lt; minor & gt;를 사용합니다. & lt; buildnumber & gt; 빌드 서버에서 CruiseControl / ()을 사용하여이 작업을 관리합니다. 그리고 메이저 마이너 번호를 관리하기 위해 Wix 및 CruiseControl Config를 사용하십시오 - 여전히 수동으로 증가시킵니다. 그러나 빌드 번호는 빌드 서버에서 자동으로 발생합니다. 규칙을 설정하여 메이저 / 마이너를 자동으로 증가시킬 수도 있습니다. 우리는 수동으로 그렇게하고 싶기 때문에 특정 릴리스 레벨의 이름을 지정할 시간이되면 dev가 생각을 바꿉니다.
메이저 (Major)와 마이너 (Minor)는 수동으로 증가시켜 수동으로 설정합니다.
BuildDateNumber는 프로젝트 시작 이후 100에 현재 월의 일 수를 더한 월 수입니다.
DailyBuildNumber는 매일 0 시부 터 자정 이후 모든 빌드에 대해 증가합니다.
예 : 그 프로젝트가 1 월 1 일 시작한 7 월 10 일 릴리스 5.2의 4 번째 빌드에는 버전 번호가 있습니다.
이것은 모두 Nant의 Version 태스크에 의해 계산됩니다.
이렇게하면 버전 번호가 고유하게 유지되고 설치가 완료된시기를 신속하게 계산할 수 있습니다.

카일 리버.
내가 쓰는 기분이 들었던 것들.
Maven 버전 관리 전략.
Maven을 사용하여 소프트웨어를 버전 화하는 방법에 대해 내 조직의 분석가와 많은 논의를 해오 고 있으며 SNAPSHOT이 실제로 무엇을 의미하는지에 대한 일반적인 오해가 있음을 확인했습니다. Maven에서 버전 관리를 설명하는 데 도움이되는 좋은 블로그를 찾고 있었지만 유감스럽게도 버전 형식을 설명하고 응용 프로그램을 개발하는 방식을 사용하는 방법이 아니라 단순히 형식 만 설명합니다. 그래서, 나는 그것에 찌르는 것을 결정했다. 이 문서를 개선하는 데 도움이되는 의견이나 건설적인 비판을 환영하므로 언제든지 알려주십시오.
첫째, SNAPSHOT은 알파 / 베타 / 기타 버전과 같은 것이 아닙니다. 그것은 당신의 코드의 최신 버전을 의미하는 특별한 키워드입니다. 이것은 그것이 바뀌는 것을 의미합니다. 어제 someapp-1.0-SNAPSHOT을 꺼냈다가 오늘 당장 해체하려고하면 거의 동일하지 않을 것입니다. 이것은 SNAPSHOT 버전에 의존하는 프로젝트를 가지고 있다면 빌드를 실행할 때마다 원격 저장소에서 변경 사항을 확인해야합니다.
이해해야 할 다음 사항은 Maven에서의 릴리스입니다. 릴리스는 버전이 프로덕션에 사용할 준비가되었음을 의미하지 않습니다. 개발자가 코드를 잠궈 코드를 잃어 버리지 않기를 바란다는 것을 의미합니다. 그는 누군가 다른 사람, 아마도 다른 팀의 개발자가 자신의 응용 프로그램 개발을 시작해야 할 수도있는 라이브러리에 코드를 배포하려고 할 수도 있고 테스트를 위해 테스트 환경에 설치 될 응용 프로그램을 배포 할 수도 있습니다. 즉, 이것은 메이븐 릴리스가 알파, 베타, 릴리스 후보, 패치, 프로덕션 또는 다른 어떤 것으로 분류 할 수 있음을 의미합니다.
이해가 되니? 글쎄, 아마도 내가 어떻게 처리하는지 시나리오를 통해 걷는 것이 도움이 될 것입니다. 먼저 내가 사용하는 버전 관리 전략을 살펴보십시오.
버전 관리 전략.
이 전략의 구문은 Maven : The Complete Reference의 형식을 기반으로합니다. 차이점은 다음과 같습니다. 증분 버전 & 증분 버전 & rdquo; & ldquo; 패치 & rdquo; 선택적 & ldquo; 한정자 & rdquo; & ldquo; type & rdquo; 및 & ldquo; 시도 & rdquo; 간단히하기 위해.
& lt; 메이저 & gt; - 이것은 응용 프로그램의 중요한 변경을 나타내는 번호입니다. 주 버전은 이전 주 버전을 완전히 다시 작성하거나 이전 버전과의 하위 호환을 중단 할 수 있습니다. & lt; minor & gt; - 이전 부 버전의 작은 변경 사항을 나타내는 숫자입니다. 부 버전은 대개 짝수 개의 버그 수정과 새로운 기능으로 구성되며 항상 하위 호환이 가능해야합니다. & lt; patch & gt; - 이것은 다음 부 릴리스가 될 때까지 기다릴 수없는 버그가 수정되었음을 나타내는 번호입니다. 패치 버전에는 버그 수정 만 포함하고 새로운 기능은 포함하지 않아야합니다. 또한 항상 하위 호환 가능해야합니다. 보안 패치는 일반적인 패치의 한 예입니다. [& lt; type & gt; - & lt; 시도 & gt;] - 마지막 부분은 선택적이며이 버전이 반드시 안정적이지는 않다는 것을 식별하는 데에만 사용됩니다. 유형은 키워드이며 아무거나 일 수 있습니다. 그러나 나는 보통 알파, 베타 및 RC를 고수합니다. 이 시도는이 유형의 시도가이 번호임을 나타 내기위한 숫자입니다. 그래서 예를 들어, 베타 -01, RC-02, RC-05, 요법. 안정 버전의 경우에는이 부분을 생략하지만 안정 버전을 나타 내기 위해 RELEASE라는 키워드를 사용하려는 다른 프로젝트를 보았습니다 (시도하지 않으려면 RC를 사용하십시오. 릴리스 후보자) 그).
예제 Scenerio.
이제 시나리오를 위해. foobar 응용 프로그램에서 작업하고 있다고합시다. 내 조직은 분기 말에 foobar 버전 1.0을 제공 할 것으로 예상됩니다. (1.0이라고 말하면 처음 2 개의 숫자 만 사용하여 버전을 참조한다는 것을 알 수 있습니다. 이는 메이저 버전과 마이너 버전이 개발 팀 이외의 다른 사람에게 신경을 쓰는 유일한 버전이기 때문입니다. 또한, & lt; No & gt; 최종 버전이 무엇인지 알 수있는 방법이지만 전공과 부전공이 동일하게 유지된다는 것을 알고 있습니다.) 민첩한 팀에서 일하기 때문에 각 스프린트가 끝날 때 수행 한 작업을 배포 할 것입니다. 테스터가 모든 것을 검증 할 수 있도록 내 테스트 환경에 적용합니다. 그래서, 여기에 내가 할 수있는 일이있다.
Sprint # 1 시작 부분의 pom. xml에서 1.0.0-SNAPSHOT 버전부터 시작하겠습니다. Sprint # 1이 끝나면 maven-release-plugin을 사용하여 foobar 응용 프로그램의 foobar-1.0.0-RC-01 릴리스를 만듭니다. 플러그인은 버전을 1.0.0-SNAPSHOT에서 1.0.0-RC-01로 변경하고 scm의 코드에 foobar-1.0.0-RC-01으로 태그를 지정한 다음 해당 릴리스를 빌드합니다. 그런 다음 플러그인은 트렁크를 1.0.0-SNAPSHOT에서 남길 응용 프로그램의 다음 개발 버전으로 업데이트합니다. 그런 다음 foobar-1.0.0-RC-01을 테스트 환경에 배치합니다. 이 과정은 다음 몇 번의 스프린트에서 계속 될 것이며 우리는 우리가 완벽하다고 생각하는 단계에 도달하게 될 것입니다.
이제 우리는 Sprint # 5에 있다고 말할 수 있습니다. 우리는 4 가지 릴리스 후보 버전의 애플리케이션을 출시하여 버그를 수정하고 기능을 추가했습니다. 이제 우리는 foobar-1.0.0-RC-04를 프로덕션 용도로 사용할 준비가되었다고 생각합니다. 이제 응용 프로그램의 foobar-1.0.0 버전을 만들기 위해 maven-release-plugin을 다시 실행합니다. 다시 말하지만 플러그인은 foobar-1.0.0으로 scm의 현재 코드 버전에 태그를 지정한 다음 해당 릴리스를 빌드합니다. 그런 다음 플러그인은 트렁크를 1.1.0-SNAPSHOT으로 선택하는 이번 개발 버전의 애플리케이션으로 업데이트합니다.
패치 버전이 아니라 마이너 버전을 증가시킵니다. 완전한 세계에서, 나는 1.0 버전으로 끝날 것이지만, 물론 이것은 완벽한 세계가 아니며, 어느 시점에서 1.0.0 버전을 패치해야 할 가능성이 높습니다. 삶이 계속되고 다음 버전의 응용 프로그램에서 작업하기 시작할 때, 나는 언제 알 수 없으므로 1.1.
몇 주 후 QA 팀에서 릴리스 테스트에서 버그를 발견했음을 알려줍니다. 나는 지금 무엇을 할 것인가? 새 버전 1.1 코드가 트렁크에 릴리스 1.0으로 들어갈 수 있습니다. 걱정하지 마라, 나는 릴리스 플러그인이 각 릴리스를 나를 위해 태그한다는 것을 기억한다. 그래서 foobar-1.0.0 태그에서 분기를 만들고 foobar-1.0.X라고 부릅니다. 그런 다음 새 분기를 체크 아웃하고 패치 버전을 1.0.1-SNAPSHOT으로 증가시킵니다. 이 새로운 지점은 이제 내 패치 지점입니다. QA 팀이보고 한 버그를 수정하고 릴리스 플러그인을 사용하여 패치 버전 foobar-1.0.1을 생성합니다. 그런 다음 foobar-1.0.1을 생성 한 직후 버전 1.0.1의 변경 사항을 트렁크에 병합하여 수정 사항이 아직 릴리스되지 않은 버전 1.1에 존재하게합니다.
그런 다음 심호흡을하고 1.1로 돌아갑니다. 다른 버그가 나타나면 어쩌면 우리가 프로덕션에 나가기도 전에 foobar-1.0.X 패치 브랜치로 돌아가 수정 사항을 작성하고 변경 사항을 다시 트렁크에 병합합니다.
간소화 된 전략.
위의 전략을 항상 사용하지 마십시오. 실제로, 나는이 전략의 단순화 된 버전이라고 부를 때 많은 시간을 사용합니다. 본질적으로, & lt; type & gt; - & lt; 시도 & gt; & lt; patch & gt; , 나는보다 일반적인 & lt; incrementalVersion & gt; (그냥 maven 책처럼). 그래서 다음과 같이 보입니다.
위의 예제 시나리오로 돌아가 전체 전략과이 단순화 된 전략을 비교해 보겠습니다.
보시다시피 간소화 된 전략은 좋은 전략 일뿐만 아니라 나쁜 전략 일 수 있습니다. 버전이 프로덕션을위한 준비 상태인지 또는 릴리스 후보인지 여부는 분명하지 않습니다. 그러나 승인 된 릴리스 후보를 두 번 테스트하지 않아도된다는 의미입니다. 스프린트 # 4가 제공 한 버전도 프로덕션 버전입니다. - RC-04를 제거하기 위해 다시 만들 필요가 없습니다.
소규모 팀이나 많은 다른 분야에서 실제로 사용되지 않는 유물을 보유하고있는 팀의 경우 관리가 훨씬 적은 버전 관리가 있기 때문에 더 나은 솔루션 일 수 있습니다. 모든 사람들이 무슨 일이 일어나고 있는지 알 수 있도록 팀과 명확하게 의사 소통하는 것이 필요합니다.
최근 게시물.
GitHub Repos.
상태 업데이트 중. GitHub에 klieber.
저작권 및 사본; 2016 Kyle Lieber - 라이센스 - Hugo 및 Hugo-Octopress 테마 제공.

Java 버전 관리 전략
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
버전 제어 데이터베이스에 대한 적절한 전략.
나는이 블로그를 읽고 있는데 쓰여진 5 개의 게시물에 관한 질문이있다. 내가 이해하는 바로는 모든 SQL DDL 구문을 포함하는 큰베이스 라인 스크립트에서 작성합니다. 이 작업이 완료되면 별도의 스크립트로 각 변경 사항을 추적합니다.
그러나 스크립트 파일의 이름을 응용 프로그램의 특정 빌드와 관련시킬 수있는 방법을 이해하지 못합니까? 그는 사용자가 3.1.5.6723의 버그를보고하면 해당 버전으로 스크립트를 다시 실행할 수 있다고 말합니다. 그리고 당신은 자신의 파일에서 테이블 등의 변경 사항을 추적하거나 동일한 스크립트 파일에서 모든 DLL 변경 사항을 가져온 다음 자신이 말한 것처럼 자체 파일에보기 등을 추가할까요?
우선, DB 업그레이드는 악의적 인 일이지만, 블로그에서는 악몽이 가득합니다.
업그레이드 방법을 기반으로 프로그래머 역량 매트릭스를 만들 수 있습니다.
수준 0 : 전혀 업그레이드가 없습니다. 고객은 애플리케이션이나 타사 DB 관리 솔루션에서 제공하는 UI를 사용하여 두려워하고 수동으로 데이터를 이동합니다 (실제로 가능합니다). 1 단계 : DB 덤프를 업그레이드하는 스크립트가 있습니다. 고객은 안전하다고 느끼지만, 향후 1-2 년 동안은 매우 자극적 인 문제를 해결할 것입니다. 시스템이 작동하지만 변경이 허용되지 않습니다. 레벨 2 : 테이블 변경. 업그레이드 중 문제가 발생한 경우 특히 엄청난 중단 시간. 거대한 문제와 거의 100 % 안전 결과를 보장하지 않습니다. 데이터 변환은 버그가있는 스크립트로 관리됩니다. 고객은 행복하지 않습니다. 수준 3 : 스키마가없는 디자인 : DB에서 구성을 번역하기 위해 버그가있는 스크립트를 허용하기 위해 1 ~ 2 시간의 가동 중지 시간이 있습니다 (이 단계는 대부분의 경우 DB를 손상시킬 수 있음). 지원 사람들은 모든 커피 매장량이 완전히 고갈되었습니다. 수준 4 : 게으른 투명 업그레이드 : 중단 시간은 없지만 몇 가지 문제가 여전히 있습니다. 고객은 거의 행복하지만 이전 경험을 기억합니다. 수준 5 : 이상적인 아키텍처, 명시 적 업그레이드가 필요하지 않습니다. 총 행복. 고객은 업그레이드 절차가 어떤 것인지 알지 못합니다. 개발자는 생산적이며 차분합니다.
나는 모든 기술적 인 문제를 기술 할 것이다. 그러나 그 전에 나는 다음과 같이 말하게한다. (나에게 긴 대답을 용서 해주십시오) :
요즘 개발주기가 매우 단축되고 DB가 상당합니다. 어떤 기능이든 스키마 변경 및 호환성 저하로 인해 간단하고 안정적인 업그레이드 절차가 수행되거나 고객이 식별 할 수있는 문제를 연기 할 수 있으므로 기회가 있습니다 일반적으로 필요한 업그레이드 단계가있는 긴급 핫 픽스 빌드를 사용하려면 사용자와 고객 간의 장벽을 피하는 것이 훨씬 좋습니다.
수준 0과 수준 1 두 경우 모두 분명한 바보입니다. 누구든지 그것을 피해야합니다.
레벨 2 변경은 작은 테이블에는 좋지 않지만 큰 테이블에는 문제가 될 수 있습니다. 정말 큰 테이블 (> 1Gb)에서는 ALTER TABLE을 완료하는 데 몇 시간 또는 며칠이 걸릴 것입니다. 또한 스키마 업그레이드 문제 만 해결하지만 저장된 데이터는 무엇입니까? 또한이 접근법의 실제 장애를 이해하기 위해 물리적 데이터 레이아웃에 대해 생각해 보는 것이 좋습니다. 전체 절차가 안전하지 않을 수 있으므로 백업이 있는지 확인하십시오.
수준 3 스키마 업그레이드 문제는 스키마를 상위 계층으로 이동하여 해결됩니다. Schema-less 솔루션은 다소 제한적입니다. 주로 관계형 모델의 모든 기능을 사용할 수 없기 때문입니다. 하이브리드 접근법은 빠른 업그레이드와 관계형 대수 사용 기능을 모두 제공 할 수 있습니다. 몇 가지 흥미로운 기사가 ​​있습니다.
업그레이드 절차의 복잡성은 여전히 ​​존재하며 응용 프로그램 수준으로 변경되었습니다. 많은 관련 시나리오가 있지만 몇 년 동안 함께해온 하나의 하이브리드 시스템을 설명하려고합니다. 데이터 모델을 "관계가있는 엔터티"로 설명 할 수 있습니다. 엔티티 간의 관계는 DB 수준에서 표현되었으며 엔티티 자체는 XML 모양으로 저장되었습니다.
이 시스템은 성숙했고 충분한 고객을 가지고있었습니다. 다양한 기능 요청이 있었기 때문에 R & D 및 QA 팀에 약간의 스트레스가있었습니다. 처음에 업그레이드 절차는 독립 실행 형 Java 응용 프로그램으로 구현되어 DB에서 XML 모양을 읽고 DOM API를 사용하여 업그레이드 한 다음 다시 DB에 기록했습니다. 실제 접근 방식은 매우 직관적이지만 다음과 같은 숨겨진 몇 가지 문제가 있습니다.
업그레이드 로직이 다소 버그가있을 수 있으므로 잘못된 XML 데이터를 작성하여 고객의 다운 타임을 크게 늘릴 수 있습니다. 1-2GB의 XML을 읽고 변환하는 데 시간이 오래 걸릴 수 있습니다. 모든 업그레이드 절차 단계는 자동화 된 테스트 (나는 CI가 반드시 필요합니다) 숨겨진 고장은 1-2 일 안에 발견 될 수 있으므로 백업이 더 이상 도움이되지 않습니다. 새로운 데이터가 삽입되어 업그레이드 코드가 조금 복잡해질 수 있습니다. 특히 원하는 경우 / 필요하면 빌드 간 업그레이드 (애자일 팀의 일반적인 요구 사항)
모든 엄격한 업그레이드 절차 정의, 유효성 검사 규칙 및 CI 시스템이 실제 데이터 (모든 고객에서 수집 한)에 대해 수행 한 광범위한 테스트를 사용하여 모든 잠재적 위험을 완화하려고했습니다. 오래된 문제로 오래 전에 업그레이드 스크립트가 도입되어 일부 단계가 실패하는 것을보고 놀랐습니다. 숨겨진 문제를 해결하기 위해 별도의 업그레이드 단계가 개발되었습니다. 합리적인 20-30 분으로 업그레이드 시간을 줄이기 위해 일부 최적화가 수행되었습니다. 콘솔 기반 진행률 표시 줄 구현은 나머지 작업을 수행했습니다.
빠른 참고 : 모든 최종 사용자는 장시간 (> 2 분) 작동에 대한 진행 상황을보고 싶어합니다. 그러한 "즐거움"을 구현하는 것을 잊지 마십시오.
처음에는 DB 버전이 별도의 테이블에 저장되었습니다. 엔티티를 별도로 버전 관리하고 업그레이드하는 동안 전체 DB 잠금을 피하는 것이 훨씬 낫기 때문에이 방법을 사용하지 마십시오.
하나의 업그레이드 절차를 예로 제시합니다 (모든 유효성 검사 및 확인 단계는 & lt; 빌드 / & gt; 및 버전 / & gt; 처리 논리 뒤에 숨김). '-'는 적은 것을 의미하고, '*'는 모든 빌드를 의미합니다.
각 스크립트는 작은 Java 또는 Groovy 구현 (XSLT도 사용됨)입니다. 나중에 다운 그레이드 절차도 개발되었지만 이것은 완전히 다른 이야기입니다.
레벨 4 응용 프로그램 계층의 데이터 스키마는 많은 흥미로운 작업을 수행 할 수 있습니다. 예를 들어, XML을 protobuf로 대체 할 수 있습니다. 평소처럼 그렇게하는 데는 여러 가지 이유가 있습니다 (더 간단하고 빠릅니다). 빌더 개념을 좋아하지 않는다면 대신 중고품을 사용할 수 있습니다.
어쨌든, protobuf는 거의 두통없이 이전 버전과 호환되는 시스템 (저장된 데이터 측면에서)을 만들 수 있습니다. 그런데 좋은 이점. 시스템을 이전 버전과의 호환성을 유지하면 쉽게 게으르고 완전하게 업그레이드 할 수 있습니다. 요청이있을 때 백그라운드 프로세스 또는 업그레이드가 될 수 있습니다. 좋은 소식은 가동 중지 시간이없고, 행복한 사용자와 업그레이드를 더 자주 수행 할 수 있다는 것입니다. 즉, 신속하게 개발하고 고객 요청에 신속하게 대응하며 다른 말로는 더 성공적 일 수 있음을 의미합니다.
Level 5 죄송합니다, 이번에는 아닙니다. 업그레이드 전략에주의하십시오. 몇 가지 스키마가 정의 된 시스템을 판매하고 자신을 잠그는 것이 쉽습니다. 새로운 기능 없음 - 고객 없음.
간단하지만 매우 유용한 체크리스트 :
고객 측의 문제를 즉시 해결할 수 있습니까? 고객이 시스템을 업그레이드하는 것이 안전 할 수 있습니까 (적어도 업무상 중요한 경우). 문제를 확인하는 데 얼마나 많은 시간이 필요합니까? 자동 검증이 있습니까?
읽어 주셔서 감사합니다.
테이블 및 뷰에 대한 변경 사항은 자체 파일에서 유지 관리되지 않습니다. 당신이하는 모든 변화에 대해 새로운 변경 스크립트를 만들 것입니다. 따라서 테이블 'X'를 5 번 변경하면 각 변경 사항에 대해 5 가지 변경 스크립트가 생깁니다.
특정 릴리스 버전으로 스키마를 만들려면 해당 릴리스의 레이블이 붙은 소스 코드를 얻습니다. 베이스 라인에서 데이터베이스를 생성하십시오. 그런 다음 해당 버전의 코드에서 변경 스크립트를 연대순으로 실행하십시오. 예 :
이제 버전 1.2에서 데이터베이스를 다시 만들고 싶다고합시다.
version_1.2 레이블에 코드를 동기화하여 baseline. sql, add_publisher. sql, add_publish_date. sql 순서로 스크립트를 실행합니다.
Liquibase 대신 Flyway (flywaydb. org/)를 사용하여 자신 만의 업그레이드 / 다운 그레이드 SQL 스크립트를 작성할 수 있습니다. 이것은 더 많은 유연성을 제공하며 뷰와 저장 프로 시저에도 적용됩니다.
Liquibase는 자신 만의 XML 기반 언어를 사용하여 스키마를 변경해야하며 이는 다소 제한적일 수 있습니다.
데이터베이스에 버전 번호를 유지하고 시작시 업데이트 스크립트를 적용하는 것이이 전략의 중요한 부분입니다.
시작 방법은 다음과 같습니다.
데이터베이스의 DB_VERSION 레코드를 확인하고 업데이트> 현재 버전을 찾습니다. 어쩌면 코드로. 각 해당 "업데이트", 스크립트 또는 프로그래밍 방식의 동작을 실행합니다. DB_VERSION이 각각 업데이트되고 이로 인해 실패한 부분을 다시 실행할 수 있습니다.
찾으 DB_VERSION 현재 = 789; 정교한 코드 또는 큰 긴 IF 체인은 업데이트 790 이상을 찾습니다. # 790 업데이트, 고객 업그레이드 & amp; 계정 테이블; 업데이트 # 791, 업그레이드 표; 792 번을 업데이트하고 주문 테이블을 재구성한다. 데이터베이스 버전은 = 792입니다.
몇 가지주의 사항이 있습니다. 이것은 합리적으로 잘 작동합니다. 사람들은 100 % 신뢰해야한다고 주장하지만, 그렇지 않습니다.
불완전한 스크립트, 필드 길이의 차이 또는 서버 버전의 차이로 인해 때때로 스크립트 / SQL이 일부 데이터베이스로 전달되지만 다른 스크립트에서는 실패 할 수 있습니다.
실행할 스크립트를 찾는 것은 IF 문이 많은 큰 단일 메서드처럼 간단 할 수 있습니다. 또는보다 우아하게 검색 또는 메타 데이터를 통해 스크립트를로드 할 수 있습니다. 때로는 SQL이 아닌 프로그래밍 방식의 코드를 포함하는 것이 유용 할 때가 있습니다.

버전 관리 전략 개발.
DZone 커뮤니티에 가입하여 전체 회원 경험을 얻으십시오.
Automic Release Automation, Automic의 20 년 이상의 비즈니스 자동화 경험, 회사에서 이미 활용하고있는 검증 된 툴 및 프랙티스의 조합을 사용하여 엔터프라이즈 급 연속 배송까지 모든 성숙도 수준의 회사를 확보 할 수있는 청사진을 다운로드하십시오. .
지난 몇 년 동안 다음 형식의 빌드 버전 전략을 따랐습니다.
소수점을 사용하면 빌드에 대한 자동 증가 전략을 구현할 수 있습니다. 즉, 빌드 ID가 빌드를 생성 할 때마다 수동으로 변경하지 않아도됩니다. 빌드 시스템이이를 처리하므로 빌드 ID를 수동으로 변경할 필요가 없습니다. Maven과 Ant 모두이 숫자를 증가시키는 간단한 방법을 가지고 있습니다.
빌드 ID를 증가시킴으로써 각 빌드가 고유 한 버전 번호를 갖도록 보장함으로써 동일한 프로젝트의 두 빌드가 동일한 BuildID를 갖지 않으므로 빌드를 구별 할 수 있습니다. 다른 번호는 필요한 경우 수동으로 변경됩니다.
주요 버전 - 일반적으로 재 작성 후 또는 기능이 크게 변경된 경우처럼 제품이나 프로젝트에 대폭적인 변경이있을 때 변경됩니다.
Release Version - 주요 버전 변경으로 간주되지 않는 프로젝트의 공식 릴리스가있는 경우 증가합니다. 예를 들어 2 ~ 3 건의 개별 릴리스로 프로젝트를 고객에게 출시 할 계획입니다. 이 릴리스는 동일한 주요 버전 (버전 5)을 나타낼 수 있지만, 이후의 계획된 릴리스이며 패치가 아니라는 사실을 식별 할 수 있기를 바랍니다.
패치 번호 - 기존 릴리스에 대한 패치를 나타냅니다. 패치중인 릴리스는 릴리스 버전에 반영됩니다. 패치는 대개 치명적인 버그 또는 중요한 문제 모음을 수정하기 위해 발행되며 "계획된"릴리스와는 다릅니다.
Build ID - CI 시스템의 각 릴리즈 빌드와 함께 자동으로 증가합니다. 이렇게하면 각 빌드마다 고유 한 버전 번호가 지정됩니다. 주 버전, 릴리스 버전 또는 패치 번호가 증가하면 빌드 ID가 1로 재설정됩니다.
17.23.0.9 - 이것은 17.23 릴리스를 나타냅니다. 이 릴리스의 9 번째 빌드입니다.
17.24.0.1 - 다음 릴리스 17.24 릴리스입니다. 이것은 17.24의 첫 번째 빌드입니다.
17.24.1.2 - 이것은 릴리스 17.24 용 패치를 나타냅니다. 이것은 첫 번째 패치 릴리스이며이 패치의 두 번째 빌드입니다.
Automic Release Automation이 귀사의 디지털 전환을 시작하거나 지속하는 데 어떻게 도움이되는지 배우려면 '실용적인 Blueprint to Continuous Delivery'를 다운로드하십시오.
이 기사처럼? 자세히 읽기 DZone.
무료 DZone Refcard.
Docker 시작하기.
James Betteley, DZone MVB의 허가를 받아 DZone에 게시 됨. 여기에 원본 기사를 참조하십시오.
DZone 기고자가 표명 한 의견은 독자적으로 작성되었습니다.

Comments

Popular Posts