Aspnetcore: IIS-> .NET Core ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ DLL ํŒŒ์ผ ์ž ๊ธˆ

์— ๋งŒ๋“  2016๋…„ 07์›” 07์ผ  ยท  114์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: dotnet/aspnetcore

ํ”„๋กœ๋•์…˜ IIS ์„œ๋ฒ„์—์„œ FTP๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ .NET Core ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ DLL ํŒŒ์ผ์„ ๋ฎ์–ด ์“ฐ๋ ค๊ณ ํ•˜๋ฉด ํŒŒ์ผ์ด ์ž ๊ฒจ์žˆ์–ด ๋ฎ์–ด ์“ธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ƒˆ ๋ฒ„์ „์„ ๋ฐฐํฌํ•˜๋ ค๋ฉด IIS์—์„œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ค‘์ง€ํ•˜์—ฌ ์ž ๊ธˆ์„ ํ•ด์ œ ํ•œ ๋‹ค์Œ ๋ฎ์–ด ์จ์•ผํ•ฉ๋‹ˆ๋‹ค.
์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ค‘์ง€ํ•˜์ง€ ์•Š๊ณ  ๋ฐฐํฌ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

affected-medium area-servers bug servers-iis severity-nice-to-have

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๐Ÿ‘

์ค‘๋ณต ์žฌํ™œ์šฉ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ํšŒ๊ท€์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  114 ๋Œ“๊ธ€

app_offline.htm์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. https://docs.asp.net/en/latest/hosting/aspnet-core-module.html#asp -net-core-module-app-offline-htm

PowerShell ๋ฐฉ์‹์„ ์›ํ•˜๋Š” ๊ฒฝ์šฐ IIS Admin cmdlet์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://technet.microsoft.com/en-us/library/ee790599.aspx

Stop-WebAppPool -Name $appPoolName

... deploy ...

Start-WebAppPool -Name $appPoolName

@Tratcher ์„ค๋ช… ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
์ด๊ฒƒ์ด ๊ท€ํ•˜์˜ ๊ณ„ํš์— ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ์ด์ „ ASP.NET MVC์—์„œ ์ž‘๋™ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?
์ด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๊ณ„ํš์ž…๋‹ˆ๊นŒ?

@GuardRex ๊ณต์œ  ํ˜ธ์ŠคํŒ… ํ™˜๊ฒฝ์ด๊ณ  AppPool์„ ์ค‘์ง€ ํ•  ๊ถŒํ•œ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

msdeploy.exe ๋ฐ Azure๋กœ '๊ทธ๋ƒฅ ์ž‘๋™'ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•˜๋ฉด ํŒŒ์ผ ์ž ๊ธˆ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์›น ์‚ฌ์ดํŠธ๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. -enableRule:AppOffline ์€ (๋Š”) ์ž‘๋™ํ•˜์ง€๋งŒ ์ „์ฒด ์›น ์‚ฌ์ดํŠธ๊ฐ€ ๋ช‡ ๋ถ„ ๋™์•ˆ ์˜คํ”„๋ผ์ธ ์ƒํƒœ์ด๋ฏ€๋กœ ํŠนํžˆ ํ•˜๋ฃจ์— ๋ช‡ ๋ฒˆ ๋ฐฐํฌํ•œ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•  ๋•Œ ํ›Œ๋ฅญํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ์•„๋‹™๋‹ˆ๋‹ค.

http://stackoverflow.com/q/40276582/14131 ์ฐธ์กฐ

@chuchuva ์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋ชจ๋“  ๋งˆ๋ฒ•์—๋Š” ๋น„์šฉ์ด

๋งˆ์ˆ ์ด๋“  ์•„๋‹ˆ๋“  ์ž˜ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ASP.NET ์ฝ”์–ด๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•œ ํ›„ ์ง€๊ธˆ์€ ์ข€ ๊ทธ๋ฆฌ์›Œ์š” ...

@HarelM๊ณผ ๋™์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ž๋™ํ™” ๋œ ๋ฐฐํฌ์—์„œ ์ตœ์ข… ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์— ์ด๋ฅด๊ธฐ๊นŒ์ง€ ์ด์™€ ๊ด€๋ จํ•˜์—ฌ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด์ „ MVC๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•˜๋ฃจ์— ์•ฝ 10 ๋ฒˆ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์—์„œ ๋ฐค์— ๋งค์ผ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ „ํ™˜ํ–ˆ์œผ๋ฉฐ Core ์•ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์˜คํ”„๋ผ์ธ์œผ๋กœ ์ „ํ™˜ ํ•  ๋•Œ ์งœ์ฆ์ด ๋‚  ๊ฒƒ์ด๋ผ๋Š” ์ ์„ ๋ฐ›์•„ ๋“ค์˜€์Šต๋‹ˆ๋‹ค. ์‡ผ ์Šคํ† ํผ๋Š” ์•„๋‹ˆ์ง€๋งŒ Core ์ฑ„ํƒ์— ๋Œ€ํ•œ ๋งˆ์ฐฐ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ‘

์ค‘๋ณต ์žฌํ™œ์šฉ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ํšŒ๊ท€์ž…๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์„ ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•˜์—ฌ ๋กœ๋“œ๋งต์— ์˜ฌ๋ฆด ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‹ค์šด ํƒ€์ž„์—†๋Š” ๋ฐฐํฌ๋ฅผ ์ง€์›ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ .Net Core ์›น ์‚ฌ์ดํŠธ๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์Šคํ…Œ์ด์ง• ์Šฌ๋กฏ ์ „๋žต์„ ์ˆ˜๋™์œผ๋กœ ๊ตฌํ˜„ํ•˜๋„๋ก ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋ถˆํŽธํ•˜๊ณ  ๋น„์šฐํ˜ธ์ ์ž…๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด .Net Core ์›น ์‚ฌ์ดํŠธ๋กœ ํ›จ์”ฌ ์›ํ™œํ•˜๊ฒŒ ์ „ํ™˜ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ .Net Core ์›น ์‚ฌ์ดํŠธ๋ฅผ ๋” ๋น ๋ฅด๊ฒŒ ์ฑ„ํƒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋„ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๋””๋ ‰ํ† ๋ฆฌ์— app_offline.htm์„ ๋„ฃ๋Š” ๊ฒƒ์€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ์‚ฌ์ดํŠธ๋ฅผ AspNetCore๋กœ ์ด๋™ ํ•œ ํ›„์—์•ผ์ด '๊ธฐ๋Šฅ'์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ๊ฒŒ์‹œ ํ•  ๋•Œ๋งˆ๋‹ค ๋ช‡ ๋ถ„ ๋™์•ˆ ์‚ฌ์ดํŠธ๋ฅผ ์˜คํ”„๋ผ์ธ์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ํ—ˆ์šฉ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค!

์ด๊ฒƒ์€ ์†Œ๊ทœ๋ชจ ํŒ€์˜ ๋ฆฌ๋”๋กœ์„œ ๋‚˜์—๊ฒŒ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. AspNetCore๊ฐ€ ๋Œ€๊ทœ๋ชจ๋กœ ์—ฐ์† ํ†ตํ•ฉ์„ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๋‹ค์‹œ ๊ฒŒ์‹œํ•˜๊ธฐ ์œ„ํ•ด ๋งค์‹œ๊ฐ„ ๋ช‡ ๋ถ„ ๋™์•ˆ ์‚ฌ์ดํŠธ๋ฅผ ์˜คํ”„๋ผ์ธ ์ƒํƒœ๋กœ ๋งŒ๋“ค ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

FTP ๋˜๋Š” xcopying์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐํฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด webdeploy๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

์›น ๋ฐฐํฌ๋ฅผ ํ†ตํ•ด IIS์— ๊ฒŒ์‹œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ํ˜„์žฌ web.config๋ฅผ ๋จผ์ € ์‚ญ์ œ (ํšจ๊ณผ์ ์œผ๋กœ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒ)ํ•˜์—ฌ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์žˆ์ง€๋งŒ ์žฅ๊ธฐ์ ์œผ๋กœ๋Š” ์‹ค์ œ๋กœ ํ—ˆ์šฉ๋˜๋Š” ์†”๋ฃจ์…˜์ด ์•„๋‹™๋‹ˆ๋‹ค.

@DaleMckeown ์ด์ƒ์ ์œผ๋กœ ์ง€์†์ ์ธ ํ†ตํ•ฉ ์›Œํฌ ํ”Œ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ๋’ค์— ์—ฌ๋Ÿฌ ์„œ๋ฒ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•˜๋‚˜์˜ ์„œ๋ฒ„๋ฅผ ๊ฐ€์ ธ ์™€์„œ ์—…๋ฐ์ดํŠธ ํ•œ ๋‹ค์Œ ๋‹ค์‹œ ๋„ฃ๊ณ  ๋‹ค์Œ ์„œ๋ฒ„๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด๊ฒƒ์ด ํ•ญ์ƒ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋ฏ€๋กœ (์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ์ฒ˜๋Ÿผ) ๋ช‡ ๋ถ„์˜ ๋‹ค์šด ํƒ€์ž„์„ ๊ฐ€์ง€๊ณ  ์‚ด์•„์•ผํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ ์•ฑ์ด 30 ์ดˆ ์ด๋‚ด์— ๋ฐฑ์—…๋˜๋ฏ€๋กœ ์‹ค์ œ๋กœ๋Š” ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ—‰ํ—‰

์›น ๋ฐฐํฌ๋ฅผ ํ†ตํ•ด IIS์— ๊ฒŒ์‹œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

webdeploy๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐํฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค (์ž ๊ธด ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ๊ณ  ์•ฑ์„ ์˜คํ”„๋ผ์ธ์œผ๋กœ ์ž๋™์œผ๋กœ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Œ). ๊ธฐ๋ณธ์ ์œผ๋กœ @shirhatti ์ž…๋‹ˆ๊นŒ?

๋ฟก ๋นต๋€จ

์šฐ๋ฆฌ๋Š” ํ˜„์žฌ web.config๋ฅผ ๋จผ์ € ์‚ญ์ œ (ํšจ๊ณผ์ ์œผ๋กœ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒ)ํ•˜์—ฌ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์žˆ์ง€๋งŒ ์žฅ๊ธฐ์ ์œผ๋กœ๋Š” ์‹ค์ œ๋กœ ํ—ˆ์šฉ๋˜๋Š” ์†”๋ฃจ์…˜์ด ์•„๋‹™๋‹ˆ๋‹ค.

xcopy ๋ฐฐํฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๊นŒ?

webdeploy๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐํฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค (์ž ๊ธด ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ๊ณ  ์•ฑ์„ ์˜คํ”„๋ผ์ธ์œผ๋กœ ์ž๋™์œผ๋กœ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Œ). ๊ธฐ๋ณธ์ ์œผ๋กœ @shirhatti ์ž…๋‹ˆ๊นŒ?

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค David-๋‚ด๊ฐ€ ํ˜„์žฌํ•˜๊ณ ์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ์ข‹๊ฒŒ ๋“ค๋ฆฝ๋‹ˆ๋‹ค (IIS์—์„œ ์‚ฌ์ดํŠธ ๋ฐ ์•ฑ ํ’€์„ ์ˆ˜๋™์œผ๋กœ ์ค‘์ง€). ์ด๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์˜ ์˜๋ฏธ๋ฅผ ์กฐ์‚ฌ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ช‡ ๊ฐ€์ง€ ๋ฆฌ์†Œ์Šค๋ฅผ ์•Œ๋ ค ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์ง„์‹ค์˜ ๊ทผ์›์„ ์ฐพ์„ ๋•Œ๊นŒ์ง€ @DaleMckeown ๋ช‡ ๊ฐ€์ง€ ์ •๋ณด https://github.com/Microsoft/vsts-tasks/issues/5259#issuecomment -346202503

@davidfowl ์šฐ๋ฆฌ๋Š” webdeploy๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ ์„œ๋ฒ„ (btw๋Š” ์šฐ๋ฆฌ์—๊ฒŒ ๋ฌธ์ œ๋ฅผ์ฃผ์ง€ ์•Š์Œ)์— ๋ฐฐํฌํ•˜๊ณ , ๊ฑฐ๊ธฐ์—์„œ robocopy๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ๋ผ์ด๋ธŒ ์„œ๋ฒ„๋กœ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋ฟก ๋นต๋€จ

ํ˜„์žฌ web.config๋ฅผ ๋จผ์ € ์‚ญ์ œํ•˜์—ฌ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

web.config ๊ฐ€ ๋ฐฐํฌ์—์„œ ์ œ๊ฑฐ๋˜๋ฉด IIS๋Š” ๋ฐฐํฌ์—์„œ ์ค‘์š”ํ•œ ํŒŒ์ผ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์ž๋Š” 30 ๋Œ€๊ฐ€ ์—ด๋ฆด ๋•Œ๊นŒ์ง€ ๋ฐค๋‚ฎ์œผ๋กœ ๊ณ„์† ํŒŒ์ผ์„ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ—‰ํ—‰

PS ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ์žก์ดˆ์— ์กฐ๊ธˆ์ด๋ผ๋„ ๋“ค์–ด๊ฐ€๊ณ  ์‹ถ๋‹ค๋ฉด @ajeckmans์˜ ์กฐ์–ธ์— ๋”ฐ๋ผ ์›น ํŒœ์— ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•ด AppPools๋ฅผ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์”ฉ ์‚ญ์ œํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์Šคํฌ๋ฆฝํŒ… ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์˜ˆ์ œ๋Š” https://github.com/guardrex/aspnetcore-iis-ps-publish ...๋ฅผ ์ฐธ์กฐ

@guardrex ๋‹น์‹ ์ด ๋งž์•„์š”. ๋จผ์ € app_offline.htm์„ dir์— ๋ณต์‚ฌ ํ•œ ๋‹ค์Œ web.config๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ณต์‚ฌ ํ•œ ๋‹ค์Œ web.config๋ฅผ ๋‹ค์‹œ ๋„ฃ๊ณ  app_offline์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค (๋ชจ๋‘ ofc ์Šคํฌ๋ฆฝํŠธ ์‚ฌ์šฉ). ๋ถˆํ–‰ํžˆ๋„ ์›น ์‚ฌ์ดํŠธ ๋””๋ ‰ํ† ๋ฆฌ์— app_offline ํŒŒ์ผ์„ ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” dll์— ๋Œ€ํ•œ ์ž ๊ธˆ์ด ํ•ด์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. web.config๋ฅผ ์ œ๊ฑฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ด์ „์˜ asp.net ์ „์ฒด ์•ฑ (์˜ˆ : ์ด์ „ ์›น ์–‘์‹ ๋“ฑ)์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ ํ•  ํ•„์š”๊ฐ€์—†๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค.

