αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž’αŸ†αž–αžΈ CI/CD αž“αŸ…αž€αŸ’αž“αž»αž„ GitLab αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ†αž”αžΌαž„αžŠαžΆαž…αŸ‹αžαžΆαž (αžŸαŸ’αž‘αžΎαžšαžαŸ‚)

αž¬αžšαž”αŸ€αž”αžŠαžΎαž˜αŸ’αž”αžΈαž‘αž‘αž½αž›αž”αžΆαž“αž•αŸ’αž›αžΆαž€αžŸαž‰αŸ’αž‰αžΆαžŠαŸαžŸαŸ’αžšαžŸαŸ‹αžŸαŸ’αž’αžΆαžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αž˜αŸ’αžšαŸ„αž„αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž“αŸ…αž–αŸαž›αž›αŸ’αž„αžΆαž…αž“αŸƒαž€αžΆαžšαžŸαžšαžŸαŸαžšαž€αžΌαžŠαž„αžΆαž™αžŸαŸ’αžšαž½αž›

αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ‚αž›αž˜αžΆαž“αž‚αž˜αŸ’αžšαŸ„αž„αžŸαžαŸ’αžœαž…αž·αž‰αŸ’αž…αžΉαž˜αž™αŸ‰αžΆαž„αž αŸ„αž…αžŽαžΆαžŸαŸ‹αž˜αž½αž™αž“αŸ…αž…αŸ†αžŽαž»αž…αžαŸ’αž›αŸ‡αž˜αžΆαž“αž€αžΆαžšαžšαž˜αžΆαžŸαŸ‹αž’αŸ†αž–αžΈαž•αŸ’αž›αžΆαž€αžŸαž‰αŸ’αž‰αžΆαžŠαŸαžŸαŸ’αžšαžŸαŸ‹αžŸαŸ’αž’αžΆαžαž‡αžΆαž˜αž½αž™αž“αžΉαž„αžŸαŸ’αžαžΆαž“αž—αžΆαž– αž€αžΆαžšαž‚αŸ’αžšαž”αžŠαžŽαŸ’αžαž”αŸ‹αž€αžΌαžŠ αž€αŸ†αžŽαŸ‚αž€αž‰αŸ’αž…αž”αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„ nuget ... αž αžΎαž™αž€αžΆαžšαžšαž˜αžΆαžŸαŸ‹αž“αŸαŸ‡αž”αžΆαž“αž“αžΆαŸ†αž±αŸ’αž™αžαŸ’αž‰αž»αŸ†αžŸαžšαžŸαŸαžšαž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αŸ” αž€αŸ’αž“αž»αž„β€‹αž€αžΆαžšβ€‹αžšαŸ€αž”β€‹αž…αŸ†β€‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹β€‹αž€αžΆαžšβ€‹αžŸαžšαžŸαŸαžšβ€‹αžœαžΆ αžαŸ’αž‰αž»αŸ†β€‹αž‘αž‘αž½αž›β€‹αž”αžΆαž“β€‹αžŸαž˜αŸ’αžšαžŸαŸ‹β€‹αž“αŸαŸ‡β€‹αž€αŸ’αž“αž»αž„β€‹αž‚αž˜αŸ’αžšαŸ„αž„β€‹αž˜αž½αž™β€‹αžšαž”αžŸαŸ‹β€‹αžαŸ’αž‰αž»αŸ†αŸ–

αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž’αŸ†αž–αžΈ CI/CD αž“αŸ…αž€αŸ’αž“αž»αž„ GitLab αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ†αž”αžΌαž„αžŠαžΆαž…αŸ‹αžαžΆαž (αžŸαŸ’αž‘αžΎαžšαžαŸ‚)

αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αž“αžΉαž„αžŽαŸ‚αž“αžΆαŸ†αž’αŸ’αž“αž€αž’αŸ†αž–αžΈαž€αžΆαžšαžšαŸ€αž”αž…αŸ†αž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž“αŸƒαž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž› αž“αž·αž„αž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™αž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αž˜αŸ’αžšαŸ„αž„αž”αžŽαŸ’αžŽαžΆαž›αŸαž™αžαŸ’αž“αžΆαž€αŸ‹ .Net Core αž“αŸ…αž€αŸ’αž“αž»αž„ GitLab αž€αžΆαžšαž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž―αž€αžŸαžΆαžšαž‘αŸ…αž€αžΆαž“αŸ‹αž‘αŸ†αž–αŸαžš GitLab αž“αž·αž„αž€αžΆαžšαž‡αŸ†αžšαž»αž‰αž€αž‰αŸ’αž…αž”αŸ‹αžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αŸ…αž‡αžΆαž…αŸ†αžŽαžΈαž―αž€αž‡αž“αž“αŸ…αž€αŸ’αž“αž»αž„ Azure DevOps αŸ”

VS Code αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž‡αžΆαž”αžšαž·αž™αžΆαž€αžΆαžŸαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž‡αžΆαž˜αž½αž™αž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αžαŸ‚αž˜ αž›αŸ†αž αžΌαžšαž€αžΆαžšαž„αžΆαžš GitLab (αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαž»αž–αž›αž—αžΆαž–αž―αž€αžŸαžΆαžšαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž–αžΈαž”αžšαž·αžŸαŸ’αžαžΆαž“αž’αž—αž·αžœαžŒαŸ’αžαž“αŸ)αŸ”

αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžŸαž„αŸ’αžαŸαž”

ស៊ីឌី - αžαžΎαžœαžΆαž“αŸ…αž–αŸαž›αž’αŸ’αž“αž€αž‘αžΎαž”αžαŸ‚αžšαž»αž‰ αž αžΎαž™αž’αŸ’αžœαžΈαŸ—αž”αžΆαž“αž’αŸ’αž›αžΆαž€αŸ‹αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž—αŸ’αž‰αŸ€αžœαž αžΎαž™αž¬αž“αŸ…?

αžαžΎαž’αŸ’αžœαžΈαž‘αŸ…αž‡αžΆ CI/CD αž αžΎαž™αž αŸαžαž»αž’αŸ’αžœαžΈαž”αžΆαž“αž‡αžΆαž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž€αžΆαžšαžœαžΆ - αž’αŸ’αž“αž€αž’αžΆαž… google αžœαžΆαž”αžΆαž“αž™αŸ‰αžΆαž„αž„αžΆαž™αžŸαŸ’αžšαž½αž›αŸ” αžŸαŸ’αžœαŸ‚αž„αžšαž€αž―αž€αžŸαžΆαžšαž–αŸαž‰αž›αŸαž‰αžŸαŸ’αžαžΈαž–αžΈαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž”αŸ†αž–αž„αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„ GitLab αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž•αž„αžŠαŸ‚αžšαŸ”. αž“αŸ…αž‘αžΈαž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αžŸαž„αŸ’αžαŸαž”αž αžΎαž™αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αžΆαž…αž’αŸ’αžœαžΎαž‘αŸ…αž”αžΆαž“αžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αž‚αž»αžŽαžœαž·αž”αžαŸ’αžαž·αž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸƒαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž–αžΈαž‘αž·αžŠαŸ’αž‹αž—αžΆαž–αž—αŸ’αž“αŸ‚αž€αžšαž”αžŸαŸ‹αž”αž€αŸ’αžŸαžΈ:

  • αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž•αŸ’αž‰αžΎαž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αžαž‘αŸ…αž€αžΆαž“αŸ‹αžƒαŸ’αž›αžΆαŸ†αž„ αž”αž„αŸ’αž€αžΎαžαžŸαŸ†αžŽαžΎαž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαžαžΆαž˜αžšαž™αŸˆαž‚αŸαž αž‘αŸ†αž–αŸαžš αž¬αžαžΆαž˜αž˜αž’αŸ’αž™αŸ„αž”αžΆαž™αž•αŸ’αžŸαŸαž„αž‘αŸ€αž αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹ αž¬αžŠαŸ„αž™αž…αŸαžαž“αžΆαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžšαž”αŸ’αžšαŸαž„,
  • αž€αž·αž…αŸ’αž…αž€αžΆαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž–αžΈαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ αž›αž€αŸ’αžαžαžŽαŸ’αžŒαžŠαŸ‚αž›αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž–αž½αž€αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαžΆαž€αŸ‹αž±αŸ’αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αŸ’αž“αž»αž„αž”αžšαž·αž”αž‘αžŠαŸ‚αž›αž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™
  • αž—αžΆαžšαž€αž·αž…αŸ’αž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαŸ€αž”αž…αŸ†αžαžΆαž˜αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸ
  • αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž‡αžΆαžœαŸαž“ - i.e. αž”αŸ‰αžΆαžšαŸ‰αžΆαž‘αŸ‚αž› αž€αžΆαžšαž„αžΆαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸƒαžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹
  • αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αž”αžšαžΆαž‡αŸαž™ (ឧ. αž™αŸ‰αžΆαž„αž αŸ„αž…αžŽαžΆαžŸαŸ‹αž€αž·αž…αŸ’αž…αž€αžΆαžšαž˜αž½αž™αž“αŸƒαžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αž”αžšαžΆαž‡αŸαž™) αž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžšαž”αŸ’αžšαŸαž„αž“αžΉαž„αžˆαž”αŸ‹ (αžŸαŸ’αž‘αžΎβ€‹αžαŸ‚β€‹αžšαž αžΌαž),
  • αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹αžŠαŸ„αž™αž‡αŸ„αž‚αž‡αŸαž™ αž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžšαž”αŸ’αžšαŸαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαžαŸ‹αž‘αž»αž€αžαžΆαž‡αŸ„αž‚αž‡αŸαž™αŸ”

αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αž™αžΎαž„αž˜αžΆαž“αŸ–

  • αž”αŸ†αž–αž„αŸ‹ - αžŸαŸ†αžŽαž»αŸ†αž“αŸƒαž€αž·αž…αŸ’αž…αž€αžΆαžšαžŠαŸ‚αž›αž”αžΆαž“αžšαŸ€αž”αž…αŸ†αž‡αžΆαžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αž”αž„αŸ’αž€αžΎαž αžŸαžΆαž€αž›αŸ’αž”αž„ αž€αžΌαžŠαž€αž‰αŸ’αž…αž”αŸ‹ αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž€αžΆαžšαžŸαŸ’αžαžΆαž”αž“αžΆαžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹αž‘αŸ…αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž–αž–αž€αŸ”αž›αŸ”
  • αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž› (αž†αžΆαž€) - αž’αž„αŸ’αž‚αž—αžΆαž–αž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžšαž”αŸ’αžšαŸαž„ αž˜αžΆαž“αž—αžΆαžšαž€αž·αž…αŸ’αž… 1+
  • αž—αžΆαžšαž€αž·αž…αŸ’αž… (αž€αžΆαžšβ€‹αž„αžΆαžš) αž‚αžΊαž‡αžΆαž―αž€αžαžΆαž“αŸƒαž€αžΆαžšαž„αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ†αž–αž„αŸ‹αŸ” αžœαžΆαž˜αžΆαž“αžŸαŸ’αž‚αŸ’αžšαžΈαž” (αž‘αžΆαž˜αž‘αžΆαžš) αž›αž€αŸ’αžαžαžŽαŸ’αžŒαž“αŸƒαž€αžΆαžšαž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–/αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽ αž“αž·αž„αž…αŸ’αžšαžΎαž“αž‘αŸ€αžαŸ”

αžŠαžΌαž…αŸ’αž“αŸ„αŸ‡αž αžΎαž™ αž—αžΆαžšαž€αž·αž…αŸ’αž…αž“αŸ…αž–αŸαž›αžšαŸ€αž”αž…αŸ† CI/CD αž…αž»αŸ‡αž˜αž€αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαžŸαŸ†αžŽαž»αŸ†αž“αŸƒαž€αž·αž…αŸ’αž…αž€αžΆαžšαžŠαŸ‚αž›αž’αž“αž»αžœαžαŸ’αžαžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž€αžŸαžΆαž„ αžŸαžΆαž€αž›αŸ’αž”αž„ αž“αž·αž„αž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž€αžΌαžŠ αž“αž·αž„αžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαŸ”

αž˜αž»αž“αž–αŸαž›αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αŸ– αž αŸαžαž»αž’αŸ’αžœαžΈ?

  • αž αŸαžαž»αž’αŸ’αžœαžΈ Gitlab?

αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžœαžΆαž€αŸ’αž›αžΆαž™αž‡αžΆαž€αžΆαžšαž…αžΆαŸ†αž”αžΆαž…αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαžƒαŸ’αž›αžΆαŸ†αž„αž―αž€αž‡αž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αž˜αŸ’αžšαŸ„αž„αžŸαžαŸ’αžœαž…αž·αž‰αŸ’αž…αžΉαž˜ αž–αž½αž€αž‚αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ‹αž“αŸ…αž›αžΎ GitHub αž αžΎαž™αžαŸ’αž‰αž»αŸ†αž˜αžΆαž“αž€αžΆαžšαž›αŸ„αž—αž›αž“αŸ‹αŸ” αžƒαŸ’αž›αžΆαŸ†αž„αž”αžΆαž“αž€αŸ’αž›αžΆαž™αž‘αŸ…αž‡αžΆαž₯αžαž‚αž·αžαžαŸ’αž›αŸƒ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžšαž αžΌαžαž˜αž€αžŠαž›αŸ‹αž–αŸαž›αž“αŸαŸ‡ αžœαžΆαž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαž αŸαžαž»αž•αž›αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ’αž‰αž»αŸ†αž€αŸ’αž“αž»αž„αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž‘αžΈαž‘αŸ… GitHub αž“αŸ„αŸ‡αž‘αŸαŸ”

  • αž αŸαžαž»αž’αŸ’αžœαžΈαž”αžΆαž“αž‡αžΆαž˜αž·αž“ Azure DevOps Pipelines?

αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αž“αŸ…αž‘αžΈαž“αŸ„αŸ‡αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž‚αžΊαž”αž‹αž˜ - αž…αŸ†αžŽαŸαŸ‡αžŠαžΉαž„αž“αŸƒαž”αž“αŸ’αž‘αžΆαžαŸ‹αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αžΆαž˜αž‘αžΆαžšαžŸαžΌαž˜αŸ’αž”αžΈαžαŸ‚αŸ” αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‡αžΆαž˜αž½αž™αž’αŸ’αž“αž€αž•αŸ’αžαž›αŸ‹αžŸαŸαžœαžΆ git αžαžΆαž„αž€αŸ’αžšαŸ… - αžŠαŸ„αž™αž€αžΆαžšαž…αž»αž…αž–αžΈαžšαž”αžΈαžŠαž„ αž€αžΆαžšαž“αžΆαŸ†αž…αžΌαž›αžŸαŸ„ SSH αžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αž‰αžΎαž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αžαž‘αŸ…αž€αžΆαž“αŸ‹αžƒαŸ’αž›αžΆαŸ†αž„ - αž•αž„αžŠαŸ‚αžš αž”αŸ†αž–αž„αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αžαŸ†αž‘αžΎαž„αž™αŸ‰αžΆαž„αž„αžΆαž™αžŸαŸ’αžšαž½αž› αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαž˜αž·αž“αž˜αŸ‚αž“αž˜αž€αž–αžΈαž‚αŸ†αžšαžΌαž€αŸαžŠαŸ„αž™αŸ”

αž‘αžΈαžαžΆαŸ†αž„αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αŸ– αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž’αŸ’αž“αž€αž˜αžΆαž“ αž“αž·αž„αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž’αŸ’αž“αž€αž…αž„αŸ‹αž”αžΆαž“

αž™αžΎαž„β€‹αž˜αžΆαž“:

  • αžƒαŸ’αž›αžΆαŸ†αž„αž“αŸ…αž€αŸ’αž“αž»αž„ GitLab αŸ”

αž™αžΎαž„αž…αž„αŸ‹αž”αžΆαž“αŸ–

  • αž€αžΆαžšαž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆαžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž· αž“αž·αž„αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαŸ†αžŽαžΎαž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αžΈαž˜αž½αž™αŸ—,
  • αž€αžΆαžšαž€αžŸαžΆαž„αž€αž‰αŸ’αž…αž”αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαŸ†αžŽαžΎαž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αžΈαž˜αž½αž™αŸ— αž“αž·αž„αž€αžΆαžšαž‡αŸ†αžšαž»αž‰αž‘αŸ…αž˜αŸ αž•αŸ’αžαž›αŸ‹αžαžΆαž˜αžΆαž“αž”αž“αŸ’αž‘αžΆαžαŸ‹αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž˜αž½αž™αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆ
  • αž€αžΆαžšαž•αŸ’αž‰αžΎαž€αž‰αŸ’αž…αž”αŸ‹αžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αŸ…αž˜αžαž·αž–αŸαžαŸŒαž˜αžΆαž“αž―αž€αž‡αž“αž“αŸ…αž€αŸ’αž“αž»αž„ Azure DevOps,
  • αž€αžΆαžšαž”αŸ’αžšαž˜αžΌαž›αž•αŸ’αžαž»αŸ†αž―αž€αžŸαžΆαžš αž“αž·αž„αž€αžΆαžšαž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž•αŸ’αžŸαžΆαž™αž“αŸ…αž€αŸ’αž“αž»αž„αž‘αŸ†αž–αŸαžš GitLab,
  • αž•αŸ’αž›αžΆαž€αžŸαž‰αŸ’αž‰αžΆ !11

αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαžŠαŸ‚αž›αž”αžΆαž“αž–αž·αž–αžŽαŸŒαž“αžΆαž˜αžΆαž“αž›αž€αŸ’αžαžŽαŸˆαžŸαžšαžΈαžšαžΆαž„αŸ’αž‚αž’αŸ’αž›αžΆαž€αŸ‹αž›αžΎαž‚αŸ†αžšαžΌαž”αŸ†αž–αž„αŸ‹αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

  • αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αž‘αžΈ 1 - αž€αžΆαžšαž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆαŸ”
    • αž™αžΎαž„αž”αŸ’αžšαž˜αžΌαž›αž€αžΌαžŠ αž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž―αž€αžŸαžΆαžšαž›αž‘αŸ’αž’αž•αž›αž‡αžΆαžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽ
  • αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αž‘αžΈ 2 - αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αž
    • αž™αžΎαž„αž‘αž‘αž½αž›αž”αžΆαž“αžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαž–αžΈαžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αžŸαžΆαž„αžŸαž„αŸ‹ αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„ αž”αŸ’αžšαž˜αžΌαž›αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‚αŸ’αžšαž”αžŠαžŽαŸ’αžαž”αŸ‹αž€αžΌαžŠ
  • αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αž‘αžΈ 3 - αžŠαžΆαž€αŸ‹αžŸαŸ’αž“αžΎ
    • αž€αž·αž…αŸ’αž…αž€αžΆαžšαž‘αžΈ 1 - αž”αž„αŸ’αž€αžΎαžαž€αž‰αŸ’αž…αž”αŸ‹ nuget αž αžΎαž™αž•αŸ’αž‰αžΎαžœαžΆαž‘αŸ… Azure DevOps
    • αž€αž·αž…αŸ’αž…αž€αžΆαžšαž‘αžΈ 2 - αž™αžΎαž„αž”αŸ’αžšαž˜αžΌαž›αž‚αŸαž αž‘αŸ†αž–αŸαžšαž–αžΈ xmldoc αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΌαžŠαž”αŸ’αžšαž—αž– αž αžΎαž™αž”αŸ„αŸ‡αž•αŸ’αžŸαžΆαž™αžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„ GitLab Pages

αžαŸ„αŸ‡αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜!

αž€αžΆαžšαž”αŸ’αžšαž˜αžΌαž›αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’

αž€αŸ†αž–αž»αž„αžšαŸ€αž”αž…αŸ†αž‚αžŽαž“αžΈ

  1. αž”αž„αŸ’αž€αžΎαžαž‚αžŽαž“αžΈαž“αŸ…αž€αŸ’αž“αž»αž„ Microsoft Azure

  2. αž‘αŸ… Azure DevOps

  3. αž™αžΎαž„αž”αž„αŸ’αž€αžΎαžαž‚αž˜αŸ’αžšαŸ„αž„αžαŸ’αž˜αžΈαž˜αž½αž™

    1. αžˆαŸ’αž˜αŸ„αŸ‡ - αžŽαžΆαž˜αž½αž™αŸ”
    2. αž—αžΆαž–αž˜αžΎαž›αžƒαžΎαž‰ - αžŽαžΆαž˜αž½αž™αŸ”
      αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž’αŸ†αž–αžΈ CI/CD αž“αŸ…αž€αŸ’αž“αž»αž„ GitLab αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ†αž”αžΌαž„αžŠαžΆαž…αŸ‹αžαžΆαž (αžŸαŸ’αž‘αžΎαžšαžαŸ‚)

  4. αž“αŸ…αž–αŸαž›αž’αŸ’αž“αž€αž…αž»αž…αž›αžΎαž”αŸŠαžΌαžαž»αž„αž”αž„αŸ’αž€αžΎαž αž‚αž˜αŸ’αžšαŸ„αž„αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαž αž αžΎαž™αž’αŸ’αž“αž€αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“αž”αž“αŸ’αžαž‘αŸ…αž€αžΆαž“αŸ‹αž‘αŸ†αž–αŸαžšαžšαž”αžŸαŸ‹αžœαžΆαŸ” αž“αŸ…αž›αžΎαž‘αŸ†αž–αŸαžšαž“αŸαŸ‡ αž’αŸ’αž“αž€αž’αžΆαž…αž”αž·αž‘αž˜αž»αžαž„αžΆαžšαžŠαŸ‚αž›αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αžŠαŸ„αž™αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž‚αž˜αŸ’αžšαŸ„αž„ (αžαŸ†αžŽαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž€αŸ’αž“αž»αž„αž”αž‰αŸ’αž‡αžΈαž“αŸ…αžαžΆαž„αž†αŸ’αžœαŸαž„ -> αž‘αž·αžŠαŸ’αž‹αž—αžΆαž–αž‘αžΌαž‘αŸ… -> αž”αŸ’αž›αž»αž€αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ Azure DevOps)
    αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž’αŸ†αž–αžΈ CI/CD αž“αŸ…αž€αŸ’αž“αž»αž„ GitLab αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ†αž”αžΌαž„αžŠαžΆαž…αŸ‹αžαžΆαž (αžŸαŸ’αž‘αžΎαžšαžαŸ‚)

  5. αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹ Attrifacts αž…αž»αž… Create feed

    1. αž”αž‰αŸ’αž…αžΌαž›αžˆαŸ’αž˜αŸ„αŸ‡αž”αŸ’αžšαž—αž–
    2. αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž—αžΆαž–αž˜αžΎαž›αžƒαžΎαž‰
    3. αžŠαŸ„αŸ‡αž’αžΈαž€ αžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž€αž‰αŸ’αž…αž”αŸ‹αž–αžΈαž”αŸ’αžšαž—αž–αžŸαžΆαž’αžΆαžšαžŽαŸˆαž‘αžΌαž‘αŸ…αžŠαžΌαž…αŸ’αž“αŸαŸ‡β€‹αž”αŸ’αžšαž—αž–β€‹αž˜αž·αž“β€‹αž”αŸ’αžšαŸ‚β€‹αž€αŸ’αž›αžΆαž™β€‹αž‘αŸ…β€‹αž‡αžΆβ€‹αž€αŸ’αž›αžΌαž“β€‹αž“αž»αž™αž€αŸ’αž›αŸαž’αŸŠαŸ‚
      αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž’αŸ†αž–αžΈ CI/CD αž“αŸ…αž€αŸ’αž“αž»αž„ GitLab αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ†αž”αžΌαž„αžŠαžΆαž…αŸ‹αžαžΆαž (αžŸαŸ’αž‘αžΎαžšαžαŸ‚)

  6. αž…αž»αž… Connect to feed αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸ Visual Studio αž…αž˜αŸ’αž›αž„αž”αŸ’αžšαž—αž–αž–αžΈαž”αŸ’αž›αž»αž€αžŠαŸ†αž‘αžΎαž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“
    αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž’αŸ†αž–αžΈ CI/CD αž“αŸ…αž€αŸ’αž“αž»αž„ GitLab αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ†αž”αžΌαž„αžŠαžΆαž…αŸ‹αžαžΆαž (αžŸαŸ’αž‘αžΎαžšαžαŸ‚)

  7. αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž‚αžŽαž“αžΈ αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸ Personal Access Token
    αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž’αŸ†αž–αžΈ CI/CD αž“αŸ…αž€αŸ’αž“αž»αž„ GitLab αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ†αž”αžΌαž„αžŠαžΆαž…αŸ‹αžαžΆαž (αžŸαŸ’αž‘αžΎαžšαžαŸ‚)

  8. αž”αž„αŸ’αž€αžΎαžαž“αž·αž˜αž·αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαž…αžΌαž›αž”αŸ’αžšαžΎαžαŸ’αž˜αžΈαŸ”

    1. αžˆαŸ’αž˜αŸ„αŸ‡ - αž”αŸ†αž–αžΆαž“
    2. αž’αž„αŸ’αž‚αž€αžΆαžš - αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“
    3. αž˜αžΆαž“αžŸαž»αž–αž›αž—αžΆαž–αž’αžαž·αž”αžšαž˜αžΆ 1 αž†αŸ’αž“αžΆαŸ†αŸ”
    4. αžœαž·αžŸαžΆαž›αž—αžΆαž– - αž€αžΆαžšαžœαŸαž…αžαŸ’αž…αž”αŸ‹/αž’αžΆαž“ αž“αž·αž„αžŸαžšαžŸαŸαžš
      αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž’αŸ†αž–αžΈ CI/CD αž“αŸ…αž€αŸ’αž“αž»αž„ GitLab αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ†αž”αžΌαž„αžŠαžΆαž…αŸ‹αžαžΆαž (αžŸαŸ’αž‘αžΎαžšαžαŸ‚)

  9. αž…αž˜αŸ’αž›αž„αž“αž·αž˜αž·αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž€αžΎαž - αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž”αž„αŸ’αž’αž½αž…αž˜αŸ‰αžΌαžŒαž»αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž·αž‘ αžαž˜αŸ’αž›αŸƒαž“αžΉαž„αž˜αž·αž“αž˜αžΆαž“

  10. αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžƒαŸ’αž›αžΆαŸ†αž„αž“αŸ…αž€αŸ’αž“αž»αž„ GitLab αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹ CI/CD
    αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž’αŸ†αž–αžΈ CI/CD αž“αŸ…αž€αŸ’αž“αž»αž„ GitLab αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ†αž”αžΌαž„αžŠαžΆαž…αŸ‹αžαžΆαž (αžŸαŸ’αž‘αžΎαžšαžαŸ‚)

  11. αž–αž„αŸ’αžšαžΈαž€αž”αŸ’αž›αž»αž€αž’αžαŸαžš αž”αž“αŸ’αžαŸ‚αž˜αžαŸ’αž˜αžΈαž˜αž½αž™

    1. αžˆαŸ’αž˜αŸ„αŸ‡ - αžŽαžΆαž˜αž½αž™αžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αž…αž“αŸ’αž›αŸ„αŸ‡ (αž“αžΉαž„αž˜αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ‚αž›αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ)
    2. αžαž˜αŸ’αž›αŸƒ - αžŸαž‰αŸ’αž‰αžΆαžŸαž˜αŸ’αž„αžΆαžαŸ‹αž…αžΌαž›αž”αŸ’αžšαžΎαž–αžΈαž€αžαžΆαžαžŽαŸ’αžŒαž‘αžΈ 9
    3. αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž’αžαŸαžšαžšαž”αžΆαŸ†αž„αž˜αž»αž
      αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž’αŸ†αž–αžΈ CI/CD αž“αŸ…αž€αŸ’αž“αž»αž„ GitLab αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ†αž”αžΌαž„αžŠαžΆαž…αŸ‹αžαžΆαž (αžŸαŸ’αž‘αžΎαžšαžαŸ‚)

