"지속적인"전달을위한 팁


14

팀이 소프트웨어를 자주 배포하는 데 어려움을 겪고 있습니다 (매주 1 회). 다음은 일반적인 출시 일정입니다.

반복하는 동안 :

  • 개발자는 마스터 브랜치를 기반으로하는 단기 (열심히 시행되는) 기능 브랜치에서 백 로그에 대한 스토리를 작업합니다.
  • 개발자는 종종 기능 분기를 통합 분기로 가져 오며, 통합 분기는 지속적으로 자동으로 테스트 범위를 구축하고 테스트합니다.
  • 테스터는 스테이징 환경에 통합을 자동 배치 할 수 있으며 일주일에 여러 번 발생하여 테스트 스위트를 지속적으로 실행할 수 있습니다.

매주 월요일:

  • 테스터의 작업을 기반으로 "알려진"스토리를 결정하기위한 릴리스 계획 미팅이 있으므로 릴리스에 포함됩니다. 스토리에 알려진 문제가있는 경우 소스 분기가 통합에서 제외됩니다.
  • 이번 주 월요일에는 테스터가 릴리스를 차단할 안정적인 코드베이스를 갖도록하기 위해 새로운 코드 (테스터가 요청한 버그 수정 만)를 통합 할 수 없습니다.

매주 화요일:

  • 테스터는 가능한 한 많은 시간을 할애 할 수있을 정도로 통합 지점을 테스트했으며 알려진 버그가 없으므로 릴리스가 중단되어 프로덕션 노드로 천천히 푸시됩니다.

실용적으로는 괜찮은 것처럼 들리지만 달성하기가 매우 어렵다는 것을 알았습니다. 팀은 다음 증상을 봅니다.

  • "미묘한"버그는 준비 환경에서 식별되지 않은 프로덕션에서 발견됩니다.
  • 마지막 순간 핫픽스는 화요일까지 계속됩니다.
  • 프로덕션 환경의 문제는 성공적인 라이브 배포가 이루어지고 마스터 브랜치가 업데이트 될 수 있고 따라서 브랜치 될 때까지 지속적인 개발을 차단하는 롤백이 필요합니다.

테스트 범위, 코드 품질, 테스트를 신속하게 회귀하는 능력, 마지막 순간의 변화 및 환경 적 차이가 여기에 있다고 생각합니다. "지속적인"전달을 달성하는 가장 좋은 방법에 대한 조언을 누구나 제공 할 수 있습니까?


1
Continous Delivery 책에 대한 @emddudley의 답변 외에도 infoq.com/presentations/Continuous-Deployment-50-Times-a-Day 실제 라이브에 하루에 여러 번 배포하는 것에 대한 흥미로운 프레젠테이션 을 볼 것을 권장합니다 생산.
sdg

답변:


6
  • "미묘한"버그는 준비 환경 에서 식별되지 않은 프로덕션에서 발견됩니다. 이러한 문제가있는 프로젝트 중 하나에서이 문제는 이중 문제라고하는 전술에 의해 성공적으로 해결되었습니다. 나는 그런 버그를 의미합니다. 은 이슈 트래커에서 두 개의 티켓을 . 하나는 코드를 수정하기 위해 개발자에게 할당되고 다른 하나는 테스터에게 회귀 테스트를 설계 및 설정하거나 스테이징 환경에서 변경하여 향후 반복을 막을 수 있도록합니다. 그것은 꾸준한 준비를 유지하는 데 도움이되었습니다.

  • 프로덕션 환경에서 문제가 발생하면 롤백이 필요합니다. 빈번한 경우 매주 릴리스가 실제로 가짜입니다. 실제로 작동하는 레벨로 빈도를 조정하십시오. 으로 가짜 말은 두 개의 주간 방출의 말 하나 롤 - 다시 사용자가 2 주 만에 한 번 새 (작업) 출시에 직면한다는 것을 의미하는 경우 - 모든 수, 배포 시간이 아닌 수이다.

  • 열성적으로 강화 된 기능 분기 -이전에 단일 분기에서 작업을 시도하여 열등하다는 것을 알았습니까? 그렇다면 나머지를 건너 뛰십시오. 그렇지 않은 경우 단일 분기 (필요한 경우 분기 전략 "개발 분기"에 대한 Google 또는 분기 전략 "불안정 트렁크"에 대한 자세한 내용은 Google)에서 작업 해보십시오 . 또는 Perforce를 사용하는 경우 분기 및 병합에 대한 Microsoft 지침을 웹에서 검색하십시오. 시도 내가 말 했습니까? 미안 적절한 단어를 테스트 해야합니다 : 1) 단일 지점이 현재 가지고있는 것보다 나은지 여부와 시간을 측정하는 방법과 2)이 경우에 대비하여 기능 지점으로 다시 전환하는시기와 방법을 계획합니다. 테스트 가 실패합니다 .


