توزیع ماژولهای PowerShell با Azure Artifacts
خلاصهٔ کاملتر
تو این مقاله اومده که وقتی یه اسکریپت PowerShell کمکم تبدیل به ماژول حیاتی کسبوکار میشه، کپی کردن پوشه روی فایلشیر دیگه جواب نمیده: نه تاریخچهٔ نسخهٔ تمیزی داری، نه کنترل دسترسی، نه انتشار خودکار از پایپلاین. نویسنده پیشنهاد میده جاش یه فید خصوصی NuGet روی Azure Artifacts بسازی، چون ماژولهایی که با PSResourceGet منتشر میشن از همون مدل مخزن NuGet استفاده میکنن.
بعد از ساختن فید، آدرس v3 فید رو با Register-PSResourceRepository بهعنوان یه مخزن مورد اعتماد ثبت میکنی و از اون به بعد نصب ماژول با Install-PSResource مثل هر مخزن دیگهایه. اگه اعتبارنامهٔ فید تو یه vault نگه داشته میشه، میشه با PSCredentialInfo اسم vault و اسم سکرت رو به مخزن وصل کرد. قبل از بستهبندی هم Test-ModuleManifest رو اجرا کن؛ به گفتهٔ نویسنده این قدم رو تو پایپلاین جا ننداز، چون یه مانیفست خراب کل مخزن بستهها رو خراب میکنه.
برای نسخهبندی، GitVersion از تاریخچهٔ Git نسخهٔ سمانتیک رو حساب میکنه و پایپلاین همون رو تو مانیفست ماژول مینویسه. یه نکتهٔ مهم اینه که تو Azure DevOps باید fetchDepth: 0 بذاری، وگرنه کلون کمعمق باعث میشه GitVersion شکست بخوره. امضای کد هم با AzureSignTool و گواهی داخل Azure Key Vault انجام میشه؛ نویسنده managed identity رو ترجیح میده تا سکرت اپلیکیشن تو پایپلاین نباشه، و پیشنهاد میکنه قبل از انتشار صحت امضاها بررسی بشه.
قسمت آخر به زمان اجرا برمیگرده: انتشار امن نصف ماجراست و باید کنترل کنی کی میتونه توابع پرامتیاز رو اجرا کنه. JEA بهت اجازه میده یه اندپوینت محدود PowerShell بسازی که فقط دستورهای لازم برای یه نقش توش دیده میشه؛ بعد با یه session configuration یه گروه Active Directory رو به همون نقش وصل میکنی. فایل role capability شکل سادهای داره:
$roleParameters = @{
Path = 'C:\Program Files\WindowsPowerShell\Modules\Contoso.Operations\RoleCapabilities\ServiceOperator.psrc'
ModulesToImport = 'Contoso.Operations'
VisibleFunctions = 'Restart-ContosoService'
}
New-PSRoleCapabilityFile @roleParametersنکات کلیدی:
- Azure Artifacts یه فید خصوصی NuGet بهت میده که PSResourceGet مستقیم باهاش کار میکنه.
- Register-PSResourceRepository مخزن رو ثبت میکنه و Install-PSResource ازش نصب میکنه.
- GitVersion نسخهٔ سمانتیک رو از تاریخچهٔ Git میسازه؛ تو Azure DevOps حتماً fetchDepth: 0 بذار.
- امضای Authenticode با AzureSignTool و گواهی Azure Key Vault یکپارچگی فایلها رو تضمین میکنه.
- فقط از CI/CD منتشر کن، نسخهٔ منتشرشده رو بازنویسی نکن و برای توابع حساس سراغ JEA برو.