αž“αŸαŸ‡αž”αž‰αŸ’αž…αž”αŸ‹αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž‡αžΆαž˜αž»αž“αŸ”

αž€αŸ†αž–αž»αž„αžšαŸ€αž”αž…αŸ†αž€αŸ’αžšαž”αžαŸαžŽαŸ’αžŒαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’

αžαžΆαž˜αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜ αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ CI/CD αž“αŸ…αž€αŸ’αž“αž»αž„ GitLab αž”αŸ’αžšαžΎαž―αž€αžŸαžΆαžš .gitlab-ci.yml αž–αžΈαž«αžŸαž“αŸƒαžƒαŸ’αž›αžΆαŸ†αž„αŸ” αž’αŸ’αž“αž€αž’αžΆαž…αž€αŸ†αžŽαžαŸ‹αž•αŸ’αž›αžΌαžœαž”αŸ†αž–αžΆαž“αž‘αŸ…αž―αž€αžŸαžΆαžšαž“αŸαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžƒαŸ’αž›αžΆαŸ†αž„ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡αžœαžΆαž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž‘αŸαŸ”

αžŠαžΌαž…αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αž˜αžΎαž›αžƒαžΎαž‰αž–αžΈαž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αžαŸ‚αž˜ αž―αž€αžŸαžΆαžšαž˜αžΆαž“αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹ YAML. αž―αž€αžŸαžΆαžšαž›αž˜αŸ’αž’αž·αžαž’αŸ†αž–αžΈαžŸαŸ„αžŠαŸ‚αž›αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‘αž»αž€αž“αŸ…αž€αž˜αŸ’αžšαž·αžαž€αŸ†αž–αžΌαž›αž“αŸƒαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ αž“αž·αž„αž“αŸ…αž€αž˜αŸ’αžšαž·αžαž“αžΈαž˜αž½αž™αŸ—αž“αŸƒαžŸαŸ’αžšαž‘αžΆαž”αŸ‹αŸ”

αž‡αžΆαžŠαŸ†αž”αžΌαž„ αž™αžΎαž„αž”αž“αŸ’αžαŸ‚αž˜αžαŸ†αžŽαž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ…αžšαžΌαž”αž—αžΆαž– docker αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ αžŠαŸ‚αž›αž—αžΆαžšαž€αž·αž…αŸ’αž…αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžšαžΏαž„αž“αŸαŸ‡αž™αžΎαž„αžšαž€αžƒαžΎαž‰ αž‘αŸ†αž–αŸαžšαžšαžΌαž”αž—αžΆαž– .Net Core αž“αŸ…αž›αžΎ Docker HubαŸ” αž“αŸαŸ‡ GitHub αž˜αžΆαž“αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž›αž˜αŸ’αž’αž·αžαž’αŸ†αž–αžΈαžšαžΌαž”αž—αžΆαž–αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž·αž…αŸ’αž…αž€αžΆαžšαž•αŸ’αžŸαŸαž„αŸ—αŸ” αžšαžΌαž”αž—αžΆαž–αžŠαŸ‚αž›αž˜αžΆαž“ .Net Core 3.1 αž‚αžΊαžŸαŸαž€αŸ’αžαž·αžŸαž˜αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž™αžΎαž„αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž’αŸ’αž“αž€αž’αžΆαž…αž”αž“αŸ’αžαŸ‚αž˜αž”αž“αŸ’αž‘αžΆαžαŸ‹αž‘αžΈαž˜αž½αž™αž‘αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αŸ”

image: mcr.microsoft.com/dotnet/core/sdk:3.1

αž₯αž‘αžΌαžœαž“αŸαŸ‡ αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžšαž”αŸ’αžšαŸαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαžΆαž€αŸ‹αž±αŸ’αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž–αžΈαžƒαŸ’αž›αžΆαŸ†αž„αžšαžΌαž”αž—αžΆαž–αžšαž”αžŸαŸ‹ Microsoft αžšαžΌαž”αž—αžΆαž–αžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αžΆαž‰αž™αž€ αžŠαŸ‚αž›αž€αž·αž…αŸ’αž…αž€αžΆαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž–αžΈαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αŸ”

αž‡αŸ†αž αžΆαž“αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž‚αžΊαžαŸ’αžšαžΌαžœαž”αž“αŸ’αžαŸ‚αž˜ αž†αžΆαž€αžšαž”αžŸαŸ‹ αžαžΆαž˜αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜ GitLab αž€αŸ†αžŽαžαŸ‹ 5 αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αŸ–

  • .pre - αž’αž“αž»αžœαžαŸ’αžαžšαž αžΌαžαžŠαž›αŸ‹αž‚αŸ’αžšαž”αŸ‹αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›
  • .post - αž’αž“αž»αžœαžαŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αž‘αžΆαŸ†αž„αž’αžŸαŸ‹,
  • build - αžŠαŸ†αž”αžΌαž„αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈ .pre αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›,
  • test - αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αž‘αžΈαž–αžΈαžš
  • deploy - αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αž‘αžΈαž”αžΈαŸ”

αž‘αŸ„αŸ‡αž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αž‚αŸ’αž˜αžΆαž“αž’αŸ’αžœαžΈαžšαžΆαžšαžΆαŸ†αž„αž’αŸ’αž“αž€αž–αžΈαž€αžΆαžšαž”αŸ’αžšαž€αžΆαžŸαž–αž½αž€αž‚αŸαž±αŸ’αž™αž…αŸ’αž”αžΆαžŸαŸ‹αž›αžΆαžŸαŸ‹αž“αŸ„αŸ‡αž‘αŸαŸ” αž›αŸ†αžŠαžΆαž”αŸ‹αžŠαŸ‚αž›αž‡αŸ†αž αžΆαž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαžΆαž™αž”αž‰αŸ’αž‡αžΈαž”αŸ‰αŸ‡αž–αžΆαž›αŸ‹αžŠαž›αŸ‹αž›αŸ†αžŠαžΆαž”αŸ‹αžŠαŸ‚αž›αž–αž½αž€αž‚αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž—αžΆαž–αž–αŸαž‰αž›αŸαž‰ αž…αžΌαžšαž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ…αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αŸ–

stages:
  - build
  - test
  - deploy

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž€αŸ‚αž€αŸ†αž αž»αžŸ αžœαžΆαžŸαž˜αž αŸαžαž»αž•αž›αž€αŸ’αž“αž»αž„αž€αžΆαžšαž‘αž‘αž½αž›αž”αžΆαž“αž–αŸαžαŸŒαž˜αžΆαž“αž’αŸ†αž–αžΈαž”αžšαž·αžŸαŸ’αžαžΆαž“αžŠαŸ‚αž›αž€αž·αž…αŸ’αž…αž€αžΆαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αŸ” αž…αžΌαžšαž”αž“αŸ’αžαŸ‚αž˜αžŸαŸ†αžŽαž»αŸ†αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž‡αžΆαžŸαž€αž›αžŠαŸ‚αž›αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž˜αž»αž“αž–αŸαž›αž€αž·αž…αŸ’αž…αž€αžΆαžšαž“αžΈαž˜αž½αž™αŸ—αž‡αžΆαž˜αž½αž™ before_script:

before_script:
  - $PSVersionTable.PSVersion
  - dotnet --version
  - nuget help | select-string Version

αžœαžΆαž“αŸ…αžŸαž›αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž”αž“αŸ’αžαŸ‚αž˜αž™αŸ‰αžΆαž„αž αŸ„αž…αžŽαžΆαžŸαŸ‹αž€αž·αž…αŸ’αž…αž€αžΆαžšαž˜αž½αž™ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αžαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“ αž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžšαž”αŸ’αžšαŸαž„αž“αžΉαž„αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž–αŸαž›αž“αŸαŸ‡ αž…αžΌαžšαž™αžΎαž„αž”αž“αŸ’αžαŸ‚αž˜αž€αž·αž…αŸ’αž…αž€αžΆαžšαž‘αž‘αŸ αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž αžΆαž‰αŸ–

dummy job:
  script:
    - echo ok

αž™αžΎαž„αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŸαž»αž–αž›αž—αžΆαž– αž™αžΎαž„αž‘αž‘αž½αž›αž”αžΆαž“αžŸαžΆαžšαžαžΆαž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž‚αžΊαž›αŸ’αž’ αž™αžΎαž„αž”αŸ’αžαŸαž‡αŸ’αž‰αžΆ αž™αžΎαž„αžšαž»αž‰ αž™αžΎαž„αž˜αžΎαž›αž›αž‘αŸ’αž’αž•αž›αž“αŸ…αž›αžΎαž‚αŸαž αž‘αŸ†αž–αŸαžš ... αž αžΎαž™αž™αžΎαž„αž‘αž‘αž½αž›αž”αžΆαž“αž€αŸ†αž αž»αžŸαžŸαŸ’αž‚αŸ’αžšαžΈαž” - bash: .PSVersion: command not found. wtf?

αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž‚αžΊαž‘αžΌαž‡αžΈαžαž› - αžαžΆαž˜αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜ αž’αŸ’αž“αž€αžšαžαŸ‹αž€αžΆαžš (αž‘αž‘αž½αž›αžαž»αžŸαžαŸ’αžšαžΌαžœαž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αžŸαŸ’αž‚αŸ’αžšαžΈαž”αž€αž·αž…αŸ’αž…αž€αžΆαžš αž“αž·αž„αž•αŸ’αžαž›αŸ‹αžŠαŸ„αž™ GitLab) αž”αŸ’αžšαžΎ bash αžŠαžΎαž˜αŸ’αž”αžΈαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαŸ” αž’αŸ’αž“αž€αž’αžΆαž…αž‡αž½αžŸαž‡αž»αž›αžœαžΆαž”αžΆαž“αžŠαŸ„αž™αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž™αŸ‰αžΆαž„αž…αŸ’αž”αžΆαžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαž€αž·αž…αŸ’αž…αž€αžΆαžšαž’αŸ’αžœαžΈαžŠαŸ‚αž›αžŸαŸ’αž›αžΆαž€αžŠαŸ‚αž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžšαž”αŸ’αžšαŸαž„αž‚αž½αžšαž˜αžΆαž“αŸ–

dummy job on windows:
  script:
    - echo ok
  tags:
    - windows

αž’αžŸαŸ’αž…αžΆαžšαŸ’αž™! αž₯αž‘αžΌαžœαž“αŸαŸ‡αž”αŸ†αž–αž„αŸ‹αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ”

αž’αŸ’αž“αž€αž’αžΆαž“αžŠαŸ‚αž›αž™αž€αž…αž·αžαŸ’αžαž‘αž»αž€αžŠαžΆαž€αŸ‹ αžŠαŸ„αž™αž”αžΆαž“αž’αŸ’αžœαžΎαž˜αŸ’αžαž„αž‘αŸ€αžαž“αžΌαžœαž‡αŸ†αž αžΆαž“αžŠαŸ‚αž›αž”αžΆαž“αž…αž„αŸ’αž’αž»αž›αž”αž„αŸ’αž αžΆαž‰ αž“αžΉαž„αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžƒαžΎαž‰αžαžΆ αž€αž·αž…αŸ’αž…αž€αžΆαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž› testαž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαž™αžΎαž„αž˜αž·αž“αž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αž€αŸαžŠαŸ„αž™αŸ” αžŠαžΌαž…αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αž‘αžΆαž™αž”αžΆαž“αŸ” test αž‚αžΊαž‡αžΆαž‡αŸ†αž αžΆαž“αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜αŸ”

αž…αžΌαžšαž”αž“αŸ’αžαž”αž„αŸ’αž€αžΎαžαž‚αŸ’αžšαŸ„αž„αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ„αž™αž”αž“αŸ’αžαŸ‚αž˜αž€αž·αž…αŸ’αž…αž€αžΆαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ‚αž›αž”αžΆαž“αž–αž·αž–αžŽαŸŒαž“αžΆαžαžΆαž„αž›αžΎαŸ–

build job:
  script:
    - echo "building..."
  tags:
    - windows
  stage: build

test and cover job:
  script:
    - echo "running tests and coverage analysis..."
  tags:
    - windows
  stage: test

pack and deploy job:
  script:
    - echo "packing and pushing to nuget..."
  tags:
    - windows
  stage: deploy

pages:
  script:
    - echo "creating docs..."
  tags:
    - windows
  stage: deploy

αž™αžΎαž„αž‘αž‘αž½αž›αž”αžΆαž“αž”αŸ†αž–αž„αŸ‹αžŠαŸ‚αž›αž˜αž·αž“αž˜αžΆαž“αž˜αž»αžαž„αžΆαžšαž–αž·αžŸαŸαžŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžšαž”αŸ’αžšαŸαž„αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαŸ”

αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αž€αŸαŸ‡

αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αž€αžΆαžšαž–αž·αžαžŠαŸ‚αž›αžαžΆαž‚αŸ’αž˜αžΆαž“αžαž˜αŸ’αžšαž„αž€αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž·αž…αŸ’αž…αž€αžΆαžšαžŽαžΆαž˜αž½αž™αž‘αŸ αž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžšαž”αŸ’αžšαŸαž„αž“αžΉαž„ αž™αŸ‰αžΆαž„αž–αŸαž‰αž›αŸαž‰ αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αžšαžΆαž›αŸ‹αž–αŸαž›αžŠαŸ‚αž›αž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αžαžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž»αž‰αž‘αŸ…αžƒαŸ’αž›αžΆαŸ†αž„αŸ” αžŠαŸ„αž™αžŸαžΆαžšαž“αŸαŸ‡αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαž₯αžšαž·αž™αžΆαž”αžαžŠαŸ‚αž›αž…αž„αŸ‹αž”αžΆαž“αž‡αžΆαž‘αžΌαž‘αŸ… αž™αžΎαž„αž“αžΉαž„αžšαŸ€αž”αž…αŸ†αžαž˜αŸ’αžšαž„αž‚αž“αŸ’αž›αžΉαŸ‡αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž·αž…αŸ’αž…αž€αžΆαžšαŸ”

αžαž˜αŸ’αžšαž„αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž‡αžΆαž–αžΈαžšαž‘αž˜αŸ’αžšαž„αŸ‹αŸ– αžαŸ‚αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡/αž›αžΎαž€αž›αŸ‚αž„αžαŸ‚ ΠΈ αž…αŸ’αž”αžΆαž”αŸ‹. αžŠαŸ„αž™αžŸαž„αŸ’αžαŸαž”, only/except αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžαž˜αŸ’αžšαž„αžŠαŸ„αž™αž€αŸαŸ‡ (merge_requestαž§αž‘αžΆαž αžšαžŽαŸ - αž€αŸ†αžŽαžαŸ‹αž—αžΆαžšαž€αž·αž…αŸ’αž…αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αžšαžΆαž›αŸ‹αž–αŸαž›αžŠαŸ‚αž›αžŸαŸ†αžŽαžΎαžšαž‘αžΆαž‰αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαž αž αžΎαž™αžšαžΆαž›αŸ‹αž–αŸαž›αžŠαŸ‚αž›αž€αžΆαžšαžŸαž“αŸ’αž™αžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‰αžΎαž‘αŸ…αžŸαžΆαžαžΆαžŠαŸ‚αž›αž‡αžΆαž”αŸ’αžšαž—αž–αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ†αžŽαžΎαž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆ) αž“αž·αž„αžˆαŸ’αž˜αŸ„αŸ‡αžŸαžΆαžαžΆ (αžšαž½αž˜αž‘αžΆαŸ†αž„αž€αžΆαžšαž”αŸ’αžšαžΎαž€αž“αŸ’αžŸαŸ„αž˜αž’αž˜αŸ’αž˜αžαžΆ); rules αž’αž“αž»αž‰αŸ’αž‰αžΆαžβ€‹αž±αŸ’αž™β€‹αž’αŸ’αž“αž€β€‹αž”αŸ’αžŠαžΌαžšβ€‹αž›αž€αŸ’αžαžαžŽαŸ’αžŒβ€‹αž˜αž½αž™β€‹αž…αŸ†αž“αž½αž“β€‹αžαžΆαž˜β€‹αž”αŸ†αžŽαž„ αž αžΎαž™β€‹αž‡αžΆβ€‹αž‡αž˜αŸ’αžšαžΎαžŸ αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžŠαžΌαžšβ€‹αž›αž€αŸ’αžαžαžŽαŸ’αžŒβ€‹αž“αŸƒβ€‹αž€αžΆαžšβ€‹αž’αž“αž»αžœαžαŸ’αžβ€‹αž—αžΆαžšαž€αž·αž…αŸ’αž… αž’αžΆαžŸαŸ’αžšαŸαž™β€‹αž›αžΎβ€‹αž‡αŸ„αž‚αž‡αŸαž™β€‹αž“αŸƒβ€‹αž€αž·αž…αŸ’αž…αž€αžΆαžšβ€‹αž˜αž»αž“αŸ— (when αž“αŸ…αž€αŸ’αž“αž»αž„ GitLab CI/CD).

αž…αžΌαžšαž™αžΎαž„αžšαŸ†αž›αžΉαž€αž‘αžΎαž„αžœαž·αž‰αž“αžΌαžœαžŸαŸ†αžŽαž»αŸ†αž“αŸƒαžαž˜αŸ’αžšαžΌαžœαž€αžΆαžš - αž€αžΆαžšαž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆ αž“αž·αž„αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ‚αž€αžΆαžšαžŸαŸ’αž“αžΎαžŸαž»αŸ†αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆ αž€αžΆαžšαžœαŸαž…αžαŸ’αž…αž”αŸ‹ αž“αž·αž„αž€αžΆαžšαž•αŸ’αž‰αžΎαž‘αŸ…αž€αžΆαž“αŸ‹ Azure DevOps - αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαŸ†αžŽαžΎαž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆ αž“αž·αž„αž€αžΆαžšαž‡αŸ†αžšαž»αž‰αž‘αŸ…αž˜αŸ αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž―αž€αžŸαžΆαžš - αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž‡αŸ†αžšαž»αž‰αž‘αŸ…αž€αžΆαž“αŸ‹αž˜αŸαŸ”

αž‡αžΆαžŠαŸ†αž”αžΌαž„ αž™αžΎαž„αžšαŸ€αž”αž…αŸ†αž€αž·αž…αŸ’αž…αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž€αžΌαžŠαžŠαŸ„αž™αž”αž“αŸ’αžαŸ‚αž˜αž…αŸ’αž”αžΆαž”αŸ‹αžŠαŸ‚αž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžαŸ‚αž›αžΎαžŸαŸ†αžŽαžΎαž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ–

build job:
  # snip
  only:
    - merge_request

αž₯αž‘αžΌαžœαž“αŸαŸ‡ αž…αžΌαžšαž™αžΎαž„αžšαŸ€αž”αž…αŸ†αž€αž·αž…αŸ’αž…αž€αžΆαžšαžœαŸαž…αžαŸ’αž…αž”αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž›αžΎαžŸαŸ†αžŽαžΎαž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆ αž αžΎαž™αž”αž“αŸ’αžαŸ‚αž˜αž€αžΆαžšαžŸαž“αŸ’αž™αžΆαž‘αŸ…αž˜αŸαŸ–

pack and deploy job:
  # snip
  only:
    - merge_request
    - master

αžŠαžΌαž…αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αžƒαžΎαž‰αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž‚αžΊαžŸαžΆαž˜αž‰αŸ’αž‰αž“αž·αž„αžαŸ’αžšαž„αŸ‹αŸ”

αž’αŸ’αž“αž€αž€αŸαž’αžΆαž…αž€αŸ†αžŽαžαŸ‹αž—αžΆαžšαž€αž·αž…αŸ’αž…αž±αŸ’αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αžΆαž“αž›αž»αŸ‡αžαŸ’αžšαžΆαžαŸ‚αž€αžΆαžšαžŸαŸ’αž“αžΎαžŸαž»αŸ†αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‡αžΆαž˜αž½αž™αž‚αŸ„αž›αžŠαŸ…αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹ αž¬αžŸαžΆαžαžΆαž”αŸ’αžšαž—αž–αŸ–

  rules:
    - if: $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master"

αž“αŸ…αž€αŸ’αžšαŸ„αž˜αž›αž€αŸ’αžαžαžŽαŸ’αžŒαž’αŸ’αž“αž€αž’αžΆαž…αž”αŸ’αžšαžΎ αž’αžαŸαžšαžŠαŸ‚αž›αž”αžΆαž“αžšαžΆαž™αž“αŸ…αž‘αžΈαž“αŸαŸ‡; αž…αŸ’αž”αžΆαž”αŸ‹ rules αž˜αž·αž“αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαž“αžΉαž„αž…αŸ’αž”αžΆαž”αŸ‹ only/except.

αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž€αžΆαžšαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽ

αž€αŸ’αž“αž»αž„αž’αŸ†αž‘αž»αž„αž–αŸαž›αž—αžΆαžšαž€αž·αž…αŸ’αž…αž˜αž½αž™αŸ” build job αž™αžΎαž„αž“αžΉαž„αž˜αžΆαž“αžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαžŠαŸ‚αž›αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž‘αžΎαž„αžœαž·αž‰αž€αŸ’αž“αž»αž„αž€αž·αž…αŸ’αž…αž€αžΆαžšαž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŠαžΌαž…αŸ’αž“αŸαŸ‡ αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž”αž“αŸ’αžαŸ‚αž˜αž•αŸ’αž›αžΌαžœαž‘αŸ…αž€αžΆαž“αŸ‹αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž—αžΆαžšαž€αž·αž…αŸ’αž… αž―αž€αžŸαžΆαžšαžŠαŸ‚αž›αž’αŸ’αž“αž€αž“αžΉαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαžšαž€αŸ’αžŸαžΆαž‘αž»αž€ αž“αž·αž„αž”αŸ’αžšαžΎαž‘αžΎαž„αžœαž·αž‰αž€αŸ’αž“αž»αž„αž€αž·αž…αŸ’αž…αž€αžΆαžšαžαžΆαž„αž€αŸ’αžšαŸ„αž˜ αž‘αŸ…αž€αžΆαž“αŸ‹αž‚αž“αŸ’αž›αžΉαŸ‡ artifacts:

