Bagaimana Anda menyebarkan Aplikasi Web .NET Anda? (Tolong, Rekomendasi!)

10

Kami baru-baru ini meningkatkan Situs Web ASP.NET kami ke Aplikasi Web dan kami dikejutkan oleh lompatan tiba-tiba dalam kesulitan saat menempatkannya. Mempertimbangkan seberapa umum tugas ini, saya bertanya-tanya apa plug-in / software yang digunakan orang untuk menyebarkan proyek yang berkembang, disimpan dari jarak jauh (mis. Sebuah situs web)?

Pasti ada cara yang lebih baik daripada hanya "Penerbitan" di Visual Studio dan kemudian harus secara manual FTP file yang telah berubah? Paling tidak karena situs turun ketika kita mengunggah .DLL kami.

Ada begitu banyak pengecualian file fiddly sehingga saya harus mengotomatiskan proses sebanyak mungkin, untuk mencegah unggahan yang tidak disengaja.

Dengan solusi lama kami (di WebSite kami) kami menggunakan Pengiriman untuk ASP yang benar-benar mengguncang dan membuat seluruh proses satu klik. Sayangnya itu tidak bagus untuk DLL (seperti yang disebutkan sebelumnya).

Jadi bagaimana tim Anda melakukannya?

Terima kasih atas sarannya.

PS - Saya pernah membaca bahwa Visual Studio 2010 seharusnya mengatasi kekurangan ini dalam VS2005 / 08, tetapi sampai saat itu ...

