코드 변경으로 라이브 웹 사이트를 어떻게 업데이트합니까?


21

나는 이것이 매우 기본적인 질문이라는 것을 알고 있습니다. 누군가가 나를 유머하고 어떻게 처리 할 수 ​​있는지 말해 주면, 나는 위대 할 것입니다.

아래 문제를 해결하기 위해 SynchToy를 설치하려고하기 때문에 이것을 게시하기로 결정했으며 "Toy"를 사용하여 약간 전문가가 아닌 느낌이 들지만 더 나은 방법을 생각할 수 없습니다.

이 상황에 처했을 때 여러 번 아는 것은 고통스럽고 분명한 방법이 없다는 것입니다. 이것은 회사의 유일한 개발자라는 데 있습니다.

  • 업무용 컴퓨터에서 개발 된 ASP.NET 웹 응용 프로그램
  • 솔루션에는 두 가지 프로젝트가 있습니다.
    • 웹 사이트 (파일)
    • WebsiteLib (C # / dll)
  • Git 리포지토리 사용
  • GoGrid 2008R2 웹 서버에 배포

전개:

  1. 코드를 변경하십시오.
  2. 힘내로 밀어 넣습니다.
  3. 원격 데스크톱 대 서버.
  4. 힘내에서 당겨 라.
  5. Windows 탐색기로 드래그 / 드롭하여 라이브 파일을 덮어 씁니다.

5 단계에서 웹 사이트 루트에서 모든 파일을 삭제합니다.. 이것은 좋은 일이 아닙니다. 그래서 SynchToy를 설치하려고합니다 ...

업데이트 : 모든 유용한 응답에 감사드립니다. 웹 배포를 사용하는 사이에 답변을 표시 할 것을 선택할 수 없습니다. 몇 가지 유용한 제안이있는 것처럼 보입니다.

  1. 웹 프로젝트 = 전체 사이트가 단일 DLL로 패키지되어 있습니다-단점은 간단한 업데이트를 푸시 할 수 없습니다-50 대의 회사에서 고독한 개발자이기 때문에 때로는 더 간단한 것입니다.
  2. SCM에서 사이트의 루트 웹 사이트로 직접 가져 오기-원래 SCM 숨겨진 디렉토리가 노출 될 수 있다는 두려움 에서이 작업을 수행하지는 않았지만 여기에 대한 답변은 여전히 ​​그것을 극복하는 데 도움이되었습니다. 시간이 지나도 여전히 사실인지 확인하는 것을 잊어 버릴 염려가 더 많습니다)
  3. 웹 팜을 사용하고 노드에 체계적으로 배포-다운 타임 제로에 이상적인 솔루션입니다.이 사이트는 본질적으로 회사의 실시간 수익원이므로 실제로 관심이있는 부분입니다. 서버 비용을 두 배로 늘립니다.

-> 마지막으로, 사이트에 대해 한 번의 클릭으로 배포해야한다는 기본 원칙을 다시 강화하거나 잘못된 것이있을 수 있습니다.

업데이트 2 : 이 문제로 돌아와서 몇 달 동안 존재하고 완벽하게 작동하는 실제 솔루션으로 업데이트한다고 생각했습니다 (단일 웹 서버 솔루션).

내가 사용하는 프로세스는 다음과 같습니다

  1. 코드 변경
  2. 힘내다
  3. 원격 데스크톱 대 서버
  4. 힘내에서 당겨
  5. 다음 배치 스크립트를 실행하십시오.

    cd C : \ 사용자 \ 관리자

    % systemroot % \ system32 \ inetsrv \ appcmd.exe 중지 사이트 "/site.name : 기본 웹 사이트"

    robocopy Documents \ code \ da \ 1 \ work \ Tree \ LendingTreeWebSite1 c : \ inetpub \ wwwroot / E / XF connectionsconfig Web.config

    % systemroot % \ system32 \ inetsrv \ appcmd.exe 시작 사이트 "/site.name : 기본 웹 사이트"