@ajeckmans ์ž‘๋™ํ•˜์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค. web.config ํŒŒ์ผ์ด ์ œ๊ฑฐ๋˜๋ฉด IIS๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ฆ‰์‹œ ์„ ํƒํ•˜๋ฏ€๋กœ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ •์  ํŒŒ์ผ ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ํŒŒ์ผ ์ œ๊ณต์„ ์‹œ์ž‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ์‹œ๋„ํ•˜๊ณ  ๊ทธ๊ฒƒ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค ...

  1. app_offline.htm์„ ์ถ”๊ฐ€
  2. ์‚ฌ์ดํŠธ์—์„œ app_offline.htm์„ ์ œ๊ณต
  3. web.config๋ฅผ ๊บผ๋‚ด์‹ญ์‹œ์˜ค.
  4. ๋ฏผ๊ฐํ•œ ํŒŒ์ผ์„ ์š”์ฒญํ•˜์‹ญ์‹œ์˜ค (์˜ˆ : http://localhost:<PORT>/<ASSEMBLY_NAME>.deps.json ... PORT ๋ฐ ASSEMBLY_NAME ๋Œ€์ฒด).
  5. ์ •์  ํŒŒ์ผ ๋ชจ๋“ˆ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๊ฒฝ์šฐ deps.json ํŒŒ์ผ์ด ์ œ๊ณต๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹จ์ˆœํžˆ ๋ชจ๋“ˆ์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์„ ์‹ ๋ขฐํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค ...

<configuration> 
 <system.webServer> 
   <modules> 
     <remove name="StaticFileModule" /> 
   </modules> 
 </system.webServer> 
</configuration>

... ๋‹ค๋ฅธ ๋ชจ๋“ˆ์ด ๋‚จ์•„ ์žˆ๊ณ  ๋‹ค๋ฅธ ๊ณต๊ฒฉ ๋ฒกํ„ฐ๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ•„์ˆ˜๊ฐ€ ์•„๋‹Œ ๋ชจ๋“ˆ์„ ๋ชจ๋‘ ์ œ๊ฑฐ ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ web.config ์ œ๊ฑฐ๋ฅผ ํ†ตํ•ด ๋ฐฐํฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ด์™€ ๊ฐ™์€ ์›€์ง์ž„์œผ๋กœ ๋ฏธ์ง€์˜ ์˜์—ญ์— ์ง„์ž…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ณต์‹ ์ง€์นจ์— ๋”ฐ๋ฅธ ์˜ต์…˜์ด ์•„๋‹ˆ๋ฏ€๋กœ ์™„์ „ํžˆ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, AppPool์„ ์ค‘๋‹จํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์ „๋žต์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด PS ์Šคํฌ๋ฆฝํŒ…์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋™์ •์˜ ๋ฉ”๋ชจ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๊ทธ๊ฒƒ์€ ๋ณด์•ˆ ๊ด€์ ์—์„œ ์•ฝ๊ฐ„์˜ ๋ˆˆ์น์„ ์˜ฌ๋ ธ๋‹ค. ๋ฐฐํฌ ๋ ˆ์ด์•„์›ƒ์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ ํŒŒ์ผ์„ wwwroot ๋‹ค์‹œ ๋„ฃ๋Š” ๊ฒƒ์„ ํฌํ•จํ•˜์—ฌ ๋…ผ์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํ† ๋ก  ๋Œ€์ƒ : IIS ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ web.config ์œ„์น˜์— ๊ฒŒ์‹œ (IISIntegration 158)
web.config ๋‹ค์‹œ wwwroot (IISIntegration 164)๋กœ ์ด๋™์‹œ์ฃผ์˜

[ํŽธ์ง‘] ์•„๋งˆ๋„ ๊ทธ๊ฒƒ์€ ๋‹น์‹ ์˜ (์ง€์›๋˜์ง€ ์•Š๋Š”) ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค : web.config๋ฅผ ๋‹ค์‹œ wwwroot ๋กœ ์ด๋™ ํ•œ ๋‹ค์Œ ๋‹น์‹ ์ดํ•˜๋Š” ์ผ์„ ๊ณ„์†ํ•˜์‹ญ์‹œ์˜ค. ์•„์ง๋„ tho ... ์–ด๋–ป๊ฒŒ ์˜คํ”„๋ผ์ธ ์ƒํƒœ๋กœ ๋งŒ๋“ค๋ ค๋ฉด ์•ฑ์„ ๊นจ๋Š” ๊ฒƒ์ด ๋ฌด์„ญ์Šต๋‹ˆ๋‹ค.

์ด ์ƒํ™ฉ์—์„œ ์šฐ๋ฆฌ๊ฐ€ํ•ด์•ผ ํ•  ์ผ์— ๋Œ€ํ•ด ๋”์šฑ ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ ์ž ๊ธˆ์„ ๋ฐฉ์ง€ ํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ์›น ๋ฐฐํฌ๋ฅผ ํ†ตํ•ด IIS์— AspNetCore ์‚ฌ์ดํŠธ๋ฅผ ๊ฒŒ์‹œํ•˜๊ธฐ์œ„ํ•œ ํ˜„์žฌ ๊ถŒ์žฅ ์‚ฌํ•ญ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ €๋„ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์šฐ๋ฆฌ ์กฐ์ง์—์„œ .net ํ•ต์‹ฌ ์ฑ„ํƒ์— ๋Œ€ํ•œ ์ฃผ์š” ์žฅ์• ๋ฌผ์ด๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด .net ํ•ต์‹ฌ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰ ์ค‘์ด๊ณ  ์ƒˆ ๋นŒ๋“œ๋ฅผ ๊ฒŒ์‹œํ•˜๋ ค๊ณ  ํ•  ๋•Œ DLL์ด ์‚ฌ์šฉ ์ค‘์ด๋ผ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์•ฑ ํ’€์„ ์ค‘์ง€ ํ•œ ๋‹ค์Œ DLL์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์•ฑ ํ’€์„ ์‹œ์ž‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

.Net Core์—์„œ ์•ฑ ํ’€์„ ์ค‘์ง€ํ•˜์ง€ ์•Š๊ณ  ์ƒˆ ๋นŒ๋“œ / DLL์„ ๊ฒŒ์‹œ ํ•  ์ˆ˜์žˆ๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ์„€๋„์šฐ ๋ณต์‚ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋Š” .Net ํ”„๋ ˆ์ž„ ์›Œํฌ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›๋ฉ๋‹ˆ๋‹ค. ์•ˆํƒ€๊น๊ฒŒ๋„ .Net ์ฝ”์–ด๊ฐ€ ์ถœ์‹œ ๋œ ์ง€ 2 ๋…„์ด ์ง€๋‚ฌ๊ณ  ์—ฌ์ „ํžˆ ๋งค์šฐ ๊ธฐ๋ณธ์ ์ธ ํ•„์ˆ˜ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ง€์›์ด์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋„์›€์„ ์ฃผ์…”์„œ ๋ฏธ๋ฆฌ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

@guardrex dll์„ ํ•ด์ œํ•˜๊ธฐ ์œ„ํ•ด IIS (๋˜๋Š” ์ž ๊ธˆ์„ ์œ ์ง€ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ)๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์•ฑ์„ ์ค‘๋‹จํ•˜๋Š” ๊ฒƒ์€ ์‹ค์ œ๋กœ ๋ฌด์„ญ์ง€ ๋งŒ ํ•ซํ”ฝ์Šค๋ฅผ ์ œํ’ˆ์— ํ‘ธ์‹œ ํ•  ์ˆ˜์—†๋Š” ๊ฒƒ์€ ๋” ๋ฌด์„ญ์Šต๋‹ˆ๋‹ค. ๋‹น๋ถ„๊ฐ„์€ ์•ฑ์„ ๊นจ๋Š” ๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜์žˆ๋Š” ์œ ์ผํ•œ ์ผ์ด์ง€๋งŒ, ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋‹ค๋ฅธ ๋” ํ˜„๋Œ€์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ž์ฃผ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. :)

@ shahjay748 ์ˆจ์„
๋‹น๋ถ„๊ฐ„ ์˜ค๋ž˜๋œ ํ”„๋กœ์„ธ์Šค์— ๊ฐ‡ํ˜€์žˆ๋Š” ์šฐ๋ฆฌ์—๊ฒŒ ๋„์›€์ด๋˜์ง€ ์•Š๋Š” ofc :)

๋‚ด๊ฐ€ํ•˜๋Š” ์ผ์€ (์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Œ) ์‚ฌ์ดํŠธ๋ฅผ ๋‹ค๋ฅธ ๋””๋ ‰ํ† ๋ฆฌ์— ์—…๋กœ๋“œํ•˜๊ณ  iis์—์„œ ๊ฒฝ๋กœ๋ฅผ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋‚ด๋ถ€ ์กฐ์‚ฌ๋ฅผํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ANCM์€ ๋ฐฐํฌ ๋œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ํŒŒ์ผ / ํ•ธ๋“ค์„ ๋ณด๊ด€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. webdeploy ์ž์ฒด์˜ ๋ฌธ์ œ๋กœ ๋ณด์ด๋ฉฐ ๋ฐฐํฌ์— ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. app_offline์ด ์‚ญ์ œ ๋œ ํ›„ ๋ช‡ ๋ฒˆ ์žฌ ์‹œ๋„ํ•œ ํ›„์—๋„ ์ง€์†์ ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ์— ์‹คํŒจํ•œ ์ ์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ๋น ๋ฅธ PowerShell ์‚ฌ์ด๋“œ ๋…ธํŠธ ์ถ”๊ฐ€ : ์•ฑ ์–ด์…ˆ๋ธ”๋ฆฌ์— ๋Œ€ํ•œ ์ž ๊ธˆ์€ ํ•ญ์ƒ ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค ... ๋‚˜๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค ( ์•„์ง! lol).

@ bpetersen1 ... "์Šคํ…Œ์ด์ง•"์ ‘๊ทผ ๋ฐฉ์‹์€ ์ƒˆ ๋ฐฐํฌ๊ฐ€ ์ค‘๋‹จ ๋  ๊ฒฝ์šฐ ๋น ๋ฅธ ๋กค๋ฐฑ ์˜ต์…˜์„ ์ œ๊ณตํ•˜๋Š” ๋‹ฌ์ฝคํ•œ ๋ถ€์ž‘์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์Šคํฌ๋ฆฝํŒ…ํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์™ธ๋ถ€ ์ ์œผ๋กœ ์„ฑ๊ฐ€์‹  ์ผ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” IIS๋ฅผ ๋’ค๋กœํ•˜๊ธฐ ์œ„ํ•ด ๋„์ปค ์†”๋ฃจ์…˜์„ ์กฐ์‚ฌํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ•ด๊ฒฐ์ฑ…์„ ์‹คํ—˜ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ณ„์† ์ง€์ผœ๋ด์ฃผ์„ธ์š”.

FTP๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ Microsoft์˜ ์กฐ์–ธ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?!

FTP๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ Microsoft์˜ ์กฐ์–ธ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?!

appoffline.htm ํŒŒ์ผ์„ ๋“œ๋กญ ํ•œ ๋‹ค์Œ ftp๋ฅผ ์ œ๊ฑฐํ•œ ๋‹ค์Œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

@davidfowl ์˜ˆ, ์ด๊ฒƒ์ด

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐ์น˜ ํŒŒ์ผ์„ ์–ด๋–ป๊ฒŒ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์— ๋Œ€ํ•œ MIcrosoft์˜ ๋ฌธ์„œ์— ๋Œ€ํ•œ ๋งํฌ๋„ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. Google์—์„œ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ.

@ niico100 ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐฐ์น˜ ํŒŒ์ผ์€ ํŒŒ์ผ์„ ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ์— ๋ณต์‚ฌํ•˜๊ณ  ๋จผ์ € ๋ฐฑ์—… ํด๋”๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜๊ธฐ ์ „์— appoffline.htm์„ ํ”„๋กœ์ ํŠธ ํด๋”์— ๋„ฃ์œผ์‹ญ์‹œ์˜ค.
ํŒŒ์ผ ์ž ๊ธˆ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ณต์‚ฌ๊ฐ€ ๋‹ค์‹œ ์‹œ๋„๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” robcopy๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค
https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/robocopy

๊ด€์‹ฌ์žˆ๋Š” ์‚ฌ๋žŒ์ด์žˆ๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ ์Šคํฌ๋ฆฝํŠธ๋Š” Appveyor์—์„œ ๋ฐฐํฌ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ , ์‚ฌ์ดํŠธ๋ฅผ ์ค‘์ง€ํ•˜๊ณ , ํ•„์š”ํ•œ ํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜๊ณ , ์‚ฌ์ดํŠธ๋ฅผ ๋ฐฑ์—…ํ•ฉ๋‹ˆ๋‹ค.
https://github.com/IsraelHikingMap/Site/blob/master/Scripts/Deploy.ps1
๊ทธ๋ž˜๋„ ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์œผ๋กœ ์‹คํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋ฉด docker ๊ฐ€์ด ๋ชจ๋“  ๋ง๋„ ์•ˆ๋˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.
Stop-WebAppPool ๋ฐ Start-WebAppPool powershell ๋ช…๋ น์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋กœ์ปฌ ๊ฐœ๋ฐœ์˜ ๊ฒฝ์šฐ WebDeploy๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‚ด ๋กœ์ปฌ IIS์— ๋Œ€ํ•ด ์‚ฌ์šฉํ•ด ๋ณด์•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ์ž ๊ธด ํŒŒ์ผ์— ๋Œ€ํ•ด ๋ถˆํ‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ VS ์‚ฌ์ „ / ์‚ฌํ›„ ๋นŒ๋“œ ์ด๋ฒคํŠธ์—์„œ ์œ„์˜ powershell ์ปค๋งจ๋“œ ๋ ›์„ ์‚ฌ์šฉํ•ด ๋ณด์•˜์ง€๋งŒ 32 ๋น„ํŠธ powershell์ด โ€‹โ€‹64 ๋น„ํŠธ IIS ์„ค์ •์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๊นŒ? ์–ด์จŒ๋“  ๋‚ด ASP.Net Core ํ”„๋กœ์ ํŠธ์˜ ๋‹ค์Œ ์‚ฌ์ „ / ์‚ฌํ›„ ๋นŒ๋“œ ์ด๋ฒคํŠธ๊ฐ€ ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋นŒ๋“œ ์ „ ์ด๋ฒคํŠธ :
echo "App Offline" /a > $(ProjectDir)app_offline.htm

๋นŒ๋“œ ํ›„ ์ด๋ฒคํŠธ :
del $(ProjectDir)app_offline.htm

๋‚˜๋Š” ์—ฌ๊ธฐ์„œ ๋ถˆํ‰์„ ๊ฐ„๋žตํžˆ ์ˆ™๋…ํ–ˆ๊ณ , ์ด๊ฒƒ์ด ๊ด€๋ จ์ด์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค. CI ๋ฐฐํฌ๋ฅผ ์ผ๋ฐ˜์ ์œผ๋กœ "๋ฐฉ๊ธˆ ์ž‘๋™ ํ•œ"octopus ๋ฐฐํฌ์—์„œ iis ๊ด€๋ฆฌ ์ž‘์—…๊ณผ ํ•จ๊ป˜ azure devops ๋ฆด๋ฆฌ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค. ์›น์•ฑ์„ ์ค‘์ง€ํ•˜๊ณ  ์•ฑ ๋„๋ฉ”์ธ์„ ์ค‘์ง€ ํ•œ ํ›„์—๋„ ํŒŒ์ผ์ด ์—ฌ์ „ํžˆ ๋‚จ์•„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ ํŒŒ์ผ์„ ๋ฐฐํฌํ•˜๋Š” ๋ฐ ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜๋‹ค.

์ด๊ฒƒ์€ ์•„๋งˆ๋„ 3 ๋ฒˆ์˜ ๋ฐฐํฌ ์ค‘ ์ ์–ด๋„ 1 ๋ฒˆ์ด๋ฉฐ ์ƒํ™ฉ์„ ๊ฐœ์„ ํ•˜๊ฑฐ๋‚˜๋ณด๋‹ค ์•ˆ์ •์ ์ธ ๋ฐฐํฌ๋ฅผ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

@Tratcher @ronnyek Application Insights์™€ ๊ด€๋ จ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. App Insights ํ™•์žฅ์„ ์ถ”๊ฐ€ ํ•œ ํ›„ ์›น ์•ฑ DLL์€ ๊ฐ‘์ž๊ธฐ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต๊ณ  ๊ทธ ์ „์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ด๋Š” App Insights๊ฐ€ ํ”„๋กœํŒŒ์ผ ๋Ÿฌ๋ฅผ ์•ฑ ํ”„๋กœ์„ธ์Šค ๋ฐ DLL์— ์—ฐ๊ฒฐํ•ด์•ผํ•œ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•  ๋•Œ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฌ์ „ํžˆ์ด ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ”Œ๋ž˜๊ทธ -e nableRule : AppOffline์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค

