코드를 재사용 가능한 비트로 분리 한 후 어떻게 테스트하고 배포합니까?


9

우리는 하나의 개발자와 모든 코드를 포함하는 하나의 svn 저장소로 시작했습니다.

^/foo/trunk/module-a
^/foo/trunk/module-b
^/foo/trunk/module-b/submodule-b1
^/foo/trunk/website1

(당시 이것은 큰 개선이었습니다). 이것이 조금 성장할 기회를 얻은 후에 우리는 순환 의존성, 느린 테스트 슈트 및 코드 재사용에 어려움을 겪기 시작했습니다 (예 : website1의 기능 세트가 일반 모듈-a로 바뀌 었 기 때문에).

코드베이스를 모듈화하고 git으로 곧 이동하고 git이 svn mega-repos를 좋아하지 않는 곳을 읽기를 기대하면서 훨씬 더 세분화 된 구조로 전환했습니다.

^/module-a/trunk/
^/module-b/trunk/
^/module-b/trunk/sumbmodule-b1
^/earlier-sub-sub-sub-module-c/trunk
etc. (about 120 such modules)

이것은 개념적으로 훌륭했습니다. 더 모듈화 된 코드, 훨씬 빠른 테스트 슈트, 문서화 등. 우리는보다 일반적인 구성 요소 중 일부를 오픈 소싱했으며 모든 모듈을 pip 설치 가능하게 만들었습니다 (virtuenv에 설치하는 pip install -e .데 사용 development).

우리 ^/srv/trunk는 런타임 환경의 폴더 구조를 포함 하는 저장소를 만들었습니다 . 웹 사이트 등을위한 ^/srv/trunk/lib모듈, /srv/trunk/src유적 ^/foo/trunk,^/srv/trunk/www

