고객 별 소프트웨어 패치를 처리하는 현실적인 방법은 무엇입니까?


16

다른 사람들이 다음 문제를 해결하는 효과적인 방법을 모 으려고합니다. 직장에서 우리는 특정 고객 만 볼 수있는 소프트웨어 패치 (최종 사용자 시스템에 설치)를 발표했습니다. 사용자 지정 코드는 자체 소스 제어 분기에 있습니다. 문제는 동기화를 유지하기 위해 두 개의 병렬 코드 라인 (및 빌드 스크립트)이 있으며, 원래 코드를 패치 할 때마다 고객 별 코드를 패치하고 테스트해야한다는 것입니다.

궁금합니다. 다른 조직에서이 시나리오를 어떻게 처리합니까? 우리는 비즈니스 솔루션에 개방하지 않은 단지 기술 (관련 소스 제어) 것들. 예를 들어, 고객에게 해당 지점에서 업데이트를받을 수 없음을 알리는 것에 대해 이야기했습니다.

우리의 브랜칭 전략은 다음과 같습니다 ( Visual Studio TFS 브랜칭 가이드를 기반으로 하지만 Subversion을 사용하고 있지만) 여기에 이미지 설명을 입력하십시오


당신은 사용한 경우 hg또는 git당신이 패치 큐 (사용하여 볼 것을 제안 할 수 의욕 대기열 확장 또는 스택 힘내 )하지만 TFS는 아무것도 비슷한 경우 모르겠어요.
Mark Booth

어쩌면 TFS 제안 분기 전략을 사용하더라도 Subversion을 사용하고있을 것입니다 .P 패치 대기열이 필요한 테스트를 줄입니까? 소스 제어 패치 용인 것 같습니다. 우리는 고객이 최종 사용자 시스템에 설치하는 패치를 다루고 있습니다.
Vimes

2
비즈니스 솔루션은 다음과 같습니다.하지 마십시오.
JeffO

@JeffO good call =) 어쨌든 이것을 데이터 구동 런타임 스위치로 만들 수있는 방법이 있습니까?
Patrick Hughes

1
@JohnB는 - 죄송합니다, 나도 몰라,하지만 당신은 소스 패치가있는 경우 다음 빌드 시스템은 테스트를 자동화 할 수 있어야한다, 플러스 유지하는 고객마다하는 패치 의 외부 svn그들이 당신의 정상적인 흐름을 혼란하지 않는 의미합니다. 패치 대기열이 유용 할 것 같으면 git-svn 또는 hgsubversion을 사용하여 시험 대기열을 사용해 볼 수 있습니다 . DVCS 프런트 엔드를 사용하여 까다로운 워크 플로를 원활하게 수행하면 svn사람들이 DVCS 도매로의 이동을 고려하여 다른 모든 이점을 얻을 수도 있습니다.
마크 부스

답변:


5

고객에게 특정 패치를 제공하기 시작하면 제품과 함께 유지 관리해야하는 새 버전의 제품을 즉시 생성했습니다. 즉, 두 버전간에 변경 사항이 전파되어야합니다. 일반적으로 고객 별 패치는 소스 코드를 포함하여 고객이 소유해야하는 사용자 정의입니다.

문제해결 하기위한 패치가 즉각적인 문제에 대한 최적의 임시 수정이 아니라면 메인 라인 분기로 만들지 않을 것 같습니다 . 이 경우 패치가 예상되는 수정 사항이 메인 라인에 포함될 때까지 패치를 유지하면됩니다.


5

키가 "보이는"것 같습니다. 별도의 코드 분기가없는 것이 아니라 동작을 변경하는 구성 옵션은 어떻습니까?


이는 간단한 사용자 정의에 효과적 일 수 있지만 더 복잡한 사용자 정의는 모든 고객에게 제품을 더욱 어색하고 불안정하게 만들 수 있습니다.
FrustratedWithFormsDesigner

3
@FrustratedWithFormsDesigner 단일 클라이언트를위한 복잡한 사용자 지정은 제품 관리 및 디자인에서 심각한 태만을 나타냅니다. 제품의 단일 고객에 대해 별도의 지점을 필요로하는 솔루션은 제품 소유자의 모든 고객 요구와 불충분 한 청지기 직분을 충족시키기 위해 제품의 심한 부적절 함을 나타냅니다.
maple_shaft