추신.

웹에서 소프트웨어 프로젝트 위험 관리 와 같은 것을 검색하여 더 많은 트릭을 찾을 수 있습니다.


최신 정보

<의견에서 복사>

테스트 파이프 라인이 고장난 증상으로 빈번한 핫픽스를 인식합니다. 그렇지 않습니까? 어느 쪽이든, 그들은 수정 팀이 더 많은 작업을 할 수 있도록 핫픽스를 얻으려면 반복 릴리스가 필요합니다. 또한 핫픽스는 일반적으로 극단적 인 시간 압력으로 코딩되므로 정상적인 작업보다 품질이 떨어질 수 있습니다.

</ 댓글에서 복사>

  • 막판 핫픽스 -위의 우려 사항은 나에게 합리적이며 깨진 테스트 파이프 라인에 대한 참조입니다. 이 업데이트로, 새로운 코드 통합은 월요일에 차단되어 귀하의 사전주의가 깨진 하나 개 더 증상 같은 소리 (좀 더 정확한 단어가 될 것이라고 생각 주장 파이프 라인). 경합의 의미는 다음과 같습니다. 단일 브랜치를 사용하여 통합 및 릴리스라는 두 가지 목적 을 동시에 제공합니다. 릴리스가 다가 오면이 두 가지 목적이 서로 충돌하기 시작하여 상충되는 요구 사항을 추진합니다. 통합 목적은 지속적으로 개방 된 브랜치 ( Merge Early And 종종 ) 와 함께 제공되는 것이 가장 좋은 반면, 브랜치 밀봉으로 인한 릴리스 안정성 이점(절연) 가능한 한 오랫동안. 퍼즐 부분이 일치하기 시작한 것 같습니다 ...

.. 월요일 동결은 이제 상충되는 목적을 달성하기 위해 타협 한 것처럼 보입니다. 개발자는 새로운 코드 통합 블록으로 고통 받고 테스터는이 블록으로 너무 짧아 고통을 겪습니다.

알다시피, 나는 당신의 최선의 방법은 전용 브랜치 (통합 이외)에서 릴리스 를 시도하는 것이라고 생각합니다 입니다. 이 브랜치가 통합처럼 오래 살았는지 또는 기능 브랜치처럼 짧게 살았 든 ( "기능"릴리스와 함께), 그것은 당신에게 달려 있습니다. 그것은 분리되어 있어야합니다.

그냥 생각 해봐 현재 언젠가는 릴리스를 편리하게 안정화시키기에 충분하지 않다는 것을 알고 있습니까? 새로운 브랜칭 전략을 사용하면 릴리스 2 일 전에 문제없이 포크 할 수 있습니다. 이틀만으로도 충분하지 않다면 3 일 전에 포크를 시도하십시오. 문제는 더 이상 새 분기를 통합 지점에 병합하는 것을 차단하지 않기 때문에 원하는 시점에 릴리스 지점을 격리 할 수 ​​있습니다. 이 모델에서는 통합 분기를 전혀 동결 할 필요가 없습니다. 개발자는 지속적으로 월요일, 화요일, 금요일 등 어디서나 사용할 .

이 행복에 대한 대가는 핫픽스의 합병증입니다. 이것들은 하나가 아닌 두 개의 브랜치 (release + integration)로 합쳐 져야합니다. 이것이 새 모델을 테스트 할 때 중점을 두어야 할 사항입니다. 두 번째 지점에 합병하는 데 드는 추가 노력, 두 번째 지점에 합병하는 것을 잊을 수있는 위험과 관련된 모든 노력을 모두 추적하십시오.