๋ฆด๋ฆฌ์Šค๋ฅผ ์‹œ์ž‘ํ•œ ํ›„ ์›น ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ํด๋”๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  msdeploy์—์„œ ์‚ญ์ œ ํ•œ App_Offline.html์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ ์œ„์˜ ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ ๋ฆด๋ฆฌ์Šค๊ฐ€ ์‹คํŒจํ•˜๊ณ  App_Offline ํŒŒ์ผ์ด ์—ฌ์ „ํžˆ ํด๋”์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฆด๋ฆฌ์Šค๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” ๋ชจ๋“ˆ์ด ํด๋”์˜ ํŒŒ์ผ์„ ๋ณผ ๋•Œ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰ asp.net ์ฝ”์–ด ๋Ÿฐํƒ€์ž„ ์„ค์น˜-> aspnetcore.dll 12.1.18263.2

์–ด๋–ค ์•„์ด๋””์–ด? ์•„์ง๋„ ๋ฒ„๊ทธ?

@dhtek app_offline.htm ๋ฐฐ์น˜ ํ•œ ํ›„ ์ฆ‰์‹œ ํŒŒ์ผ์„ ๊ต์ฒดํ•˜๋ ค๊ณ ํ•˜๋ฉด ์„œ๋ฒ„๊ฐ€ ์•„์ง ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒ ํ•  ์‹œ๊ฐ„์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŒŒ์ผ ๊ต์ฒด๋ฅผ ์‹œ๋„ํ•˜๊ธฐ ์ „์— ์ž ์‹œ ๊ธฐ๋‹ค๋ ค์•ผํ•ฉ๋‹ˆ๋‹ค.

์ข‹์•„, ์ดํ•ดํ•˜์ง€๋งŒ msdeploy์—์„œ -e nableRule : AppOffline ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ํŽ˜์ด์ง€๊ฐ€ ์ž๋™์œผ๋กœ ํด๋”์— ๋“œ๋กญ๋˜๊ณ  ๋™๊ธฐํ™”๊ฐ€ ์ฆ‰์‹œ ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์•„๋ฌด๊ฒƒ๋„ํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ด ๋ฌธ์ œ๋„ ์—ฌ์ „ํžˆ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์€ Microsoft.NET.Sdk.Web ๋ฅผ ์ฐธ์กฐํ•˜์ง€๋งŒ ๋ฌธ์„œ์— ๋ช…์‹œ๋œ๋Œ€๋กœ app_offline.htm ํŒŒ์ผ์„ ์ž๋™์œผ๋กœ ์‚ญ์ œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”. ์ด ์„ฑ๊ฐ€์‹  ๋ฌธ์ œ๋Š” ์ตœ์‹  VS 2017์ด ์„ค์น˜๋œ Core 2.1์—์„œ ์—ฌ์ „ํžˆ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” appoffline์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ์ฃผ ํ”„๋กœ์ ํŠธ dll์€ ํ•ญ์ƒ ์‚ฌ์šฉ ์ค‘์ด๋ฉฐ ๊ฒŒ์‹œํ•˜๋Š” ๋™์•ˆ ์›น ์‚ฌ์ดํŠธ๋ฅผ ์™„์ „ํžˆ ์ค‘์ง€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์›น ๋ฐฐํฌ๋ฅผ ๊ฑฐ์˜ ์“ธ๋ชจ ์—†๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ๋’ค์—์„œ ํ˜ธ์ŠคํŠธ๋ฅผ ์˜คํ”„๋ผ์ธ์œผ๋กœ ์ „ํ™˜ ํ•  ์ˆ˜์—†๊ณ  ๋” ๋นจ๋ฆฌ ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ์™€ ์ผ๋ถ€ powershell์„ ์‚ฌ์šฉํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋Ÿฐ ์‹์œผ๋กœ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์—ˆ์–ด์š”.

๋ณต์‚ฌ + ์žฌํ™œ์šฉ ์ค‘์— ์•ฑ ํ’€์„ ์ค‘์ง€ ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค. ํ˜„์žฌ ์š”์ฒญ์„ ์™„๋ฃŒ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ค‘๋‹จ ์‹œ๊ฐ„์ด ์ค„์–ด๋“ค ๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋“œ ์ค‘์ง€๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค.

# Setup
Import-Module WebAdministration
# create 2 site root directories
$a = 'C:\inetpub\AspNetCoreSampleA'
$b = 'C:\inetpub\AspNetCoreSampleB'
$siteRoot = 'C:\inetpub\aspnetcoresample'
$siteName = 'AspNetCoreSample'
$poolName = "aspnetcore"
New-Item -Type Directory $a
New-Item -Type Directory $b
# create a symlink to targeting one side
New-Item -Type SymbolicLink -Path $siteRoot -Target $a
# point the site root to the symlink
Set-ItemProperty "IIS:\Sites\$siteName" -name physicalPath -value $siteRoot
# make sure it get's picked up
Restart-WebAppPool -Name $poolName

# this tells you the active side
Get-Item -Path $siteRoot | Select-Object -ExpandProperty target

# Flip the symlink
$current = (Get-Item -Path $siteRoot).Target
$newTarget = if ($current -eq $a) {$b} else {$a}
New-Item -Type SymbolicLink -Path $siteRoot -Target $newTarget -Force
# at this point w3wp.exe still locks the current target folder until it's getting recycled
# Deploy new version to the symlink which is now pointing to the other side which should have no locks
robocopy \\myshare\myapp $siteRoot /mir
# recycle app pool, so it picks up the new files
Restart-WebAppPool -Name $poolName

# bonus point: rollback is easy
$current = (Get-Item -Path $siteRoot).Target
$newTarget = if ($current -eq $a) {$b} else {$a}
New-Item -Type SymbolicLink -Path $siteRoot -Target $newTarget -Force
Restart-WebAppPool -Name $poolName

์š”์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
https://gist.github.com/csharmath/b2af0f50700ce9fbdd8c5c3e582fd41b

Restart-WebAppPool์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์žฌํ™œ์šฉ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ค‘์ฒฉ ๋œ ์žฌํ™œ์šฉ์„ ํ™œ์„ฑํ™” ํ•œ ๊ฒฝ์šฐ (๊ธฐ๋ณธ๊ฐ’) ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ w3wp.exe๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์™„๋ฃŒ๋˜๋Š” ๋™์•ˆ ๋ชจ๋“  ์ƒˆ ์š”์ฒญ์ด ํ•ด๋‹น ์ƒˆ ํ”„๋กœ์„ธ์Šค์—์„œ ์ œ๊ณต๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด์ „ w3wp.exe์— ์˜ํ•ด.
์ด๋ ‡๊ฒŒํ•˜๋ฉด ์ด์ „ ๋ฒ„์ „์ด ์š”์ฒญ์œผ๋กœ ์™„๋ฃŒ ๋  ๋•Œ๊นŒ์ง€ ๊ฒน์น˜๋ฉฐ ์ƒˆ ๋ฒ„์ „์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋‹จ์ผ w3wp.exe๋กœ ๋๋‚˜๊ณ  ์ž ๊ธˆ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์„€๋„์šฐ ๋ณต์‚ฌ์™€ ๋น„์Šทํ•˜์ง€๋งŒ ํ›จ์”ฌ ๋ฉ‹์ง€๊ณ  ๋งค๋„๋Ÿฌ์šด xcopy ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ œ๊ณตํ•˜๋ฏ€๋กœ 100 %๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€๋Š” ๋ฆด๋ฆฌ์Šค ์ค‘์— ์˜จ๋ผ์ธ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ ์ œ๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜์žˆ๋Š” ์ตœ์„ ์˜ ๋ฐฉ๋ฒ• ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@csharmath ๋˜๋Š” ๋‚ด๊ฐ€ ์ถ”์ธกํ•˜๋Š”๋„

๋ฌผ๋ก  ๊ทธ๊ฒŒ ๋” ์ข‹์Šต๋‹ˆ๋‹ค. ํ•œ์ˆจ, ๋ชจ๋“  ์žฅ์†Œ๊ฐ€ ์•„์ง ๊ทธ๋Ÿฐ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.
๋‚˜๋จธ์ง€ ๊ตฌ์‹ ์„ค์ •์˜ ๊ฒฝ์šฐ ๊ฐ€๋™ ์ค‘์ง€ ์‹œ๊ฐ„์ด ์—†๊ฑฐ๋‚˜ ์ตœ์†Œํ™”๋˜์ง€ ์•Š๊ณ  ์ž‘๋™ ํ•  ๋•Œ๊นŒ์ง€ ์•ผํฌ๋ฅผํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@csharmath ๋™์˜ํ–ˆ์ง€๋งŒ,์ด ์‹œ์ ์—์„œ ์ด๊ฒƒ์ด _years_ ๋™์•ˆ ์ˆ˜์ •๋˜์ง€ ์•Š์€ ๋ฌธ์ œ ์˜€์Œ์„ ๊ฐ์•ˆํ•  ๋•Œ ๊ธฐ์ ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋Œ€์‹  ์ž‘๋™ํ•˜๋Š” ์†”๋ฃจ์…˜์„ ์ ์šฉํ•˜๊ณ  ์ถ”๊ตฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค ...

๋‚˜๋Š” ์•„๋ž˜์˜ ํŒŒ์›Œ ์‰˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ–ˆ์œผ๋ฉฐ IIS๊ฐ€ ์ถฉ๋Œํ•˜๊ณ  ๋‹ค๋ฅธ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ํ’€์—๋„ ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ณ  ๋ชจ๋“  ๊ฒƒ์„ ๋˜์ฐพ๊ธฐ ์œ„ํ•ด ์ปดํ“จํ„ฐ๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค ...์ด ํ”„๋กœ์„ธ์Šค๋Š” ๊ณต์‹ ๋ฌธ์„œ์—์„œ ๊ฐ€์ ธ ์™”์œผ๋ฉฐ ์žฌ์•™์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์ถฉ๊ณ ๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ํ’€์„ ์ค‘์ง€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค DO NOT USE์˜ app_offline.htm์ด๊ณ , ํ•˜๋‚˜๋Š” ๋‚ด๊ฐ€์ด ์Šค๋ ˆ๋“œ์—์„œ ๋ฐœ๊ฒฌ https://github.com/IsraelHikingMap/Site/blob/master/Scripts/Deploy .ps1

$pathToApp = 'G:\prod_web_core'
$pathToAppOfflineHtml = 'G:\prod_web_core\app_offline.htm'
# Stop the AppPool 
New-Item -Path $pathToApp -Name app_offline.htm
# Provide script commands here to deploy the app
Copy-Item "G:\prod_web_core_temp\*" -Destination $pathToApp -Recurse -Force
# Restart the AppPool 
Remove-Item -Path $pathToAppOfflineHtml
Get-ChildItem -Path "G:\prod_web_core_temp" -Recurse | Remove-Item -Force

๋ฐฐํฌ ์„ฑ๊ณต์„ ์œ„ํ•ด AppPool์„ ๊ฐ•์ œ๋กœ ์ค‘์ง€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ์œ„ํ•œ ์ง„ํ–‰ ์ƒํ™ฉ์ด ์žˆ์Šต๋‹ˆ๊นŒ?!

dotnet ์ฝ”์–ด๊ฐ€ ์šฐ๋ฆฌ์—๊ฒŒ ์ƒˆ๋กœ์šด ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋Š˜ ์ฒ˜์Œ์œผ๋กœ์ด ํŒŒ์ผ ์ž ๊ธˆ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ ๋•Œ๋ฌธ์— ์ •๋ง๋กœ ๊ฒฝ๊ณ„๋ฅผ ์žƒ์—ˆ๋‹ค. ๋ฒ ํƒ€ ๋ฒ„์ „ (~ 2001)์—์žˆ๋Š” ๋™์•ˆ Classic ASP์—์„œ .Net Framework๋กœ ์ „ํ™˜ ํ•œ ๊ฐ€์žฅ ํฐ ์ด์œ ๋Š” ํŒŒ์ผ ์ž ๊ธˆ์—†์ด ํ•ซ ๋ฐฐํฌ๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ต‰์žฅํ–ˆ์Šต๋‹ˆ๋‹ค! ๊ฑฐ์˜ 18 ๋…„์ด ์ง€๋‚œ ์ง€๊ธˆ ์ €๋Š” ์ œ๊ฐ€ ์‹œ์ž‘ํ•œ ๊ณณ์œผ๋กœ ๋Œ์•„ ์™”์Šต๋‹ˆ๋‹ค. ์˜ค ๊ธ€์Ž„์š”, ๋‹น์‹ ์€ ์ผ๋ถ€๋ฅผ ์ด๊ธฐ๊ณ  ์ผ๋ถ€๋Š” ์žƒ์Šต๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ ์ œ ๋ฌธ์ œ๋ฅผ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ œ ๊ฒฝ์šฐ์—๋Š” Blazor ์„œ๋ฒ„ ์ธก ์†”๋ฃจ์…˜์„ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค ....
๋ฉฐ์น  ์ „์—๋Š” ์•…๋ชฝ์ด์—ˆ์Šต๋‹ˆ๋‹ค. app_offline.htm์„ ์ ์šฉํ•˜๊ณ  ์•ฑ ํ’€์„ ์ข…๋ฃŒํ•˜๊ณ  ์ „์ฒด IIS ์ธ์Šคํ„ด์Šค๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜์—ฌ ํŒŒ์ผ ์ž ๊ธˆ์„ ํ•ด์ œํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‹จ๊ณ„๋Š” ์ „์ฒด ์„œ๋ฒ„๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹คํ–‰ํžˆ 5 ๋ถ„ ํ›„์— .dll์ด ์ž ๊ธˆ ํ•ด์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

2019 ๋…„, ์ €์—๊ฒŒ๋„ ๊ฐ™์€ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.์ด ๋ฌธ์ œ๋Š” 2016 ๋…„์— ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค ... ์•„์ง ํ•ด๊ฒฐ์ฑ…์ด ์—†๋‚˜์š”?

2020 ๋…„, ์ €์—๊ฒŒ๋„ ๊ฐ™์€ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์—ญ๋Œ€ ๊ฐ€์žฅ ํฐ ํšŒ๊ท€. .Net 4.6์€ dll ํŒŒ์ผ์„ ๋ฐ”๊พธ๊ณ  ์•ฑ์ด ์ƒˆ ๋ฒ„์ „์—์„œ ๋‹ค์‹œ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. .Net ์ฝ”์–ด๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์ž ๊ธ‰๋‹ˆ๋‹ค.

@bladefist ์˜ค๋Š˜ ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ Docker ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@kanadaj ๊ฐ์‚ฌํ•˜์ง€๋งŒ Dockers๋Š” ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ๋˜ ๋‹ค๋ฅธ ๊ณจ์นซ๊ฑฐ๋ฆฌ์ž…๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ App_offline.htm์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„ ๋‚ธ ๋‹ค์Œ ์ž ์‹œ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ํŒŒ์ผ์ด ๋ฌด๋ฃŒ๊ฐ€๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. 99 %์˜ ์‹œ๊ฐ„ ๋™์•ˆ ๊ธฐ๋‹ค๋ ค์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์•ฑ์˜ ์ „์›์ด ๊บผ์ง€๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