2
나는 또한 이것이 이전 고용주를 계속해서 물린 것을 보았다. 나쁜 습관 일 뿐이지 만 일반적으로 경영진이 원하고 되돌릴 수없는 일입니다. 특히 Subversion을 사용하는 경우 이것은 사라지지 않는 악몽 일뿐입니다. 코드를 동기화 상태로 유지하면 시간과 시간이 다치게됩니다.
Steve Hill

1
@maple_shaft-그러나 "국제화를 구현하기 위해 코드 브랜칭을 사용해 본 적이 있습니까?"
psr

3
@maple_shaft-농담 이었지만 실제로는 국제화를 처리하기 위해 분기를 사용하는 것이 적어도 고객 특정 지점만큼 나쁘다는 것이 내 요점이었습니다. 아마도 그런 곳에서 일하고 싶지 않다는 의미에서 똥이 아닙니다. 내가 주제를 상당히 벗어난 것이 무례합니다.
psr

3

이것을 단기 또는 장기적인 것으로 보십니까? 사실 비즈니스는 이미이 고객을 수용하기로 결정 했으므로 단기적으로는 비즈니스 관행 (추가 비용 수용 / 고객의 비용 청구)을 통해 주로 해결해야하는 비즈니스 결정입니다.

장기적인 경우 구성 (또는 설정 등)을 통해 고객의 요구를 쉽게 수용 할 수 있도록 소프트웨어를 리팩터링하면 비용을 절감 할 수 있습니다.

상대적으로 단기적인 의미라면 곧 이러한 변경 사항을 기본 / 개발 지점으로 다시 병합하고 모든 사용자도 변경 사항을 볼 수 있으며 현재 상황의 한계 내에서 작업하는 것이 가능할 것입니다. 내가 말했듯이, 고객 수용에 대한 결정이 내려 졌을 때해야 할 일에 대한 결정이 이루어져야했다.

긴 이야기가 짧습니다. 장기적으로는 기술적으로 해결하고 단기적으로 처리하십시오.

물론 동전 던지기 지점이 있습니다. 그 시점에 있다면 개발자가 선호하는 모든 것을 할 것입니다.


2

우리는 subversion도 사용합니다-그리고 우리는 그러한 시나리오를 정확하게 보게됩니다.

기억해야 할 몇 가지 핵심 사항은 다음과 같습니다.

  1. 고객에게는 특정 지점을 피해야하지만 가능한 한 최소화해야합니다. 항상 모두에게 적합한 솔루션을 일반화 할 수 있는지 묻습니다.

  2. 고객 별 지점은 새 릴리스에서 시작해야합니다. 버전 1.2가 있고 버전 1.2.1에서 1.2.11까지 파생 된 것으로 가정합니다. 고객 지점에는 모든 패치가 허용되어야하므로 고객 지점은 기본 버전과 호환 가능 해야합니다 .

  3. 호환되지 않는 새 버전을 시작할 때 고객 별 지점을 새로 만들어야합니다. 불행한 부분은 어떻게 든 작업 을 다시 수행 해야 할 수도 있다는 것입니다. 한 가지 솔루션은 고객 지점에서 모든 패치를 작성하여 추출해야하며 여전히 호환 가능한 모든 항목을 새 고객 지점에 적용 할 수 있습니다.

  4. 어떠한 상황에서도 항상 고객 별 변경 사항을 푸시하여 지점 또는 트렁크를 해제해야합니다. 그러나 이상적으로는 이러한 고객 별 작업이 줄어드는 방식으로 작업을 일반화해야합니다.

나는이 아이디어를 함께 보여 주려고 노력했다 아래 다이어그램.


1

확장 메커니즘을 코드에 도입하는 것은 어떻습니까?

기본 코드는 다음과 같습니다.

class Foo
{
}

프로그램이 시작되면 시작 폴더에서 로컬 사용자 정의를 위해 DLL / moral equivalent을 검사합니다. 하나를 찾으면로드되고 회사 특정 버전의 Foo가 포함될 수 있습니다.

class FooForABC : Foo
{
}

FooForABC는 Foo와 동일한 동작을 구현하지만 ABC에 필요한 특정 동작을 제공하는 데 필요한 기능을 재정의합니다. 이 기술은 지원해야하는 모든 시나리오를 처리 할 수있을 정도로 유연해야합니다.

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