선호하는 PHP 배포 전략은 무엇입니까? [닫은]


161

PHP로 새 프로젝트를 시작하고 있으며 PHP 배포 전략에 대해 다른 개발자들로부터 피드백을 받고 싶습니다. 변경 사항이 커밋되면 개발 또는 프로덕션 서버로 신속하게 마이그레이션 할 수 있도록 작업을 약간 자동화하고 싶습니다.

Ruby와 함께 Capistrano를 사용한 배포 및 일부 기본 셸 스크립팅 경험이 있습니다.

내가 먼저 머리를 치기 전에 다른 사람들이 프로젝트에서 어떻게 접근했는지 들어 보는 것이 좋을 것입니다.

추가 정보

현재 개발자는 사이트의 로컬 설치 작업을 수행하고 하위 버전 저장소에 변경 사항을 커밋합니다. svn에서 태그가 지정된 릴리스를 내보내고 서버에 업로드하여 초기 배포를 수행합니다.

추가 된 변경은 일반적으로 변경된 파일을 수동으로 업로드하여 부분적으로 이루어집니다.


귀여운 :) 편집 splattne 주셔서 감사합니다.
GloryFish

1
@Paul Tomblin : 세상에 나는 웃을 수 없어 !!!!! 더 좋은 방법은 없습니다 :)
Andrei Rînea

답변:


109

PHP의 경우 Phing 빌드 스크립트가있는 SVN을 사용하는 것이 좋습니다 . Phing은 ANT 와 비슷 하지만 PHP로 작성 되었으므로 PHP 개발자가 자신의 요구에 맞게 수정하기가 훨씬 쉽습니다.

우리의 배포 루틴은 다음과 같습니다.

  • 모든 사람은 직장에서 동일한 로컬 서버에서 개발하며 모든 개발자는 자신의 컴퓨터에서 집으로 체크 아웃 할 수 있습니다.
  • 커밋은 준비 서버를 업데이트하는 커밋 후 후크를 트리거합니다.
  • 테스트가 통과되면 스테이징 서버에서 실행됩니다. 계속하십시오.
  • Phing 빌드 스크립트가 실행되었습니다.
  • 도메인을 "공사 중"페이지로 전환하여 프로덕션 서버를 중단시킵니다.
  • 생산 체크 아웃시 SVN 업데이트 실행
  • 스키마 델타 스크립트를 실행합니다
  • 테스트 실행
  • 테스트에 실패한 경우 롤백 스크립트를 실행하십시오.
  • 테스트가 통과되면 서버는 프로덕션 체크 아웃으로 다시 라우팅됩니다.

Continuous Integration 서버 인 phpUnderControl 도 있습니다 . 나는 웹 프로젝트가 정직하다는 것이 그다지 유용하지 않다는 것을 알았습니다.


Windows / .NET 상점에서 내가하는 일의 목록을 게시하려고했지만 여기에있는 것이 다소 적습니다. +1
Daniel Schaffer

svn co를 프로덕션 환경으로 사용하는 데 단점이 있습니까? 나는 실제로 어떤 단점도 생각할 수 없지만 svn co를 생산으로 사용하는 것이 "깨끗한"것 같지 않습니까? 왜 svn 내보내기 또는 rsync가 아닌가?
ChrisR

공동과 내보내기의 기본 차이로 인해 특정 변경 사항을 푸시 할 수 없으므로 전체 애플리케이션을 다시 내 보내야합니다. 인생을 훨씬 쉽게 만드는 것은 매우 중요한 차이점입니다.
Eran Galperin

36
사이트를 화면에 올리는 이유는 무엇입니까? releases /의 디렉토리를 실행하고 releases /의 폴더에 대한 심볼릭 링크를 통해 liveSite /를 가리키면 사이트를 새 릴리스 / 폴더로 완전히 체크 아웃하고 공동 작업이 완료되면 심볼릭 링크를 즉시 뒤집을 수 있습니까? 다운 링크가 필요하지 않습니다 (symlink 스위치 동안 요청을하는 빈약 한 sob가 아닌 한).
Joseph Lust