Django Reinhardt
sumber
3
ini untuk stackoverflow, bukan?
Cicik
1
Menyebarkan situs web ke server? Saya rasa tidak - tidak ada hubungannya dengan pemrograman.
Django Reinhardt
Apakah semua orang cukup mengklik "Terbitkan" dan mengunggah FTP? :( Pasti ada cara yang lebih baik!
Django Reinhardt
Kesulitan apa yang Anda alami setelah berubah dari situs web ke aplikasi web?
Chris
Ketika kami memiliki situs web, solusi penempatan lama kami (Pengiriman) secara otomatis memantau file mana yang telah diubah. Kemudian dapat mengunggah file-file itu ke situs produksi (mengabaikan file dan folder tertentu) dengan satu klik dari dalam Visual Studio. Kalau dipikir-pikir, itu adalah kebahagiaan.
Django Reinhardt

Jawaban:

5

Saya akan sangat menyarankan menggunakan Integrasi Berkelanjutan.

Kami menggunakan kombinasi TeamCity untuk CI, Rake dan Albacore untuk mengotomatisasi pembuatan.

TeamCity akan memeriksa kode dari repositori kode sumber Anda, kemudian, menggunakan Rake, membangun aplikasi, menjalankan tes unit dan bahkan menjalankan skrip database Anda jika Anda menginginkannya. Setelah pembangunan yang berhasil, Anda dapat mengemas kode sumber Anda dalam file zip atau menyalinnya ke tujuan pilihan Anda.

Kami menggunakan Git, meskipun TeamCity bekerja dengan semua sistem kontrol sumber.

Menggunakan TeamCity dan Rake akan mirip dengan menggunakan CruiseControl dan NANT, tanpa mengedit file XML. Tentu saja, Anda dapat menggunakan TeamCity dengan NANT jika Anda mau.

Sampel pendek ditarik dari rakefile.rb yang melakukan build. IMHO, lebih mudah dibaca dan di-debug daripada file XML.

require 'albacore'
require 'rexml/document'
require 'find'

VERSION_NO = "1.0"

OUTPUT_PATH = "output"
WEBOUTPUT_PATH = "output/web"
ADMINOUTPUT_PATH = "output/admin"

CONFIG = "Release"

WEB_PATH = "app/Company.Website.Web"
ADMIN_PATH = "app/Company.Website.Admin"
PACKAGE_PATH = "build/package"
DB_SCRIPT_PATH = "Company.Website.DB"
SOLUTION = "Company.Website.sln"

ARTIFACTS_PATH = "d:/build/artifacts/"

DEPLOY_WEB_PATH = "d:/deploy/company/website/"
DEPLOY_ADMIN_PATH = "d:/deploy/company/admin/"

task :default => ['setuptest','assemblyinfo','config','msbuild','createdb','sqlcmd','deploy']


task :setuptest do |setup|
  if ENV['BuildNumber'].nil? then ENV['BuildNumber'] = "000" end

  VERSION_NO = VERSION_NO + '.' + ENV['BuildNumber']
  puts 'Version Number : ' + VERSION_NO

  ZIPFILE_WEB = 'Company.Website.Web.' + VERSION_NO
  ZIPFILE_ADMIN = 'Company.Website.Admin.' + VERSION_NO  

  DB_SERVER = "WEB2"
  DB_DATABASE = "Website"  
  CREATEDB_SCRIPT = "app/Company.Website.DB/00CreateDatabaseTEST.sql"
end

  assemblyinfotask do |asm|
    asm.version = VERSION_NO
    asm.company_name = "Company Name"
    asm.copyright = "Copyright 2010"
    asm.output_file = "CommonAssemblyInfo.cs"
  end

  task :config do
    FileUtils.cp 'NHibernate.test.config', 'NHibernate.config'
  end

  msbuildtask do |msb|
    msb.properties = { :configuration => :Debug }
    msb.targets [:Clean, :Build]
    msb.solution = "Company.Website.sln"
  end

  sqlcmdtask :createdb do |sql|
    puts "executing sql scripts..."
    sql.log_level = :verbose
    sql.path_to_command = "sqlcmd.exe"
    sql.server = DB_SERVER
    sql.database = "master"
    sql.scripts << CREATEDB_SCRIPT
  end

  sqlcmdtask do |sql|
    puts "executing sql scripts..."
    sql.log_level = :verbose
    sql.path_to_command = "sqlcmd.exe"
    sql.server = DB_SERVER
    sql.database = DB_DATABASE
    sql.scripts << "app/Company.Website.DB/01CreateTables.sql"
    sql.scripts << "app/Company.Website.DB/02InsertReferenceData.sql"
  end

  task :deployprep do

    FileUtils.remove_dir 'app/Company.Website.Web/obj'
    FileUtils.remove_dir 'app/Company.Website.Admin/obj'

  end

  ziptask :zipweb do |zip|
    puts "creating zip package in " + ZIPFILE_WEB
    zip.directories_to_zip = ["app/Company.Website.Web"]
    zip.output_file = ZIPFILE_WEB  + '.zip'
    zip.output_path = File.dirname(__FILE__)
  end

  ziptask :zipadmin do |zip|
      puts "creating zip package in " + ZIPFILE_ADMIN
    zip.directories_to_zip = ["app/Company.Website.Admin"]
    zip.output_file = ZIPFILE_ADMIN  + '.zip'
    zip.output_path = File.dirname(__FILE__)
  end  

Albacore adalah rangkaian tugas Rake yang dibuat khusus untuk menyebarkan aplikasi .NET.

Jason Watts
sumber
pertanyaan bodoh: apakah ada solusi yang sama seperti ini untuk proyek Dreamweaver?
djangofan
Saya tidak tahu bahwa Anda benar-benar membangun proyek Dreamweaver, tetapi Anda masih bisa menggunakan integrasi berkelanjutan dan tugas menyalin file yang dibangun ke rake.
Jason Watts
3

Di Linux, saya telah menggunakan fabric (fabfile.org) dan capistrano (capify.org) yang merupakan alat otomatisasi untuk membantu perintah SSH dan SCP jarak jauh. Jika Anda telah menginstal Cygwin di host windows Anda, Anda harus dapat menggunakan kembali ini sebagai alat penyebaran.

pengguna11094
sumber
2
Maafkan saya karena benar-benar omong kosong, tetapi bagaimana ini bisa digunakan dengan Visual Studio? (Saya pikir mereka tidak bisa?)
Django Reinhardt
3

"Menerbitkan" aplikasi web di Visual Studio dapat dijalankan dari baris perintah sebagai msbuild "C:\proj\yourprojectpathandfilename.csproj" /deploydir:"C:\some\deploy\dir". Direktori tujuan adalah aplikasi web yang dapat digunakan.

Jawaban lain yang mencakup pertanyaan Anda yang lebih besar adalah baik. Saya juga menambahkan bahwa Anda harus melihat beberapa proyek aplikasi web sumber terbuka dan menyalin proses pembuatan yang paling Anda sukai.

Peter Seale
sumber
3

Saya setuju dengan Scott bahwa ini bisa sangat rumit dan mudah diabaikan. Strategi penyebaran juga sangat spesifik untuk aplikasi. Jika aplikasi Anda benar-benar mandiri dalam satu folder, mungkin lebih mudah daripada aplikasi yang mereferensikan GAC. Yang pada gilirannya mungkin masih lebih mudah daripada server yang perlu mempertahankan beberapa versi aplikasi yang mereferensikan banyak versi rakitan GAC. Kami tidak ingin memulai berbicara tentang file kebijakan di sini :).

