우리는 현재 원격 SVN 서버, DEV, STAGE 및 PROD에 대한 SVN 브랜치 3 개를 포함하는 다소 복잡한 배치 설정을 사용하고 있습니다. 패치를 통해 코드를 승격시키는 등의 작업을 수행합니다. 팀 상황?SVN에서 즐겨 사용하는 웹 앱 배포 워크 플로는 무엇입니까?
답변
개발 용 트렁크 및 프로덕션 용 분기 (생산).
내 로컬 컴퓨터에서 변경 내용을 테스트하기 위해 트렁크 지점을 가리키는 VirtualHost가 있습니다.
상관 트렁크에 커밋 온라인 서버의 dev에 URL에 svn의 수출 및 동기화를 수행하는 커밋 후크 트리거 - 그래서 사이트가있는 경우 stackoverflow.com 다음이 후크는 자동으로 다음
를 업데이트 dev.stackoverflow.com I svnmerge를 사용하여 로컬 체크 아웃에서 선택한 패치를 트렁크에서 프로덕션으로 병합하십시오.로컬 컴퓨터에서 VirtualHost를 다시 사용하여 프로덕션 지점을 가리 킵니다.
프로덕션 분기에 병합 된 변경 내용을 커밋하면 SVN 내보내기 후크가 프로덕션 (라이브) 내보내기를 다시 업데이트하고 사이트가 라이브입니다!
간단한 트렁크 분기가 가장 최신 코드를 포함하고, 우리가 살 때마다 분기를 자릅니다. 이것은 꽤 효과적으로 작동하는 것 같습니다. 실제 시스템을 위해 잘라낸 현재 분기가 실패 할 때마다 이전 분기로 쉽게 이동할 수 있습니다. 또한 현재 브랜치에 버그를 수정하는 것은 쉽습니다. 새 브랜치를자를 때 브랜치가 효과적으로 사라지기 때문에 작업 할 필요가있는 실제 브랜치는 하나뿐입니다 (그리고 나서 거기에서 수정 사항을 라이브 지점).
작은 개발자 팀에서 (작은 프로그래머와 상사가 나를 의미하는 듯) 나 혼란 스러웠습니다. 그러나 우리는 "게이트 키퍼 (gatekeeper)"유형의 프로세스 할당이 우리에게 효과적이라는 것을 발견했습니다.
게이트 키퍼는 앱에서 가장 많은 작업을 한 사람이었습니다 (이 경우, 내가 처음부터 개발 한 프로젝트 2 개를 가지고 있었으며, 그는 4 개를 가지고있었습니다).
기본적으로 그가 내 프로젝트에서 작업해야 할 때마다 그는 자신이 일하고 있다고 나에게 알리고 싶습니다. 저장소가 최신이고 빌드 가능하다는 것을 확인한 다음, 변경 후 커밋. 그는 그것이 끝났다고 나에게 알려줄 것이고, 나는 풀고, 짓고, 배치 할 것이다. DB가 변경된 경우 DB를 수정하는 모든 스크립트가 포함 된 DB 변경 폴더가 있습니다.
분명히 많은 구멍이 있지만 프로세스가 우리를 위해 일하고 서로 건물을 짓지 못하게했습니다.
세 가지 가지가 추가 작업처럼 들립니다.
환경 차이는 트렁크에 관련 파일의 다른 버전을 사용하여 처리 할 수 있습니다. 즉 database.yml & database.yml.prod입니다. 배포 프로세스는 환경을 인식하고 단순히 기본 환경 파일을 기준으로 환경 파일을 복사해야합니다.
웹 관련 항목을 준비하기 위해 분기를 사용하지 않습니다. 트렁크로 병합하는 데 오랜 시간이 걸리는 실험적인 것들을 테스트하는 용도로만 사용됩니다 (하루 이상 읽음). 트렁크는 '지속적인 통합'스타일로 (잘하면) 작동하는 현재 상태를 나타냅니다.
따라서 대부분의 변경 사항은 곧바로 트렁크에 적용됩니다. CruiseControl.NET 서버는 IIS를 실행하는 컴퓨터에서 자동으로 업데이트되며 추가 사이트의 모든 리소스를 사용할 수있는 최신 복사본이 있으므로 사내에서 사이트를 완전히 테스트 할 수 있습니다. 테스트 후 파일은 공용 서버로 업로드됩니다.
나는 그것이 완벽한 접근법이라고 말하지는 않겠지 만 간단하고 비교적 작은 직원들에게 적당하며 비교적 안전하며 잘 작동합니다.
우리는 릴리즈 브랜칭을 사용합니다. 이것은 우리가하고있는 기능 브랜치보다 더 효율적인 것 같습니다.
다른 환경에서 다른 분기를 만들지 마십시오.
트렁크에는 현재 "기본"개발 코드베이스가 있습니다.
개발자는 종종 트렁크 코드베이스를 담당하고 다른 개발자의 길에 들어갈 수있는 중장기 프로젝트를위한 개별 분기를 만듭니다. 그가 완료되면 그는 다시 트렁크에 병합합니다.
코드를 프로덕션으로 푸시 할 때마다 태그있는 릴리스를 만듭니다./태그의 폴더는 단순히 버전 번호입니다.
프로덕션에 배포하기 위해 SVN 내보내기로 작업을 수행하고 있습니다. 만족 스럽다면 간단한 rsync를 사용하여 프로덕션 클러스터로 롤아웃합니다.
저는 개인적으로 로컬로 (개발), 기능 추가/수정 작업을하고 있습니다. 준비가되었다고 생각하면 트렁크 (생산)에 전념합니다. 프로덕션 서버에서 svn 업데이트 만 수행합니다.
현재 가지고있는 것과 비슷한 상황에서 작동합니다. 나는 '더 나은'해결책을 찾는 임무를 띠고 있었고, 다음의 내용을 따라 뭔가를 실행했다.
라이브 브랜치는 현재 상태의 서버를 나타냅니다.
모든 개발 작업은 게시판에서 수행해야합니다. 이는 1 인 1 시간 반 또는 1 년에 걸친 멀티 팀 프로젝트 일 수 있습니다. 종종 라이브에 대한 좋아하는 변경 사항을이 개발 브랜치에 병합 할 수 있습니다.
작업 내용이 게시되기 전에 변경 내용이 다시 병합되고 잠재적 릴리스로 태그가 지정됩니다. 이 릴리스는 준비 환경에서 테스트되며 테스트를 통과하면 새 라이브가 태그에서 가져옵니다.
더 잘 작동하면 여러 작품을 하나의 자료로 병합하는 것이 가능합니다.
이것은 개발 브랜치를 실시간으로 최신 상태로 유지하는 것이 매우 간단하다는 것을 의미합니다. 개발중인 작업을 삭제할 경우 최소한의 정리 만하면됩니다.
한 프로젝트에서 다른 프로젝트로 변경하려면 개발자는 로컬 작업 환경을 다른 분기로 전환하면됩니다.
설명하는대로 시스템에서 가지고있는 문제 중 하나는 DEV가 PROD로 구식이 될 수 있다는 것입니다. 따라서 개발자는 실시간으로 개발하지 않으며 무대까지 교차 의존성을 발견하는 것은 쉽지 않습니다. 위의 솔루션은 여전히 상당히 가벼운 채로 이러한 문제를 해결합니다.
공통 태그/지점/트렁크 조직에 문제가 없었습니다.
일반적인 진행중인 개발은 트렁크에서 발생합니다.
프로덕션 릴리스의 유지 관리는 적절한 릴리스 분기에서 수행됩니다.
트렁크와 관련이있는 릴리스 분기의 변경 사항이 병합됩니다.
새 버전을 배포 할 준비가되면 트렁크에서 태그가 추가 된 다음 해당 태그에서 분기가 만들어집니다. 새 릴리스 분기는 현재 릴리스와 병행하여 서버에 체크 아웃됩니다. 전환 할 때 경로가 저글링됩니다 ("mv appdir appdir.old & & mv appdir.new appdir").
프로덕션 릴리스를 지원하는 개발자는 svn에서 작업 복사본을 새 분기로 전환하거나 새 분기를 수행합니다.
은 내가보기 엔 (다른 사람의 사이에서) 지속적인 통합의 원칙을 기반으로 소프트웨어 제공을 관리하는 전체 과정을 설명합니다 (현재 거친 인하) 책 Continuous Delivery을 추천한다.
분기 및 병합 접근법이 매우 지저분하고, 실제로 새로운 가치를 제공하지 않는 활동에 시간을 소비하기 때문에 꽤 낭비입니다. 코드를 한 번 개발, 테스트 및 수정 했으므로이 작업을 다시해야하는 상황 (코드를 다른 분기로 복사)을 만드는 이유는 무엇입니까?
어쨌든 분기 및 병합을 피하는 방법은 배포 가능한 인공물을 트렁크에서 빌드하고 테스트, 스테이징 등을 통과 할 때 원본보다는 인공물을 승격시키는 것입니다. 이렇게하면 100 % 확신 할 수 있습니다. 생산에 투입하는 것은 테스트 한 것과 동일한 것입니다.
다른 일정으로 출시해야하는 다른 기능이있는 경우 구현 방식 (기능을 구성 가능하게 만들거나 모듈성을 향상시키는 방식)을 변경하면 단일 개발 트렁크를 유지하는 데 도움이됩니다.
책은 지금 꺼져 있고 내가 읽은 책에서 좋아 보인다. –
나는이 방법을 사용하지만 데이터베이스 업데이트를 어떻게 유지합니까? – cgreeno
웹 사이트 코드는 관리 URL에서 데이터베이스에 대한 업데이트를 처리하며 업그레이드 할시기를 알 수있는 데이터베이스 '버전 번호'가 있습니다. –