2
프로덕션에서 SVN 업데이트 및 새 릴리스에서 심볼릭 링크와 같은 모든 작업을 수행하는 담당자는 누구입니까? 핑인가요? 젠킨스 야?
다니엘 리베이로

24

현재 Git을 사용하여 PHP 배포하고 있습니다. 간단한 git push 프로덕션이 Git의 최신 사본으로 프로덕션 서버를 업데이트하는 데 필요한 전부입니다. Git이 전체 프로젝트가 아닌 diff 만 보낼 수있을 정도로 똑똑하기 때문에 쉽고 빠릅니다. 또한 하드웨어 오류가 발생할 경우 웹 서버에 리포지토리의 중복 복사본을 유지하는 데 도움이됩니다 (물론 안전을 위해 GitHub로 푸시).


나는 중소 규모의 프로젝트에서도 수년간 같은 일을 해왔습니다. 나는 그것이 나를 위해 훌륭하게 일하고 있다고 말해야합니다. 이 접근 방식의 단순성을 좋아해야합니다.
크리스 알렌 레인

3
이 방법으로 데이터베이스를 어떻게 처리합니까?
32423hjh32423

1
@neilc 불행히도 손으로. 푸시하기 전에 DB에 대한 모든 변경 사항을 수동으로 수행해야합니다.
Kyle Cronin

나는 보통 DB 설정을 포함하는 PHP 파일을 include ()하고 수동으로 파일을 서버 나 테스트 머신에 놓는다. 그렇게하면 git에 암호를 저장하지 않고 실수로 프로덕션 데이터베이스에서 작동하지 않습니다.
Matt

이것을 위해 git을 어떻게 구성합니까? 가이드 / 튜토리얼이 있습니까? 미리 감사드립니다.
미구엘 스티븐스

14

우리는 Capistrano를위한 웹 프론트 엔드 인 Webistrano를 사용 하며 매우 만족합니다.

Webistrano는 SVN, GIT 등의 다단계, 다중 환경 배포를 지원합니다. 롤백 지원 기능이 내장되어 있으며 웹, db, 앱 등과 같은 별도의 서버 역할을 지원하며 병렬로 배포됩니다. 스테이지와 같은 여러 레벨에서 구성 매개 변수를 대체하고 모든 배치 결과를 로그 (선택적으로 메일 발송) 할 수 있습니다.

Capistrano와 Webistrano는 Ruby 애플리케이션이지만, 배포 '레시피'의 구문은 모든 PHP 프로그래머가 이해할 수있을만큼 쉽고 강력합니다. 원래 Capistrano는 Ruby on Rails 프로젝트를 위해 제작되었지만 PHP 프로젝트를 쉽게 수용 할 수 있습니다.

일단 구성되면 스테이징 버전을 배포하는 테스터와 같은 프로그래머가 아닌 사람도 사용할 수 있습니다.

가장 빠른 배치를 제공하기 위해 원격 서버에서 svn 작업 복사 캐시를 업데이트 한 다음 결과를 하드 링크로 연결하는 fast_remote_cache 메소드를 설치했습니다 .


7

Apache Ant 를 사용 하여 다른 대상 (dev, QA 및 live)에 배포합니다. Ant는 Java 배치를 위해 작동하도록 설계되었지만 임의의 파일을 배치하는 데 유용한 유용한 일반 사례 솔루션을 제공합니다.

build.xml 파일의 구문은 배우기 매우 쉽습니다. 명령 줄에서 ant 프로그램을 호출 할 때 실행되는 다른 대상 및 해당 종속성을 정의합니다.

예를 들어 dev, QA 및 live에 대한 대상이 있습니다. 각 대상은 CVS 서버에서 최신 헤드 개정을 확인하고 해당 파일을 빌드 디렉토리에 복사합니다 (fileset 태그 사용) .cvsbuild 대상에 따라 다릅니다. 빌드 디렉토리를 적절한 서버로 rsync합니다. 배워야 할 몇 가지 단점이 있으며 학습 곡선은 완전히 평평하지는 않지만 수년간 문제 없이이 방법을 사용 해 왔으므로 상황에 따라 추천하고 싶습니다. 다른 답변은 궁금합니다. 이 스레드에서 볼 수 있습니다.


6