Setelah mengatakan semua yang menggabungkan Alat Penerapan Web Microsoft dengan Routing Permintaan Aplikasi adalah salah satu pilihan yang baik. Di IIS7, dimungkinkan untuk membuat paket instalasi menggunakan alat ini. Dimungkinkan juga untuk mengarahkan alat ke aplikasi web dan mencadangkan seluruh aplikasi ke dalam folder arsip aplikasi. Anda kemudian dapat menggunakan dari folder arsip ini ke IIS6 atau server web IIS7 (IIS5 tidak didukung). Saya akan menggunakan perutean permintaan aplikasi seperti yang disarankan Scott untuk memisahkan langsung dari situs web pengujian. Setelah memverifikasi situs web yang baru diterbitkan itu baik, Anda dapat mengatur ARR untuk merutekan ke versi yang baru.

Ameer Deen
sumber
2

PyroBatchFTP berfungsi dengan baik untuk ini. Ini akan mendorong hanya perubahan dan Anda bisa skrip sehingga Anda bisa mendorong dengan mengklik dua kali file batch.

Di Vaasnet, kami telah menyiapkan solusi impian untuk diri kami sendiri, tetapi cukup melibatkan pengaturan tetapi layak menggunakan beberapa atau semua elemen ini jika Anda bisa. Inilah dia:

  • SVN di semua mesin pengembang kami
  • SVN di server build / deployment kami
  • Cruisecontrol.net mengawasi perubahan pada SVN dan akan membangun dan menampilkan hanya file yang diperlukan ke folder pementasan
  • menggunakan PyroBatchFTP, kami mendorong ke situs pementasan (dipicu oleh Cruisecontrol sehingga terjadi secara otomatis)
  • menggunakan IIS7 dan Aplikasi Permintaan Routing (ARR) dan Penulisan Ulang URL, kami memiliki pengaturan pementasan / produksi berikut:
    • ARR di muka akan mengarahkan lalu lintas ke instance 01 atau 02, tergantung mana yang 'hidup' dan yang mana 'pementasan'
    • akun FTP selalu terikat dengan 'pementasan'
    • Saya memiliki situs admin mini lain yang akan menukar pementasan dan hidup dengan satu klik. Dibutuhkan semua 1 detik untuk beralih dengan nol downtime dan kami dapat beralih kembali jika kami menyadari ada sesuatu yang salah dengan rilis itu (meskipun jarang karena kami dapat mengujinya dengan mudah sebelum ditayangkan).

Jadi hasil bersihnya memungkinkan kita untuk memeriksa SVN dan membuatnya secara otomatis membangun dan mendorong produksi tanpa interaksi manual. Setelah kami menguji URL pementasan kami dan menentukan bahwa itu siap untuk ditayangkan, kami masuk ke situs sederhana dan dengan 1 klik, itu langsung.

Scott Forsyth - MVP
sumber
Saya berharap produk itu gratis. itu terlihat sangat keren.
djangofan
Ini sepertinya jenis yang kita cari. Saya akan melakukan sedikit riset lagi, tapi terima kasih sudah memposting!
Django Reinhardt
Ya, ini tidak gratis, tetapi membayar untuk dirinya sendiri dalam satu jam pertama dari waktu Anda menghemat. Itu datang cukup cepat dalam situasi penempatan seperti ini.
Scott Forsyth - MVP
bagus, satu pertanyaan. Anda menyebutkan bahwa instance 01 atau 02 dapat dibuat langsung, dan jika ada masalah, itu dapat dikembalikan ke instance lain. Apa yang terjadi pada data pengguna dalam database selama waktu itu? Separuh akan menjadi contoh 1 DB, dan sisanya pada contoh DB lainnya?
Saurabh Kumar
1

