Friday 16 March 2018

버전 관리 전략


버전 관리.
제품 라인을 만듭니다.
버전 관리는 핵심 제품을 기반으로하는 다양한 제품을 제공하는 관행입니다. 버전 관리는 새로운 이익과 성장을 두 가지 방식으로 생성 할 수 있습니다. 첫째, 고객에게 고유 한 요구 사항을 제공 할 수있는 새로운 제품을 제공하십시오. 따뜻한 기후의 운전자 (시동을 걸기 위해 크랭크 암을 많이 필요로하지 않음)는 Sears의 79.99 달러 DieHard South 자동차 배터리를 구입할 수 있습니다. 시어스는 더 강력한 배터리 (더 높은 크랭크 암페어)를 필요로하는 극한 지역의 운전자를 위해 $ 179.99 플래티넘 버전을 제공합니다. 둘째, 우수하고 우수하며 최상의 제품을 제공하면 고객이 지불 할 금액을 선택할 수 있습니다 (소비자의 선택에 따라 실제 가치가 드러납니다). McDonald 's는 $ 1 McDoubles와 $ 3.59 Quarter Pounders를 판매합니다. 대부분이 두 샌드위치의 재료는 비슷합니다. 가격에 민감한 고객은 McDoubles를 구입하지만 예산이 많은 고객은 프리미엄 가격의 Quarter Pounders를 선택합니다.
버전이 지정된 제품을 만드는 것은 세 가지 기본 방법을 통해 구현할 수 있습니다.
프리미엄 (높은 품질, 보장 된 액세스, 빠른, 우선 순위 서비스, 낮은 deductibles / 더 나은 범위). 철저히 지켜야합니다 (품질이 떨어지고, 제한이 많으며, 비수기, 개인 상표, 번들되지 않음, 공제액이 더 높고 혜택이 낮습니다). 독창적 인 고객 요구 사항 (패키지 크기, 확장 및 향상된 보증, 월별 클럽, 번들링, 플랫폼, 다양한 사용법)을 충족하십시오.
버전 관리는 새로운 고객을 유치하고 (고유 한 요구 사항 포함), 다른 고객에 대한 다양한 수익 마진을 도출합니다. 엄격한 제품은 할인을 제공하는 반면 보험료는 최고급 버전에서 파생됩니다. 이러한 고수익 프리미엄 버전 및 신규 고객 (고유 한 요구 사항과 저렴한 버전을 구매하는 고객)의 이익이 모든 회사의 가격 횡재 캠페인의 핵심 구성 요소입니다.