보시다시피 사이트가 다운되고 robocopy를 사용하여 변경된 파일을 지능적으로 복사 한 다음 사이트를 다시 시작합니다. 일반적으로 2 초 이내에 실행됩니다. 이 사이트의 최대 트래픽은 초당 약 2 건이므로 사이트 업데이트 당 4 건의 누락 요청이 허용됩니다.

Sit 나는 Git에 더 능숙 해졌다. 위의 첫 4 단계가 "수동 프로세스"인 것도 가능하다는 것을 알았지 만, 원한다면 모든 것을 한 번의 클릭으로 롤백 할 수 있다고 확신한다.

AppCmd.exe에 대한 설명서는 여기에 있습니다 . Robocopy 설명서는 여기에 있습니다 .


6
serverfault에 더 적합합니다.
Karl Bielefeldt

원하는 경우 배포를 스크립팅 할 수있는 방식으로 원격 데스크톱을 사용하는 대신 서버에 SSH로 연결하는 것을 고려해야합니다.
Malfist

5
나는이 질문이 여기 머무르는 것이 좋다고 생각한다. 웹 사이트 배포는 sysadmin 작업 이상의 개발자 관심사처럼 보이지만 회사마다 다를 수 있습니다. 여전히 개발자 중심의 모든 답변.
Adam Lear

1
@Malfist-Windows 서버에 정확히 어떻게 ssh가 있습니까?
와이엇 바넷

@Wyatt 원격 시스템에서 SSH 서버를 실행하면 (거의) Linux 상자에서와 동일합니다.
Adam Lear

답변:


3

VS 2010의 웹 배포를 확인해야합니다. GoGrid가 지원하는 경우 웹 배포 패키지가 좋은 솔루션입니다.

http://weblogs.asp.net/scottgu/archive/2010/07/29/vs-2010-web-deployment.aspx


웹 배포를 사용하면 핫픽스 옵션이 손실됩니다. 나는 공식적인 과정 밖에서 무언가를하고 싶지 않은 사람들이 많이 있다는 것을 알고 있지만 비상 사태에 대한 선택권을 갖는 것을 좋아합니다 ...
Aaron Anodide

당신은 좋은 지적입니다. 회사에서 변경 사항을 추적 할 수 없기 때문에 사람들이 그렇게하지 않기를 바랍니다. 개인 사이트의 경우 실제로 해당 옵션을 사용하는 것이 좋습니다.
Nate

3

이전 고용주에서 코드 변경 사항을 배포하기 위해 로드 밸런서를 설정했습니다.하나의 웹 서버에 대한 서비스를 중지합니다. 첫 번째 웹 서버의 세션이 만료 되려면 20 분이 걸릴 수 있습니다. 배포 zip 파일의 압축을 풀어 해당 웹 서버의 코드를 업데이트 한 다음 해당 첫 번째 웹 서버의 직접 IP 주소를 눌러 문제가 없는지 확인합니다. 제대로 작동한다고 확신하면로드 밸런서가 업데이트 된 웹 서버에 도달하고 다른 서버에서 세션이 만료 될 때까지 기다린 다음 해당 서버를 업데이트합니다 (모든 서버가 업데이트 될 때까지). 그들이 확인한 후, 우리는로드 밸런서가 작업을 다시 시작하도록 설정했습니다. 성수기 최대로드 중로드 밸런서에 최대 10 대의 웹 서버를 연결하면 복잡해졌습니다 (따라서 웹 사이트를 종료 할 수 없어서 하나씩 업데이트하는 데 몇 시간이 걸릴 수 있음). 사이트에).

ASP.NET에서 웹 사이트의 루트 디렉토리에 이름이 지정된 파일 을 삭제 하면App_Offline.htm 해당 웹 사이트가 언로드되어 DLLS (및 기타)를 업데이트 할 수 있습니다. IIS는 "Application Offline"이라는 제목의 페이지를 제공합니다. 파일을 제거하거나 이름을 바꾸거나 삭제하면 웹 응용 프로그램이 다시 시작되고 IIS는 해당 웹 사이트에 웹 페이지를 제공합니다. VS 내부에서 웹 사이트를 게시 할 때 Visual Studio에서 수행하는 작업입니다.


