길고 힘든 한 달 동안 다른 일을 시도하고 깨달을 때마다 물린 후,
Heroku는 배포 메커니즘으로 git 저장소를 사용하기 때문에이를 git 저장소로 취급해서는 안됩니다.
그것은 rsync 일 수도 있었을 것입니다. 그들은 git로갔습니다. 이것 때문에 산만하지 마십시오.
그렇게한다면 모든 종류의 상처를 입을 수 있습니다. 앞서 언급 한 모든 솔루션은 어딘가에서 비참하게 실패합니다.
- 매번 또는 주기적으로 수행해야하거나 예기치 않은 일이 발생해야합니다 (하위 모듈 푸시, 하위 트리 동기화 등).
- 예를 들어 코드를 모듈화하기 위해 엔진을 사용하면 Bundler가 당신을 죽일 것입니다. 이에 대한 좋은 해결책을 찾기 위해 그 프로젝트에 대해 내가 겪었던 좌절의 정도를 설명하는 것은 불가능합니다
- 엔진을 git repo 링크 +
bundle deploy
-실패, 매번 번들 업데이트해야합니다.
- 엔진을
:path
+ bundle deploy
-실패 로 추가하려고 하면 개발 팀은 :path
옵션을 "이 gem 옵션과 함께 Bundler를 사용하지 않습니다"로 간주 하므로 프로덕션 용으로 번들로 제공되지 않습니다.
- 또한 엔진을 새로 고칠 때마다 레일 스택을 업데이트하려고합니다. -_-
- 내가 찾은 유일한 해결책
/vendor
은 개발시 심볼릭 링크로 엔진을 사용 하고 실제로 프로덕션을 위해 파일을 복사하는 것입니다.
해결책
문제의 앱에는 git root에 4 개의 프로젝트가 있습니다.
- api-프로필에 따라 2 개의 다른 heroku 호스트에서 실행됩니다-업로드 및 API
- web-웹 사이트
- web-old-이전 웹 사이트, 아직 마이그레이션 중
- common-엔진에서 추출 된 공통 구성 요소
모든 프로젝트에는 엔진 vendor/common
의 루트를 보는 심볼릭 링크 가 있습니다 common
. heroku에 배포하기 위해 소스 코드를 컴파일 할 때 심볼릭 링크를 제거하고 rsync해야합니다. 코드는 물리적으로 각 개별 호스트의 공급 업체 폴더에 있습니다.
- 호스트 이름 목록을 인수로받습니다.
- 개발 리포지토리에서 git push를 실행 한 다음 별도의 폴더에서 깨끗한 git pull을 실행하여 더티 (커밋되지 않은) 변경 사항이 호스트에 자동으로 푸시되지 않도록합니다.
- 호스트를 병렬로 배포합니다-모든 heroku git repo가 풀리고 새 코드가 올바른 위치로 rsync되고 git commit 주석의 기본 푸시 정보로 커밋됩니다.
- 결국, 우리는 컬과 함께 핑을 보내서 취미 주인에게 일어나서 모든 것이 와인이되었는지 확인하기 위해 통나무를 꼬리를 달도록 지시합니다.
- 젠킨스와도 잘 어울립니다 : D (성공적인 테스트 후 테스트 서버로 자동 코드 푸시)
이제 6 개월 동안 최소한의 (아니요?) 문제로 야생에서 매우 잘 작동합니다.
다음은 스크립트 https://gist.github.com/bbozo/fafa2bbbf8c7b12d923f입니다.
업데이트 1
@AdamBuczynski, 결코 그렇게 간단하지 않습니다.
첫째, 최소한 프로덕션 및 테스트 환경은 항상 있어야하며, 더 나쁜 경우에는 기능별 클러스터가 많이 있습니다. 갑자기 1 개의 폴더가 매우 기본적인 요구 사항으로 n heroku 프로젝트에 매핑되어야하며 모든 것이 어떻게 든 구성되어야합니다. 스크립트는 배포 할 소스를 "인식"합니다.
두 번째로, 프로젝트간에 코드를 공유하고 싶을 것입니다. 이제 sync_common
개발중인 심볼릭 링크가 포함 된 shennanigans가 Heroku에서 실제 rsynced 코드로 대체됩니다. 공통 스레드를 보석으로 추출하고 싶습니다.
세 번째로 CI를 연결하고 하위 폴더와 git repo를 구성하는 방법이 약간 변경되며, 결국 가장 간단한 사용 사례에서 앞서 언급 한 요점으로 끝납니다.
다른 프로젝트에서는 Java 빌드를 연결해야합니다. 소프트웨어를 여러 클라이언트에 판매 할 때 설치 요구 사항 및 기타 사항에 따라 설치되는 모듈을 필터링해야합니다.
나는 정말로 Rakefile이나 무언가로 묶는 것을 탐구하고 그런 식으로 모든 것을해야합니다 ...