build job:
  # snip
  artifacts:
    paths:
      - path/to/build/artifacts
      - another/path
      - MyCoolLib.*/bin/Release/*

αž•αŸ’αž›αžΌαžœαž‚αžΆαŸ†αž‘αŸ’αžšαž’αž€αŸ’αžŸαžšαž‡αŸ†αž“αž½αžŸ αžŠαŸ‚αž›αž–αž·αžαž‡αžΆαž’αŸ’αžœαžΎαž±αŸ’αž™αž–αž½αž€αž‚αŸαž„αžΆαž™αžŸαŸ’αžšαž½αž›αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αŸ”

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž—αžΆαžšαž€αž·αž…αŸ’αž…αž”αž„αŸ’αž€αžΎαžαžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽ αž“αŸ„αŸ‡αž€αž·αž…αŸ’αž…αž€αžΆαžšαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž“αžΈαž˜αž½αž™αŸ—αž“αžΉαž„αž’αžΆαž…αž…αžΌαž›αž”αŸ’αžšαžΎαž–αž½αž€αžœαžΆαž”αžΆαž“ - αž–αž½αž€αž‚αŸαž“αžΉαž„αž˜αžΆαž“αž‘αžΈαžαžΆαŸ†αž„αž“αŸ…αžαžΆαž˜αž•αŸ’αž›αžΌαžœαžŠαžΌαž…αž‚αŸ’αž“αžΆαžŠαŸ‚αž›αž‘αžΆαž€αŸ‹αž‘αž„αž‘αŸ…αž“αžΉαž„αž«αžŸαž“αŸƒαžƒαŸ’αž›αžΆαŸ†αž„αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαž˜αžΌαž›αž–αžΈαž€αž·αž…αŸ’αž…αž€αžΆαžšαžŠαžΎαž˜αŸ” αžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαž€αŸαž˜αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‘αžΆαž‰αž™αž€αž“αŸ…αž›αžΎαž‚αŸαž αž‘αŸ†αž–αŸαžšαž•αž„αžŠαŸ‚αžšαŸ”

αž₯αž‘αžΌαžœαž“αŸαŸ‡ αž™αžΎαž„αž˜αžΆαž“αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžšαž½αž…αžšαžΆαž›αŸ‹ (αž“αž·αž„αžŸαžΆαž€αž›αŸ’αž”αž„) αž™αžΎαž„αž’αžΆαž…αž”αž“αŸ’αžαž€αžΆαžšαžŸαžšαžŸαŸαžšαžŸαŸ’αž‚αŸ’αžšαžΈαž”αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž·αž…αŸ’αž…αž€αžΆαžšαŸ”

αž™αžΎαž„αžŸαžšαžŸαŸαžšαžŸαŸ’αž‚αŸ’αžšαžΈαž”

αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž˜αžΆαž“αž–αŸαž›αž˜αž½αž™αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαž‘αžΆαž€αŸ‹αžŸαŸŠαžΈαž†αŸ’αž„αžΆαž™ αž†αŸ’αž„αžΆαž™ αž‚αž˜αŸ’αžšαŸ„αž„αžŸαžΆαž„αžŸαž„αŸ‹ (αžšαž½αž˜αž‘αžΆαŸ†αž„αž“αŸ…αž›αžΎ .net) αž–αžΈαž”αž“αŸ’αž‘αžΆαžαŸ‹αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž‚αžΊαž‡αžΆαž€αžΆαžšαžˆαžΊαž…αžΆαž”αŸ‹αŸ” αž₯αž‘αžΌαžœβ€‹αž“αŸαŸ‡ αž’αŸ’αž“αž€β€‹αž’αžΆαž…β€‹αž”αž„αŸ’αž€αžΎαž αžŸαžΆαž€αž›αŸ’αž”αž„ αž“αž·αž„β€‹αž”αŸ„αŸ‡αž•αŸ’αžŸαžΆαž™β€‹αž‚αž˜αŸ’αžšαŸ„αž„β€‹αž‡αžΆ 3 αž€αŸ’αžšαž»αž˜αŸ–

dotnet build
dotnet test
dotnet pack

αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆ αž˜αžΆαž“αž€αžΆαžš nuances αž˜αž½αž™αž…αŸ†αž“αž½αž“αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αž€αžΆαžšαžŠαŸ‚αž›αž™αžΎαž„αž“αžΉαž„αž’αŸ’αžœαžΎαž±αŸ’αž™αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž”αž“αŸ’αžαž·αž…αŸ”

  1. αž™αžΎαž„β€‹αž…αž„αŸ‹β€‹αž”αžΆαž“β€‹αž€αžΆαžšβ€‹αž”αž„αŸ’αž€αžΎαžβ€‹αž…αŸαž‰β€‹αž˜αž·αž“β€‹αž˜αŸ‚αž“β€‹αž”αž„αŸ’αž€αžΎαžβ€‹αž”αŸ†αž”αžΆαžαŸ‹β€‹αž€αŸ†αž αž»αžŸβ€‹αž‘αŸ αžŠαžΌαž…αŸ’αž“αŸαŸ‡β€‹αž™αžΎαž„β€‹αž”αž“αŸ’αžαŸ‚αž˜β€‹αž‘αŸ…β€‹αž–αžΆαž€αŸ’αž™β€‹αž”αž‰αŸ’αž‡αžΆβ€‹αž“αžΈαž˜αž½αž™αŸ— -c Release
  2. αž“αŸ…αž–αŸαž›αž’αŸ’αžœαžΎαžαŸαžŸαŸ’αž αž™αžΎαž„αž…αž„αŸ‹αž”αŸ’αžšαž˜αžΌαž›αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‚αŸ’αžšαž”αžŠαžŽαŸ’αžαž”αŸ‹αž€αžΌαžŠ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž™αžΎαž„αžαŸ’αžšαžΌαžœαž”αž‰αŸ’αž…αžΌαž›αž§αž”αž€αžšαžŽαŸαžœαž·αž—αžΆαž‚αž€αžΆαžšαž‚αŸ’αžšαž”αžŠαžŽαŸ’αžαž”αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž”αžŽαŸ’αžŽαžΆαž›αŸαž™αžŸαžΆαž€αž›αŸ’αž”αž„αŸ–
    1. αž”αž“αŸ’αžαŸ‚αž˜αž€αž‰αŸ’αž…αž”αŸ‹αž‘αŸ…αž”αžŽαŸ’αžŽαžΆαž›αŸαž™αžŸαžΆαž€αž›αŸ’αž”αž„αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ” coverlet.msbuild: dotnet add package coverlet.msbuild αž–αžΈαžαžαž‚αž˜αŸ’αžšαŸ„αž„
    2. αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ…αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„ /p:CollectCoverage=true
    3. αž”αž“αŸ’αžαŸ‚αž˜αžŸαŸ„αž‘αŸ…αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž€αž·αž…αŸ’αž…αž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„ αžŠαžΎαž˜αŸ’αž”αžΈαž‘αž‘αž½αž›αž”αžΆαž“αž›αž‘αŸ’αž’αž•αž›αž‚αŸ’αžšαž”αžŠαžŽαŸ’αžαž”αŸ‹ (αžŸαžΌαž˜αž˜αžΎαž›αžαžΆαž„αž€αŸ’αžšαŸ„αž˜)
  3. αž“αŸ…αž–αŸαž›αžαŸ’αž…αž”αŸ‹αž›αŸαžαž€αžΌαžŠαž‘αŸ…αž€αŸ’αž“αž»αž„αž€αž‰αŸ’αž…αž”αŸ‹ nuget αž€αŸ†αžŽαžαŸ‹αžαžαž›αž‘αŸ’αž’αž•αž›αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž‰αŸ’αž…αž”αŸ‹αŸ– -o .

αž€αžΆαžšαž”αŸ’αžšαž˜αžΌαž›αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‚αŸ’αžšαž”αžŠαžŽαŸ’αžαž”αŸ‹αž€αžΌαžŠ

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„ αž€αžΆαžšαž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž– Coverlet αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαŸ’αžαž·αžαž·αž‘αŸ…αž€αžΆαž“αŸ‹αž€αž»αž„αžŸαžΌαž›αŸ–

Calculating coverage result...
  Generating report 'C:Usersxxxsourcereposmy-projectmyProject.testscoverage.json'

+-------------+--------+--------+--------+
| Module      | Line   | Branch | Method |
+-------------+--------+--------+--------+
| project 1   | 83,24% | 66,66% | 92,1%  |
+-------------+--------+--------+--------+
| project 2   | 87,5%  | 50%    | 100%   |
+-------------+--------+--------+--------+
| project 3   | 100%   | 83,33% | 100%   |
+-------------+--------+--------+--------+

+---------+--------+--------+--------+
|         | Line   | Branch | Method |
+---------+--------+--------+--------+
| Total   | 84,27% | 65,76% | 92,94% |
+---------+--------+--------+--------+
| Average | 90,24% | 66,66% | 97,36% |
+---------+--------+--------+--------+

GitLab αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž€αž“αŸ’αžŸαŸ„αž˜αž’αž˜αŸ’αž˜αžαžΆαžŠαžΎαž˜αŸ’αž”αžΈαž‘αž‘αž½αž›αž”αžΆαž“αžŸαŸ’αžαž·αžαž· αžŠαŸ‚αž›αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž’αžΆαž…αž‘αž‘αž½αž›αž”αžΆαž“αž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹αž‡αžΆαž•αŸ’αž›αžΆαž€αžŸαž‰αŸ’αž‰αžΆαŸ” αž€αž“αŸ’αžŸαŸ„αž˜αž’αž˜αŸ’αž˜αžαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž—αžΆαžšαž€αž·αž…αŸ’αž…αžŠαŸ„αž™αž”αŸ’αžšαžΎαž‚αŸ’αžšαžΆαž”αŸ‹αž…αž»αž… coverage; αž€αž“αŸ’αžŸαŸ„αž˜αžαŸ’αžšαžΌαžœαžαŸ‚αž˜αžΆαž“αž€αŸ’αžšαž»αž˜αž…αžΆαž”αŸ‹αž™αž€ αžαž˜αŸ’αž›αŸƒαžŠαŸ‚αž›αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“αž‘αŸ…αž•αŸ’αž›αžΆαž€αžŸαž‰αŸ’αž‰αžΆαŸ–

test and cover job:
  # snip
  coverage: /|s*Totals*|s*(d+[,.]d+%)/

αž“αŸ…αž‘αžΈαž“αŸαŸ‡αž™αžΎαž„αž‘αž‘αž½αž›αž”αžΆαž“αžŸαŸ’αžαž·αžαž·αž–αžΈαž”αž“αŸ’αž‘αžΆαžαŸ‹αžŠαŸ‚αž›αž˜αžΆαž“αž”αžŽαŸ’αžαžΆαž‰αž‚αŸ’αžšαž”αžŠαžŽαŸ’αžαž”αŸ‹αžŸαžšαž»αž”αŸ”

αž•αŸ’αžŸαž–αŸ’αžœαž•αŸ’αžŸαžΆαž™αž€αž‰αŸ’αž…αž”αŸ‹ αž“αž·αž„αž―αž€αžŸαžΆαžš

αžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αž‘αžΆαŸ†αž„αž–αžΈαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž–αŸαž›αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž“αŸƒαž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžšαž”αŸ’αžšαŸαž„ - αž…αžΆαž”αŸ‹αžαžΆαŸ†αž„αž–αžΈαž€αžΆαžšαž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆ αž“αž·αž„αž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αž”αžΆαž“αž€αž“αŸ’αž›αž„αž•αž»αžαž‘αŸ… αž™αžΎαž„αž’αžΆαž…αž…αŸ‚αž€αžšαŸ†αž›αŸ‚αž€αž€αžΆαžšαžœαž·αžœαžαŸ’αžαžšαž”αžŸαŸ‹αž™αžΎαž„αž‡αžΆαž˜αž½αž™αž–αž·αž—αž–αž›αŸ„αž€αŸ”

αž‡αžΆαžŠαŸ†αž”αžΌαž„ αž–αž·αž…αžΆαžšαžŽαžΆαž€αžΆαžšαž”αŸ„αŸ‡αž•αŸ’αžŸαžΆαž™αž‘αŸ…αž”αŸ’αžšαž—αž–αž€αž‰αŸ’αž…αž”αŸ‹αŸ–

  1. αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž‚αž˜αŸ’αžšαŸ„αž„αž˜αž·αž“αž˜αžΆαž“αž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ nuet (nuget.config) αž”αž„αŸ’αž€αžΎαžαžαŸ’αž˜αžΈαž˜αž½αž™αŸ– dotnet new nugetconfig

    αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΈ: αžšαžΌαž”αž—αžΆαž–αž’αžΆαž…αž˜αž·αž“αž˜αžΆαž“αžŸαž·αž‘αŸ’αž’αž·αžŸαžšαžŸαŸαžšαž‘αŸ…αž€αžΆαž“αŸ‹αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŸαž€αž› (αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ αž“αž·αž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“)αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž€αž»αŸ†αž±αŸ’αž™αž…αžΆαž”αŸ‹αž€αŸ†αž αž»αžŸ αž™αžΎαž„αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αžαŸ’αž˜αžΈ αž αžΎαž™αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αžœαžΆαŸ”

  2. αžαŸ„αŸ‡αž”αž“αŸ’αžαŸ‚αž˜αž”αŸ’αžšαž—αž–αž€αž‰αŸ’αž…αž”αŸ‹αžαŸ’αž˜αžΈαž‘αŸ…αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αŸ– nuget sources add -name <name> -source <url> -username <organization> -password <gitlab variable> -configfile nuget.config -StorePasswordInClearText
    1. name - αžˆαŸ’αž˜αŸ„αŸ‡αž”αŸ’αžšαž—αž–αž€αŸ’αž“αž»αž„αžŸαŸ’αžšαž»αž€αž˜αž·αž“αžŸαŸ†αžαžΆαž“αŸ‹
    2. url - URL αž“αŸƒαž”αŸ’αžšαž—αž–αž–αžΈαžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž› "αž€αžΆαžšαžšαŸ€αž”αž…αŸ†αž‚αžŽαž“αžΈ" αž‘αŸ†αž–αŸαžš 6
    3. organization - αžˆαŸ’αž˜αŸ„αŸ‡αž’αž„αŸ’αž‚αž€αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„ Azure DevOps
    4. gitlab variable - αžˆαŸ’αž˜αŸ„αŸ‡αž“αŸƒαž’αžαŸαžšαžŠαŸ‚αž›αž˜αžΆαž“αžŸαž‰αŸ’αž‰αžΆαžŸαž˜αŸ’αž„αžΆαžαŸ‹αž…αžΌαž›αž”αŸ’αžšαžΎαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ… GitLab ("αž€αžΆαžšαžšαŸ€αž”αž…αŸ†αž‚αžŽαž“αžΈ" αž‘αŸ†αž–αŸαžš 11) αŸ” αžαžΆαž˜αž’αž˜αŸ’αž˜αž‡αžΆαžαž·αž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹ $variableName
    5. -StorePasswordInClearText - αž€αžΆαžšβ€‹αž›αž½αž…β€‹αž…αžΌαž›β€‹αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αžšαŸ†αž›αž„β€‹αž€αžΆαžšβ€‹αž…αžΌαž›β€‹αžŠαŸ†αžŽαžΎαžšβ€‹αž€αžΆαžšβ€‹αž”αžΆαž“β€‹αž”αžŠαž·αžŸαŸαž’β€‹αž€αŸ†αž αž»αžŸ (αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαž˜αž“αž»αžŸαŸ’αžŸαžŠαŸ†αž”αžΌαž„αžŠαŸ‚αž›αžˆαžΆαž“αž‡αžΎαž„αž›αžΎαžαž»αž„αžšαž½αž…αž“αŸαŸ‡αž‘αŸαŸ”)
    6. αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž˜αžΆαž“αž€αŸ†αž αž»αžŸ αžœαžΆαž’αžΆαž…αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜ -verbosity detailed
  3. αž€αžΆαžšαž•αŸ’αž‰αžΎαž€αž‰αŸ’αž…αž”αŸ‹αž‘αŸ…αž”αŸ’αžšαž—αž–αŸ– nuget push -source <name> -skipduplicate -apikey <key> *.nupkg
    1. αž™αžΎαž„αž•αŸ’αž‰αžΎαž€αž‰αŸ’αž…αž”αŸ‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž–αžΈαžαžαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“ αžŠαžΌαž…αŸ’αž“αŸαŸ‡ *.nupkg.
    2. name - αž–αžΈαž‡αŸ†αž αžΆαž“αžαžΆαž„αž›αžΎαŸ”
    3. key - αž”αž“αŸ’αž‘αžΆαžαŸ‹αžŽαžΆαž˜αž½αž™αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„ Azure DevOps αž“αŸ…αž€αŸ’αž“αž»αž„αž”αž„αŸ’αž’αž½αž… Connect to feed αž§αž‘αžΆαž αžšαžŽαŸαž‚αžΊαžαŸ‚αž„αžαŸ‚αž‡αžΆαž”αž“αŸ’αž‘αžΆαžαŸ‹ az.
    4. -skipduplicate - αž“αŸ…αž–αŸαž›αž–αŸ’αž™αžΆαž™αžΆαž˜αž•αŸ’αž‰αžΎαž€αž‰αŸ’αž…αž”αŸ‹αžŠαŸ‚αž›αž˜αžΆαž“αžŸαŸ’αžšαžΆαž”αŸ‹αžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αžŸαŸ„αž“αŸαŸ‡ αž”αŸ’αžšαž—αž–αž“αžΉαž„αžαŸ’αžšαž‘αž”αŸ‹αž€αŸ†αž αž»αžŸ 409 Conflict; αžŠαŸ„αž™αž”αŸ’αžšαžΎαžŸαŸ„ αž€αžΆαžšαž•αŸ’αž‰αžΎαž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαŸ†αž›αž„αŸ”

αž₯αž‘αžΌαžœβ€‹αž™αžΎαž„β€‹αžšαŸ€αž”αž…αŸ†β€‹αž€αžΆαžšβ€‹αž”αž„αŸ’αž€αžΎαžβ€‹αž―αž€αžŸαžΆαžšαŸ–

  1. αžŠαŸ†αž”αžΌαž„αž“αŸ…αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„ αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαžΆαžαžΆαž˜αŸ αž™αžΎαž„αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‚αž˜αŸ’αžšαŸ„αž„ docfx αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŠαžΌαž…αž“αŸαŸ‡αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž–αžΈ root docfx init αž“αž·αž„αž’αŸ’αžœαžΎαž’αž“αŸ’αžαžšαž€αž˜αŸ’αž˜αž€αŸ†αžŽαžαŸ‹αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαžŸαŸ†αžαžΆαž“αŸ‹αŸ—αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž€αžŸαžΆαž„αž―αž€αžŸαžΆαžšαŸ” αž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆαž›αž˜αŸ’αž’αž·αžαž“αŸƒαž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αž‚αž˜αŸ’αžšαŸ„αž„αž’αž”αŸ’αž”αž”αžšαž˜αžΆ αž“αŸ…αž‘αžΈαž“αŸαŸ‡.
    1. αž“αŸ…αž–αŸαž›αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ αžœαžΆαž˜αžΆαž“αžŸαžΆαžšαŸˆαžŸαŸ†αžαžΆαž“αŸ‹αžŽαžΆαžŸαŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αž‰αŸ’αž‡αžΆαž€αŸ‹αžαžαž›αž‘αŸ’αž’αž•αž› ..public - GitLab αžαžΆαž˜αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜αž™αž€αž˜αžΆαžαž·αž€αžΆαž“αŸƒαžαžαžŸαžΆαž’αžΆαžšαžŽαŸˆαž“αŸ…αž€αŸ’αž“αž»αž„αž«αžŸαž“αŸƒαžƒαŸ’αž›αžΆαŸ†αž„αž‡αžΆαž”αŸ’αžšαž—αž–αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‘αŸ†αž–αŸαžšαŸ” αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚ αž‚αž˜αŸ’αžšαŸ„αž„αž“αžΉαž„αž˜αžΆαž“αž‘αžΈαžαžΆαŸ†αž„αž“αŸ…αž€αŸ’αž“αž»αž„αžαžαžŠαŸ‚αž›αžŠαžΆαž€αŸ‹αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„ - αž”αž“αŸ’αžαŸ‚αž˜αž›αž‘αŸ’αž’αž•αž›αž‘αŸ…αž€αž˜αŸ’αžšαž·αžαž‘αžΎαž„αž›αžΎαž•αŸ’αž›αžΌαžœαŸ”
  2. αžαŸ„αŸ‡αž‡αŸ†αžšαž»αž‰αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‘αŸ… GitLab αŸ”
  3. αž”αž“αŸ’αžαŸ‚αž˜αž—αžΆαžšαž€αž·αž…αŸ’αž…αž‘αŸ…αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž”αŸ†αž–αž„αŸ‹ pages (αž–αžΆαž€αŸ’αž™αžŠαŸ‚αž›αž”αžΆαž“αž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž·αž…αŸ’αž…αž€αžΆαžšαž•αŸ’αžŸαž–αŸ’αžœαž•αŸ’αžŸαžΆαž™αž‚αŸαž αž‘αŸ†αž–αŸαžšαž“αŸ…αž€αŸ’αž“αž»αž„ GitLab Pages)αŸ–
    1. αžŸαŸ’αž‚αŸ’αžšαžΈαž”αŸ–
      1. nuget install docfx.console -version 2.51.0 - αžŠαŸ†αž‘αžΎαž„ docfx; αž€αŸ†αžŽαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž’αžΆαž“αžΆαžαžΆαž•αŸ’αž›αžΌαžœαžŠαŸ†αž‘αžΎαž„αž€αž‰αŸ’αž…αž”αŸ‹αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαŸ”
      2. .docfx.console.2.51.0toolsdocfx.exe .docfx_projectdocfx.json - αž”αŸ’αžšαž˜αžΌαž›αž―αž€αžŸαžΆαžš
    2. αžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαžαŸ’αž“αžΆαŸ†αž„αŸ–

pages:
  # snip
  artifacts:
    paths:
      - public

αž€αžΆαžšαž”αŸ†αž”αŸ’αž›αŸ‚αž„αžŸαžΆαžšαž’αžαŸ’αžαž”αž‘αž’αŸ†αž–αžΈ docfx

αž–αžΈαž˜αž»αž“αž“αŸ…αž–αŸαž›αžšαŸ€αž”αž…αŸ†αž‚αž˜αŸ’αžšαŸ„αž„ αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž”αŸ’αžšαž—αž–αž€αžΌαžŠαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž―αž€αžŸαžΆαžšαž‡αžΆαž―αž€αžŸαžΆαžšαžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αŸ” αž‚αž»αžŽαžœαž·αž”αžαŸ’αžαž·αž…αž˜αŸ’αž”αž„αž‚αžΊαžαžΆαž―αž€αžŸαžΆαžšαž€αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αž˜αŸ’αžšαŸ„αž„αžŸαžΆαž€αž›αŸ’αž”αž„αž•αž„αžŠαŸ‚αžšαŸ” αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžŠαŸ‚αž›αžœαžΆαž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹ αž’αŸ’αž“αž€αž’αžΆαž…αž€αŸ†αžŽαžαŸ‹αžαž˜αŸ’αž›αŸƒαž“αŸαŸ‡αž‘αŸ…αžαŸ’αž“αžΆαŸ†αž„ metadata.src:

{
  "metadata": [
    {
      "src": [
        {
          "src": "../",
          "files": [
            "**/*.csproj"
          ],
          "exclude":[
            "*.tests*/**"
          ]
        }
      ],
      // --- snip ---
    },
    // --- snip ---
  ],
  // --- snip ---
}

  1. metadata.src.src: "../" - αž™αžΎαž„αž‘αžΎαž„αž˜αž½αž™αž€αž˜αŸ’αžšαž·αžαž’αŸ€αž”αž“αžΉαž„αž‘αžΈαžαžΆαŸ†αž„ docfx.json, αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚ αž“αŸ…αž€αŸ’αž“αž»αž„αž›αŸ†αž“αžΆαŸ† αž€αžΆαžšαžŸαŸ’αžœαŸ‚αž„αžšαž€αž˜αŸ‚αž€αž’αžΆαž„αžαžαž˜αž·αž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αŸαŸ”
  2. metadata.src.files: ["**/*.csproj"] - αž‚αŸ†αžšαžΌαžŸαž€αž› αž™αžΎαž„αž”αŸ’αžšαž˜αžΌαž›αž‚αž˜αŸ’αžšαŸ„αž„ C # αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž–αžΈαžαžαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ”
  3. metadata.src.exclude: ["*.tests*/**"] - αž›αŸ†αž“αžΆαŸ†αžŸαž€αž› αž˜αž·αž“αžšαžΆαž”αŸ‹αž”αž‰αŸ’αž…αžΌαž›αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž–αžΈαžαžαž‡αžΆαž˜αž½αž™ .tests αž“αŸ…αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαž„αž‡αžΎαž„