테스트가 끝나면 추적 한 내용을 집계하고이 추가 노력의 양이 수용 가능한지 여부를 알아보십시오. 괜찮다면 다 끝난 것입니다. 그렇지 않으면 현재 모델로 돌아가서 무엇이 잘못되었는지 분석하고 개선 할 수있는 방법에 대해 생각하기 시작하십시오.


update2

<의견에서 복사>

내 목표는 반복 내에서 스토리를 테스트하고 전달할 수 있도록하는 것입니다 (구성 벽 뒤 또는 앞쪽). 테스터가 반복 작업을 수행하는 테스트를 수행하는 경우에만 가능합니다 (이전 반복의 코드를 안정화하지 않음).

</ 댓글에서 복사>

내가 참조. 글쎄, 나는 그런 식으로 직접적인 경험이 없지만 우리와 관련된 프로젝트에서 반복 테스트가 성공적으로 수행되는 것을 보았습니다 . 우리 프로젝트가 반대 방향을 따르고 있었기 때문에 이러한 반대 접근법에 대한 대면 비교도 훌륭했습니다 .

내 관점에서 볼 때, 반복 외 테스트 방식은 그 경쟁에서 우월 해 보였다. 예, 그들의 프로젝트는 훌륭했고 테스터들은 우리보다 버그를 더 빨리 감지했지만 어쨌든 도움이되지 않았습니다. 우리 프로젝트도 잘 진행되었고, 어쨌든 우리는 그들보다 더 짧은 반복을 감당할 수 있었고, 릴리스보다 릴리스가 훨씬 적었고, 개발자와 테스터 사이의 긴장이 적었습니다.

BTW는 측면에서 더 빠른 탐지에도 불구하고 평균 버그 수명이 거의 같았습니다 (수명 은 소개와 탐지가 아닌 소개와 수정 사이의 시간입니다 ). 아마도 반복 횟수가 짧고 릴리스가 줄어듦에 따라 평균적으로 수정 사항 이 사용자보다 더 빨리 도달 한다고 주장 할 수 있기 때문에 아마도 여기에 약간의 우위가 있었을 것입니다 .

요약하자면, 릴리스 코드 라인을 분리하면 팀 생산성을 향상시킬 수있는 더 좋은 기회라고 생각합니다.


더 생각하면 ...

  • 릴리스 코드 라인을 분리하면 더 나은 기회를 얻을 수 있습니다. 다시 읽을 때 반복 테스트 를 시도하지 않는 것이 좋습니다 . 나는 그렇지 않다는 것을 완벽하게 분명히하고 싶습니다.

귀하의 경우 반복 테스트 방법은 테스트 방법 (부드럽게 테스트 파이프 라인 )을 이해하고 주요 장애물이 무엇인지 명확하게 이해하기 때문에 시도하기에 안전합니다 (er ... test ) . 결국 파이프 라인을 제대로 구축하기가 너무 어렵다면 대체 방법으로 대체 할 수있는 옵션이 항상 있습니다.

장애물에 관한 BTW, 그 경우 추적해야 할 추가 사항 은 개발자 측에서 버그를 재현하지 못하고 테스터 측에서 수정 사항을 확인하기 위해 늦게 찾거나 늦게하는 것과 같은 문제 입니다. 핫픽스로 인해 발생하는 것처럼 파이프 라인 도 막힐 수 있습니다.


1
통찰력에 감사드립니다. 분기와 관련하여 우리는 아니오를 테스트했습니다. 접근 방식 (그리고 실제로 내 경력에 다른 @ orgs를 사용했습니다). 우리는 모든 개발자가 자주 (하루 이상 이상) 자주 사용하는 통합 브랜치 (마스터 기반) 인 프로덕션 코드를 나타내는 깔끔한 마스터를 정했습니다. 통합 브랜치는 잦은 자동 스테이징 구축으로 지속적으로 구축 및 테스트됩니다. 나는 이전에 큰 성공으로 더러운 메인 라인을 시도했습니다. 우리의 현재 접근 방식은 더욱 통제 된 것으로 보입니다. 불완전하고 원치 않는 기능을 위해 구성 벽을 사용합니다.