dll์„ ๋ณต์‚ฌํ•˜๊ณ  ์•ฑ์ด ์ž๋™ ์žฌํ™œ์šฉ๋˜๋Š” .net 4.6์˜ ์‹œ๋Œ€๋Š” ์ง€๋‚ฌ์Šต๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๊ฐ„๋‹จํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฐฐ๋กœ ์‹ค๋ง์Šค๋Ÿฌ์šด ๊ฒƒ์€ ์ด๊ฒƒ์ด ๋ฆฌ๋ˆ…์Šค์—์„œ ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Linux์—์„œ ์‚ฌ์šฉ์ค‘์ธ ํŒŒ์ผ์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ๊ทธ๋ ‡๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ทธ ๋ฐฉ๋ฒ•์€ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ๊ทธ๋ฆฌ ๊ฐ„๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. HA๊ฐ€ ์—†์œผ๋ฉด ์•ฑ์ด 1 ๋ถ„ ๋™์•ˆ ์‘๋‹ตํ•˜์ง€ ์•Š๊ณ  HA๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๊ฐ€ ์•ฑ์ด ๋‹ค์šด๋˜์—ˆ์Œ์„ ์•Œ ๋•Œ๊นŒ์ง€ ์ž„์˜์˜ ์ž˜๋ชป๋œ ์š”์ฒญ์„ ๋ฐ›๊ฒŒ๋ฉ๋‹ˆ๋‹ค.๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ์—์„œ ํ˜ธ์ŠคํŠธ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ˆœํ™˜ํ•˜์ง€ ์•Š๋Š” ํ•œ. ๊ทธ๋Ÿฌ๋‚˜ ์„ค์ •ํ•˜๋Š” ๋ฐ ๋” ๋งŽ์€ ๋ฌธ์ œ๊ฐ€์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@kanadaj ๊ทธ๋ž˜, ์šฐ๋ฆฌ๋Š”๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์„œ๋ฒ„๋ฅผ ์„ ํ˜• ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์šด ํƒ€์ž„์ด ์—†์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค

  • ์•ฑ ๋””๋ ‰ํ† ๋ฆฌ์— ๋Œ€ํ•œ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ ์‚ฌ์šฉ
  • ์ƒˆ ๋ฒ„์ „์˜ ์‚ฌ์ดํŠธ๋ฅผ ๋‹ค๋ฅธ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋ฐฐํฌ
  • ์‹ฌ๋ณผ๋ฆญ ๋งํฌ ์—…๋ฐ์ดํŠธ
  • IIS์™€ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” appcmd ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ฑ ํ’€์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

@davidglassborow ๋Š” ์ฐฝ์˜์ ์ธ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ๊ฐ์‚ฌ. ํ•˜์ง€๋งŒ ์ฐฝ์˜์ ์ธ ์†”๋ฃจ์…˜์ด ํ•„์š”ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

๋‚ด ๊ฒฝํ—˜์ƒ ์‚ฌ์ดํŠธ๊ฐ€๋กœ๋“œ ์ƒํƒœ ์ผ ๋•Œ ์ด์ „ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†์—ˆ์œผ๋ฉฐ ํŠธ๋ž˜ํ”ฝ์ด ๋งŽ์€ ์‚ฌ์ดํŠธ์— ๋Œ€ํ•ด ์—ญ๋ฐฉํ–ฅ ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋งž์Šต๋‹ˆ๋‹ค. ์ธํ”Œ๋ ˆ ์ด์Šค ๋ฐฐํฌ๋Š” ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๊ฑฐ๋‚˜ ์›์ž ์ ์ด ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์šด์ด ์ข‹๊ฑฐ๋‚˜ ํŠธ๋ž˜ํ”ฝ์ด ๋งŽ์ง€ ์•Š์œผ๋ฉด ๊ดœ์ฐฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๋ถˆ๋งŒ์ด ์ด๋Ÿฌํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๊ด€ํ•œ ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. .NET 5.0 ์‹œ๊ฐ„ ํ”„๋ ˆ์ž„์—์„œ ๊ฐœ์„  ์‚ฌํ•ญ์„ ์‚ดํŽด๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€์ฃผ์˜ ์‚ฌํ•ญ :

  • ์šฐ๋ฆฌ๋Š” ํ”„๋ ˆ์ž„ ์›Œํฌ์— ์˜์กดํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋” ์ข‹๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋…๋ฆฝํ˜•์„ ๋ฐฐํฌํ•˜๋ฉด ์šด์ด ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ถœ๋ ฅ ํด๋”์˜ ๊ธฐ๋ณธ ๋ฐ ๊ด€๋ฆฌ ํŒŒ์ผ์„ ๋ชจ๋‘ ์ž ๊ธ‰๋‹ˆ๋‹ค. ๊ธฐ๋ณธ dll ์ž ๊ธˆ ๋ฌธ์ œ๋Š” ํ•ญ์ƒ ์กด์žฌ ํ•ด ์™”์œผ๋ฉฐ ์šฐ๋ฆฌ๊ฐ€ ์–ด๋–ค ์™„ํ™” ์กฐ์น˜๋ฅผ ์ทจํ•˜๋”๋ผ๋„ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์šฐ๋ฆฌ๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ๋””์Šคํฌ์—์„œ๋กœ๋“œํ•˜๊ณ  ํŒŒ์ผ์„ ์ž ๊ทธ๋Š” ๋Œ€์‹  ๋ฐ”์ดํŠธ๋กœ ๋ฉ”๋ชจ๋ฆฌ์—๋กœ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณผ ๊ณ„ํš์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๊ดœ์ฐฎ์ง€ ๋งŒ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ๋” ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์žฌํ™œ์šฉํ•˜๋ ค๋ฉด ์—ฌ์ „ํžˆ appoffline ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ œ๊ฑฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. appoffline ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๋ฐฐํฌ์˜ ๊ฒฐ๊ณผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๋Š” ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

@davidfowl 5.0์— ๋Œ€ํ•ด ์„ค๋ช…ํ•œ ๊ณ„ํš์€ ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ํ”„๋ ˆ์ž„ ์›Œํฌ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

ํ˜„์žฌ ์œ„์น˜ ๋ฐฐํฌ์˜ ์•ˆ์ •์„ฑ์— ๋Œ€ํ•ด ์ •์ค‘ํžˆ ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋งค์šฐ ๋†’์€ ๋ถ€ํ•˜๋ฅผ ๊ฐ€์ง„ ์‚ฌ์ดํŠธ์—์„œ ์ˆ˜๋…„๊ฐ„ ๊ทธ๊ฒƒ์„ ํ•ด์™”๊ณ  ํ•œ ๋ฒˆ๋„ ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ ๊ฐ์ง€ ๋œ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ์•ฑ์ด ์žฌ์„ค์ •๋˜๊ณ ,๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋Š” ์ธ์Šคํ„ด์Šค๊ฐ€ ์‘๋‹ตํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜๊ณ , ์˜คํ”„๋ผ์ธ์œผ๋กœ ์ „ํ™˜ํ•˜๊ณ , ๋ชจ๋“  DLL์ด ๊ต์ฒด๋˜๋ฉด๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๊ฐ€ ์ƒํƒœ ํ™•์ธ์„ ์™„๋ฃŒํ•˜๊ณ  ๋‹ค์‹œ ์˜จ๋ผ์ธ ์ƒํƒœ๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์ด์ œ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ์ƒํƒœ ํ™•์ธ์ด ์—†์œผ๋ฉด ๋„๋ฐ•์ž…๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ํ”„๋ก์‹œ์—†์ด ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ DLL์„ ๋Œ€์ฒดํ•˜๋Š” ์‚ฌ๋žŒ์€ ๋ˆ„๊ตฌ์ž…๋‹ˆ๊นŒ? ์˜ˆ์™ธ๊ฐ€ ์•„๋‹Œ ๊ทœ์น™์— ์ดˆ์ ์„ ๋งž ์ถฅ๋‹ˆ ๋‹ค. ํ”„๋ก์‹œ๊ฐ€ ์—†์œผ๋ฉด ์ค‘๋‹จ์—†์ด ์•ฑ์„ ์—…๋ฐ์ดํŠธ ํ•  ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ•ซ ๋ฆฌ๋กœ๋”ฉ์„ ์ง€์›ํ•˜๋”๋ผ๋„ ์ผ๋ถ€ ์š”์ฒญ์€ ์ค‘๋‹จ๋˜๊ฑฐ๋‚˜ ์‹คํŒจ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ์œ„์น˜ ๋ฐฐํฌ์˜ ์•ˆ์ •์„ฑ์— ๋Œ€ํ•ด ์ •์ค‘ํžˆ ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋งค์šฐ ๋†’์€ ๋ถ€ํ•˜๋ฅผ ๊ฐ€์ง„ ์‚ฌ์ดํŠธ์—์„œ ์ˆ˜๋…„๊ฐ„ ๊ทธ๊ฒƒ์„ ํ•ด์™”๊ณ  ํ•œ ๋ฒˆ๋„ ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ ๊ฐ์ง€ ๋œ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ์•ฑ์ด ์žฌ์„ค์ •๋˜๊ณ ,๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋Š” ์ธ์Šคํ„ด์Šค๊ฐ€ ์‘๋‹ตํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜๊ณ , ์˜คํ”„๋ผ์ธ์œผ๋กœ ์ „ํ™˜ํ•˜๊ณ , ๋ชจ๋“  DLL์ด ๊ต์ฒด๋˜๋ฉด๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๊ฐ€ ์ƒํƒœ ํ™•์ธ์„ ์™„๋ฃŒํ•˜๊ณ  ๋‹ค์‹œ ์˜จ๋ผ์ธ ์ƒํƒœ๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์ด์ œ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ์ƒํƒœ ํ™•์ธ์ด ์—†์œผ๋ฉด ๋„๋ฐ•์ž…๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ํ”„๋ก์‹œ์—†์ด ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ DLL์„ ๋Œ€์ฒดํ•˜๋Š” ์‚ฌ๋žŒ์€ ๋ˆ„๊ตฌ์ž…๋‹ˆ๊นŒ? ์˜ˆ์™ธ๊ฐ€ ์•„๋‹Œ ๊ทœ์น™์— ์ดˆ์ ์„ ๋งž ์ถฅ๋‹ˆ ๋‹ค. ํ”„๋ก์‹œ๊ฐ€ ์—†์œผ๋ฉด ์ค‘๋‹จ์—†์ด ์•ฑ์„ ์—…๋ฐ์ดํŠธ ํ•  ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ•ซ ๋ฆฌ๋กœ๋”ฉ์„ ์ง€์›ํ•˜๋”๋ผ๋„ ์ผ๋ถ€ ์š”์ฒญ์€ ์ค‘๋‹จ๋˜๊ฑฐ๋‚˜ ์‹คํŒจ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๊ณ  ๋””์Šคํฌ์˜ ํŒŒ์ผ์„ ์ œ์ž๋ฆฌ์— ๋†“๊ณ  ๋งˆ๋ฒ•์„ ๊ธฐ๋Œ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค ๐Ÿ˜„

@davidfowl ๋งž์ง€๋งŒ ๋†’์€ ํŠธ๋ž˜ํ”ฝ + ํŒŒ์šด๋“œ ์—†์Œ = ๋ฌด๋ชจํ•จ

๋˜ํ•œ app_offline.htm์˜ ๋ฌธ์ œ๋Š” ci / cd ํ”„๋กœ์„ธ์Šค์—์„œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์–ธ์ œ ์ค‘์ง€๋˜๋Š”์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ข…๋ฃŒ ํ”„๋กœ์„ธ์Šค๊ฐ€ 1 ๋ถ„์—์„œ 1 ๋ถ„๊นŒ์ง€ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  DLL์„ ํ‘ธ์‹œํ•˜๋Š” ์‚ฌ์ด์— ์—„์ฒญ๋‚œ ์ ˆ์ „ ๋ช…๋ น์„ ์ถ”๊ฐ€ํ•ด์•ผํ–ˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜๋งŽ์€ ์ธ์Šคํ„ด์Šค๋ฅผ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ํ•  ๋•Œ ์ด๋Ÿฌํ•œ ํœด๋ฉด์ด ์ถ”๊ฐ€๋˜์–ด ๋ฐฐํฌ์ฃผ๊ธฐ๊ฐ€ ๋งค์šฐ ๊ธธ์–ด์ง‘๋‹ˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ์— ํŒŒ์ผ์„๋กœ๋“œํ•˜๋ฉด ๋ชจ๋“  ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

@davidfowl ๋งž์ง€๋งŒ ๋†’์€ ํŠธ๋ž˜ํ”ฝ + ํŒŒ์šด๋“œ ์—†์Œ = ๋ฌด๋ชจํ•จ

๐Ÿ‘

๋˜ํ•œ app_offline.htm์˜ ๋ฌธ์ œ๋Š” ci / cd ํ”„๋กœ์„ธ์Šค์—์„œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์–ธ์ œ ์ค‘์ง€๋˜๋Š”์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ข…๋ฃŒ ํ”„๋กœ์„ธ์Šค๊ฐ€ 1 ๋ถ„์—์„œ 1 ๋ถ„๊นŒ์ง€ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  DLL์„ ํ‘ธ์‹œํ•˜๋Š” ์‚ฌ์ด์— ์—„์ฒญ๋‚œ ์ ˆ์ „ ๋ช…๋ น์„ ์ถ”๊ฐ€ํ•ด์•ผํ–ˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜๋งŽ์€ ์ธ์Šคํ„ด์Šค๋ฅผ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ํ•  ๋•Œ ์ด๋Ÿฌํ•œ ํœด๋ฉด์ด ์ถ”๊ฐ€๋˜์–ด ๋ฐฐํฌ์ฃผ๊ธฐ๊ฐ€ ๋งค์šฐ ๊ธธ์–ด์ง‘๋‹ˆ๋‹ค.

๋งž์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฌธ์ œ๋Š” ํ•ด๋‹น ํŒŒ์ผ์„ ์‚ญ์ œํ•ด๋„ ANCM์—์„œ ์•Œ๋ฆผ์„๋ฐ›์„ ๋•Œ๊นŒ์ง€ ํŒŒ์ผ์ด ์—ฌ์ „ํžˆ ์ž ๊ฒจ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐํฌ๋ฅผ ์‹œ์ž‘ํ•ด๋„๋˜๋Š”์ง€ ์•Œ๋ ค์ฃผ์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ app_offline.htm์˜ ๋ฌธ์ œ๋Š” ci / cd ํ”„๋กœ์„ธ์Šค์—์„œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์–ธ์ œ ์ค‘์ง€๋˜๋Š”์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋งž์Šต๋‹ˆ๋‹ค. VS ๊ฒŒ์‹œ์ž๋Š” ์งง์€ ์ ˆ์ „ ๋ชจ๋“œ์™€ ์—ฌ๋Ÿฌ ๋ฒˆ์˜ ์žฌ ์‹œ๋„๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์žฌํ™œ์šฉํ•˜๋ ค๋ฉด ์—ฌ์ „ํžˆ appoffline ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ œ๊ฑฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. appoffline ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๋ฐฐํฌ์˜ ๊ฒฐ๊ณผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๋Š” ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๋‚˜์ค‘์— appoffline ํŒŒ์ผ์„ ์‚ญ์ œํ•˜์ง€ ์•Š๊ณ ๋„ ์žฌํ™œ์šฉ ํ•  ์•ฑ์„ ํ‘œ์‹œํ•˜๋Š” "apprestart"ํŒŒ์ผ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@Socolin ์™œ

@Socolin ์™œ

๋‚ด๊ฐ€ ์ž˜ ์ดํ•ดํ•œ๋‹ค๋ฉด (๋‚ด๊ฐ€ ํ‹€๋ ธ๋‹ค๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”) ์ž ๊ธˆ์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ๊ณ„ํš์ด์ง€๋งŒ ๋นŒ๋“œ๊ฐ€ ์™„๋ฃŒ๋œ ํ›„ IIS์— ์•ฑ์„ ์žฌํ™œ์šฉํ•˜๋„๋ก ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด appoffline์„ ๋งŒ๋“ค์–ด์•ผํ•ฉ๋‹ˆ๊นŒ?