αžŸαžšαž»αž”αžšαž„

αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŸαžΆαž˜αž‰αŸ’αž‰αž”αŸ‚αž”αž“αŸαŸ‡αž’αžΆαž…αž”αž„αŸ’αž€αžΎαžαž”αžΆαž“αž€αŸ’αž“αž»αž„αžšαž™αŸˆαž–αŸαž›αžαŸ’αžšαžΉαž˜αžαŸ‚αž€αž“αŸ’αž›αŸ‡αž˜αŸ‰αŸ„αž„ αž“αž·αž„αž€αžΆαž αŸ’αžœαŸαž–αžΈαžšαž”αžΈαž–αŸ‚αž„ αžŠαŸ‚αž›αž“αžΉαž„αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžαžΆαž€αžΌαžŠαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαž αž αžΎαž™αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž†αŸ’αž›αž„αž€αžΆαžαŸ‹ αž”αž„αŸ’αž€αžΎαžαž€αž‰αŸ’αž…αž”αŸ‹αžαŸ’αž˜αžΈ αž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αž―αž€αžŸαžΆαžš αž“αž·αž„αž’αŸ’αžœαžΎαž±αŸ’αž™αž—αŸ’αž“αŸ‚αž€αžŸαŸ’αžšαžŸαŸ‹αžŸαŸ’αž’αžΆαžαŸ” αž•αŸ’αž›αžΆαž€αžŸαž‰αŸ’αž‰αžΆαž“αŸ…αž€αŸ’αž“αž»αž„ README αž“αŸƒαž‚αž˜αŸ’αžšαŸ„αž„αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαžŸαŸ’αž“αžΎαžŸαž»αŸ†αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αžΈαž˜αž½αž™αŸ— αž αžΎαž™αž•αŸ’αž‰αžΎαž‘αŸ…αž˜αŸαŸ”

αž…αž»αž„αž€αŸ’αžšαŸ„αž™ .gitlab-ci.yml

image: mcr.microsoft.com/dotnet/core/sdk:3.1

before_script:
  - $PSVersionTable.PSVersion
  - dotnet --version
  - nuget help | select-string Version

stages:
  - build
  - test
  - deploy

build job:
  stage: build
  script:
    - dotnet build -c Release
  tags:
    - windows
  only:
    - merge_requests
    - master
  artifacts:
    paths:
      - your/path/to/binaries

test and cover job:
  stage: test
  tags:
    - windows
  script:
    - dotnet test -c Release /p:CollectCoverage=true
  coverage: /|s*Totals*|s*(d+[,.]d+%)/
  only:
    - merge_requests
    - master

pack and deploy job:
  stage: deploy
  tags:
    - windows
  script:
    - dotnet pack -c Release -o .
    - dotnet new nugetconfig
    - nuget sources add -name feedName -source https://pkgs.dev.azure.com/your-organization/_packaging/your-feed/nuget/v3/index.json -username your-organization -password $nugetFeedToken -configfile nuget.config -StorePasswordInClearText
    - nuget push -source feedName -skipduplicate -apikey az *.nupkg
  only:
    - master

pages:
  tags:
    - windows
  stage: deploy
  script:
    - nuget install docfx.console -version 2.51.0
    - $env:path = "$env:path;$($(get-location).Path)"
    - .docfx.console.2.51.0toolsdocfx.exe .docfxdocfx.json
  artifacts:
    paths:
      - public
  only:
    - master

αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαž•αŸ’αž›αžΆαž€αžŸαž‰αŸ’αž‰αžΆ

αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αž–αž½αž€αž‚αŸ, αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž‘αžΆαŸ†αž„αž’αžŸαŸ‹, αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜!

αž•αŸ’αž›αžΆαž€αžŸαž‰αŸ’αž‰αžΆαžŠαŸ‚αž›αž˜αžΆαž“αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž”αŸ†αž–αž„αŸ‹ αž“αž·αž„αž€αžΆαžšαž‚αŸ’αžšαž”αžŠαžŽαŸ’αžαž”αŸ‹αž€αžΌαžŠαž˜αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„ GitLab αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹ CI/CD αž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αž›αž»αž€ Gtntral pipelinesαŸ–

αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž’αŸ†αž–αžΈ CI/CD αž“αŸ…αž€αŸ’αž“αž»αž„ GitLab αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ†αž”αžΌαž„αžŠαžΆαž…αŸ‹αžαžΆαž (αžŸαŸ’αž‘αžΎαžšαžαŸ‚)

αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž•αŸ’αž›αžΆαž€αžŸαž‰αŸ’αž‰αžΆαž˜αž½αž™αžŠαŸ‚αž›αž˜αžΆαž“αžαŸ†αžŽαž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ…αž€αžΆαž“αŸ‹αž―αž€αžŸαžΆαžšαž“αŸ…αž›αžΎαžœαŸαž‘αž·αž€αžΆ shields.io - αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž‚αžΊαžŸαžΆαž˜αž‰αŸ’αž‰αžŽαžΆαžŸαŸ‹αž“αŸ…αž‘αžΈαž“αŸ„αŸ‡αž’αŸ’αž“αž€αž’αžΆαž…αž”αž„αŸ’αž€αžΎαžαž•αŸ’αž›αžΆαž€αžŸαž‰αŸ’αž‰αžΆαž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž αžΎαž™αž‘αž‘αž½αž›αžœαžΆαžŠαŸ„αž™αž”αŸ’αžšαžΎαžŸαŸ†αžŽαžΎαŸ”

