2009-04-28 28 views
23

Tôi đã nghe cụm từ "triển khai ứng dụng" nghe có vẻ tốt hơn/dễ hơn/đáng tin cậy hơn so với tải lên các tệp đã thay đổi riêng lẻ lên máy chủ, nhưng tôi không biết bắt đầu từ đâu.Làm thế nào để bắt đầu triển khai các ứng dụng PHP từ một kho lưu trữ lật đổ?

Tôi có một ứng dụng Zend Framework đang được kiểm soát phiên bản (trong kho lưu trữ Subversion). Làm thế nào để tôi đi về "triển khai" ứng dụng của tôi? Tôi nên làm gì nếu tôi có thư mục "tải lên" mà tôi không muốn ghi đè?

Tôi lưu trữ ứng dụng của mình thông qua bên thứ ba, vì vậy tôi không biết nhiều hơn FTP. Nếu bất kỳ điều nào liên quan đến việc đăng nhập vào máy chủ của tôi, vui lòng giải thích quy trình.

+0

Tôi thấy đây là một câu hỏi thú vị. Tôi sẽ không bao giờ thực hiện cập nhật tự động nhưng những gì tôi muốn có giống như bản sao trực tiếp đã được kiểm xuất mà tôi có thể chuyển đổi và tất cả ... thay vì có bản sao làm việc và sau đó tải lên từ đó lên máy chủ trực tiếp, tôi muốn để có bản sao 'đang hoạt động' trực tiếp trên máy chủ. đó có lẽ là cách nó được cho là nhưng tôi chưa bao giờ thử nó. – markus

+0

Tôi nhớ đã nghe thấy luồng chồng đó, đang thực hiện tương tự –

+1

Một podcast gần đây mà tôi đã nghe (từ ITC) về vấn đề này cũng đề cập đến mục nhập blog tại http://timothyfitz.wordpress.com/2009/02/10/continuous-deployment -at-imvu-do-the-không thể-năm mươi-lần-một-ngày/Tôi thích chỉ là một vài đẩy một tuần, nhưng sau đó, có thực sự chỉ là tôi phát triển. –

Trả lời

21

Tự động triển khai + chạy thử nghiệm đối với máy chủ dàn dựng được gọi là tích hợp liên tục. Ý tưởng là nếu bạn kiểm tra cái gì đó phá vỡ các bài kiểm tra, bạn sẽ nhận được thông báo ngay lập tức. Đối với PHP, bạn có thể muốn xem xét Xinc hoặc phpUnderControl

Bạn thường muốn chứ không phải muốn tự động triển khai sang sản xuất. Điều bình thường cần làm là viết một số tập lệnh tự động hóa tác vụ, nhưng bạn vẫn cần phải khởi tạo thủ công. Bạn có thể sử dụng các khung công tác như Phing hoặc các công cụ xây dựng khác cho điều này (Một lựa chọn phổ biến là Capistrano), nhưng bạn cũng có thể chỉ cần lắc vài tập lệnh shell lại với nhau. Cá nhân tôi thích thứ hai.

Các kịch bản mình có thể làm những việc khác nhau, tùy thuộc vào ứng dụng và thiết lập của bạn, nhưng một quá trình điển hình sẽ là:

  • ssh vào máy chủ sản xuất. Phần còn lại của các lệnh được chạy tại máy chủ sản xuất, thông qua ssh.
  • chạy svn export svn://path/to/repository/tags/RELEASE_VERSION /usr/local/application/releases/TIMESTAMP
  • dịch vụ dừng (Apache, daemon)
  • chạy unlink /usr/local/application/current && ln -s /usr/local/application/releases/TIMESTAMP /usr/local/application/current
  • chạy ln -s /usr/local/application/var /usr/local/application/releases/TIMESTAMP/var
  • chạy /usr/local/application/current/scripts/migrate.php
  • dịch vụ bắt đầu

(Giả sử bạn có ứng dụng của bạn trong /usr/local/application/current)

0

Điều đó tùy thuộc vào đơn đăng ký của bạn và mức độ thử nghiệm là bao nhiêu.

Nơi tôi làm việc mọi thứ được kiểm tra vào kho lưu trữ để xem xét và sau đó được phát hành.