마이크로 서비스 - 버전 전략.
버전 관리의 문제점을 식별하고 가능한 솔루션을 탐색합니다.
ОјServices 힙합입니다! 그들은 잠시 동안 머물렀다. 그러나 매우 강력한 모듈 방식의 느슨하게 결합 된 접근 방식은 프로젝트를보다 쉽게 ​​유지 관리 할 수있는 경향이 있지만 또한 문제를 야기합니다. 이 블로그 게시물에서 나는이 문제 중 하나에 뛰어 들고 싶습니다. 버전 관리.
이 블로그 게시물은 예제 코드와 함께 제공됩니다.
업데이트 : Spring Boot에서이 어댑터 패턴을 좀더 심층적으로 구현했습니다. 여기에 대한 모든 것을 읽어보십시오!
소개.
몇 년 전 나는 유일한 서비스 (ish) 접근 방식을 사용하는 프로젝트에 참여했습니다. 코드 작성이 잘되어 있고 버전 관리 작업에 대한 완전한 기쁨이 고려되었지만 서비스는 고려되지 않았습니다. 서비스 간 직렬화를 위해 Netty 및 Kryo에 기반한 가정용 RPC 계층이 사용되었습니다. 빠르고 사용하기 쉽지만 큰 문제가있었습니다. 직렬화 된 클래스가 완전히 똑같은 구조가 아니고 동일한 (또는 적어도 호환되는) Kryo 버전을 사용하지 않으면 서비스는 서로 통신 할 수 없습니다.
서비스 간 버전 협상이 없었기 때문에 유일한 해결책이있었습니다. 전체 생태계를 하나의 큰 단일체로 배치합니다. 그리고 이것은 마이크와 많이 관련이 있습니다. 진정한 서비스 아키텍처 대신 모듈 식 단일체 (monolith)인데, 여기에는 서비스 아키텍처의 이점 (민첩성 : 서비스 중 하나를 교환 할 수 있어야 함)이없는 반면 유일한 서비스 아키텍처의 단점을 가지고 있습니다 (주로 트랜잭션 업데이트 기능을 잃어 버립니다).
따라서 서비스 아키텍처를 선택하는 경우 사용하고 전략을 결정해야합니다.
데이터 형식.
데이터 형식으로 시작하겠습니다. 소개의 예제에서 우리는 크기가 작고 빠르지 만 이전 버전과 호환되도록 만드는 것이 어렵거나 거의 불가능하다는 점에서 큰 문제가있는 바이너리 형식을 사용했습니다. 이것은 실수였습니다. 이 예제에서 하위 호환성 (Protobuf, Smile)을 허용하는 바이너리 형식이 있지만 JSON 만 사용합니다. 새로운 프로토콜 버전이 필드를 추가하는 경우 오래된 프로토콜에 의해 잘 처리되어야합니다.
프로토콜 버전.
나는 프로토콜 버전을 언급했는데 이것은 당신이 결정할 필요가있는 두 번째 중요한 구성 요소이다 : 프로토콜 버전 번호 매기기. 새로운 버전이 호환성을 깨뜨릴 때마다 하나의 정수를 사용하여 실제로 충돌 할 수 있습니다. 프로토콜이 항상 버전 내에서 이전 버전과 호환되므로 & lt; 메이저 & gt;. & lt; 마이너 & gt; 버전 관리 체계.
또한 클라이언트가 항상 예상 한 프로토콜 버전을 서비스에 알려야합니다. 클라이언트가 특정 버전을 원한다는 암묵적인 가정을하는 대신 클라이언트가 실제로 오류를 던져야하는 경우가 아니라면 개발자에게 항상 버전을 포함해야한다는 것을 알려줍니다. 또한이 정보는 오래된 버전을 비추천으로 인한 영향을 평가하기 위해 얼마나 많은 클라이언트가 아직 최신 버전인지 알기 위해 필요합니다.
전략.
이제 데이터 형식과 프로토콜 버전 관리 전략을 결정 했으므로이를 적용하고 전략을 결정할 수 있습니다. 예를 들어 웹 상점을위한 매우 간단한 "주문"API를 사용합니다. ID를 기반으로 한 아이템을 가진 주문을 반환하는 단일 GET 호출 만 있습니다.
호환되지 않는 버전 1과 2의 두 가지 버전이 있습니다. 버전 1 응답 :
보시다시피이 응답에서 몇 가지 실수를 범했습니다. customerLastName 필드의 철자가 틀리며 orderTotal의 센트가 주문 항목 가격과 10 진수로 일치하지 않습니다. 그래서 우리는 형식 버전 2에서이를 수정했습니다 :
훨씬 낫다! 또한; 완전히 호환되지 않습니다!
라우팅 기반 버전 관리.
외부 적으로 노출 된 API의 경우 비교적 잘 작동하는 전략은 단순히 경로 URL에 버전을 포함시키는 것입니다. 그래서 우리 고객의 첫 번째 버전은 / v1 / order / 1을 얻을 것이고 새로운 API를 기반으로하는 새로운 버전은 GET / v2 / order / 1을 요청할 것입니다. 그러면 이전 버전의 API가 포트 8001에서 실행되고 새 버전은 포트 8002에서 실행됩니다.
Nginx와 같은 역방향 프록시는 요청을 (/ vN 비트를 제거하여) 해당 서비스로 간단히 라우트합니다.
이것은 비교적 간단하게 구현할 수있는 전략이지만 (뒤늦은 지켜 볼지라도) 몇 가지 단점이 있습니다. 첫 번째 버전은 분명히 이전 버전의 서비스를 병렬로 유지할 수 있어야합니다. Order 서버의 새 버전은 예를 들어 이전 버전이 더 이상 데이터에 액세스 할 수 없도록 데이터베이스를 변경할 수 있습니다.
또 다른 문제점은 외부에서 노출 된 서비스에 대해서는 잘 작동하지만 여기에서는 '서비스'에 대해 이야기하고 있다는 것입니다. 역방향 프록시를 통과해야하는 많은 서비스가 서로 통신합니다.
보기 기반 버전 관리.
또 다른 접근법은 하위 호환성을 처리하는 로직을 코드로 이동시키는 것입니다. 제 의견으로는 이것이 합리적입니다. 수정을 한 개발자는 하위 호환성이 가장 좋은 방법을 알고 싶어하는 경향이 있습니다.
이 예제 코드는 내부적으로 JSON 직렬화에 Jackson을 사용하는 Spring Boot (개념적으로 모든 언어와 프레임 워크를 사용할 수 있음)를 기반으로합니다. 잭슨은 '전망'이라는 개념을 가지고 있습니다. 이러한 종류의보기에 대한 일반적인 시나리오는 권한이없는 사용자에 대한 사용자 세부 정보의 일부만을 표시하고 권한이 부여 된 / 친구의 사용자에 대한 자세한 정보를 표시하려는 것입니다. 예를 들어 Facebook 프로필의 전자 메일을 친한 친구에게만 제공하는 것과 비슷합니다.
Jackson View에 대한 자세한 정보는 여기에 있습니다.
예제 프로젝트에서는 두 가지 접근법을 보여주는 컨트롤러를 만들었습니다. 먼저 생성자를 살펴 보겠습니다.
보시다시피 우리는 하나의 Order로 '데이터베이스'를 채우고 뷰 및 어댑터 맵을 구성합니다. 링크 된 기사에서 설명하는 '보기'는 모든 클래스입니다. 기본 문자열 상속을 사용할 수 있도록 일반 문자열 대신 클래스를 사용합니다.
어댑터는 주문을 MappingJacksonValue 객체에 매핑하는 간단한 함수입니다.
getProtocolVersion 유틸리티 메소드에 대해서도 설명하겠습니다.
두 가지 버전 관리 방법에서 사용되는이 방법은 클라이언트가 제공 한 헤더에서 프로토콜 버전을 얻는 방법입니다. 제공되지 않으면 400 상태 코드로 응답합니다.
컨트롤러 소스는 비교적 간단합니다.
컨트롤러에서 "Order"객체를 반환하지 않고 Jackson MappingJacksonValue 래퍼를 대신 사용한다는 사실을 눈치 챘을 것입니다. 이렇게하면 버전에 따라 다른보기를 제공 할 수있는 유연성이 생깁니다.
getOrderView 메서드는 단순히 버전을 기반으로 뷰 클래스를 찾거나 기본 Version2 뷰를 반환합니다.
이제 뷰를 설정하고 하위 호환성을 처리하는 방법을 살펴 보겠습니다. 이 클래스는 표준 Jackson serializer 인 OrderSerializer 클래스에서 처리됩니다.
표준 뷰 기능을 사용하는 대신 시리얼 라이저를 사용했던 이유는 다른 이름으로 속성을 잘 직렬화 할 수 없기 때문입니다.
보시다시피 view는 serializerProvider. getActiveView () 메소드를 통해 serializer에 제공되며이를 기반으로 호환성 논리를 수행 할 수 있습니다. 단점은 많은 수작업을해야한다는 것입니다.
어댑터 기반 버전 관리.
필자의 의견으로는 좀 더 우아한 방법은 어댑터 디자인 패턴을 적용하는 것입니다. 우리는 유일한 서비스의 느슨하게 결합 된 특성을 이용하고 프로토콜 버전에 따라 완전히 다른 객체를 반환합니다. 이 방법에서는 클라이언트가 제공 한 X-Protocol-Version 헤더도 사용합니다.
두 번째 경로를 살펴 보겠습니다.
컨트롤러는 발견 된 Order를 매핑 메소드를 검색하는 adapt 메소드에 넘깁니다 (예를 들어 Java 8!). 그리고이를 주문에 적용합니다. 버전 1의 생성자에서 보았 듯이 OrderV1 객체에서 Order를 래핑하고 Jackson은 그 결과를 출력으로 직렬화합니다. 다음과 같이 보입니다.
이는 일반적인 어댑터입니다. 즉, 데이터 자체가 포함되어 있지 않습니다. 새 버전을 이전 인터페이스에 '적용'합니다. 이 방식으로 모든 중요한 로직은 여전히 ​​Order 클래스에 있고 '어댑터 로직'만이 어댑터에 포함됩니다.
이 솔루션에 대해 좋아하는 점은 명확하고 읽기 쉽기 때문에 많은 코드가 필요하지 않습니다 (버전간에 '클래스가 끊어지는 클래스에 어댑터가 필요함을 명심하십시오.) 또한 적응하기 쉽습니다 ( heh)를 다른 직렬화 방법에 적용합니다. 이 메커니즘은 예를 들어 Protobuf 직렬화 및 / 또는 예를 들어 Kafka 대기열과 통신하는 서비스에 쉽게 적용될 수 있습니다.
결론.
나는이 블로그 게시물에 몇 가지 접근법을 보여 주었고 이것들 각각은 프로와 사기극을 가지고있다. 그러나 중요한 교훈은 버전 관리가 일종의 사후 검토뿐만 아니라 아키텍처의 일부가되어야한다는 것입니다. 외부 API의 경우에는 이미 중요하지만 상호 서비스의 정밀한 메쉬를 사용하면 서비스 아키텍처에서 볼 수 있습니다. 전략을 결정해야합니다.
그리고 어떤 전략을 선택 하든지간에 예상 프로토콜 버전이 무엇인지 명확하게 (URL에서 카프카 주제 또는 헤더의 이름으로) 반드시 전달해야합니다. 그것 없이는 라우트가 불가능하며, 어댑터를 작성하는 것은 불가능하며 어떤 버전이 '외부에 있는지'알기조차 불가능합니다.
나는이 글을 즐겁게 쓰기를 기뻐했다. 이 예를 가지고 놀고 의견이나 질문이 있으면 알려주십시오!
저작권 및 사본; Niels Dommerholt 2017 - JBake와 구운 - 템플릿 깨끗한 블로그.

버전 전략
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 태스크에 의해 계산됩니다.
이렇게하면 버전 번호가 고유하게 유지되고 설치가 완료된시기를 신속하게 계산할 수 있습니다.

버전 전략
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
애플리케이션 버전 관리 전략은 무엇입니까? [복제]
이 질문에는 이미 답변이 있습니다.
최고의 응용 프로그램 버전 전략에 대한 SO 커뮤니티의 의견을 얻는 데 관심이 있습니다.
애플리케이션의 버전 번호를 어떻게 추적합니까? 해당 버전의 각 숫자 / 문자의 의미에 대한 공식적인 정의가 있습니까?
앱의 버전이 다른 숫자 / 문자열은 앱의 의미가 무엇입니까?
앱에서 자동화 된 업데이트 시스템 (예 : Sparkle)을 사용하고 있으며 귀하의 행동 방식이 얼마나 좋았습니까?
베타 테스터 또는 앱의 시험판 테스터를위한 별도의 업데이트 절차가 있습니까?
gnat, MichaelT, Kilian Foth, GlenH7, Rein Henrichs Apr 29 '13 at 2:42에 의해 중복으로 표시됩니다.
이 질문은 전에 질문을 받았고 이미 답변이 있습니다. 이러한 답변으로 귀하의 질문에 완전히 답변하지 못하면 새로운 질문을하십시오.
stackoverflow에서 마이 그 레이션 5 월 18 일 13시 48 분.
이 질문은 전문적이고 열광적 인 프로그래머를위한 사이트에서 왔습니다.
애플리케이션의 버전 번호를 어떻게 추적합니까? 해당 버전의 각 숫자 / 문자의 의미에 대한 공식적인 정의가 있습니까?
앱의 버전이 다른 숫자 / 문자열은 앱의 의미가 무엇입니까?
나는 다음을 사용한다 :
Major - Major 버전은 제품의 확실한 릴리스입니다. 기능에 중대한 변화가있을 때 증가했습니다.
마이너 버전은 새 기능이나 주요 버그 수정 사항 만 추가되면 증가합니다.
업그레이드 / 패치 - 업그레이드는 제품을 최신 버전의 제품으로 대체하는 것을 의미합니다. 지정된 주요 릴리스에서 업그레이드가 제공되는 경우에만 증가됩니다. 패치 버전은 0으로 시작하고 버그가 해결 된 경우에만 증가합니다.
빌드 번호 - 새 빌드가 생성되면 빌드 번호가 증가합니다.
앱에서 자동화 된 업데이트 시스템 (예 : Sparkle)을 사용하고 있으며 귀하의 행동 방식이 얼마나 좋았습니까?
우리는 야간 빌드라고 부르는 야간에 앱을 자동으로 빌드하는 빌드 도구를 사용하며 빌드가 생성 될 때마다 빌드 번호가 증가합니다.
베타 테스터 또는 앱의 시험판 테스터를위한 별도의 업데이트 절차가 있습니까?
매일 아침 BAT (빌드 수락 테스트)를 호출하고 야간 빌드를 확인하는 야간 빌드에 대한 테스터 테스트.
먼저 "최고의"전략에 동의하지 않는 것 같습니다. 현재 프로젝트에서 내 경험 만 공유 할 수 있습니다.
시스템 버전은 빌드 특성에서 수동으로 정의됩니다. 팀이 새 릴리스에 동의하면 발생합니다. 추가적인 버전 관리로서 우리는 CI 빌드에 의해 자동으로 생성되는 빌드 번호를 사용합니다.
Ubuntu 명명 체계 YY. MM. version. patch_buildNumber를 대충 따릅니다. Major. Minor 버전 관리가 고객의 기대를 망쳐 놓은 것으로 나타났습니다.)
관리자가 응용 프로그램을 롤아웃해야하기 때문에 자동 업데이트가 없습니다.
테스트 릴리스는 GA 출시보다 더 자주 발생하지만 모두 지원해야합니다.
나는 많은 버전 시스템을 테스트했고, 이제는이 버전에 꽤 만족한다.
Major는 수동으로 설정되고 주요 개선 사항을 포함하는 버전을 참조하십시오. Minor는 수동으로 설정되며 업그레이드 및 유지 관리 릴리스를 참조하십시오. 수정 사항 개정은 자동으로 생성되고 저장소의 정확한 개정을 참조합니다.
마지막 하나는 버전 관리에있어 매우 유연합니다. 여러 클라이언트에 여러 버전을 제공 할 수 있으며 디버그 및 디버깅이 가능합니다. repos에서 특정 버전을 가져 와서 쉽게 수정 한 다음 트렁크로 다시 병합하십시오.
빌드, 패키징 & amp; 게시는 완전히 자동화되어 있습니다. 유일한 수동 작업은 마지막 패키지를 FTP로 프로덕션 서버로 옮기는 경우입니다. 우리는 생산 현장에서 쓰레기를 전달하지 않도록 통제권을 유지하려고합니다. 얼리 어답터가 출시 노트를 읽고 버전을 다운로드하여 사용할 수있는 예비 단계로 이동합니다. 특정 버그에 직면 한 고객은이 버전 중 하나를 사용하여 고정 된 버전을 매우 빨리 얻을 수 있습니다.
오픈 소스 라이브러리를위한 시맨틱 버저 닝 (Semantic Versioning)을 사용하고 있으며 다른 라이브러리와도 작업하기가 훨씬 쉽다. 버전 변경이 의미하는 바를 이해할 수있는 공통 기반을 제공합니다. 도서관은 여전히 ​​베타 버전입니까? 버그 수정을위한 릴리즈인가요? API 변경 사항이 깨지십니까?
이것은 기본적으로 대부분의 오픈 소스 프로젝트에서 이미 사용 된 최상의 버전 관리 방식을 체계적으로 정리 한 것입니다.

No comments:

Post a Comment