Untuk cara lain yang belum disarankan, saya merujuk Anda ke 'Gu' dan Proyek Pengaturan Web

Ini pada dasarnya membuat installer MSI untuk aplikasi .NET Anda. Contoh ini untuk VS2005, tapi saya punya VS2010 dan jenis proyek masih ada. Ini dapat memberi Anda banyak penyesuaian jika Anda membutuhkannya, atau hanya instalasi dasar jika Anda tidak membutuhkannya.

Secara pribadi di mana saya bekerja, kami hanya melakukan penyebaran gaya xcopy, tapi saya akhirnya ingin hanya menyerahkan paket ke grup server, memberi mereka kontrol kapan dan bagaimana itu dikerahkan. (Saya pikir ini mungkin juga membuatnya lebih mudah untuk melakukan penyebaran massal menggunakan sesuatu seperti kebijakan kelompok, tapi saya tidak terlalu terbiasa dengan itu)

mpeterson
sumber
0

Ada banyak cara untuk menguliti kucing ini, sangat tergantung pada seberapa banyak akses yang dapat Anda miliki di server Anda. Metode favorit pribadi saya akhir-akhir ini adalah menyiapkan skrip pembuatan dalam proyek (biasanya menggunakan MSBUILD) yang mengemas semua file penempatan, kemudian menggunakan SVN untuk menjembatani mereka menjadi produksi. Dan untuk versi file produksi.

Dari sisi database, cara terbaik adalah menggunakan semacam kerangka migrasi. Sekali lagi, banyak dari mereka yang berkeliaran dan tidak ada jawaban yang jelas.

Wyatt Barnett
sumber
0

Secara pribadi saya hanya menggunakan skrip vbs yang saya tulis sendiri untuk menyalin folder dari tipe file tertentu ke server dev (yaitu meninggalkan file cs, dll).


sumber
Server dev kami hanya tersedia melalui FTP, dan saya agak berharap harus menghindari solusi yang dipesan lebih dahulu, jika memungkinkan.
Django Reinhardt
0

Ketika saya bekerja di sebuah perusahaan besar .com, inilah yang kami lakukan dengan penggunaan .net.

Semua kode sumber dan prosedur tersimpan kami disimpan di SVN. Setiap malam, pekerjaan database menjalankan dan menarik procs yang tersimpan produksi dan menyelipkannya ke direktori di SVN sehingga selalu ada versi terbaru dalam kontrol sumber.

Pada hari penyebaran untuk suatu proyek, kami akan menggunakan skrip nAnt untuk menarik proyek dari SVN, melakukan pembuatan kustom proyek dan menarik setiap ketergantungan yang dibutuhkan oleh proyek-proyek ini. Setelah skrip nAnt dijalankan, paket tersebut dikemas menjadi file zip yang dapat diekstraksi sendiri. Procs tersimpan yang terkait dengan penyebaran ini diperiksa ke dalam kontrol sumber dan lembar spreed excel diperbarui dengan skrip untuk menjalankan dan dalam urutan yang mana.

Ketika deploymenet berbunyi, file zip yang mengekstraksi sendiri dipindahkan ke server tempat diluncurkan. Semua file diekstraksi ke direktori yang benar dan DBA menjalankan procs yang tersimpan pada basis data prodcution.

Pada penyebaran yang umum menggunakan sistem ini, kami beralih dari penyebaran lima hingga enam jam menjadi kurang dari satu jam atau kurang.

Selamat mencoba dan berharap ini membantu beberapa orang dalam mencari cara untuk menggunakan aplikasi Anda.

Chris
sumber
0

Pasti ada cara yang lebih baik daripada hanya "Penerbitan" di Visual Studio dan kemudian harus secara manual FTP file yang telah berubah?