Git을 사용하여 수동으로 작업합니다. 개발을위한 하나의 저장소 ( git push --mirror공개 저장소로 가져오고 라이브 서버는 그 중 세 번째 저장소입니다). 내가 생각하는이 부분은 자신의 설정과 동일합니다.

가장 큰 차이점은 내가하고있는 거의 모든 변경 사항에 대해 지점을 사용한다는 것입니다 (지금은 약 5가 있습니다). 마스터 브랜치는 다른 브랜치를 병합하는 것을 제외하고 직접 변경되지 않습니다.

마스터 지점에서 직접 라이브 서버를 실행하고 다른 지점으로 작업을 마치고 병합 할 준비가되면 서버를 해당 지점으로 잠시 동안 뒤집습니다. 고장이 나면 다시 마스터로 되 돌리는 데 몇 초가 걸립니다. 작동하면 마스터로 병합되고 라이브 코드가 업데이트됩니다. SVN에서 이것의 비유는 두 개의 작업 사본이 있고 심볼릭 링크를 통해 실제 사본을 가리키고 있다고 가정합니다.


3

나는 Phing 이 몇 번 언급되었다는 것을 알고 있지만 phpUnderControl 과 함께 행운을 빕니다 . 우리를 위해

  1. 로컬 머신에 대한 개별 브랜치 사본 확인
  2. 지점을 테스트 한 후 트렁크에 병합
  3. 트렁크에 대한 커밋은 phpUnderControl에 의해 자동으로 빌드되고, 테스트를 실행하고 모든 문서를 작성하며 데이터베이스 델타를 적용합니다
  4. 트렁크는 품질 테스트를 거친 후 안정적인 지점으로 통합
  5. phpUnderControl은 자동으로 Stable을 빌드하고 테스트를 실행하며 문서를 생성하고 데이터베이스를 업데이트합니다.
  6. 프로덕션으로 푸시 할 준비가되면 프로덕션을 백업하고 데이터베이스를 업데이트 한 다음 파일을 푸시하는 rsync 스크립트를 실행합니다. rsync 명령은 손으로 호출되므로 누군가 프로모션을보고 있는지 확인할 수 있습니다.

5
phpUnderControl이 죽었습니다 : |
m02ph3u5 2016 년

3

집에서 만든 배포 스크립트의 대안은 많은 작업을 추상화하는 서비스 형 플랫폼에 배포하는 것입니다. PaaS는 일반적으로 자체 코드 배포 도구와 스케일링, 내결함성 (예 : 하드웨어 장애시 다운되지 않음), 일반적으로 모니터링, 로그 확인 등을위한 훌륭한 툴킷을 제공합니다. 좋은 구성으로 시간이 지남에 따라 최신 상태로 유지됩니다 (두 번 덜 골치 아파).

내가 추천하는 PaaS는 dotCloud 이며 PHP 외에도 ( PHP 빠른 시작 참조 ) MySQL, MongoDB 및 추가 서비스를 배포 할 수 있습니다. 또한 다운 타임없는 배포, 즉각적인 롤백, SSL 및 웹 소켓에 대한 완벽한 지원 등과 같은 유용한 기능이 있습니다. 또한 항상 좋은 프리 티어가 있습니다. :)

물론 거기에서 일한 후 약간 편견이 있습니다! dotCloud 외에도 체크 아웃 할 가치가있는 다른 옵션은 Pagodabox 및 Orchestra (현재 Engine Yard의 일부)입니다.

도움이 되었기를 바랍니다!

솔로몬


2

리포지토리에서 프로덕션 서버로 자동 및 맹목적으로 변경하면 위험하게 들립니다. 커밋 된 코드에 회귀 버그가 포함되어 프로덕션 응용 프로그램에 문제가 생기면 어떻게해야합니까?

그러나 PHP 용 Continuous Integration 시스템을 원한다면 Phing 이 PHP에 가장 적합한 선택 이라고 생각 합니다. scp와 같은 수동 방법을 사용하기 때문에 직접 테스트하지는 않았습니다.


2