์ด๋ ‡๊ฒŒํ•˜๋ ค๋ฉด appoffline ํŒŒ์ผ์„ ๋งŒ๋“  ๋‹ค์Œ ์‚ญ์ œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์ด ์ƒ์„ฑ ๋œ ์งํ›„์ด ํŒŒ์ผ์„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด IIS๊ฐ€ ๊ฐ์ง€ ํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผํ•ฉ๋‹ˆ๊นŒ? ์กฐ๊ธˆ๋งŒ ๊ธฐ๋‹ค๋ ค์•ผํ•œ๋‹ค๋ฉด IIS๊ฐ€ ์ˆ˜์‹  ํ•  "apprestart"์™€ ๊ฐ™์€ ํŒŒ์ผ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ฐ์ง€๋˜๋ฉด ์‚ญ์ œํ•˜๊ณ  ์žฌํ™œ์šฉ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.


๋˜ ๋‹ค๋ฅธ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋นŒ๋“œ ์ค‘ IDE ์ตœ์ ํ™”์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ €๋Š” ์ข…์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ์ž‘์—…ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์›น ๋ ˆ์ด์–ด ์šฉ ํ”„๋กœ์ ํŠธ์™€ ๋กœ์ง ๋ฐ ๋ฐ์ดํ„ฐ ์šฉ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋นŒ๋“œํ•˜๋Š” ๋™์•ˆ ์›น ๋ ˆ์ด์–ด (ASP.NET Core)์—์„œ ์ž‘์—… ํ•  ๋•Œ ๋นŒ๋“œ ์ „์— appoffline ํŒŒ์ผ์„ ๋งŒ๋“  ๋‹ค์Œ ๋นŒ๋“œ ํ›„์— ์‚ญ์ œํ•˜๋ฉด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ข…์†์„ฑ ์ค‘ ํ•˜๋‚˜์—์„œ ์ž‘์—… ํ•  ๋•Œ Rider์—์„œ ๋นŒ๋“œ ํ•  ๋•Œ (msbuild๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— VS์—์„œ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค) msbuild๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์„ ๋ณผ ๋•Œ ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด .dll์€ .Web ํ”„๋กœ์ ํŠธ๋ฅผ ๋‹ค์‹œ ๋นŒ๋“œํ•˜์ง€ ์•Š๊ณ  .Web / bin ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ง์ ‘ ๋ณต์‚ฌ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  dll์ด ์ž ๊ฒจ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž๋™์œผ๋กœ ์‹คํŒจํ•˜๊ณ  ์„œ๋ฒ„๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ฑฐ๋‚˜ .Web ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ๋ฅผ ์ˆ˜๋™์œผ๋กœ ํŠธ๋ฆฌ๊ฑฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์Šต๋‹ˆ๊นŒ?
์ง€๊ธˆ๊นŒ์ง€ ๋‚ด๊ฐ€ ์ฐพ์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋‚ด .Web ํ”„๋กœ์ ํŠธ์˜ / bin์„ ์ฐพ๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ์ž‘์€ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜๋ฉด IIS๊ฐ€ ์ˆ˜์‹ ํ•˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ์— appoffline ํŒŒ์ผ์„ ์ƒ์„ฑ ํ•œ ๋‹ค์Œ ์ˆ˜์ • ๋œ ํŒŒ์ผ์„ ๋ณต์‚ฌ ํ•œ ๋‹ค์Œ appoffline์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์•ฝ๊ฐ„ ์—‰๋ง์ธ ๊ฒƒ ๊ฐ™์ง€๋งŒ ์ง€๊ธˆ๊นŒ์ง€๋Š” ๋นŒ๋“œ ํ•  ์ˆ˜์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ• ์ธ ๋‹ค์Œ F5 ํ‚ค๋ฅผ ๋ˆ„๋ฅด๊ณ  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒํ•˜๋ ค๋ฉด appoffline ํŒŒ์ผ์„ ๋งŒ๋“  ๋‹ค์Œ ์‚ญ์ œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์ด ์ƒ์„ฑ ๋œ ์งํ›„์ด ํŒŒ์ผ์„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด IIS๊ฐ€ ๊ฐ์ง€ ํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผํ•ฉ๋‹ˆ๊นŒ? ์กฐ๊ธˆ๋งŒ ๊ธฐ๋‹ค๋ ค์•ผํ•œ๋‹ค๋ฉด IIS๊ฐ€ ์ˆ˜์‹  ํ•  "apprestart"์™€ ๊ฐ™์€ ํŒŒ์ผ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ฐ์ง€๋˜๋ฉด ์‚ญ์ œํ•˜๊ณ  ์žฌํ™œ์šฉ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

IIS๋Š” ํŒŒ์ผ ๋ณต์‚ฌ๊ฐ€ ๋๋‚ฌ์Œ์„ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ฐข์–ด์ง„ ์ƒํƒœ๋ฅผ ์–ด๋–ป๊ฒŒ ํ”ผํ•ฉ๋‹ˆ๊นŒ? ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฑฐ๋ž˜์˜ ์‹œ์ž‘๊ณผ ์™„๋ฃŒ๋ฅผ ์•Œ๋ฆฌ๋Š” ์‹ ํ˜ธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์˜ ์ƒ์„ฑ์€ ์‹œ์ž‘ ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด๊ณ  ์‚ญ์ œ๋Š” ๋ ์‹ ํ˜ธ๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์Šต๋‹ˆ๊นŒ?
์ง€๊ธˆ๊นŒ์ง€ ๋‚ด๊ฐ€ ์ฐพ์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋‚ด .Web ํ”„๋กœ์ ํŠธ์˜ / bin์„ ์ฐพ๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ์ž‘์€ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜๋ฉด IIS๊ฐ€ ์ˆ˜์‹ ํ•˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ์— appoffline ํŒŒ์ผ์„ ์ƒ์„ฑ ํ•œ ๋‹ค์Œ ์ˆ˜์ • ๋œ ํŒŒ์ผ์„ ๋ณต์‚ฌ ํ•œ ๋‹ค์Œ appoffline์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์•ฝ๊ฐ„ ์—‰๋ง์ธ ๊ฒƒ ๊ฐ™์ง€๋งŒ ์ง€๊ธˆ๊นŒ์ง€๋Š” ๋นŒ๋“œ ํ•  ์ˆ˜์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ• ์ธ ๋‹ค์Œ F5 ํ‚ค๋ฅผ ๋ˆ„๋ฅด๊ณ  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

VS๋Š” ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์˜ ๋นŒ๋“œ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•ด ์ƒˆ ํŒŒ์ผ์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•˜์—ฌ์ด๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒํ•˜๋ ค๋ฉด appoffline ํŒŒ์ผ์„ ๋งŒ๋“  ๋‹ค์Œ ์‚ญ์ œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์ด ์ƒ์„ฑ ๋œ ์งํ›„์ด ํŒŒ์ผ์„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด IIS๊ฐ€ ๊ฐ์ง€ ํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผํ•ฉ๋‹ˆ๊นŒ? ์กฐ๊ธˆ๋งŒ ๊ธฐ๋‹ค๋ ค์•ผํ•œ๋‹ค๋ฉด IIS๊ฐ€ ์ˆ˜์‹  ํ•  "apprestart"์™€ ๊ฐ™์€ ํŒŒ์ผ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ฐ์ง€๋˜๋ฉด ์‚ญ์ œํ•˜๊ณ  ์žฌํ™œ์šฉ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

IIS๋Š” ํŒŒ์ผ ๋ณต์‚ฌ๊ฐ€ ๋๋‚ฌ์Œ์„ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ฐข์–ด์ง„ ์ƒํƒœ๋ฅผ ์–ด๋–ป๊ฒŒ ํ”ผํ•ฉ๋‹ˆ๊นŒ? ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฑฐ๋ž˜์˜ ์‹œ์ž‘๊ณผ ์™„๋ฃŒ๋ฅผ ์•Œ๋ฆฌ๋Š” ์‹ ํ˜ธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์˜ ์ƒ์„ฑ์€ ์‹œ์ž‘ ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด๊ณ  ์‚ญ์ œ๋Š” ๋ ์‹ ํ˜ธ๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

์ž ๊ธˆ์ด์—†๋Š” ๊ฒฝ์šฐ ๋นŒ๋“œ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ IIS์— ์•Œ๋ฆฌ๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋ชจ๋“  ํŒŒ์ผ์ด ์—…๋ฐ์ดํŠธ๋˜๊ณ  ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์žฌํ™œ์šฉํ•ด์•ผ ํ•  ๋•Œ ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ? ๋ญ”๊ฐ€ ์˜คํ•ด ํ•œ ๊ฒƒ ๊ฐ™์•„์š”.

์ž ๊ธˆ์ด์—†๋Š” ๊ฒฝ์šฐ ๋นŒ๋“œ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ IIS์— ์•Œ๋ฆฌ๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋ชจ๋“  ํŒŒ์ผ์ด ์—…๋ฐ์ดํŠธ๋˜๊ณ  ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์žฌํ™œ์šฉํ•ด์•ผ ํ•  ๋•Œ ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ? ๋ญ”๊ฐ€ ์˜คํ•ด ํ•œ ๊ฒƒ ๊ฐ™์•„์š”.

์˜ˆ, ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ํ˜„์žฌ์˜ ์˜ˆ์ˆ  ์ƒํƒœ๋ฅผ ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜๋‚  web.config๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ์„ ํ„ฐ์น˜ํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์žฌ๋ถ€ํŒ…๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์„ ํ†ตํ•ด ์ธํ”Œ๋ ˆ ์ด์Šค ๋ฐฐํฌ (https://flukefan.github.io/ZipDeploy/)๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. ์–ด์…ˆ๋ธ”๋ฆฌ ํŒŒ์ผ ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ (์‚ญ์ œ / ๋ฎ์–ด ์“ธ ์ˆ˜ ์—†๋”๋ผ๋„ ์ด๋ฆ„์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Œ)
  2. ์ƒˆ ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ๋ณต์‚ฌํ•˜์‹ญ์‹œ์˜ค.
  3. ์›น ๊ตฌ์„ฑ์„ ํ„ฐ์น˜ํ•˜์—ฌ ์•ฑ์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜์‹ญ์‹œ์˜ค.
  4. ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋œ ์ด์ „ ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ์—†์Œ; ๋‹จ์ผ IIS ์ธ์Šคํ„ด์Šค; IIS ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์—†์Šต๋‹ˆ๋‹ค. YMMV.

@FlukeFan ์ฐข์–ด์ง„ ๋ฐฐํฌ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๊ฑฑ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ์กฐ๊ฐ๋‚œ ๊ฒƒ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์ด์ „ ์•ฑ์ด ์ƒˆ ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ๋กœ๋“œํ•˜๋Š” ์ฐฝ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ์–ด์…ˆ๋ธ”๋ฆฌ์˜ ์ด๋ฆ„์ด ๋ณ€๊ฒฝ / ์—…๋ฐ์ดํŠธ ๋  ๋•Œ๊นŒ์ง€ web.config๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ ์‹œ๊ฐ„ ๋™์•ˆ ๋‹ค๋ฅธ ๋ฌด์–ธ๊ฐ€๋กœ ์ธํ•ด ์•ฑ ํ’€์ด ์žฌํ™œ์šฉ ๋  ๊ฐ€๋Šฅ์„ฑ์€ ์ ์ง€ ๋งŒ ์•„์ง ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค๋ฅธ ๋ชจ๋“  ์ž๋™ ์žฌํ™œ์šฉ ์˜ต์…˜์„ ๋„๊ณ  IIS ์•ฑ ํ’€ ์„ค์ •์—์„œ ์ค‘๋ณต ๋œ ์žฌํ™œ์šฉ์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

@FlukeFan ์€ ์žฌํ™œ์šฉ์ด ์•„๋‹ˆ์ง€๋งŒ ์•„์ง ๊ต์ฒด ๋œ ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ๋กœ๋“œํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ. ์˜ˆ๋ฅผ ๋“ค์–ด, ์–ด์…ˆ๋ธ”๋ฆฌ A.dll ๋ฐ B.dll์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์„ค์ • ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ๋•Œ B๊ฐ€ ์‚ฌ์šฉ๋˜์–ด๋กœ๋“œ๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ • ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. B.dll์ด ์ƒˆ ๊ฒƒ์œผ๋กœ ๊ต์ฒด๋˜์—ˆ์„ ๋•Œ ์„ค์ • ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋ฉด ์ƒˆ B.dll๋กœ ์‹คํ–‰๋˜๋Š” ์ด์ „ ์•ฑ์ด ๋๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ๋ฐฐํฌ๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด dotnet ๊ธ€๋กœ๋ฒŒ ๋„๊ตฌ๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์ด ๋„๊ตฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ๋žŒ๋“ค์ด์ด ์Šค๋ ˆ๋“œ์—์„œ ์–ธ๊ธ‰ ํ•œ ๋ชจ๋“  ์–ด๋ ค์šด ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒ๊ฐ?

@FlukeFan ์€ ์žฌํ™œ์šฉ์ด ์•„๋‹ˆ์ง€๋งŒ ์•„์ง ๊ต์ฒด ๋œ ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ๋กœ๋“œํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ. ์˜ˆ๋ฅผ ๋“ค์–ด, ์–ด์…ˆ๋ธ”๋ฆฌ A.dll ๋ฐ B.dll์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์„ค์ • ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ๋•Œ B๊ฐ€ ์‚ฌ์šฉ๋˜์–ด๋กœ๋“œ๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ • ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. B.dll์ด ์ƒˆ ๊ฒƒ์œผ๋กœ ๊ต์ฒด๋˜์—ˆ์„ ๋•Œ ์„ค์ • ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋ฉด ์ƒˆ B.dll๋กœ ์‹คํ–‰๋˜๋Š” ์ด์ „ ์•ฑ์ด ๋๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ง€๊ธˆ์€ ๊ทธ ์‚ฌ๊ฑด์„ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. https://github.com/FlukeFan/ZipDeploy/blob/master/ZipDeploy/ZipDeploy.cs#L55

๋‹ค๋ฅธ ์ˆœ์„œ๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  web.config๋ฅผ ๋จผ์ € ํ„ฐ์น˜ํ•˜๊ณ  ๋ชจ๋“  '๋‹ค๋ฅธ'์š”์ฒญ์ด ์™„๋ฃŒ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฐ ๋‹ค์Œ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋งˆ์ง€๋ง‰ ์š”์ฒญ์ด ์™„๋ฃŒ๋˜๊ธฐ ์ง์ „์— ๊ต์ฒด๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (IIS๊ฐ€ ์•ฝ์— ๋Œ€ํ•œ ์ƒˆ ์š”์ฒญ์„ ๋Œ€๊ธฐ์—ด์— ๋„ฃ๋Š” ๋™์•ˆ). recycle app-pool), ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ ๊ฐ€์ง„ ๊ฒƒ์€ ์ง€๊ธˆ ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ ์„ค๋ช…ํ•˜๊ณ ์žˆ๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•ด์„œ๋Š” ์ถฉ๋ถ„ํžˆ ๊ฒฌ๊ณ ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค (ํ•˜์ง€๋งŒ ์‹œ์ž‘ ์‹œ๊ฐ„ ์™ธ์—๋Š” ๋™์  ์–ด์…ˆ๋ธ”๋ฆฌ๋กœ๋“œ์— ๋Œ€ํ•ด ๋ฉ‹์ง„ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค).