Pisau cukur Occam biasanya merupakan pendekatan yang disukai: semakin sederhana, semakin baik. FTP mudah dengan sedikit atau tanpa komplikasi. Beberapa orang menggunakan XCOPY, Filezilla atau WSFTP, yang lain mungkin menggunakan MS Web Deployment Tool (yang saya belum kenal), tetapi secara keseluruhan, ada cara yang lebih baik untuk menggunakan aplikasi web ASP.NET (dan lainnya aplikasi secara umum). IMO, jika penyebaran dipertimbangkan dari awal pengembangan, penyebaran bisa diintegrasikan dengan aplikasi web yang membuat penyebaran yang relatif bebas rasa sakit dan lancar di masa depan.

Sebagai pengembang .NET yang telah bekerja di beberapa perusahaan yang mengembangkan aplikasi web ASP.NET mulai dari ukuran, kompleksitas, dan jumlah pengguna (dari beberapa ratus pengguna hingga puluhan ribu), 'penyebaran' IMO sering kali merupakan topik paling "cair". Beberapa organisasi mengambil terlalu jauh dalam hal birokrasi sementara yang lain tidak menangani masalah dengan penyebaran sama sekali. Dalam pengalaman saya, masalah dengan penyebaran cenderung masuk ke dalam 1 atau lebih dari 3 kategori dalam hal kesulitan / kegagalan:

  1. Penempatan diabaikan / dilupakan secara mendalam selama fase desain: Sebagian besar aplikasi web cenderung menggabungkan server web dan database. Di luar kode aplikasi, mungkin beberapa prosedur tersimpan dan tabel database, penyebaran tidak perlu banyak dipikirkan. ASP.NET lebih dari mampu membantu dalam penyebaran tetapi paling sering pengembang terganggu dalam hal menjalankan aplikasi yang sebenarnya dan melakukan tugasnya sambil meninggalkan bagaimana penyebaran sebagai masalah yang terpisah.

  2. Penempatannya rumit di banyak sistem dan orang yang bermain: Kompleksitas itu menyebalkan. Dari MSMQ, prosedur dan pemicu tersimpan T-SQL, Layanan Pelaporan, pesan SOAP / XML, otentikasi AD, SSAS / SSIS, dll. Jumlah teknologi yang dimainkan meningkatkan jumlah orang yang terlibat. Yang terburuk, semua komponen yang berbeda ini biasanya dikelola oleh entitas yang berbeda dalam suatu organisasi. Kecuali setiap orang sinkron satu sama lain, penerapan dapat meningkatkan kompleksitas dengan cepat yang mengarah ke beberapa titik kegagalan.

  3. Kemalasan, apatis atau kurangnya komunikasi dan / atau manajemen: Dari sedikit hingga tidak ada dokumentasi hingga kurangnya komunikasi dan protokol yang terkoordinasi, mudah untuk mengacaukan proses yang relatif sederhana. Penempatan harus menjadi prosedur sederhana dengan banyak pemeriksaan di tempat sambil mendokumentasikan apa yang sudah dilakukan, tetapi seringkali tidak pernah demikian. Kebanyakan orang hanya ingin situs sialan itu berjalan. Dalam pengalaman saya, orang-orang (non-programmer) tidak terlalu peduli sampai sesuatu berjalan sangat fubar. Tanggung jawab jarang jatuh pada hanya satu orang untuk benar - benar melakukan penempatan karena tidak ada yang benar-benar ingin menjadi alasan kegagalan sehingga akuntabilitas biasanya dibubarkan.

Ada begitu banyak pengecualian file fiddly sehingga saya harus mengotomatiskan proses sebanyak mungkin, untuk mencegah unggahan yang tidak disengaja. Jadi bagaimana tim Anda melakukannya?

Saya tidak tahu ada vendor untuk mengotomatiskan penyebaran meskipun saya tidak akan terkejut jika ada beberapa. Anda mungkin dapat membuat skrip solusi melalui VBScript / WMI atau skrip batch solusi, tetapi kenyataannya adalah Anda perlu menyesuaikan solusi bersama untuk situs ASP.NET yang lebih kompleks. Situs-situs sederhana yang terdiri dari halaman, konektivitas basis data, dan tidak ada yang lain, Anda tidak perlu melakukan skala yang hampir sama dengan upaya penempatan Anda sejalan dengan kompleksitas aplikasi itu sendiri.