Tự động cập nhật ra khỏi một kho lưu trữ sẽ không được thông minh cho chúng ta, như đôi khi chúng ta chỉ cần kiểm tra trong để các nhà phát triển khác có thể kéo một phiên bản mới hơn và hợp nhất có thay đổi trong.

Để làm những gì bạn đang nói về sẽ cần một số loại kiểm tra thứ hai vào và ra để cho phép cộng tác giữa các nhà phát triển trong khu vực kiểm tra chính. Mặc dù tôi không biết bất cứ điều gì về điều đó hoặc nếu nó thậm chí có thể.

Ngoài ra còn có vấn đề với phân nhánh và các tính năng tương tự khác cần được xử lý.

+0

Vâng, bạn có thể có một thẻ phát hành và một móc hậu cam kết chỉ triển khai các bản sửa đổi đã được gắn thẻ là ổn định. I E. cam kết, phân nhánh và gắn thẻ tất cả những gì bạn thích, nhưng chỉ triển khai khi từ khóa ổn định gặp phải. –

7

Tôi sẽ không đề xuất cập nhật tự động. Chỉ vì bài kiểm tra bài kiểm tra đơn vị của bạn không có nghĩa là ứng dụng của bạn hoạt động 100%. Điều gì sẽ xảy ra nếu ai đó kiểm tra tính năng mới ngẫu nhiên mà không có bất kỳ thử nghiệm đơn vị mới nào và tính năng này không hoạt động? Thử nghiệm đơn vị hiện tại của bạn có thể vượt qua, nhưng tính năng này có thể bị hỏng. Người dùng của bạn có thể thấy điều gì đó được thực hiện một nửa. Với việc triển khai tự động từ khi đăng ký, bạn có thể không nhận thấy trong vài giờ nếu có điều gì đó khiến nó hoạt động mà không nên có.

Dù sao đi chăng nữa, việc triển khai tự động sẽ không khó nếu bạn thực sự muốn. Bạn cần có móc đăng ký và thực sự các bước sẽ là:

1) Thực hiện xuất từ ​​lần đăng ký mới nhất 2) Tải lên xuất sang máy chủ sản xuất 3) Giải nén/định cấu hình mới đã tải lên xuất khẩu

Tôi luôn thực hiện các bước cuối cùng theo cách thủ công. Nói chung nó đơn giản như SVN xuất khẩu, zip, tải lên, giải nén, cấu hình, và hai bước cuối cùng tôi chỉ cần bí danh một vài lệnh bash với nhau để thực hiện. Sau đó, tôi trao đổi thư mục ứng dụng gốc với thư mục mới, đảm bảo tôi giữ thư mục cũ xung quanh dưới dạng bản sao lưu và rất tốt để thực hiện.

Nếu bạn tự tin về khả năng phát hiện lỗi trước khi chúng tự động hoạt động, bạn có thể xem xét tự động hóa quy trình đó. Nó mang lại cho tôi những jibly-jibblies mặc dù.

+2

Tôi đồng ý với đề xuất của bạn về cập nhật tự động. Tuy nhiên, tôi sẽ thay thế quy trình cập nhật thủ công của bạn bằng một số quy trình tự động. Các bước ít hơn, ít có thể đi sai. Chúng tôi thực hiện hàng chục lần triển khai mỗi ngày và tự động hóa nó càng nhiều càng tốt để giảm lỗi. Tôi có thể khuyên bạn nên Webistrano cho điều này, mà chủ yếu là các bước của bạn, nhưng tự động và linh hoạt hơn nhiều. Nếu nhu cầu của bạn đơn giản hơn, một tập lệnh sử dụng rsync có thể rất hay. –

5

Đây là một bài viết tuyệt vời về cách sử dụng Subversion để triển khai các dự án web - nó trả lời nhiều câu hỏi của bạn.

http://athleticsnyc.com/blog/entry/on-using-subversion-for-web-projects

+0

đó là một bài viết hay! – Andrew

+0

Bài viết đó chủ yếu là về lợi ích của Subversion và kiểm soát phiên bản, và hầu như không chạm vào phương pháp triển khai. Đó chắc chắn là giá trị đọc mặc dù. –

+1