![ΠŸΡ€ΠΈΠΌΠ΅Ρ€ с Shields.io](https://img.shields.io/badge/custom-badge-blue)

αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž’αŸ†αž–αžΈ CI/CD αž“αŸ…αž€αŸ’αž“αž»αž„ GitLab αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ†αž”αžΌαž„αžŠαžΆαž…αŸ‹αžαžΆαž (αžŸαŸ’αž‘αžΎαžšαžαŸ‚)

Azure DevOps Artifacts αž€αŸαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž”αž„αŸ’αž€αžΎαžαž•αŸ’αž›αžΆαž€αžŸαž‰αŸ’αž‰αžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž‰αŸ’αž…αž”αŸ‹αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αŸ†αžŽαŸ‚αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž”αŸ†αž•αž»αžαŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŠαžΌαž…αž“αŸαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αžšαž—αž–αž“αŸ…αž›αžΎαž‚αŸαž αž‘αŸ†αž–αŸαžš Azure DevOps αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž…αž»αž…αž›αžΎαž”αž„αŸ’αž€αžΎαžαž•αŸ’αž›αžΆαž€αžŸαž‰αŸ’αž‰αžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž‰αŸ’αž…αž”αŸ‹αžŠαŸ‚αž›αž”αžΆαž“αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž αžΎαž™αž…αž˜αŸ’αž›αž„αžŸαž‰αŸ’αž‰αžΆαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž…αž»αŸ‡αž€αŸ’αžšαŸ„αž˜αŸ–

αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž’αŸ†αž–αžΈ CI/CD αž“αŸ…αž€αŸ’αž“αž»αž„ GitLab αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ†αž”αžΌαž„αžŠαžΆαž…αŸ‹αžαžΆαž (αžŸαŸ’αž‘αžΎαžšαžαŸ‚)

αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž’αŸ†αž–αžΈ CI/CD αž“αŸ…αž€αŸ’αž“αž»αž„ GitLab αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ†αž”αžΌαž„αžŠαžΆαž…αŸ‹αžαžΆαž (αžŸαŸ’αž‘αžΎαžšαžαŸ‚)

αž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜αž—αžΆαž–αžŸαŸ’αžšαžŸαŸ‹αžŸαŸ’αž’αžΆαž

αž€αžΆαžšαž”αž“αŸ’αž›αž·αž…αž”αŸ†αžŽαŸ‚αž€αž“αŸƒαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž‘αžΌαž‘αŸ…

αž–αŸαž›αž€αŸ†αž–αž»αž„αžŸαžšαžŸαŸαžšαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ αž“αž·αž„αžŸαŸ’αžœαŸ‚αž„αžšαž€αž―αž€αžŸαžΆαžš αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž‡αž½αž”αž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸαž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž˜αž½αž™αžšαž”αžŸαŸ‹ YAML - αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž”αŸ†αžŽαŸ‚αž€αž‘αžΎαž„αžœαž·αž‰αŸ”

αžŠαžΌαž…αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αž˜αžΎαž›αžƒαžΎαž‰αž–αžΈαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž—αžΆαžšαž€αž·αž…αŸ’αž… αž–αž½αž€αž‚αŸαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‘αžΆαž˜αž‘αžΆαžšαžŸαŸ’αž›αžΆαž€ windows αž“αŸ…αž―αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαžαŸ‹ αž αžΎαž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸαŸ‡αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžŸαŸ†αžŽαžΎαž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‰αžΎαž‘αŸ…αž˜αŸ/αž”αž„αŸ’αž€αžΎαž (αž›αžΎαž€αž›αŸ‚αž„αžαŸ‚αž―αž€αžŸαžΆαžš)αŸ” αž…αžΌαžšαž”αž“αŸ’αžαŸ‚αž˜αžœαžΆαž‘αŸ…αž”αŸ†αžŽαŸ‚αž€αžŠαŸ‚αž›αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎαž‘αžΎαž„αžœαž·αž‰αŸ–

.common_tags: &common_tags
  tags:
    - windows
.common_only: &common_only
  only:
    - merge_requests
    - master

αž αžΎαž™αž₯αž‘αžΌαžœαž“αŸαŸ‡αž™αžΎαž„αž’αžΆαž…αž”αž‰αŸ’αž…αžΌαž›αž”αŸ†αžŽαŸ‚αž€αžŠαŸ‚αž›αž”αžΆαž“αž”αŸ’αžšαž€αžΆαžŸαž–αžΈαž˜αž»αž“αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆαž—αžΆαžšαž€αž·αž…αŸ’αž…αŸ–

build job:
  <<: *common_tags
  <<: *common_only

αžˆαŸ’αž˜αŸ„αŸ‡αž”αŸ†αžŽαŸ‚αž€αžαŸ’αžšαžΌαžœαžαŸ‚αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ„αž™αž…αŸ†αžŽαž»αž… αžŠαžΎαž˜αŸ’αž”αžΈαž€αž»αŸ†αž±αŸ’αž™αž”αž€αžŸαŸ’αžšαžΆαž™αžαžΆαž‡αžΆαž€αž·αž…αŸ’αž…αž€αžΆαžšαŸ”

αž€αŸ†αžŽαŸ‚αž€αž‰αŸ’αž…αž”αŸ‹

αž“αŸ…αž–αŸαž›αž”αž„αŸ’αž€αžΎαžαž€αž‰αŸ’αž…αž”αŸ‹αž˜αž½αž™ αž’αŸ’αž“αž€αž…αž„αž€αŸ’αžšαž„αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž€αžΆαžšαž”αŸ’αžαžΌαžšαž”αž“αŸ’αž‘αžΆαžαŸ‹αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ αž αžΎαž™αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžœαžαŸ’αžαž˜αžΆαž“αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸ αž―αž€αžŸαžΆαžšαž‚αž˜αŸ’αžšαŸ„αž„; αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžœαžΆαžšαž€αžƒαžΎαž‰αžαŸ’αž“αžΆαŸ†αž„αž€αŸ†αžŽαŸ‚ αžœαžΆαž™αž€αžαž˜αŸ’αž›αŸƒαžšαž”αžŸαŸ‹αžœαžΆαž‡αžΆαž€αŸ†αžŽαŸ‚αž“αŸƒαž€αž‰αŸ’αž…αž”αŸ‹αžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αŸ” αžœαžΆαž”αŸ’αžšαŸ‚αžαžΆαžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαž€αž‰αŸ’αž…αž”αŸ‹αž‡αžΆαž˜αž½αž™αž€αŸ†αžŽαŸ‚αžαŸ’αž˜αžΈαž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžšαž‚αž˜αŸ’αžšαŸ„αž„αž¬αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αžœαžΆαž‡αžΆαž’αžΆαž‚αž»αž™αž˜αŸ‰αž„αŸ‹αž”αž“αŸ’αž‘αžΆαžαŸ‹αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαŸ”

αž…αžΌαžšαž”αž“αŸ’αžαŸ‚αž˜αž”αž‰αŸ’αž‡αžΈαž”αŸ’αžšαžΆαžαŸ’αž“αžΆαž˜αž½αž™αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αž - αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž›αŸαžαžαžΌαž…αž–αžΈαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ†αžŽαŸ‚αž‡αžΆαž†αŸ’αž“αžΆαŸ† αž“αž·αž„αž€αžΆαž›αž”αžšαž·αž…αŸ’αž†αŸαž‘αž”αž„αŸ’αž€αžΎαžαž€αž‰αŸ’αž…αž”αŸ‹ αž αžΎαž™αž”αž“αŸ’αžαŸ‚αž˜αž€αŸ†αžŽαŸ‚αžŠαŸ‚αž›αž”αžΆαž“αž…αŸαž‰αž•αŸ’αžŸαžΆαž™αž‡αžΆαž˜αž»αž“αŸ” αž‡αžΆαž€αžΆαžšαž–αž·αžαžŽαžΆαžŸαŸ‹ αž’αŸ’αž“αž€αž’αžΆαž…αž”αž“αŸ’αžαŸ‚αž˜αž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αŸαŸ‡αž‘αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžšαž‚αž˜αŸ’αžšαŸ„αž„ αž αžΎαž™αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž˜αž»αž“αž–αŸαž›αžŠαžΆαž€αŸ‹αžŸαŸ’αž“αžΎαž“αžΈαž˜αž½αž™αŸ— αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž’αŸ’αž“αž€αž€αŸαž’αžΆαž…αž’αŸ’αžœαžΎαžœαžΆαž”αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžšαž”αŸ’αžšαŸαž„ αžŠαŸ„αž™αž”αŸ’αžšαž˜αžΌαž›αž€αŸ†αžŽαŸ‚αž€αž‰αŸ’αž…αž”αŸ‹αž–αžΈαž”αžšαž·αž”αž‘ αž αžΎαž™αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αžœαžΆαžαžΆαž˜αžšαž™αŸˆαž’αžΆαž‚αž»αž™αž˜αŸ‰αž„αŸ‹αž”αž“αŸ’αž‘αžΆαžαŸ‹αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαŸ”

αž…αžΌαžšαž™αžΎαž„αž™αž›αŸ‹αžŸαŸ’αžšαž”αžαžΆαž”αŸ’αžšαžŸαž·αž“αž”αžΎαžŸαžΆαžš commit αž˜αžΆαž“αž”αž“αŸ’αž‘αžΆαžαŸ‹αžŠαžΌαž… release (v./ver./version) <version number> (rev./revision <revision>)?αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž™αžΎαž„αž“αžΉαž„αž™αž€αž€αŸ†αžŽαŸ‚αž“αŸƒαž€αž‰αŸ’αž…αž”αŸ‹αž–αžΈαž”αž“αŸ’αž‘αžΆαžαŸ‹αž“αŸαŸ‡ αž”αž“αŸ’αžαŸ‚αž˜αžœαžΆαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαž›αž”αžšαž·αž…αŸ’αž†αŸαž‘αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“ αž αžΎαž™αž”αž‰αŸ’αž‡αžΌαž“αžœαžΆαž‡αžΆαž’αžΆαž‚αž»αž™αž˜αŸ‰αž„αŸ‹αž‘αŸ…αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ dotnet pack. αž’αžœαžαŸ’αžŠαž˜αžΆαž“αž“αŸƒαž”αž“αŸ’αž‘αžΆαžαŸ‹ αž™αžΎαž„αž“αžΉαž„αž˜αž·αž“αž”αŸ’αžšαž˜αžΌαž›αž€αž‰αŸ’αž…αž”αŸ‹αž‘αŸαŸ”

αžŸαŸ’αž‚αŸ’αžšαžΈαž”αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αž‰αŸ’αž αžΆαž“αŸαŸ‡αŸ–

# рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ для поиска строки с вСрсиСй
$rx = "releases+(v.?|ver.?|version)s*(?<maj>d+)(?<min>.d+)?(?<rel>.d+)?s*((rev.?|revision)?s+(?<rev>[a-zA-Z0-9-_]+))?"
# ΠΈΡ‰Π΅ΠΌ строку Π² сообщСнии ΠΊΠΎΠΌΠΌΠΈΡ‚Π°, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠΌ Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· прСдопрСдСляСмых GitLab'ΠΎΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…
$found = $env:CI_COMMIT_MESSAGE -match $rx
# совпадСний Π½Π΅Ρ‚ - Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΠΌ
if (!$found) { Write-Output "no release info found, aborting"; exit }
# ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ ΠΌΠ°ΠΆΠΎΡ€Π½ΡƒΡŽ ΠΈ ΠΌΠΈΠ½ΠΎΡ€Π½ΡƒΡŽ вСрсии
$maj = $matches['maj']
$min = $matches['min']
# Ссли строка содСрТит Π½ΠΎΠΌΠ΅Ρ€ Ρ€Π΅Π»ΠΈΠ·Π° - ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π΅Π³ΠΎ, ΠΈΠ½Π°Ρ‡Π΅ - Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Π³ΠΎΠ΄
if ($matches.ContainsKey('rel')) { $rel = $matches['rel'] } else { $rel = ".$(get-date -format "yyyy")" }
# Π² качСствС Π½ΠΎΠΌΠ΅Ρ€Π° сборки - Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ мСсяц ΠΈ дСнь
$bld = $(get-date -format "MMdd")
# Ссли Π΅ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ ΠΏΡ€Π΅Ρ€Π΅Π»ΠΈΠ·Π½ΠΎΠΉ вСрсии - Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ ΠΈΡ… Π² Π²Π΅Ρ€ΡΠΈΡŽ
if ($matches.ContainsKey('rev')) { $rev = "-$($matches['rev'])" } else { $rev = '' }
# собираСм Π΅Π΄ΠΈΠ½ΡƒΡŽ строку вСрсии
$version = "$maj$min$rel.$bld$rev"
# собираСм ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹
dotnet pack -c Release -o . /p:Version=$version

αž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜αžŸαŸ’αž‚αŸ’αžšαžΈαž”αž‘αŸ…αž€αž·αž…αŸ’αž…αž€αžΆαžš pack and deploy job αž“αž·αž„αžŸαž„αŸ’αž€αŸαžαž€αžΆαžšαž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆαž“αŸƒαž€αž‰αŸ’αž…αž”αŸ‹αž™αŸ‰αžΆαž„αžαžΉαž„αžšαŸ‰αžΉαž„αž“αŸ…αž€αŸ’αž“αž»αž„αžœαžαŸ’αžαž˜αžΆαž“αž“αŸƒαžαŸ’αžŸαŸ‚αž’αž€αŸ’αžŸαžšαžŠαŸ‚αž›αž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαžΆαžšαžŸαž“αŸ’αž™αžΆαŸ”

αžŸαžšαž»αž”

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž…αŸ†αžŽαžΆαž™αž–αŸαž›αž”αŸ’αžšαž αŸ‚αž›αž€αž“αŸ’αž›αŸ‡αž˜αŸ‰αŸ„αž„ αž¬αž˜αž½αž™αž˜αŸ‰αŸ„αž„αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŸαžšαžŸαŸαžšαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹ αž”αŸ†αž”αžΆαžαŸ‹αž€αŸ†αž αž»αžŸαž“αŸ…αž€αŸ’αž“αž»αž„ powershell αž€αŸ’αž“αž»αž„αžαŸ†αž”αž“αŸ‹ αž αžΎαž™αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž€αžΆαžšαž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž˜αž·αž“αž‡αŸ„αž‚αž‡αŸαž™αž–αžΈαžšαž”αžΈαžŠαž„ αž™αžΎαž„αž‘αž‘αž½αž›αž”αžΆαž“αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŸαžΆαž˜αž‰αŸ’αž‰αž˜αž½αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž€αž˜αŸ’αž˜αž€αž·αž…αŸ’αž…αž€αžΆαžšαž‘αž˜αŸ’αž›αžΆαž”αŸ‹αŸ”

αž‡αžΆαž€αžΆαžšαž–αž·αžαžŽαžΆαžŸαŸ‹ GitLab CI / CD αž˜αžΆαž“αž›αž€αŸ’αžαžŽαŸˆαž‘αžΌαž›αŸ†αž‘αžΌαž›αžΆαž™ αž“αž·αž„αž˜αžΆαž“αž›αž€αŸ’αžαžŽαŸˆαž…αž˜αŸ’αžšαž»αŸ‡αž‡αžΆαž„αžœαžΆαž αžΆαž€αŸ‹αžŠαžΌαž…αž‡αžΆαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž”αžΆαž“αž’αžΆαž“αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž“αŸαŸ‡ - αž“αŸ„αŸ‡αž˜αž·αž“αž–αž·αžαž‘αžΆαž›αŸ‹αžαŸ‚αžŸαŸ„αŸ‡. αž˜αžΆαž“αžŸαžΌαž˜αŸ’αž”αžΈαžαŸ‚ Auto DevOps αž‚αžΊαž’αž“αž»αž‰αŸ’αž‰αžΆαž

αžšαž€αžƒαžΎαž‰ αž”αž„αŸ’αž€αžΎαž αžŸαžΆαž€αž›αŸ’αž”αž„ αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ αž“αž·αž„αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·

αž₯αž‘αžΌαžœαž“αŸαŸ‡αž•αŸ‚αž“αž€αžΆαžšαž‚αžΊαžŠαžΎαž˜αŸ’αž”αžΈαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž”αŸ†αž–αž„αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‘αŸ… Azure αžŠαŸ„αž™αž”αŸ’αžšαžΎ Pulumi αž“αž·αž„αž€αŸ†αžŽαžαŸ‹αž”αžšαž·αž™αžΆαž€αžΆαžŸαž‚αŸ„αž›αžŠαŸ…αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž· αžŠαŸ‚αž›αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸ’αžšαž”αžŠαžŽαŸ’αžαž”αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž”αž“αŸ’αž‘αžΆαž”αŸ‹αŸ”

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