Sejauh ini, saat ini penyebaran pekerjaan saya masih dilakukan melalui FTP dan memindahkan banyak file. Ini jelek, mudah dikacaukan dan tidak ada rasa sejarah yang akurat. Memang Anda bisa menyisir log FTP, tidak ada yang benar-benar ingin melakukannya. Aplikasi kami cukup sederhana tanpa banyak kebutuhan di luar FTP. Bagaimana tim saya menyebarkan aplikasi web kami sangat tidak berguna bagi Anda. Sebaliknya, saya lebih suka menggunakan kesempatan ini untuk menyarankan praktik yang lebih baik .

  • Asumsikan tidak ada. Akun pengguna, hak istimewa R / W / X, ACL, firewall, waktu (kapan harus digunakan dan berapa banyak waktu yang harus Anda lakukan), dan jika mungkin, uji penyebaran ke semua lingkungan sebelum "tanggal peluncuran" final.
  • Sebelum pembangunan benar-benar dimulai, faktor penyebaran ke dalam pembangunan. Jika itu situs yang sederhana, biarlah. Jika ada banyak bagian yang bergerak, faktor semua itu dan benar-benar membangun rencana di mana semua komponen (kode, database, laporan, antrian, dll.) Semuanya berada di rencana yang sama.
  • Berkoordinasi dengan paritas lain dan berkomunikasi secara efektif dan efisien.
  • Dokumentasikan sebanyak mungkin informasi terkait.
  • Lingkungan: satu server web vs. pertanian web; 32-bit vs 64-bit; temukan cara untuk memonitor log / error / rotate, dll.
  • Temukan (atau bangun) alat yang dapat membantu dalam penyebaran.
  • Jika memungkinkan untuk penerapan yang dapat diprogram, pilih paradigma dan patuhi. Misalnya, jika Anda ingin menggunakan server basis data sebagai sarana utama untuk menjalankan status aplikasi, penyebaran, akses, dan semacamnya, pangganglah ke dalam aplikasi dan tetap menggunakannya. Jika Anda lebih suka membaca file XML (seperti web.config) dengan segala cara, tetaplah dengan paradigma yang konsisten dalam menyebarkan aplikasi. Contoh lain: beberapa organisasi meninggalkan web.config sebagai file statis di setiap lingkungan yang tidak boleh digunakan untuk lingkungan lain. Program web.config lainnya sedemikian rupa sehingga dapat digunakan di seluruh lingkungan tanpa kesalahan.

Saya menyadari bahwa posting ini mungkin berlebihan untuk pertanyaan yang semula ditanyakan. Sayangnya, penyebaran tidak mudah karena aplikasi dapat bervariasi dalam kompleksitas. Saya berani bertaruh bahwa sebagian besar organisasi yang menggunakan aplikasi ASP.NET yang kompleks dari waktu ke waktu mengembangkan strategi tertentu pekerjaan (setidaknya) andal.

osij2is
sumber
lol ... saya suka bagaimana Anda mengutip kekikiran tapi kemudian Anda terus memberikan jawaban yang paling kompleks. lol.
djangofan
1
Ya, saya sadar jawaban saya bertentangan dengan dirinya sendiri. Saya baru saja menemukan banyak penyebaran yang salah sehingga saya sangat bosan. Maaf untuk kata-kata kasar!
osij2is
1
Ada alat yang agak baru dari Red Gate: red-gate.com/supportcenter/Content/Deployment_Manager/help/1.0/…
Matt Evans
@Matthew Evans - NICE! Saya sedang melihat URL sekarang. Apakah ini akuisisi pihak ketiga yang baru atau produk mereka sendiri?
osij2is
Saya pikir ini produk mereka sendiri. Mereka mengembangkan dan menggunakannya secara internal untuk semua penyebaran mereka sendiri - yang kedengarannya menjanjikan. Akan memperbarui pada evaulation saya sendiri ketika saya sampai
Matt Evans