나는 파티에 늦었지만, 나는 우리의 방법을 공유 할 것이라고 생각했다. 우리는 Phingistrano와 함께 Phing을 사용하는데 , 이는 사전 빌드 된 빌드 파일을 통해 Capistrano와 같은 기능을 Phing에 제공합니다. 매우 멋지지만 현재 Git을 사용하는 경우에만 작동합니다.


1

서버에 SVN 릴리스 분기의 작업 사본이 있습니다. SVN 업데이트 명령을 실행하는 것처럼 사이트를 업데이트하는 것 (스키마 변경이없는 경우)이 쉽습니다. 사이트를 오프라인으로 만들 필요조차 없습니다.


1
사이트 전체에 .svn 디렉토리가 흩어져 있습니까? 나의 순수 주의자 두뇌는 이것에 반대한다 :)
Stann

소스 코드 만 처리합니다. 데이터베이스 변경 사항을 적용, 캐시가 지워 등 - 배포는 종종 다른 조치가 취해 필요
레오 니드 Mamchenkov을

1

XML 구성 파일의 고통을 견딜 수 있다면 Phing이 가장 좋은 방법 일 것입니다. Symfony 프레임 워크에는 고유 한 레이크 포트 (pake)가있어 잘 작동하지만 나머지 Symfony와 밀접하게 연결되어 있습니다 (아마도 분리 할 수는 있음).

또 다른 옵션은 Capistrano를 사용하는 것입니다. 분명히 루비와 마찬가지로 PHP와 통합되지는 않지만 많은 용도로 사용할 수 있습니다.

마지막으로, 항상 쉘 스크립트를 작성할 수 있습니다. 지금까지 내가 한 일입니다.



1

1 년 늦었지만 ... 제 경우에는 배포가 자동이 아닙니다. 코드를 배포하고 데이터베이스 마이그레이션 스크립트를 자동으로 실행하는 것이 위험하다는 것을 알았습니다.

대신 Subversion 후크는 테스트 / 스테이징 서버에만 배포하는 데 사용됩니다. 테스트를 실행하고 작업이 완료된 후 반복이 끝나면 프로덕션에 코드가 배포됩니다. 배포 자체로는 rsync를 사용하여 파일을 전송하는 맞춤형 Makefile을 사용합니다. Makefile은 원격 서버에서 마이그레이션 스크립트를 실행하고 웹 및 데이터베이스 서버를 일시 중지 / 다시 시작할 수도 있습니다.


1

내 작업에서 필자와 팀은 capistrano의 배포를위한 Phing 지향 대체물을 개발했으며, PHPUnit 테스트, phpcs 및 PHPDocumentor와 같은 phing에서 사용할 수있는 몇 가지 장점을 통합했습니다. git의 하위 모듈로 프로젝트에 추가 할 수있는 git repo를 만들었으며 매우 잘 작동합니다. 나는 그것을 소수의 프로젝트에 첨부했으며 모듈화되어있어 여러 환경 (스테이지, 테스트, 생산 등)의 모든 프로젝트에서 쉽게 작동 할 수 있습니다.

phing 빌드 스크립트를 사용하면 명령 줄에서 수동으로 스크립트를 실행할 수 있으며 Hudson과 Jenkins ci를 사용하여 빌드 / 배치 루틴을 자동화하는 데 성공했습니다.

레포지토리가 아직 공개되지 않았기 때문에 지금 링크를 게시 할 수는 없지만 곧 오픈 소스를 제공 할 것이라고 들었습니다. 관심이 있거나 관심이 있으시면 언제든지 저에게 연락하십시오 phing 및 git을 사용한 배포 자동화에 대한 질문


0

SVN 배포 방법이 좋지 않은 것 같습니다. 때문에:

전 세계에 대한 SVN 액세스를 열어야합니다

프로덕션 웹 서버에 많은 .svn이 있습니다.

나는 Phing이 브랜치를 생성하고 모든 js / css를 결합하고 모든 www 서버에 스테이지 구성을 바꾸고 ssh를 업로드하는 것이 더 좋은 방법이라고 생각합니다.

ssh to 10 www 서버 및 svn up도 문제가 있습니다.


내 svn 서버를 전 세계에 공개합니다. SSL을 통한 방화벽 및 인증을 사용하여 코드를 볼 수있는 사람을 제한하십시오.
Shadok
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.