Liên kết hiện bị hỏng. ;-(Không thể tìm thấy phiên bản mới trên - rõ ràng - [blog được thiết kế lại] của họ (http://blog.athleticsnyc.com/). Đã liên kết? –

1

Đây là thứ bạn gọi là "Tích hợp liên tục". Atlassian Bamboo (chi phí), Sun Hudson (miễn phí) và Cruise Control (miễn phí) là tất cả các tùy chọn phổ biến (theo thứ tự ưu tiên của tôi) và hỗ trợ xử lý đầu ra PHPUnit (vì PHPUnit hỗ trợ đầu ra JUnit).

Công cụ triển khai có thể được thực hiện bằng trình kích hoạt trình tạo bài đăng. Giống như một số người khác về chủ đề này, tôi sẽ thận trọng trước khi thực hiện triển khai tự động trên checkin (và kiểm tra đi qua).

1

Để xử lý tải lên, giải pháp cổ điển là di chuyển thư mục thực ra khỏi không gian web chính, chỉ để phiên bản mới được kiểm tra (như tôi làm trong tập lệnh bên dưới) và sau đó sử dụng Apache để 'Bí danh' trở lại vị trí như một phần của trang web.

Alias /uploads /home/user/uploads/ 

Có ít sự lựa chọn hơn cho bạn nếu bạn không có nhiều quyền kiểm soát máy chủ.

Tôi có một tập lệnh mà tôi sử dụng để triển khai một tập lệnh cụ thể cho các trang web phát triển/trực tiếp (cả hai đều chạy trên cùng một máy chủ).

#!/bin/sh 

REV=2410 
REVDIR=$REV.20090602-1027 

REPOSITORY=svn+ssh://[email protected]/var/svn/website.com/trunk 
IMAGES=$REVDIR/php/i 
STATIC1=$REVDIR/anothersite.co.uk 

svn export --revision $REV $REPOSITORY $REVDIR 

mkdir -p $REVDIR/tmp/templates_c 
chown -R username: $REVDIR 
chmod -R 777  $REVDIR/tmp $REVDIR/php/cache/ 
chown -R nobody: $REVDIR/tmp $REVDIR/php/cache/ $IMAGES 
dos2unix $REVDIR/bin/*sh $REVDIR/bin/*php 
chmod 755 $REVDIR/bin/*sh $REVDIR/bin/*php 

# chmod -x all the non-directories in images 
find $IMAGES -type f -perm -a+x | xargs -r chmod --quiet -x 
find $STATIC1 -type f -perm -a+x | xargs -r chmod --quiet -x 

ls -l $IMAGES/* | grep -- "-x" 

rm dev && ln -s $REVDIR dev 

Tôi đặt số phiên bản và ngày/giờ được sử dụng cho tên thư mục đã chọn. Chmod ở giữa cũng làm cho quyền truy cập vào các hình ảnh là OK vì chúng cũng được symlinked đến máy chủ hình ảnh chuyên dụng của chúng tôi.

Điều cuối cùng xảy ra là liên kết tượng trưng cũ .../trang web/dev/được liên kết lại với thư mục mới được đăng xuất. Cấu hình Apache sau đó có một doc-root của .../website/dev/htdocs/

Cũng có một .../website/live/htdocs/docroot, và một lần nữa, 'live' là một symlink khác. Đây là kịch bản khác của tôi sẽ xóa liên kết tượng trưng trực tiếp và thay thế bằng bất kỳ điểm dev nào.

#!/bin/sh 
# remove live, and copy the dir pointed to by dev, to be the live symlink 
rm live && cp -d dev live 

tôi chỉ đẩy một phiên bản mới của trang web mỗi vài dats, vì vậy bạn có thể không muốn sử dụng này nhiều lần trong ngày (cache APC tôi không muốn nhiều hơn một vài phiên bản của trang web xung quanh), nhưng đối với tôi, tôi thấy điều này là rất nhiều vấn đề miễn phí cho việc triển khai của riêng tôi.

4

Tại công ty webdev tôi, chúng tôi vừa mới bắt đầu sử dụng Webistrano, đó là một giao diện Web để công cụ Capistrano phổ biến.

Chúng tôi muốn có công cụ triển khai nhanh, dễ sử dụng với giao diện tập trung, trách nhiệm giải trình (người triển khai phiên bản nào), quay lại phiên bản trước và tốt nhất là miễn phí. Capistrano nổi tiếng là một công cụ triển khai cho các ứng dụng Ruby on Rails, nhưng không tập trung và nhắm mục tiêu chủ yếu đến các ứng dụng Rails. Webistrano tăng cường nó bằng GUI, trách nhiệm giải trình và thêm hỗ trợ cơ bản cho việc triển khai PHP (sử dụng kiểu dự án 'tệp thuần túy').

Webistrano chính là ứng dụng Ruby on Rails, mà bạn cài đặt trên máy chủ phát triển hoặc dàn dựng. Bạn thêm một dự án cho mỗi trang web của bạn. Để mỗi dự án bạn thêm các giai đoạn, chẳng hạn như Prod và Dev.

Mỗi giai đoạn có thể có các máy chủ khác nhau để triển khai và các cài đặt khác nhau. Viết (hoặc sửa đổi) một 'công thức', đó là một kịch bản ruby ​​nói với capistrano phải làm gì. Trong trường hợp của chúng tôi, tôi chỉ sử dụng công thức được cung cấp và thêm lệnh để tạo liên kết tượng trưng đến thư mục tải lên được chia sẻ, giống như bạn đã đề cập.

Khi bạn bấm Triển khai, Webistrano SSH vào (các) máy chủ từ xa, thực hiện thanh toán svn và bất kỳ tác vụ nào khác mà bạn yêu cầu như di chuyển cơ sở dữ liệu, liên kết hoặc dọn dẹp các phiên bản trước. Tất cả điều này có thể được tinh chỉnh tất nhiên, sau khi tất cả, nó chỉ đơn giản là kịch bản.

Chúng tôi rất hài lòng với nó, nhưng tôi mất một vài ngày để tìm hiểu và thiết lập, đặc biệt là vì tôi không quen thuộc với Ruby và Rails. Tuy nhiên, tôi có thể khuyên bạn nên sử dụng sản phẩm trong các công ty vừa và nhỏ, vì nó đã được chứng minh rất đáng tin cậy, linh hoạt và đã tiết kiệm cho chúng tôi nhiều lần đầu tư ban đầu. Không chỉ bằng cách đẩy nhanh tiến độ triển khai, mà còn bằng cách giảm thiểu sai sót/tai nạn.

1

Sau 3 năm, tôi đã học được một chút về các phương pháp hay nhất về triển khai. Tôi hiện đang sử dụng một công cụ gọi là Capistrano vì nó dễ cài đặt và sử dụng, và nó độc đáo xử lý rất nhiều mặc định.

Những điều cơ bản của một quá trình triển khai tự động đi như thế này:

  1. Mã của bạn đã sẵn sàng cho sản xuất, vì vậy nó được gắn thẻ với các phiên bản của phiên bản: v1.0.0
  2. Giả sử bạn đã đã định cấu hình tập lệnh triển khai của bạn, bạn chạy tập lệnh, chỉ định thẻ bạn vừa tạo.
  3. Kịch bản SSH của hơn đến máy chủ sản xuất của bạn trong đó có các cấu trúc thư mục sau:

    /your-application 
        /shared/ 
         /logs 
         /uploads 
        /releases/ 
         /20120917120000 
         /20120918120000 <-- latest release of your app 
          /app 
          /config 
          /public 
          ...etc 
        /current --> symlink to latest release 
    
    Your Apache document root should be set to /your-application/current/public 
    
  4. Các kịch bản tạo ra một thư mục mới trong thư mục phát hành với datetime hiện hành. Bên trong thư mục đó, mã của bạn được cập nhật thành thẻ bạn đã chỉ định.

  5. Sau đó, liên kết tượng trưng ban đầu bị xóa và một liên kết tượng trưng mới được tạo, chỉ vào bản phát hành mới nhất.

Những thứ cần lưu giữ giữa các bản phát hành nằm trong thư mục được chia sẻ và liên kết tượng trưng được tạo cho các thư mục được chia sẻ đó.

+0

Tôi nghe một phản đối về các liên kết tượng trưng trong triển khai ứng dụng PHP: ứng dụng Điều này dẫn đến những thay đổi không tương thích được sử dụng cho một số lượng nhỏ người dùng (và PHP sẽ không biết về điều này như trước và sau khi các trạng thái cho mỗi Nó sẽ được an toàn hơn để kịch bản lại thế hệ của một tập tin cấu hình Apache vhost để trỏ trực tiếp đến đường dẫn phát hành, và sau đó làm một duyên dáng 'tải lại'? – halfer

Các vấn đề liên quan