그리고 마지막으로 (perforce에서 아이디어를 얻었습니다. 아주 오래 전에 [ https://www.perforce.com/perforce/r12.1/manuals/cmdref/client.html] ) 우리는 "vcs- fetch "텍스트 파일에 모든 관련 리포지토리와 dev 환경으로의 체크 아웃 위치 및 해당 명령이 나열되어 있습니다. 예를 들어 vcs-fetc 줄 :

svn srv/lib/module-a ^/module-a/trunk

(처음)

cd /srv/lib && svn co ^/module-a/trunk module-a

또는 (나중에)

cd /srv/lib/module-a && svn up

github repos (자체 및 변경 / 변경되지 않은 공급 업체 패키지 모두)와 유사합니다.

프로덕션 환경을 만드는 데 동일한 vcs-fetch 프로세스를 사용했지만 vcs-fetch를 수행 한 후 prod에서 어떤 버전을 실행했는지 알 수있는 방법이 없다는 것을 빨리 알게되었습니다.

mega-repo를 사용하면 트렁크에서 prod를 업데이트하기 전에 개정 번호를 확인할 수 있었으며 다시 돌아가는 것이 간단했습니다 svn -r nnn up .. svn 및 git (및 hg의 하나의 모듈)와 ~ 120 repos의 코드 로이 작업을 수행하는 방법은 분명하지 않습니다.

오늘 http://12factor.net/을 읽었 으며 첫 번째 요소는 "하나의 코드베이스"이므로 올바른 경로를 벗어난 지 궁금합니다.

필자가 생각한 한 가지 아이디어는 pip-installable "deployment"-wheel을 생성하고 requirements.txt파일로 함께 "번들"하는 deploy 스크립트를 작성하는 것이 었습니다 . 그런 다음 배포에는 새 virtualenv 생성, 배포 휠을 나열하는 requirements.txt 파일을 pip 설치 및 활성 virtualenv 전환이 포함됩니다. 이전으로 되 돌리는 것은 virtualenv를 다시 전환하는 것과 관련이 있습니다 (그러나 virtualenv를 영원히 유지하고 싶지 않다면 어느 시점으로도 돌아갈 수 없었습니다.

이 시점에서 내가 잘못된 방향으로 걷고 있는지, 또는 올바른 길을 충분히 걷지 못했는지 궁금합니다 ..? (내가 읽는 모든 것은 "귀하의 앱"에 대해 계속 이야기하고 있으며, 동일한 코드베이스에서 14 개의 웹 사이트를 실행하는 방법을 모르겠습니다 ...)


다양한 구성 요소를 가진 개발 팀이 개별 구성 요소를 개발했다고 가정해도됩니까? 그렇다면 저장소를 분리하는 것은 불가피합니다. git을 사용하더라도 안정적인 주요 구성을 위해 동기화 된 릴리스 태그를 배치 할 수 있습니다. Google의 리포지토리 도구를 살펴보십시오. 통합 메타 데이터로 개발 버전을 일치시키는 것은 무의미합니다. pip를 통해 응용 프로그램을 연결하는 것도 완벽합니다.
Ext3h

추정 KLOC (1000 줄의 코드)와 코드의 바이트 측정 값을 포함 시키면 "2000 줄의 코드. 50 킬로바이트 소스 코드"와 같은 크기를 쉽게 알 수 있습니다. 또는 "40 KLOC, 2GB XML"입니다. . git으로 마이그레이션하는 데 필요한 것과 git에는 가져 오기 기능이 있습니다. git book 을 읽으면서 시작할 수 있습니다 .
Niklas

1
@ Programmer400 코드베이스는 .py 670 kloc, .js : 135kloc, .less : 25kloc, .html : 130kloc입니다. 너무 크지 만 크지는 않습니다. 내가 읽은 것에서 git은 실제로이 크기의 repos를 좋아하지 않으므로 git으로 전환하기 전에 더 작은 repos로 분할해야한다고 생각합니다.
thebjorn

답변:


2

분기가 누락 된 것 같습니다 (또는 '태그'또는 '릴리스'분기).

설치할 버전을 확인하기 위해 참조로 SVN revnum을 사용하는 대신 릴리스 된 버전에서 분기를 작성해야합니다. 그런 다음 해당 지점 이름을 배포하십시오.

변경 사항이 없어도 쉽게 분기 할 수 있으므로 모든 모듈이 동일한 릴리스 번호를 유지하지만 OSS 패키지는 변경없이 분기되지 않는 것이 좋으므로 다음으로 가장 좋은 것은 종속성 스크립트를 유지하는 것입니다-버전 5 제품의 OSS 모듈 X v2 등이 필요합니다.

버전 참조를 중단하고 대신 브랜치 이름으로 작업하도록 스크립트를 변경했습니다 (아무것도 가능하지만 고정 된 명명 규칙을 결정하는 것이 가장 좋습니다 (예 : Release_1_2_3))

또 다른 힌트는 현재 버전을 설명하는 각 모듈과 함께 파일을 유지 관리하는 것입니다. 필요한 경우 이러한 파일을 자동 생성 할 수 있으며 전체 변경 로그도 포함 할 수 있지만 누구나 원하는 버전 만보고 배포 할 수 있습니다.


1

나는 당신이 이미 좋은 아이디어를 많이 가지고 있다고 생각합니다. 수년 동안 다양한 프로젝트에서 그것들을 사용했습니다. 일차적 인 관심사는 분할 할 경우 주어진 패키지에 포함 된 모든 모듈의 버전을 말할 수없는 것 같습니다 그들.

@ Ext3h에서 언급했듯이 특히 팀이 여러 개이고 다양한 릴리스주기가있는 경우 일정 수준으로 세분화해야합니다.

모듈이 얼마나 고립되어 있는지 또는 버전을 얼마나 상세하게 만들고 싶은지 잘 모르겠 기 때문에 몇 가지 옵션을 제안합니다.


자식 서브 모듈을 사용하십시오. 하위 모듈을 사용하면 각 모듈을 svn 설정과 마찬가지로 별도의 git repo에 저장할 수 있으며 생각하는 것과 유사하게 저장할 수 있습니다. 그런 다음 해당 모듈을 루트 프로젝트에 연결합니다. 여기에는 각 자체 커밋에 대한 각 하위 모듈의 관련 커밋에 대한 참조가 포함됩니다.

IMO 이것은 이론적으로 좋은 설정이며 상당히 간단합니다. 주요 단점은 서브 모듈의 워크 플로우가 약간 어색하지만 이전에 스크립트를 사용하여 이러한 문제를 잘 해결 한 것처럼 보이므로 실제로 문제가되지 않을 수 있습니다.

다른주의 사항은 하위 모듈 커밋 참조는 SHA1 일 뿐이며 어떤 분기에 대한 사람이 읽을 수있는 세부 정보가 없으며 하위 모듈에서 직접 작업하려는 경우 올바른 분기를 수동으로 체크 아웃해야 할 수도 있습니다.

그러나이 패턴을 광범위하게 사용하지 않았기 때문에 귀하와 같은 대규모 프로젝트에 얼마나 많은 문제가 있는지 잘 모르겠습니다.


다른 대안은 일종의 종속성 관리자를 사용하는 것입니다. 이를 위해서는 각 모듈 또는 모듈 세트를 개별적으로 버전을 지정하고 패키지화하고 게시 할 수 있어야하며 원하는 때에 원하는 방식으로 해당 패키지를 함께 가져올 수있는 시스템이 있어야합니다.

pip를 이미 제안하고 있으며 제안에서 누락 된 것으로 보이는 것은 결과 요구 사항 .txt를 빌드와 함께 또는 루트 프로젝트 저장소에 저장하여 나중에 저장하지 않고 virtualenv를 다시 만들 수 있다는 것입니다 디스크에.

다른 시스템들도 있습니다; 필자는 약간 모듈화 된 Apache Ivy 버전을 각 모듈을 패키징 및 게시하는 도구로 사용하고 최종 프로젝트를 위해 함께 가져 오는 다소 큰 프로젝트를 설정했습니다. Ivy는 나중에 설정을 다시 작성해야하는 경우 참조하는 모든 모듈의 모든 버전을 나열하는 매니페스트도 저장합니다.

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