์ด ๊ธฐ๋Šฅ์„ ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•˜์—ฌ ๋กœ๋“œ๋งต์— ์˜ฌ๋ฆด ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‹ค์šด ํƒ€์ž„์—†๋Š” ๋ฐฐํฌ๋ฅผ ์ง€์›ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ .Net Core ์›น ์‚ฌ์ดํŠธ๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์Šคํ…Œ์ด์ง• ์Šฌ๋กฏ ์ „๋žต์„ ์ˆ˜๋™์œผ๋กœ ๊ตฌํ˜„ํ•˜๋„๋ก ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋ถˆํŽธํ•˜๊ณ  ๋น„์šฐํ˜ธ์ ์ž…๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด .Net Core ์›น ์‚ฌ์ดํŠธ๋กœ ํ›จ์”ฌ ์›ํ™œํ•˜๊ฒŒ ์ „ํ™˜ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ .Net Core ์›น ์‚ฌ์ดํŠธ๋ฅผ ๋” ๋น ๋ฅด๊ฒŒ ์ฑ„ํƒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ƒ๊ฐํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹น์‹ ์€ ๋จธ๋ฆฌ์— ๋ชป์„ ๋ฐ•์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‚ฌ๋žŒ๋“ค์ด ํ•˜๋Š˜๋น› ์Šฌ๋กฏ์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์š”ํ•˜๋Š” ์‚ฌ์•…ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๊ฒฐ์ •์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ์— ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์ง€๊ธˆ "๊ณ ์น˜๋Š”"๋ฐ ์™œ ๊ทธ๋ ‡๊ฒŒ ์˜ค๋ž˜ ๊ฑธ๋ ธ์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์ด ๋ฌด์—‡์„ ์—ผ๋‘์—๋‘๊ณ  ์žˆ๋Š”์ง€ ๋น„์ฆˆ๋‹ˆ์Šค ๊ด€์ ์—์„œ ๊นจ์ง€์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ข€ ๋ƒ‰์†Œ์ ์ผ์ง€๋„ ๋ชฐ๋ผ. ํ•˜์ง€๋งŒ ์ด์ „์—๋Š” ๋ฌด๋ฃŒ๋กœ ์ œ๊ณต๋˜์–ด ๋” ๋น„์‹ผ ๊ณ„์ธต์œผ๋กœ ์ด๋™ ํ•œ ํ‘ธ๋ฅธ ์ƒ‰ ๊ธฐ๋Šฅ์„ ์ฒœ์ฒœํžˆ ์ง€์ผœ ๋ดค์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ๋ฐฐํฌ๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด dotnet ๊ธ€๋กœ๋ฒŒ ๋„๊ตฌ๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์ด ๋„๊ตฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ๋žŒ๋“ค์ด์ด ์Šค๋ ˆ๋“œ์—์„œ ์–ธ๊ธ‰ ํ•œ ๋ชจ๋“  ์–ด๋ ค์šด ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒ๊ฐ?

์ด๊ฒƒ์€ CI ์„œ๋ฒ„์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฐ”์ด๋„ˆ๋ฆฌ / ํŒจํ‚ค์ง€๋ฅผ ๋Œ€์ƒ ์„œ๋ฒ„๋กœ ์–ด๋–ป๊ฒŒ ํ‘ธ์‹œํ•ฉ๋‹ˆ๊นŒ?

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ƒ๊ฐํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹น์‹ ์€ ๋จธ๋ฆฌ์— ๋ชป์„ ๋ฐ•์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‚ฌ๋žŒ๋“ค์ด ํ•˜๋Š˜๋น› ์Šฌ๋กฏ์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์š”ํ•˜๋Š” ์‚ฌ์•…ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๊ฒฐ์ •์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ์— ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์ง€๊ธˆ "๊ณ ์น˜๋Š”"๋ฐ ์™œ ๊ทธ๋ ‡๊ฒŒ ์˜ค๋ž˜ ๊ฑธ๋ ธ์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์ด ๋ฌด์—‡์„ ์—ผ๋‘์—๋‘๊ณ  ์žˆ๋Š”์ง€ ๋น„์ฆˆ๋‹ˆ์Šค ๊ด€์ ์—์„œ ๊นจ์ง€์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ข€ ๋ƒ‰์†Œ์ ์ผ์ง€๋„ ๋ชฐ๋ผ. ํ•˜์ง€๋งŒ ์ด์ „์—๋Š” ๋ฌด๋ฃŒ๋กœ ์ œ๊ณต๋˜์–ด ๋” ๋น„์‹ผ ๊ณ„์ธต์œผ๋กœ ์ด๋™ ํ•œ ํ‘ธ๋ฅธ ์ƒ‰ ๊ธฐ๋Šฅ์„ ์ฒœ์ฒœํžˆ ์ง€์ผœ ๋ดค์Šต๋‹ˆ๋‹ค.

์กฐ์ •์ด์—†๋Š” ์ œ์ž๋ฆฌ ๋ฐฐํฌ๋Š” ์œ„์—์„œ ์–ธ๊ธ‰ ํ•œ ์ด์œ ๋กœ ๊ทผ๋ณธ์ ์œผ๋กœ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ์—ญ์‚ฌ์ ์œผ๋กœ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†์—ˆ๊ณ  .NET ํ”„๋ ˆ์ž„ ์›Œํฌ์˜ ASP.NET์—์„œ ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์„€๋„ ๋ณต์‚ฌ๋ฅผ ๋‹ค์‹œ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ชจ๋“  .NET Framework๊ฐ€ ์ง€์›๋˜๋Š” ํŠน์ • ์œ ํ˜•์˜ ๋ฐฐํฌ, ํ”„๋ ˆ์ž„ ์›Œํฌ์— ๋”ฐ๋ผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. .NET core๋Š” ์ž์ฒด ํฌํ•จ ๋œ ๋‹จ์ผ ํŒŒ์ผ์„ ์ง€์›ํ•˜๋ฏ€๋กœ ์ง€์›ํ•˜๊ธฐ๊ฐ€ ํ›จ์”ฌ ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์ œ์•ˆ์กฐ์ฐจ๋„ ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ๋ฅผ ๋‹ค๋ฃจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ์ธํ”Œ๋ ˆ ์ด์Šค ๋ฐฐํฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ ํ•œ ์›์ž ์ ์ด์–ด์•ผํ•œ๋‹ค๊ณ  ๋ฏฟ๊ณ  ์žˆ์œผ๋ฉฐ,์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋งŽ์€ ๋ฌธ์ œ๋Š” ๋ฒ„๊ทธ์™€ app_offline ๊ฐ์ง€ ๋ฐ ์žฌํ™œ์šฉ์˜ ๋น„ ์‹ ๋ขฐ์„ฑ์—์„œ ๋น„๋กฏ๋˜์—ˆ์œผ๋ฏ€๋กœ์ด๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค (๋ฐ pdb ์ž ๊ธˆ๋„ ํฌํ•จ).

์›น ๋ฐฐํฌ๋Š” ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ํ๋ฆ„์„ ๊ตฌํ˜„ํ•˜๋Š” ์œ ์ผํ•œ ๋„๊ตฌ์ด์ง€๋งŒ ํ•ด๋‹น ๊ธฐ์ˆ ์— ๊ฐ‡ํ˜€ ์žˆ์œผ๋ฏ€๋กœ ์„œ๋ฒ„์— ftp๋ฅผ ๋ฐฐํฌํ•˜๊ฑฐ๋‚˜ ํŒŒ์ผ ๊ณต์œ ์— ๋ณต์‚ฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋„์›€์ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค).

์—ฌ๊ธฐ์„œ dotnet ๊ธ€๋กœ๋ฒŒ ๋„๊ตฌ๊ฐ€ ๋‹ต์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ CI ์„œ๋ฒ„์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฐ”์ด๋„ˆ๋ฆฌ / ํŒจํ‚ค์ง€๋ฅผ ๋Œ€์ƒ ์„œ๋ฒ„๋กœ ์–ด๋–ป๊ฒŒ ํ‘ธ์‹œํ•ฉ๋‹ˆ๊นŒ?

๋‚˜๋Š” ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค. ์•„๋งˆ๋„ FTP์™€ ์ง์ ‘ ๋ณต์‚ฌ๋ฅผ ์ง€์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ ์ด์™ธ์˜ ๊ฒƒ์€ ๋…์  ํ”„๋กœํ† ์ฝœ ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

FTP๋ฅผ ๋งํ•  ๋•Œ ssh๋ฅผ ํ†ตํ•œ ftp๋„ ์˜๋ฏธํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ๋„๊ตฌ๋Š” ๋งค์šฐ ๊ฐ€์น˜๊ฐ€์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

FTP๋ฅผ ๋งํ•  ๋•Œ ssh๋ฅผ ํ†ตํ•œ ftp๋„ ์˜๋ฏธํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ๋„๊ตฌ๋Š” ๋งค์šฐ ๊ฐ€์น˜๊ฐ€์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„๋‹ˆ ๋‚˜๋Š” ftp๋ฅผ ์˜๋ฏธํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์ด์น˜์— ๋งž๋Š” ๋ชจ๋“  ๊ฒƒ์„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€์ƒ ์ปดํ“จํ„ฐ์—์„œ ์‹คํ–‰ํ•ด์•ผํ•˜๋Š” ๋ณต์‚ฌ ๋„๊ตฌ ์ธ ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์šฐ๋ฆฌ๋ฅผ ์–ด๋””๋กœ ๋“  ๋น„ํŠธ๋ฅผ ๋ณด๋‚ด์•ผํ•˜๋Š” ์‚ฌ์—…์—์„œ ๋ฒ—์–ด๋‚˜๊ฒŒํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ IIS์— ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•ด Windows ์‹œ์Šคํ…œ์— SSH๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

@davidfowl ๋ฐฐํฌ ์Šฌ๋กฏ์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ (์˜ตํŠธ ์ธ)ํ•˜์‹ญ์‹œ์˜ค.
https://github.com/dotnet/aspnetcore/issues/3719#issuecomment -473183712
https://github.com/dotnet/aspnetcore/issues/3793#issuecomment -335666414

์šฐ๋ฆฌ๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ๋””์Šคํฌ์—์„œ๋กœ๋“œํ•˜๊ณ  ํŒŒ์ผ์„ ์ž ๊ทธ๋Š” ๋Œ€์‹  ๋ฐ”์ดํŠธ๋กœ ๋ฉ”๋ชจ๋ฆฌ์—๋กœ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณผ ๊ณ„ํš์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์— ๋ฌธ์ œ๊ฐ€ ์—†์ง€๋งŒ ๊ฒฝ์šฐ ์— ๋”ฐ๋ผ ๋” ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .

๋”๊ตฐ๋‹ค๋‚˜ ์ด๋Š” ๋‹ค์šด ํƒ€์ž„์„ ์ œ๋กœ๋กœ ๋งŒ๋“ค ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋ชจ๋“ˆ๋กœ ์ด์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์— ํˆฌ์ž ํ•  ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค.

FTP๋ฅผ ๋งํ•  ๋•Œ ssh๋ฅผ ํ†ตํ•œ ftp๋„ ์˜๋ฏธํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ๋„๊ตฌ๋Š” ๋งค์šฐ ๊ฐ€์น˜๊ฐ€์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„๋‹ˆ ๋‚˜๋Š” ftp๋ฅผ ์˜๋ฏธํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์ด์น˜์— ๋งž๋Š” ๋ชจ๋“  ๊ฒƒ์„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€์ƒ ์ปดํ“จํ„ฐ์—์„œ ์‹คํ–‰ํ•ด์•ผํ•˜๋Š” ๋ณต์‚ฌ ๋„๊ตฌ ์ธ ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์šฐ๋ฆฌ๋ฅผ ์–ด๋””๋กœ ๋“  ๋น„ํŠธ๋ฅผ ๋ณด๋‚ด์•ผํ•˜๋Š” ์‚ฌ์—…์—์„œ ๋ฒ—์–ด๋‚˜๊ฒŒํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ IIS์— ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•ด Windows ์‹œ์Šคํ…œ์— SSH๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

์˜ˆ. CI / CD๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  Linux์™€ Windows ์‹œ์Šคํ…œ ๋ชจ๋‘์— ๋ฐฐํฌํ•˜๋ฏ€๋กœ Windows ์ƒ์ž์— openssh๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์‰ฌ์› ์Šต๋‹ˆ๋‹ค.

$ appPool = '๊ธฐ๋ณธ๊ฐ’'
Stop-WebAppPool-์ด๋ฆ„ $ appPool -Passthru
... ๋ฐฐํฌ ...

Start-WebAppPool-์ด๋ฆ„ $ appPool -Passthru
... ๋ฐฐํฌ .....

๋˜๋Š”

$ appPool = '๊ธฐ๋ณธ๊ฐ’'
์ค‘์ง€ -WebAppPool-์ด๋ฆ„ $ appPool
while ((Get-WebAppPoolState -Name $ appPool) .Value -ne '์ค‘์ง€') {
์ˆ˜๋ฉด 1 # ์ดˆ
}
... ๋ฐฐํฌ ...

Start-WebAppPool-์ด๋ฆ„ $ appPool
while ((Get-WebAppPoolState -Name $ appPool) .Value -ne '์‹œ์ž‘') {
์ˆ˜๋ฉด 1 # ์ดˆ
}

... ๋ฐฐํฌ .....

๊ฐ€๋‚œํ•œ ์‚ฌ๋žŒ์˜ ๋ฐฐํฌ ์Šฌ๋กฏ
์•ฝ 1 ๋…„ ์ „์— ์‚ฌ์ดํŠธ ๋ฃจํŠธ ํด๋” 2 ๊ฐœ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๊ฒŒ์‹œํ–ˆ์œผ๋ฉฐ ๊ทธ ์ค‘ ํ•˜๋‚˜์— ๋Œ€ํ•œ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๊ฐ€ IIS ์‚ฌ์ดํŠธ ์šฉ์œผ๋กœ ๊ตฌ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์žฅ์ ์€ ๋‹ค๋ฅธ ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜์— ๋น„ํ•ด ๋‹ค์šด ํƒ€์ž„์ด ์ ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ค‘๋ณต ์žฌํ™œ์šฉ์ด ํ™œ์„ฑํ™” ๋œ ๊ฒฝ์šฐ ๋‹ค์šด ํƒ€์ž„์ด ์—†์œผ๋ฉฐ ์–ด์จŒ๋“  ์ฒซ ๋ฒˆ์งธ ์š”์ฒญ์— ๋Œ€ํ•œ ์›Œ๋ฐ์—… ํŒจ๋„ํ‹ฐ ๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋ฐฐํฌ / ๋ณต์‚ฌ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋Š” ๋ฐ N ์ดˆ๊ฐ€ ์†Œ์š”๋˜๋Š” ๊ฒฝ์šฐ N ์ดˆ ๋™์•ˆ ์•ฑ ํ’€์„ ์ค‘์ง€ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
์˜คํ”„๋ผ์ธ์—์„œ ์˜์‹ฌ์Šค๋Ÿฌ์šด ์•ฑ์„ ๋ง์น  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
๋น„ํ™œ์„ฑ ํด๋”์— ๋ณต์‚ฌํ•˜๊ณ  ํŒŒ์ผ์ด์žˆ์„ ๋•Œ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ๊ต์ฒด ํ•œ ๋‹ค์Œ ์•ฑ ํ’€์„ ์žฌํ™œ์šฉํ•˜์‹ญ์‹œ์˜ค.
์›์ž ๋ฐฐํฌ, ๋‹ค์šด ํƒ€์ž„์—†์ด ํ‰์†Œ์ฒ˜๋Ÿผ ์ฒซ ๋ฒˆ์งธ ์š”์ฒญ์ด ๋Š๋ ค์ง‘๋‹ˆ๋‹ค.

https://github.com/dotnet/aspnetcore/issues/3793#issuecomment -459870870