2

일반적으로 내가하는 일은 SVN 저장소에 모든 것을 유지하는 것입니다. 변경이 끝나면 개발자 사이트를 커밋 한 다음 프로덕션을 체크 아웃합니다. 모든 것이 동기화 된 상태로 유지되므로 빠르고 쉽습니다. 체크 아웃이 너무 번거로운 경우 WebDAV를 사용하여 Apache를 설정할 수 있습니다.


.svn 디렉토리가 라이브 사이트에 있다는 것에 대해 걱정하십니까?
Aaron Anodide

실제로 아파치는 일반적으로 해당 폴더에 대한 액세스를 거부하도록 설정되어 있습니다.
Malfist

IIS는 기본적으로 .svn (또는 .git 또는 .hg)도 거부합니다.
와이엇 바넷

악의적 인 사용자가 디렉토리에 액세스하면 명확한 상태로 모든 코드에 액세스 할 수 있습니다.
oleksii

5
악의적 인 사용자가 파일 시스템에 액세스 할 경우 걱정할 사항이 더 있습니다.
Malfist

2

각 웹 응용 프로그램마다 세 가지 분기로 git 저장소 설정이 있습니다. 라이브, 베타, 기능. 라이브는 물론 라이브 사이트입니다. 베타는 버그를 수정하거나 구현 직전에 기능을 최종 테스트하는 데 사용되는 사이트입니다. 그런 다음 간단한 git push, git pull on live로 정보를 가져옵니다. 기능은 "다음 버전"향상에 사용됩니다.


거의 모든 소스 제어 시스템에서도 동일하게 작동합니다.
deadalnix

2

지속적인 전달 문제를 해결하려고합니다 . 처음에는 수동 단계로 시작하지만 곧 문제를 깨닫게됩니다. 이들은 가장 일반적인 것들입니다 :

  1. 코드는 PC에서 작동하고 프로덕션에서는 작동하지 않습니다
  2. 새로운 변화로 기존 코드가 깨짐
  3. 점진적으로 변경하면 배포하기가 더 어려워지고 새 라이브러리를 첨부하고 패치를 적용 할 수 있습니다.

TeamCity (또는 유사한 도구)를 살펴보십시오 .


2

자동화 된 빌드 및 배포 스크립트 사용

가장 좋은 방법은 MsBuild 또는 Nant와 같은 자동화 된 빌드 및 배포 스크립트를 사용하는 것입니다.

그 이유는 단순히 1 명령을 입력하여 웹 사이트를 롤아웃 한 다음 1 명령을 입력하여 웹 사이트를 롤백 할 수 있기 때문입니다. 그리고 만약 당신이 충분히 철저하다면 이것은 데이터베이스 스키마 마이그레이션을 포함 할 것입니다. (Migrator.Net)

SVN 또는 GIT를 사용하여 배포하지 않는 주된 이유 중 하나는 환경이 프로덕션과 스테이징간에 변경 될 수 있기 때문입니다. NANT 스크립트에서 대상 환경에 맞게 .config 파일을 빌드하도록 할 수 있습니다. 이렇게하면 프로덕션 환경에서 구성 설정을 입력하지 않아도됩니다.

또한 전체 프로세스를 자동화하여 하나의 명령 업무가되며 여러 수동 프로세스가 하나의 간단한 프로세스가됩니다.


1

먼저 웹 프로젝트를 사용해야합니다. 차이점은 무엇입니까?

웹 프로젝트는 모든 C # 클래스 파일 (코드 뒤에 포함)을 단일 DLL로 결합합니다 (보안이 뛰어나고 하나의 파일이라는 사실).

