배포 전략 개선


12

회사에서 개발 한 전자 상거래 앱이 있습니다. 우리가 약 3 년 동안 개발하고 개발 한 합리적인 표준 LAMP 애플리케이션입니다. 테스트 도메인에서 애플리케이션을 개발합니다. 여기에서 새로운 기능을 추가하고 버그를 수정합니다. 버그 추적 및 기능 개발은 모두 호스팅 된 서브 버전 솔루션 (unfuddle.com) 내에서 관리됩니다. 버그가보고됨에 따라 테스트 도메인에서 이러한 수정 사항을 작성한 다음 버그가 수정되면 svn에 변경 사항을 적용합니다. 새로운 기능을 추가하여 동일한 절차를 따릅니다.

서버 전반에서 시스템 및 애플리케이션의 일반적인 아키텍처를 지적 할 가치가 있습니다. 새로운 기능이 개발 될 때마다 애플리케이션 (항상 우리가 제어하는 ​​서버)을 사용하여 모든 사이트에이 업데이트를 배포합니다. Google 시스템을 사용하는 각 사이트는 기본적으로 코드베이스의 95 %에 대해 정확히 동일한 파일을 사용합니다. 각 사이트에는 해당 사이트에 맞춤화 된 파일 (css 파일 / 이미지 등)이 포함 된 몇 개의 폴더가 있습니다. 각 사이트 간의 차이점은 각 사이트 데이터베이스 내의 다양한 구성 설정에 의해 정의됩니다.

이것은 실제 배포 자체에 적용됩니다. 우리가 어떤 종류의 업데이트를 롤아웃 할 준비가되면 테스트 사이트가있는 서버에서 명령을 실행합니다. 이 명령은 복사 명령 (cp -fru / testsite / / othersite /)을 수행하고 수정 된 날짜를 기준으로 파일을 업데이트하는 각 호스트 호스트를 거치게됩니다. 우리가 호스팅하는 각 추가 서버에는 프로덕션 코드베이스를 rsync하는 가상 호스트가 있으며 해당 서버의 모든 사이트에서 복사 절차를 반복합니다. 이 과정에서 덮어 쓰기를 원하지 않는 파일을 제거하고 복사가 완료되면 다시 이동합니다. 롤아웃 스크립트는 각 데이터베이스를 변경하기 위해 SQL 명령을 적용하고 필드 / 새 테이블을 추가하는 등의 다른 여러 기능을 수행합니다.

우리는 프로세스가 충분히 안정적이지 않고 내결함성이 없으며 약간의 무차별 한 방법이라는 것에 점점 더 우려하고 있습니다. 또한 새로운 기능으로 작업 할 때 분기 나 태그를 사용하지 않기 때문에 중요한 버그 수정을 수행 할 수없는 위치에 있으므로 서브 버전을 최대한 활용하지 않는 것으로 알고 있습니다. 서버 전체에 파일을 너무 많이 복제 한 것도 잘못된 것 같습니다. 또한 롤아웃 한 항목에 대한 롤백을 쉽게 수행 할 수 없습니다. 우리는 각 롤아웃 전에 diff를 수행하여 변경 될 파일 목록을 얻을 수 있도록 변경된 파일 목록을 얻을 수 있지만 롤백 프로세스에는 여전히 문제가 있습니다. 데이터베이스 측면에서 dbdeploy를 잠재적 솔루션으로 조사하기 시작했습니다. 실제로 원하는 것은 파일 관리 및 배포를 개선 할 수있는 방법에 대한 일반적인 지침입니다. 이상적으로는 파일 관리가 저장소에 더 밀접하게 연결되어 롤아웃 / 롤백이 svn에 더 연결되기를 원합니다. 사이트 파일이 repo 파일과 동일한 지 확인하기 위해 export 명령을 사용하는 것과 같은 것. 솔루션이 서버 주변의 파일 복제를 중지시킬 수도 있다면 좋을 것입니다.

현재 방법을 무시하면 다른 사람들이 같은 문제에 어떻게 접근하는지 듣는 것이 정말 좋습니다.

요약하면 ...

  • 여러 서버의 파일을 svn과 동기화 상태를 유지하는 가장 좋은 방법은 무엇입니까?
  • 파일 복제를 어떻게 방지해야합니까? 심볼릭 링크 / 다른 것?
  • 새로운 기능을 개발하고 기존 기능을 수정하려면 리포지토리를 어떻게 구성해야합니까?
  • 롤아웃 / 롤백을 어떻게 트리거해야합니까?

미리 감사드립니다

편집하다:

나는 이런 종류의 작업에 PhingCapistrano 를 사용하는 것에 대해 최근에 많은 좋은 것을 읽었습니다 . 누구든지 그들에 대해 더 많은 정보를 제공 할 수 있습니까?

답변:


6