๋ˆ„๊ตฌ ์‹œ๋„ ํ–ˆ์–ด?
์ด์™€ ๊ฐ™์€ ๊ฒƒ์ด ์ž‘๋™ํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ ์ธก ๋ฐฐํฌ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค๋กœ ์ „ํ™˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํด๋ผ์ด์–ธํŠธ-> ์„œ๋ฒ„ ๋น„ํ™œ์„ฑ ํด๋” / ๊ณต์œ  ๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
  • S : ์—ฌ๊ธฐ
  • C : ๋ฐฐํฌ / ๋ณต์‚ฌ ํ™•์ธ
  • S : ์‹ฌ๋ณผ๋ฆญ ๋งํฌ ๊ต์ฒด ๋ฐ ์žฌํ™œ์šฉ
  • C : thx, http get / healthcheck (์„ ํƒ ์‚ฌํ•ญ)
  • C : ์–ด, ์—‰๋ง์ง„์ฐฝ, ๋กค๋ฐฑ pls
  • S : ์‹ฌ๋ณผ๋ฆญ ๋งํฌ ์Šค์™‘, ์žฌํ™œ์šฉ (์žฌ์—…)
  • C : ์ž‘์—… ํ•  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต ํ—น๊ตฌ๊ธฐ

๋”ฐ๋ผ์„œ ๋ฐฐํฌ ์ž ๊ธˆ ํŒŒ์ผ์—๋„ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ฑ ํ˜ธ์ŠคํŒ…์—์„œ. ์•ฑ ํ’€์„ ์ค‘์ง€ํ•˜๋ ค๊ณ ํ–ˆ์ง€๋งŒ ํŒŒ์ผ์ด ์ž ๊ฒจ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” app_offline.htm์„ ๋ฐ€๋ ค ๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ๊ฑฐ๊ธฐ์—์„œ๋„ ์šด์ด ์—†๋‹ค.
๋˜ํ•œ app_offline.htm ํŒŒ์ผ ์‚ญ์ œ๋ฅผ ๊ด€๋ฆฌํ•˜๋ ค๋ฉด program.cs์—์„œ ์•ฑ์„ ์‹œ์ž‘ํ•  ๋•Œ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด ์–ธ์ œ ์˜จ๋ผ์ธ ์ƒํƒœ๊ฐ€๋˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ง๋ฉด ํ•œ ํ˜„์žฌ ๋ฌธ์ œ๋Š” dll์ด ์ค‘๋‹จ๋˜๊ณ  ์ด๋ฆ„์„ ๋ฐ”๊พผ ๋‹ค์Œ ํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜๋”๋ผ๋„ ์ด๋ฆ„์ด ๋ฐ”๋€ ํŒŒ์ผ์— ๋Œ€ํ•ด ์ด์ „ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—ฌ์ „ํžˆ ์‹คํ–‰๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐฐํฌ๋ฅผ ๋‹ค์‹œ ์‹œ๋„ํ•˜๋ฉด ํŒŒ์ผ ์ด๋ฆ„์„ ๋‹ค์‹œ ๋ณ€๊ฒฝํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ํŒŒ์ผ ์ด๋ฆ„ ๋Œ€์ฒด๋กœ ์ผ์ข…์˜ ๋‚ ์งœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
IIS ์„œ๋ฒ„ Windows 2012 R2์—์„œ์ด๋ฅผ ์œ„ํ•ด dotnet core 3.1.4๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@foxjazz ์•ฑ ํ’€ / ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ค‘์ง€ ๋˜์–ด๋„ ํŒŒ์ผ์€ ์–ด๋–ป๊ฒŒ ์ž ๊ธฐ๋‚˜์š”? ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@foxjazz ์•ฑ ํ’€ / ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ค‘์ง€ ๋˜์–ด๋„ ํŒŒ์ผ์€ ์–ด๋–ป๊ฒŒ ์ž ๊ธฐ๋‚˜์š”? ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

image

image

์‚ฌ์šฉํ•œ dll์„ ์‚ญ์ œํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๊ทธ๋ฆผ์— ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์—์„œ ์‚ฌ์šฉ ์ค‘์ด๋ผ๊ณ  ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
์•ฑ ํ’€์ด ํ•œ๋™์•ˆ ์˜คํ”„๋ผ์ธ ์ƒํƒœ์˜€์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—ฌ์ „ํžˆ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ์ž‘์—… ๊ด€๋ฆฌ์ž๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ์ค‘์ง€ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €๋‹ค ๊ณ ํ•ด์„œ ์ฆ‰์‹œ ์ข…๋ฃŒ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—ฌ์ „ํžˆ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ์ž‘์—… ๊ด€๋ฆฌ์ž๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ์ค‘์ง€ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €๋‹ค ๊ณ ํ•ด์„œ ์ฆ‰์‹œ ์ข…๋ฃŒ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

์œ„์˜ ์‚ฌ์ง„์€ ์ž‘์—… ๊ด€๋ฆฌ์ž์—์„œ ๊ฐ€์ ธ์˜จ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด๋Š ํŒŒ์ผ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ์‚ญ์ œํ•˜๋ฉด ํŒŒ์ผ์ด ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค. ํ•ธ๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ ์ข…๋ฃŒ ํ•  pid๋ฅผ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐํฌ๋ฅผ ์œ„ํ•ด ์ด๋Ÿฌํ•œ ๊ธธ์ด๋กœ ๊ฐˆ ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•ธ๋“ค์€ w3wp.exe 2 ํ”„๋กœ์„ธ์Šค์— ํŒŒ์ผ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ž ๊ฒจ ์žˆ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ์•ฑ ํ’€์ด ์ข…๋ฃŒ ๋œ ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

์ •๋ง ์ข‹์€ ๊ฒƒ์€ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ค‘์ง€ํ•˜๋Š” ๊ฒฝ๋กœ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
api \ KillDeathKill
{
Program.KillProcess ()
}

๊ทธ๋Ÿด ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค์— ์˜ํ•ด ํŒŒ์ผ์ด ์ž ๊ฒผ์Šต๋‹ˆ๋‹ค. w3wp๊ฐ€ ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค์ด๋ฉด ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ์ ˆ๋Œ€๋กœ ์ฃฝ์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ๋™์ผํ•œ ํŒŒ์ผ์„ ๋‹ค๋ฅธ pid๋กœ ์ž ๊ทธ๋Š” ์ƒˆ ๊ฒƒ์ด ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ์ผ์„ ์ž ๊ทธ๊ณ , ๊ธฐ์กด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•˜๊ณ , ์ƒˆ ๋น„ํŠธ๋ฅผ ๋ฐฐํฌํ•˜๊ณ , ์•ฑ์„ ์˜คํ”„๋ผ์ธ์œผ๋กœ ์ œ๊ฑฐํ•˜๋Š” ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋จผ์ € ์•ฑ ์˜คํ”„๋ผ์ธ์ด ๋‹ค์šด๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿด ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค์— ์˜ํ•ด ํŒŒ์ผ์ด ์ž ๊ฒผ์Šต๋‹ˆ๋‹ค. w3wp๊ฐ€ ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค์ด๋ฉด ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ์ ˆ๋Œ€๋กœ ์ฃฝ์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ๋™์ผํ•œ ํŒŒ์ผ์„ ๋‹ค๋ฅธ pid๋กœ ์ž ๊ทธ๋Š” ์ƒˆ ๊ฒƒ์ด ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ์ผ์„ ์ž ๊ทธ๊ณ , ๊ธฐ์กด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•˜๊ณ , ์ƒˆ ๋น„ํŠธ๋ฅผ ๋ฐฐํฌํ•˜๊ณ , ์•ฑ์„ ์˜คํ”„๋ผ์ธ์œผ๋กœ ์ œ๊ฑฐํ•˜๋Š” ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋จผ์ € ์•ฑ ์˜คํ”„๋ผ์ธ์ด ๋‹ค์šด๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

app_offline.htm์ด ๋จผ์ € ๋‹ค์šด๋˜์—ˆ๋‹ค๊ณ  ๋งํ•  ๋•Œ. ๋„ค, ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. get ์š”์ฒญ์„ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜์žˆ๋Š” ์ƒํƒœ ๊ฒฝ๋กœ๊ฐ€ ์žˆ์œผ๋ฉฐ ํ™•์‹คํžˆ ์˜คํ”„๋ผ์ธ ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์•ฑ ํ’€์„ ์ˆ˜๋™์œผ๋กœ ์ค‘์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ w3wp ํ”„๋กœ์„ธ์Šค๋Š” ์—ฌ์ „ํžˆ ํŒŒ์ผ์„ ์ค‘๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ค‘์ง€๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ค‘์ง€๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ค‘์ง€ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์•ฑ ํ’€์„ ์ค‘์ง€ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์•ฑ ํ’€์€ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์•ฑ ํ’€์„ ์ค‘์ง€ํ•˜๋ฉด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์„ ์ž ๊ธ€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—†์œผ๋ฉด ํŒŒ์ผ์„ ์ž ๊ธ€ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋‹ค๋ฅธ ์ด๋ก  ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋” ๊ฐ€๋Šฅ์„ฑ์ด์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

์•ฑ ํ’€์€ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์•ฑ ํ’€์„ ์ค‘์ง€ํ•˜๋ฉด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์„ ์ž ๊ธ€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—†์œผ๋ฉด ํŒŒ์ผ์„ ์ž ๊ธ€ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋‹ค๋ฅธ ์ด๋ก  ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋” ๊ฐ€๋Šฅ์„ฑ์ด์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

ํ•˜, ๋‹น์‹ ์€ ๋˜ฅ์„ ๋งํ–ˆ๋‹ค. ๋‚ด๊ฐ€ ๋‹น์‹ ์„ ๊ดด๋กญํžˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ ค๋Š” ๋œป์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‚˜๋Š” ์•ฑ ํ’€์„ ์ค‘์ง€ํ•˜๋Š” ๊ฒƒ์ด ๋ชจ๋“  ๋ฌธ์„œ์—์„œ ๊ด‘๊ณ  ๋œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋งํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์€ 90 ์ดˆ ํ›„์—๋„ ์—‰๋ง์ด๋˜์ง€ ์•Š๊ณ  ์—ฌ์ „ํžˆ ์‹คํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค. ์•ฑ ํ’€์ด ์ค‘์ง€ ๋œ ๊ฒƒ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ์–ด๋„ ํŒŒ์ผ์ด ์ž  ๊น๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์„ธ์Šค์—๋Š” ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ์–ป๊ธฐ์œ„ํ•œ ๋‹จ์ผ ํ•ญ๋ชฉ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ์ปจํŠธ๋กค๋Ÿฌ. ์ž ๊ธด ํŒŒ์ผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‘๋ ค์›€์—†์ด ๋ฐฐ์น˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ๋„ ์ž‘๋™ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ์ด๋ฆ„์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (dotnet core 3.1.4) ๋ง›

์•ฝ 1 ๋…„ ์ „์— ์‚ฌ์ดํŠธ ๋ฃจํŠธ ํด๋” 2 ๊ฐœ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๊ฒŒ์‹œํ–ˆ์œผ๋ฉฐ ๊ทธ ์ค‘ ํ•˜๋‚˜์— ๋Œ€ํ•œ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๊ฐ€ IIS ์‚ฌ์ดํŠธ ์šฉ์œผ๋กœ ๊ตฌ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฌ ์‹œ๋„ ํ–ˆ์–ด?
์ด์™€ ๊ฐ™์€ ๊ฒƒ์ด ์ž‘๋™ํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ ์ธก ๋ฐฐํฌ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค๋กœ ์ „ํ™˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@CJHarmath- ๋‚˜๋Š” ์ด๊ฒƒ์„ ์‹œ๋„ํ–ˆ๊ณ  ์•„๋ž˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ˆ˜์ • ๋œ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์•„์ฃผ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์—…๋ฐ์ดํŠธ๋ฅผ ๋” ๋งŽ์ด ๊ฒŒ์‹œํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ ๋ฐฐํฌ ๋„๊ตฌ๋ฅผ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” IIS ์„œ๋ฒ„์— ์›๊ฒฉ ์…ธ์„ ์ ์šฉํ•˜๊ณ  powershell ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋’ค์ง‘์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
psexec.exe \\IIS_SERVER cmd /c "powershell -noninteractive -file C:\FlipSymLink.ps1"

# FlipSymLink.ps1

Import-Module WebAdministration # run as admin
# create 2 site root directories
$a = 'C:\Websites\MySiteA'
$b = 'C:\Websites\MySiteB'
$appRoot  = 'C:\Websites\MySite'
$appName  = 'MyAppName'
$siteName = 'MySiteName'
$poolName = "MyPoolName"
New-Item -Type Directory $a -ErrorAction SilentlyContinue
New-Item -Type Directory $b -ErrorAction SilentlyContinue

# create a symlink to targeting one side
New-Item -Type SymbolicLink -Path $appRoot -Target $a -Name A -ErrorAction SilentlyContinue
New-Item -Type SymbolicLink -Path $appRoot -Target $b -Name B -ErrorAction SilentlyContinue

# point the site root to the symlink
$currentPath = (Get-ItemProperty "IIS:\Sites\$siteName\$appName" -name physicalPath)
if ($currentPath -eq "$appRoot\A") {
    Write-Host "Switched to B"
    New-Item $b\active.txt
    Remove-Item $a\active.txt
    Set-ItemProperty "IIS:\Sites\$siteName\$appName" -name physicalPath -value $appRoot\B
} else {
    Write-Host "Switched to A"
    New-Item $a\active.txt
    Remove-Item $b\active.txt
    Set-ItemProperty "IIS:\Sites\$siteName\$appName" -name physicalPath -value $appRoot\A
}
Restart-WebAppPool -Name $poolName

psexec.exe \\IIS_SERVER cmd /c "powershell -noninteractive -file C:\FlipSymLink.ps1"

์ด๊ฒƒ์€ ๋˜ํ•œ JEA ์—”๋“œ ํฌ์ธํŠธ ๋กœ ์ „ํ™˜ ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ flip ๋ฅผ ๊ถŒํ•œ์ด์—†๋Š” ์‚ฌ์šฉ์ž๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ˆ : CI / CD ์„œ๋ฒ„ ๋ฐฐํฌ ๋‹จ๊ณ„์—์„œ)
Invoke-Command -ComputerName IIS_SERVER -ConfigurationName IIS-Flip -ScriptBlock { Switch-SymlinkTarget -SiteName MySite}
์Šน์ธ ๋œ ๋™์‚ฌ์ด๋ฏ€๋กœ Flip ๋Œ€์‹  Switch ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

์Šน์ธ ๋œ ๋™์‚ฌ์ด๋ฏ€๋กœ Flip ๋Œ€์‹  Switch ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

Swap ๋Š” ์Šฌ๋กฏ์„ ๋‹ค๋ฃฐ ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๋™์‚ฌ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ผ๊นŒ์š”?

4 ๋…„ ์ „์— ์„ค๋ช…ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?
์ƒˆ dll ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•ด ์›๊ฒฉ ๋ฐ์Šคํฌํ†ฑ์„ ์—ด๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ๋•์…˜ IIS ์„œ๋ฒ„์—์„œ FTP๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ .NET Core ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ DLL ํŒŒ์ผ์„ ๋ฎ์–ด ์“ฐ๋ ค๊ณ ํ•˜๋ฉด ํŒŒ์ผ์ด ์ž ๊ฒจ์žˆ์–ด ๋ฎ์–ด ์“ธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ƒˆ ๋ฒ„์ „์„ ๋ฐฐํฌํ•˜๋ ค๋ฉด IIS (RDP ์—ด๊ธฐ)์—์„œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ค‘์ง€ํ•˜์—ฌ ์ž ๊ธˆ์„ ํ•ด์ œ ํ•œ ๋‹ค์Œ ๋ฎ์–ด ์จ์•ผํ•ฉ๋‹ˆ๋‹ค.
์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ค‘์ง€ํ•˜์ง€ ์•Š๊ณ  ๋ฐฐํฌ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐ์‚ฌ

๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ๋’ค์—์„œ ํ˜ธ์ŠคํŠธ๋ฅผ ์˜คํ”„๋ผ์ธ์œผ๋กœ ์ „ํ™˜ ํ•  ์ˆ˜์—†๊ณ  ๋” ๋นจ๋ฆฌ ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ์™€ ์ผ๋ถ€ powershell์„ ์‚ฌ์šฉํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋Ÿฐ ์‹์œผ๋กœ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์—ˆ์–ด์š”.

๋ณต์‚ฌ + ์žฌํ™œ์šฉ ์ค‘์— ์•ฑ ํ’€์„ ์ค‘์ง€ ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค. ํ˜„์žฌ ์š”์ฒญ์„ ์™„๋ฃŒ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ค‘๋‹จ ์‹œ๊ฐ„์ด ์ค„์–ด๋“ค ๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋“œ ์ค‘์ง€๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค.

# Setup
Import-Module WebAdministration
# create 2 site root directories
$a = 'C:\inetpub\AspNetCoreSampleA'
$b = 'C:\inetpub\AspNetCoreSampleB'
$siteRoot = 'C:\inetpub\aspnetcoresample'
$siteName = 'AspNetCoreSample'
$poolName = "aspnetcore"
New-Item -Type Directory $a
New-Item -Type Directory $b
# create a symlink to targeting one side
New-Item -Type SymbolicLink -Path $siteRoot -Target $a
# point the site root to the symlink
Set-ItemProperty "IIS:\Sites\$siteName" -name physicalPath -value $siteRoot
# make sure it get's picked up
Restart-WebAppPool -Name $poolName

# this tells you the active side
Get-Item -Path $siteRoot | Select-Object -ExpandProperty target

# Flip the symlink
$current = (Get-Item -Path $siteRoot).Target
$newTarget = if ($current -eq $a) {$b} else {$a}
New-Item -Type SymbolicLink -Path $siteRoot -Target $newTarget -Force
# at this point w3wp.exe still locks the current target folder until it's getting recycled
# Deploy new version to the symlink which is now pointing to the other side which should have no locks
robocopy \\myshare\myapp $siteRoot /mir
# recycle app pool, so it picks up the new files
Restart-WebAppPool -Name $poolName

# bonus point: rollback is easy
$current = (Get-Item -Path $siteRoot).Target
$newTarget = if ($current -eq $a) {$b} else {$a}
New-Item -Type SymbolicLink -Path $siteRoot -Target $newTarget -Force
Restart-WebAppPool -Name $poolName

์š”์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
https://gist.github.com/csharmath/b2af0f50700ce9fbdd8c5c3e582fd41b

์—ฌ๊ธฐ ์ œ๊ฐ€ ๊ผฌ์ž„์ด ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ASP.NET์œผ๋กœ ๋งŒ ์‹œ๋„ํ–ˆ์ง€๋งŒ net core ์šฉ ํ˜ธ์ŠคํŒ… ๋ชจ๋“ˆ์—์„œ๋„ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์‹คํ–‰์€ ์‚ฌ์ดํŠธ๋ฅผ ์ž ์‹œ ์ค‘๋‹จํ•˜๋ฏ€๋กœ ์•ฝ๊ฐ„ ์กฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

param(
    [Parameter(Mandatory = $true)]
    [string] $iisRootPath,
    [Parameter(Mandatory = $true)]
    [string] $siteName,
    [Parameter(Mandatory = $true)]
    [string] $artifactPath,
    [Parameter(Mandatory = $false)]
    [string] $siteFolderName,
    [Parameter(Mandatory = $false)]
    [string] $appPoolName
)
Import-Module WebAdministration

#populate optional parameters
if (!($PSBoundParameters.ContainsKey('siteFolderName'))) { $siteFolderName = $siteName }
if (!($PSBoundParameters.ContainsKey('appPoolName'))) { $appPoolName = $siteName }

#set A, B and C paths
$a = "$iisRootPath\$siteFolderName" + 'A'
$b = "$iisRootPath\$siteFolderName" + 'B'
$c = "$iisRootPath\$siteFolderName"

#existence test
$cName = Get-Item -Path $c -ErrorAction SilentlyContinue | Select-Object -ExpandProperty name -ErrorAction SilentlyContinue
$bName = Get-Item -Path $b -ErrorAction SilentlyContinue | Select-Object -ExpandProperty name -ErrorAction SilentlyContinue

#get the shudown timeout for the app pool
$shutdownTimeout = Get-WebConfigurationProperty -Filter 'system.web/httpRuntime' -PSPath "IIS:\Sites\$siteName" -Name shutdownTimeout | Select-Object -ExpandProperty Value

#create symlink, if symlink source is an existing directory, rename existing 
if($cName -eq $null) 
{
    Write-Output "Creating SymbolicLink $c -> $a" 
    New-Item -Type SymbolicLink -Path $c -Target $a
} 
else
{
    #directories don't have a target property
    $cTarget = Get-Item -Path $c | Select-Object -ExpandProperty target -ErrorAction SilentlyContinue

    #this is a directory, rename and create symlink
    if($cTarget -eq $null)
    {
        #restart AppPool first so no locked files
        #Write-Output "Restarting AppPool $appPoolName" 
        #Restart-WebAppPool -Name $appPoolName

        #stop AppPool first so no locked files
        Write-Output "Stopping AppPool $appPoolName" 
        Stop-WebAppPool -Name $appPoolName

        #sleep for shutdownTimeout
        Write-Output "Sleeping for $shutdownTimeout" 
        Start-Sleep -Seconds (([System.TimeSpan]::Parse("$shutdownTimeout").TotalSeconds) * 1.1)

        try {
             #if the rename fails, there are files in use. stop the script
            $newName = $siteFolderName + 'A'
            Write-Output "Renaming $c to $newName" 
            Rename-Item -Path $c -NewName $newName -ErrorAction Stop
        }
        catch {
            Write-Error -Message "Failed to rename $c to $newName due to files in use."

            #start AppPool 
            Write-Output "Starting AppPool $appPoolName due to failed folder rename. Consider trying again durring a time with reduced traffic." 
            Start-WebAppPool -Name $appPoolName

        }

        #create symlink
        Write-Output "Creating SymbolicLink $c -> $a" 
        New-Item -Type SymbolicLink -Path $c -Target $a

        #start AppPool 
        Write-Output "Starting AppPool $appPoolName" 
        Start-WebAppPool -Name $appPoolName

        #copy a to b to pick up directory permissions
        if($bName -eq $null) 
        {
            Write-Output "Copying Directory $a to $b"  
            robocopy $a $b /e /sec /sl
        }
    }
}

#existence test
$aName = Get-Item -Path $a -ErrorAction SilentlyContinue | Select-Object -ExpandProperty name -ErrorAction SilentlyContinue
$bName = Get-Item -Path $b -ErrorAction SilentlyContinue | Select-Object -ExpandProperty name -ErrorAction SilentlyContinue

#create if needed
if($aName -eq $null) 
{
    Write-Output "Creating Directory $a"  
    New-Item -Type Directory $a 
}
if($bName -eq $null) 
{
    Write-Output "Creating Directory $b"  
    New-Item -Type Directory $b 
}

#make sure site pointing to symlink
Write-Output "Pointing Website $siteName to Path $c" 
Set-ItemProperty "IIS:\Sites\$siteName" -name physicalPath -value $c

#restart so we know it's loading from symlink
Write-Output "Restarting AppPool $appPoolName" 
Restart-WebAppPool -Name $appPoolName

#sleep for shutdownTimeout 
Write-Output "Sleeping for $shutdownTimeout" 
Start-Sleep -Seconds ([System.TimeSpan]::Parse("$shutdownTimeout").TotalSeconds)

#get current symlink target and set new target
Get-Item -Path $c | Select-Object -ExpandProperty target
$current = (Get-Item -Path $c).Target
$newTarget = if ($current -eq $a) {$b} else {$a}

$fileOrDirectoryName = Get-Item $artifactPath | Select-Object -ExpandProperty name

#test for .zip
if(($fileOrDirectoryName).ToLower().EndsWith(".zip") -eq $true)
{
    #copy to temp location
    $guid = [System.Guid]::NewGuid()
    $tempPath = "$iisRootPath\temp-$guid"
    $tempDest = "$iisRootPath\temp-dest-$guid"

    Write-Output "Creating temp directory $tempPath" 
    New-Item -Type Directory $tempPath

    $artifactDirectory = [System.IO.Path]::GetDirectoryName($artifactPath)
    $artifactFile = [System.IO.Path]::GetFileName($artifactPath);

    #TODO: first robocopy arg needs to be a directory, not a file
    Write-Output "Copying archive from $artifactPath to $tempPath" 
    robocopy $artifactDirectory $tempPath $artifactFile

    #extract to temp destination (seems a failed extract can leave empty folders)
    Write-Output "Extracting archive to $tempDest" 
    Expand-Archive -Path "$tempPath\$fileOrDirectoryName" -DestinationPath $tempDest -Force

    #copy from temp destination to destination
    Write-Output "Copying files from $tempDest to $newTarget" 
    robocopy $tempDest $newTarget /e

    #delete temp directory
    Write-Output "Removing temp directory $tempPath" 
    Remove-Item -Path $tempPath -Recurse -Force

    #delete temp directory
    Write-Output "Removing temp directory $tempDest" 
    Remove-Item -Path $tempDest -Recurse -Force
}
else 
{
    #copy new files
    Write-Output "Copying files from $artifactPath to $newTarget" 
    robocopy $artifactPath $newTarget /e
}

#swap symlink
Write-Output "Pointing SymbolicLink $c -> $newTarget" 
New-Item -Type SymbolicLink -Path $c -Target $newTarget -Force

#restart so it loads from newly swapped symlink
Write-Output "Restarting AppPool $appPoolName" 
Restart-WebAppPool -Name $appPoolName

@LucidObscurity ๊ทธ๊ฒŒ ๋ญ์•ผ? cmd ์ฝ”๋“œ? ๊ทธ ์ฝ”๋“œ๋ฅผ ์–ด๋””์— ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?
๊ฐ์‚ฌ

ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•ด์ œ ๋  ๋•Œ๊นŒ์ง€ msdeploy ๋ช…๋ น์— ๋Œ€ํ•œ ์žฌ์‹œ๋„ ํšŸ์ˆ˜ (๋งค๊ฐœ ๋ณ€์ˆ˜ : -retryAttempts:X ) ๋˜๋Š” ์žฌ์‹œ๋„ ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ (๋งค๊ฐœ ๋ณ€์ˆ˜ : -retryInterval:XXXX )์„ ๋Š˜๋ฆฌ๋Š” ์•„์ด๋””์–ด๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ํŒŒ์ผ ์ž ๊ธˆ?

@davidfowl ์ด ์˜ณ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค๊ฐ€ ์–ด๋–ป๊ฒŒ ๋“  ์—ฌ์ „ํžˆ ๊ฑฐ๊ธฐ์— ์žˆ๊ณ  ํŒŒ์ผ์„ ์ž ๊ธ‰๋‹ˆ๋‹ค. IIS ์žฌ์„ค์ •์€ ๋„์›€์ด ๋˜์ง€ ์•Š์ง€๋งŒ ์‹œ๊ฐ„์ด ์ดˆ๊ณผ ๋  ๋•Œ๊นŒ์ง€ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. app_offline.htm์„ ์‚ญ์ œํ•˜๊ณ  90 ์ดˆ ๋™์•ˆ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ (AppPool์„ ์ข…๋ฃŒํ•˜๋Š” ๊ธฐ๋ณธ ์‹œ๊ฐ„ ์ œํ•œ ์„ค์ •) ๋‹ค์‹œ ์‹œ๋„ํ•˜๋ฉด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋กœ์ปฌ์—์„œ ๋‚˜๋Š” ๊ทธ๋ ‡๊ฒŒ ์˜ค๋ž˜ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—์ด ์ข…๋ฃŒ ์‹œ๊ฐ„ ์ œํ•œ (์ดˆ)์„ 5๋กœ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์„ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ๋นŒ๋“œ ์ „์— app_offline.htm ์„ ์ƒ์„ฑ
์„œ๋ฒ„์˜ ๊ฒฝ์šฐ msdeploy ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ app_offline.htm์„ ์‚ญ์ œํ•˜๊ณ  ์ƒˆ ๋ฒ„์ „์„ ๋™๊ธฐํ™” ํ•œ ๋‹ค์Œ app_offline.htm์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. msdeploy๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŒŒ์ผ์ด ์ž ๊ฒจ ์žˆ์ง€๋งŒ ๋•Œ๋•Œ๋กœ 90 ์ดˆ ์ „์— ํฌ๊ธฐํ•˜๋ฉด ์žฌ ์‹œ๋„ํ•˜๋ฏ€๋กœ ๋ฐฐํฌ๋ฅผ ๋‹ค์‹œ ํŠธ๋ฆฌ๊ฑฐํ•ด์•ผํ•˜๋ฉฐ ๋‘ ๋ฒˆ์งธ ์‹œ๋„์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด ์ƒˆ๋กœ์šด ๋ฆด๋ฆฌ์Šค๊ฐ€ ์–ธ์ œ ์ค€๋น„ ๋ ๊นŒ์š”?

์—ฐ๋ฝ ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
ํ–ฅํ›„ ํ‰๊ฐ€ / ๊ณ ๋ ค๋ฅผ ์œ„ํ•ด์ด ๋ฌธ์ œ๋ฅผ Next sprint planning ๋งˆ์ผ์Šคํ†ค์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋งˆ์ผ์Šคํ†ค์— ๋Œ€ํ•œ ์ž‘์—…์„ ๊ณ„ํš ํ•  ๋•Œ ์š”์ฒญ์„ ํ‰๊ฐ€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์— ์˜ˆ์ƒ๋˜๋Š” ์‚ฌํ•ญ๊ณผ์ด ๋ฌธ์ œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„ ๋ณด๋ ค๋ฉด ์—ฌ๊ธฐ์—์„œ ์‹ฌ์‚ฌ ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์ฝ์–ด๋ณด์‹ญ์‹œ์˜ค.

.NET 4.5.2 ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ .NET 5.0์œผ๋กœ ๋ณ€ํ™˜ ํ•œ ํ›„ ์ด๋ฒˆ ์ฃผ์—์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ์œ„ํ•œ ๋˜ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค. IIS ์„œ๋ฒ„์—์„œ ์‹คํ–‰๋˜๋Š” Windows ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์„œ๋น„์Šค์—๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ํฌํŠธ์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฐ„๋‹จํ•œ HTTP ์„œ๋ฒ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ํ•ด๋‹น ์„œ๋ฒ„์— ์‚ฌํ›„ ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ฑ ํ’€์„ ์ค‘์ง€ํ•˜๋ฉด ํ•ด๋‹น ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•˜๊ณ  ํ˜„์žฌ ๋ฆด๋ฆฌ์Šค์˜ ๋ฐฑ์—…์„ ๋งŒ๋“ค๊ณ  ํ˜„์žฌ ๋ฆด๋ฆฌ์Šค๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  upgradepackage๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์•ฑ ํ’€์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์œ„์—์„œ ์–ธ๊ธ‰ ํ•œ Windows ์„œ๋น„์Šค๊ฐ€ ๊ฐ€์ ธ ์˜ค๋Š” ์ €์žฅ์†Œ๋กœ ํ‘ธ์‹œ๋˜๋Š” ์—…๊ทธ๋ ˆ์ด๋“œ ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๊ฐ„๋‹จํ•œ Windows Forms ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