둘째, 응용 프로그램을 게시 한 후에도 원격 데스크톱을 계속 사용하고 게시 폴더의 모든 파일을 끌어서 덮어 쓰기로 설정하면됩니다 (새 파일은 기존 파일을 대체 함).

게시하면 응용 프로그램에 필요한 모든 파일이 하나의 폴더에 저장됩니다.


1

현재 고용주는 꼭두각시를 사용하여 배포합니다 . ( 동일한 문제를 해결하는 더 많은 소프트웨어 패키지 가 있습니다.)

저의 이전 고용주는 사용자 지정 작업 제어 시스템을 사용하여 소프트웨어 배포, 다시 시작 등을 처리했습니다. 사용 가능한 경우에도 사용자의 요구에 너무 지나쳤습니다.

이전의 고용주는 데이터를 Subversion에서 서버로 복사하고 롤링 재시작을 수행하는 사용자 지정 스크립트를 가지고있었습니다.

이전에 본 여러 장소에서 배포를 관리하기위한 파일을 만들었습니다. 그들은 일반적으로로드 밸런서에서 웹 서버 절반을 자르고, 기다리고, 그 절반을 멈추고, 코드를 롤아웃하고, 다시 시작한 다음,로드 밸런서를 뒤집고, 다른 반을 멈추고, 다시 시작한 다음,로드 밸런서를 다시 가져 오는 것과 같은 전략을 사용했습니다. 쪽으로.

내가 일한 모든 곳에서 코드 롤아웃은 단일 명령이거나 단일 명령이 부족하다는 것은 해결해야 할 문제로 인식되었습니다.


1

일반적으로 웹 사이트에서이 문제를 해결하기 위해 사용하는 것은 junction이라는 Systems Internals에 포함 된 도구 입니다.

이 도구를 사용하여 한 디렉토리에서 다른 디렉토리로 링크를 작성할 수 있습니다. 서버의 앱 루트에는 3 개의 폴더가 있습니다. 빨강, 파랑, 전류. IIS는 항상 파일의 현재를 보도록 구성되어 있습니다.

junction current현재 가리키는 폴더를 알려주 는 명령 을 실행할 수 있습니다 . 예를 들어 현재 파란색을 가리키고 있다고 가정하십시오. 우리가 할 일은 새 배포를 위해 파일을 빨간색으로 대기열에 넣고 모든 구성을 수행 할 수 있는지 확인하는 것입니다.

준비가되면 명령 junction current red을 내릴 수 있습니다.

이 솔루션을 훌륭하게 만드는 두 가지가 있습니다

1) 당신은 세계에서 항상 폴더에 변경 사항을 대기해야합니다. 서두르지 않으며 유일한 다운 시간은 앱 풀이 회전하는 시점입니다. (이 단계도 사전 컴파일하는 방법이 있습니다.)

2) 배포에 문제가있는 경우 롤백해야 할 작업은 변경 사항을 되 돌리는 대신 명령을 실행하는 것입니다. 우리의 경우 명령은junction current blue

바라건대 우리의 일을하는 방식이 새로운 해결책을 제시 할 수 있습니다.


0

내가 한 일과 이에 대한 범위가 있는지 확실하지 않지만 여기에갑니다. 개발자는 QA 지점으로 코드를 확인한 다음 시스템 엔지니어가 QA 환경에로드 한 다음 QA를 통과하면 프로덕션 지점으로 승격됩니다. 로드 밸런서 확률로 서버에 연결된 모든 사이트 중 2 개 이상이 있으며이 경우 두 서버 중 하나가 오프라인 상태가됩니다. iis는 사이트가 보관되고 새 사이트가 함께 배포됩니다. 필요한 모든 iis 변경 사항 iis가 다시 시작되면 다음 서버로 이동합니다. 이것은 우리의 경우 C #을 사용하여 스크립팅되었지만 과거에는 vb 스크립트를 사용하여 수행되었습니다. 도움이 되길 바랍니다. 건배

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