1
@maple_shaft 테스트 스위트에 대해 트래커에서 열린 버그는 2002 년 또는 2003 년에 처음 나타났습니다. 그리고 당시에 합류 한 팀에서 상당히 확립 된 관행 인 것 같습니다. prod와 staging 사이의 diff를 목표로하는 버그에 관해서는 , 처음 본 (그리고 실제로 놀랐습니다) 2 년 전부터 나에게 참신한 것 같습니다
gnat

1
@ gnat, 그것은 상식처럼 보입니다. 왜냐하면 내가 전에 들어 본 적이없는 이유입니다. 제가 생각한 것은 모든 QA 그룹이 버그를 해결하는 데 완전히 행복해 보였지만 버그가 발생할 때마다 2 살짜리 소년이되었습니다.
maple_shaft

1
@maple_shaft lol이 방법은 당연히 드문 것 같습니다. 테스터뿐만 아니라 문서 / 스펙 작성자에게도 버그를 제기 할 수 있다는 것을 알고 있습니까? -Dev Guide의 빌드 12는 34 페이지 5 번 줄에 "검은 색"이라고 표시되어 있습니다. "흰색"이어야합니다. -John Writer에게 할당되었습니다. -빌드 67에서 수정되었습니다.-Paul Tester가 빌드 89에서 확인했습니다.
gnat

1
채팅 세션으로 전환하고 싶지 않은 마지막 응답은 마지막 조직에서 스펙 작성자에 대한 버그를 작성했으며 전체 부서가 WTF 순간에 반동했습니다. 나는 즉시 "태도 문제"가 있고 "팀 선수"가 아니라 다시하지 말라고 들었습니다.
maple_shaft

8

사용자 스토리의 특성과 그 수를 알지 못하면 1 주 릴리스주기가 극단적 인 것처럼 보입니다. 위에서 설명한 시나리오는 복잡하게 계획되었으며 일련의 서로 다른 브랜치, 병합 지점, 핸드 오프, 환경 및 테스트 스위트를 포함하며 계획의 복잡성 때문에 단일 실수로 인해 릴리스가 지연되거나 나쁜 품질. 이는 후속 릴리스에 도미노 효과를 줄 수 있습니다.

IMHO 일정이 너무 빡빡합니다.

보다 효과적인 단위 테스트와 환경 별 통합 테스트를 작성하여 코드 적용 범위를 늘릴 수 있습니다.

페어 프로그래밍 및 / 또는 코드 검토를 도입하여 코드 품질을 향상시킬 수 있습니다.

사용자 스토리 포인트를보다 잘 평가하면 단일 릴리스에 들어가는 사용자 스토리를 암시 적으로 제한하여 위험 비율의 분모를 낮출 수 있습니다.

전체적으로 모범 사례가 있고 극도의 릴리스주기를 처리 할 수있는 시스템이 좋은 것처럼 들립니다. 당신은 올바른 길을 가고있는 것 같습니다.


예! 바람이 통합 테스트를 필요로 컴파일 된 언어의 큰 제품에 1 주일이있어, 연속적이지 정상 참작 . 너무 많이 유지하면 직업 사망률을 경험하게 될 것입니다!
ZJR

+1; 현재 3 주 동안 반복 실행 중이며 제대로 작동합니다.
Duncan Bayne

@ZJR,이 맥락에서 소멸함으로써 당신이 의미하는 바를 확장 할 수 있습니까?
Ben

@Duncan, 반복은 2 주이지만 1 주 단위 로 시도하고 있습니다 . 이것은 가능하거나 나쁜 생각 일 수 있습니다. 생각은 1 주일 단위로 새로운 코드를 덜 포함 할 것이고 따라서 더 적은 문제를 포함 할 것입니다.

1
@Ben Aston, 코드의 양은 문제를 일으키지 않으며 비현실적인 마감일, 스트레스 및 높은 기대치가 문제를 야기합니다.
maple_shaft

1

커밋 (또는 푸시)으로 인해 테스트가 실행되고 테스트가 통과되면 배포가 발생하는 실제 연속 배포를 사용하지 않는 이유는 무엇입니까?

그런 다음 변경이 확실하지 않은 경우 별도의 브랜치에서 변경하면 테스트가 실행되지만 배포는 수행되지 않습니다.

부러진 트렁크 / 마스터를 안정 상태로 유지하는 것보다 안정성을 높이는 데 더 많은 스트레스가 있다고 생각합니다.

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