릴리스에 대한 조언은 기능 릴리스 및 유지 보수 릴리스를 갖는 것입니다. 기능 릴리스는 새로운 기능을 제공하는 릴리스입니다. 이것들은 서브 버전 트렁크에 추가됩니다. 이러한 기능이 완료되었다고 생각하면 릴리스 지점으로 분기합니다. QA 프로세스가이 릴리스에 만족하면 릴리스에 태그를 지정하고 코드를 서버에 배포합니다.

당신이 버그 리포트를 얻을 때 지금, 당신은 지점이 수정 커밋 트렁크에 포트를. 수정 된 버그 수에 만족하면 유지 관리 릴리스에 태그를 지정하고 배포 할 수 있습니다.

개발 브랜치와 별개로 라이브 코드 기반의 브랜치가 있거나 라이브 개정판을 알고 하나를 만들 수있는 능력이 있어야합니다. 새로운 기능 또는 테스트되지 않은 코드를 배포합니다.

새 코드를 배포하기 위해 배포판의 기본 패키징 시스템을 사용하는 것이 좋습니다. 모든 코드 기반이 포함 된 패키지가있는 경우 모든 코드가 일종의 원자 작업으로 배포 된 것을 알 수 있습니다. 한 번에 설치된 버전을 확인하고 패키지 체크섬을 사용하여 코드 기반을 확인할 수 있습니다. 롤백은 이전에 설치된 버전의 패키지를 설치하는 경우입니다.

이를 구현할 수있는 유일한 장애물은 단일 서버에서 실행중인 서로 다른 고객을 위해 여러 개의 코드 기반 복사본이있는 것 같습니다. 모든 고객이 동일한 파일을 사용하고 사본을 사용하지 않도록 코드를 정렬하려고합니다. 얼마나 쉬운 지 모르겠지만 처리해야 할 사본 수를 줄이면 두통이 크게 줄어 듭니다.

LAMP에 대해 언급했듯이 컴파일 프로세스가 필요없는 PHP 또는 다른 스크립팅 언어를 사용하고 있다고 가정합니다. 이것은 당신이 아마도 Continuous Integration이라는 훌륭한 프로세스를 놓치고 있다는 것을 의미합니다. 이것이 기본적으로 의미하는 것은 코드가 계속 릴리스 가능한 상태인지 확인하기 위해 지속적으로 테스트되고 있다는 것입니다. 누군가 새 코드를 체크인 할 때마다 프로세스가이를 수행하여 빌드 및 테스트 프로세스를 실행합니다. 컴파일 된 언어에서는 일반적으로이 코드를 사용하여 코드를 여전히 컴파일해야합니다. 모든 언어에서 단위 테스트 (코드는 테스트 가능한 단위가 아닌가?) 및 통합 테스트를 실행할 기회를 가져야합니다. 웹 사이트의 경우 통합 테스트를 테스트하는 데 유용한 도구는 Selenium입니다. Java 빌드에서는 코드 커버리지 및 코드 메트릭을 측정하여 시간이 지남에 따라 진행되는 방식을 확인합니다. Java에서 찾은 최고의 CI 서버는 Hudson이지만, buildbot과 같은 것이 다른 언어에서 더 잘 작동 할 수 있습니다. CI 서버를 사용하여 패키지를 작성할 수 있습니다.


감사. 예, 우리는 PHP를 사용하고 있습니다. 나는 단위 테스트와 그것의 매우 유사한 것을 알고있는 것으로부터 지속적인 통합에 너무 익숙하지 않다는 것을 인정해야하지만, 나는 그것을 훨씬 더 잘 모른다. 우리는 단위 테스트에 관심이 있지만 코드베이스에는 여전히 단위 테스트에 적합하지 않은 많은 레거시 절차 코드가 있습니다. 그러나 흥미로운 아이디어는 복제를 방지하기 위해 코드를 더 잘 구성하는 방법에 대한 아이디어를 듣는 것이 좋습니다.
robjmills

지속적인 통합은 말 그대로 모든 체크인 또는 매시간 또는 매일 자동화 테스트를 실행하는 것입니다. 정기적으로 자동화하는 한 CI와 거의 같습니다.
David Pashley

- 내가 PHP와 Phing 함께 허드슨을 사용하는 방법에 대해 오늘이 글을보고 toptopic.wordpress.com/2009/02/26/php-and-hudson
robjmills

1

우리는 Puppet (Reductive Labs의 플래그십 제품)을 사용하기 시작했습니다. sys-admin 작업을 자동화하기위한 Ruby 기반 프레임 워크입니다. 나는 몇 주 전에 꼭두각시에 있었고 비디오 링크는 다음과 같습니다.

Luke Kanies 제시-꼭두각시 소개

또한 샌프란시스코의 꼭두각시에서 열린 모든 프레젠테이션을 보려면 다음 링크를 참조하십시오.

다른 사람들이 Puppet을 사용한 방식에 대한 프레젠테이션

즐겨.

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