αž€αžΆαžšαž•αŸ’αž‚αž»αŸ†αžαžΆαž˜αžœαž“αŸ’αž αž“αž·αž„αž€αžΆαžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžšαžΌαž”αž—αžΆαž– Docker αž‡αžΆαž˜αž½αž™ werf αžŠαŸ„αž™αž”αŸ’αžšαžΎαž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαž‚αŸαž αž‘αŸ†αž–αŸαžšαž―αž€αžŸαžΆαžšαžŠαŸ‚αž›αž˜αžΆαž“αž€αŸ†αžŽαŸ‚

αž™αžΎαž„αž”αžΆαž“αž“αž·αž™αžΆαž™αžšαž½αž…αž αžΎαž™αž’αŸ†αž–αžΈαž§αž”αž€αžšαžŽαŸ GitOps αžšαž”αžŸαŸ‹αž™αžΎαž„αž…αŸ’αžšαžΎαž“αž‡αžΆαž„αž˜αŸ’αžαž„αŸ” werfαž αžΎαž™αž›αžΎαž€αž“αŸαŸ‡ αž™αžΎαž„αž…αž„αŸ‹αž…αŸ‚αž€αžšαŸ†αž›αŸ‚αž€αž”αž‘αž–αž·αžŸαŸ„αž’αž“αŸαžšαž”αžŸαŸ‹αž™αžΎαž„αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αŸ’αžšαž˜αžΌαž›αž•αŸ’αžαž»αŸ†αž‚αŸαž αž‘αŸ†αž–αŸαžšαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž―αž€αžŸαžΆαžšαž“αŸƒαž‚αž˜αŸ’αžšαŸ„αž„αžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„ - werf.io (αž€αŸ†αžŽαŸ‚αž‡αžΆαž—αžΆαžŸαžΆαžšαž»αžŸαŸ’αžŸαžΈαž‚αžΊ en.werf.io) αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž‚αŸαž αž‘αŸ†αž–αŸαžšαž‹αž·αžαž·αžœαž“αŸ’αžαž’αž˜αŸ’αž˜αžαžΆ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž€αžΆαžšαž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆαžšαž”αžŸαŸ‹αžœαžΆαž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαžŠαŸ‚αž›αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžΆαž„αžŸαž„αŸ‹αžŠαŸ„αž™αž”αŸ’αžšαžΎαž…αŸ†αž“αž½αž“αžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαžαžΆαž˜αžœαž“αŸ’αžαŸ”

αž€αžΆαžšαž•αŸ’αž‚αž»αŸ†αžαžΆαž˜αžœαž“αŸ’αž αž“αž·αž„αž€αžΆαžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžšαžΌαž”αž—αžΆαž– Docker αž‡αžΆαž˜αž½αž™ werf αžŠαŸ„αž™αž”αŸ’αžšαžΎαž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαž‚αŸαž αž‘αŸ†αž–αŸαžšαž―αž€αžŸαžΆαžšαžŠαŸ‚αž›αž˜αžΆαž“αž€αŸ†αžŽαŸ‚

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

αžŸαŸαž…αž€αŸ’αžαžΈαž•αŸ’αžαžΎαž˜αŸ– αžšαž”αŸ€αž”αžŠαŸ‚αž›αž‚αŸαž αž‘αŸ†αž–αŸαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžš

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

  • αž˜αž»αžαž„αžΆαžš werf αžαŸ’αž˜αžΈαž˜αž·αž“αž‚αž½αžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αŸαž‰αž•αŸ’αžŸαžΆαž™αžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αž€αžΆαžšαž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αž―αž€αžŸαžΆαžšαž‘αŸ αž αžΎαž™αž•αŸ’αž‘αž»αž™αž‘αŸ…αžœαž·αž‰ αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžŽαžΆαž˜αž½αž™αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžšαž”αž„αŸ’αž αžΆαž‰αž–αžΈαž€αžΆαžšαž…αŸαž‰αž•αŸ’αžŸαžΆαž™αž€αŸ†αžŽαŸ‚αžαŸ’αž˜αžΈαž“αŸƒ werf αŸ”
  • αž‚αž˜αŸ’αžšαŸ„αž„αž“αŸαŸ‡αž˜αžΆαž“αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαžŠαŸ‚αž›αž–αžΉαž„αž•αŸ’αž’αŸ‚αž€αžαŸ’αž›αžΆαŸ†αž„αŸ– αž€αŸ†αžŽαŸ‚αžαŸ’αž˜αžΈαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αŸαž‰αž•αŸ’αžŸαžΆαž™αž‡αžΆαž…αŸ’αžšαžΎαž“αžŠαž„αž€αŸ’αž“αž»αž„αž˜αž½αž™αžαŸ’αž„αŸƒαŸ”
  • αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŠαŸ„αž™αžŠαŸƒαžŽαžΆαž˜αž½αž™αžŠαžΎαž˜αŸ’αž”αžΈαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž‚αŸαž αž‘αŸ†αž–αŸαžšαžŠαŸ‚αž›αž˜αžΆαž“αž€αŸ†αžŽαŸ‚αžαŸ’αž˜αžΈαž“αŸƒαž―αž€αžŸαžΆαžšαž‚αžΊαž™αŸ‰αžΆαž„αž αŸ„αž…αžŽαžΆαžŸαŸ‹αž’αž»αž‰αž‘αŸ’αžšαžΆαž“αŸ‹αŸ”
  • αž‚αž˜αŸ’αžšαŸ„αž„αž“αŸαŸ‡αž”αŸ’αžšαž€αžΆαž“αŸ‹αžαŸ’αž‡αžΆαž”αŸ‹αž“αžΌαžœαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αž semantic αž€αŸ†αžŽαŸ‚αž‘αž˜αŸ’αžšαž„αŸ‹αž‡αžΆαž˜αž½αž™αž“αžΉαž„ 5 αž”αŸ‰αž»αžŸαŸ’αžαž·αŸαžŸαŸ’αžαŸαžšαž—αžΆαž–αŸ” αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž…αŸαž‰αž•αŸ’αžŸαžΆαž™αž–αžΆαž€αŸ‹αž–αŸαž“αŸ’αž’αž“αžΉαž„αž€αžΆαžšαž’αž“αž»αž˜αŸαžαž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž“αŸƒαž€αŸ†αžŽαŸ‚αžαžΆαž˜αžšαž™αŸˆαž†αžΆαž“αŸ‚αž›αž€αŸ’αž“αž»αž„αž›αŸ†αžŠαžΆαž”αŸ‹αž”αž„αŸ’αž€αžΎαž“αžŸαŸ’αžαŸαžšαž—αžΆαž–: αž–αžΈαž’αžΆαž›αŸ‹αž αŸ’αžœαžΆαž‘αŸ…αžαŸ’αž˜-αžšαžΉαž„;
  • αž‚αŸαž αž‘αŸ†αž–αŸαžšαž“αŸαŸ‡αž˜αžΆαž“αž€αŸ†αžŽαŸ‚αž‡αžΆαž—αžΆαžŸαžΆαžšαž»αžŸαŸ’αžŸαžΈ αžŠαŸ‚αž› "αžšαžŸαŸ‹αž“αŸ… αž“αž·αž„αž’αž—αž·αžœαžŒαŸ’αž" (ឧ. αž˜αžΆαžαž·αž€αžΆαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αžΆαž”αŸ‹αžŠαŸαž) αžŸαŸ’αžšαž”αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αŸ†αžŽαŸ‚αž…αž˜αŸ’αž”αž„ (ឧ. αž—αžΆαžŸαžΆαž’αž„αŸ‹αž‚αŸ’αž›αŸαžŸ)αŸ”

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

αž“αŸ…αž€αŸ’αž“αž»αž„αž˜αŸ‰αžΊαž“αž»αž™αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž€αŸ†αžŽαŸ‚αž“αŸ…αž›αžΎαž‚αŸαž αž‘αŸ†αž–αŸαžš αž€αŸ†αžŽαŸ‚αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž”αŸ†αž•αž»αžαžšαž”αžŸαŸ‹ werf αž˜αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž†αžΆαž“αŸ‚αž›αž“αžΈαž˜αž½αž™αŸ—αŸ” αžαžΆαž˜αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜ αžαžΆαž˜αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ werf.io/documentation αž€αŸ†αžŽαŸ‚αž“αŸƒαž†αžΆαž“αŸ‚αž›αžŠαŸ‚αž›αž˜αžΆαž“αžŸαŸ’αžαŸαžšαž—αžΆαž–αž”αŸ†αž•αž»αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž…αŸαž‰αž•αŸ’αžŸαžΆαž™αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž”αŸ†αž•αž»αžαž”αžΆαž“αž”αžΎαž€ - αžœαžΆαž€αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαžΆαž€αŸ‹αž›αž·αž”αž·αž€αŸ’αžšαž˜αžŠαŸ„αž™αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αžŸαŸ’αžœαŸ‚αž„αžšαž€αž•αž„αžŠαŸ‚αžšαŸ” αž―αž€αžŸαžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž†αžΆαž“αŸ‚αž›αž˜αžΆαž“αž“αŸ…αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€ (αž§αž‘αžΆαž αžšαžŽαŸ werf.io/v1.0-beta/documentation αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αŸ†αžŽαŸ‚αž”αŸ‚αžαžΆ 1.0) αŸ”

αžŸαžšαž»αž”αž˜αž€ αž‚αŸαž αž‘αŸ†αž–αŸαžšαž“αŸαŸ‡αž˜αžΆαž“αž€αŸ†αžŽαŸ‚αžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

  1. root (αž”αžΎαž€αžαžΆαž˜αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜),
  2. αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž†αžΆαž“αŸ‚αž›αž’αžΆαž”αŸ‹αžŠαŸαžαžŸαž€αž˜αŸ’αž˜αž“αŸƒαž€αžΆαžšαž…αŸαž‰αž•αŸ’αžŸαžΆαž™αž“αžΈαž˜αž½αž™αŸ— (αž§αž‘αžΆαž αžšαžŽαŸ werf.io/v1.0-beta).

αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαž€αŸ†αžŽαŸ‚αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž“αŸƒαž‚αŸαž αž‘αŸ†αž–αŸαžšαž˜αž½αž™ αž‡αžΆαž‘αžΌαž‘αŸ…αžœαžΆαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαž…αž„αž€αŸ’αžšαž„αžœαžΆαžŠαŸ„αž™αž”αŸ’αžšαžΎ JekyllαžŠαŸ„αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αžαž /docs αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαž“αŸƒαžƒαŸ’αž›αžΆαŸ†αž„ werf (jekyll build) αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž”αŸ’αžαžΌαžšαž‘αŸ…αžŸαŸ’αž›αžΆαž€ Git αž“αŸƒαž€αŸ†αžŽαŸ‚αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž€αžΆαžšαŸ”

αžœαžΆαž“αŸ…αžŸαž›αŸ‹αžαŸ‚αž”αž“αŸ’αžαŸ‚αž˜αžαžΆ:

  • αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαŸ’αž›αž½αž“αžœαžΆ (werf) αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆ;
  • αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš CI/CD αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎ GitLab CI αŸ”
  • αž αžΎαž™αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸαŸ‡ αž–αž·αžαžŽαžΆαžŸαŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„ KubernetesαŸ”

αž—αžΆαžšαž€αž·αž…αŸ’αž…

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

  1. αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž€αŸ†αžŽαŸ‚ werf αž“αŸ…αž›αžΎαž†αžΆαž“αŸ‚αž›αž’αžΆαž”αŸ‹αžŠαŸαžαžŽαžΆαž˜αž½αž™αŸ” αž―αž€αžŸαžΆαžšαž“αŸ…αž›αžΎαž‚αŸαž αž‘αŸ†αž–αŸαžšαž‚αž½αžšαžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·.
  2. αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž˜αžΆαž“αž–αŸαž›αžαŸ’αž›αŸ‡ αž˜αžΎαž›αž€αŸ†αžŽαŸ‚αž˜αžΎαž›αž‡αžΆαž˜αž»αž“αž“αŸƒαž‚αŸαž αž‘αŸ†αž–αŸαžš.

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

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

αžœαžΆαž”αŸ’αžšαŸ‚αžαžΆ αž€αžΆαžšαž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆαž’αžΆαžŸαŸ’αžšαŸαž™αž›αžΎαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αžαžΆαž„αž€αŸ’αžšαŸ….

РСализация

αž€αžΆαžšαž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αž

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

αž™αžΎαž„αž”αžΆαž“αžŠαžΎαžšαžαžΆαž˜αž•αŸ’αž›αžΌαžœαžŠαžΌαž…αž‚αŸ’αž“αžΆαŸ” αž€αžΆαžšαž”αŸ’αžšαž˜αžΌαž›αž•αŸ’αžαž»αŸ†αž€αŸ†αžŽαŸ‚αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αžšαžΌαž”αž—αžΆαž–αž˜αž½αž™αŸ”. αž‹αž·αžαž·αžœαž“αŸ’αžαžŠαŸ‚αž›αž”αžΆαž“αž…αž„αž€αŸ’αžšαž„αž“αŸƒαž€αŸ†αžŽαŸ‚αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸƒαž‚αŸαž αž‘αŸ†αž–αŸαžšαž˜αžΆαž“αž‘αžΈαžαžΆαŸ†αž„αž“αŸ…αž€αŸ’αž“αž»αž„αž€αž»αž„αžαžΊαž“αŸαžšαžŠαŸ‚αž›αž˜αžΆαž“ NGINX αž αžΎαž™αž…αžšαžΆαž…αžšαžŽαŸαž‘αŸ…αž€αžΆαž“αŸ‹αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαž€αžΎαžαž‘αžΎαž„αžαžΆαž˜αžšαž™αŸˆ NGINX Ingress αŸ” αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŸαžΆαž˜αž‰αŸ’αž‰ - αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‚αŸ’αž˜αžΆαž“αžšαžŠαŸ’αž‹ - αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ (αž’αžΆαžŸαŸ’αžšαŸαž™αž›αžΎαž”αž“αŸ’αž‘αž»αž€) αžŠαŸ„αž™αž”αŸ’αžšαžΎ Kubernetes αžαŸ’αž›αž½αž“αžœαžΆαž•αŸ’αž‘αžΆαž›αŸ‹αŸ”

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

werf vs git αž€αŸ’αž›αžΌαž“ αž“αž·αž„αžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽ

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

αž“αŸ…αž‘αžΈαž“αŸαŸ‡αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ werf αžαŸ’αž›αž½αž“αžœαžΆαž˜αž€αžŠαž›αŸ‹αž‡αŸ†αž“αž½αž™αžšαž”αžŸαŸ‹αž™αžΎαž„ αžŠαŸ„αž™αž’αž“αž»αžœαžαŸ’αž αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž†αŸ’αž›αžΆαžαžœαŸƒ αž“αž·αž„αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž”αŸ’αžšαžΎ αžƒαŸ’αž›αžΆαŸ†αž„αžαžΆαž„αž€αŸ’αžšαŸ…. αž€αžΆαžšαž”αŸ’αžšαžΎ werf αžŠαžΎαž˜αŸ’αž”αžΈαž”αž“αŸ’αžαŸ‚αž˜αž€αžΌαžŠαž–αžΈαžƒαŸ’αž›αžΆαŸ†αž„αž“αžΉαž„αž”αž„αŸ’αž€αžΎαž“αž›αŸ’αž”αžΏαž“αž€αžΆαžšαž€αžŸαžΆαž„αž™αŸ‰αžΆαž„αžαŸ’αž›αžΆαŸ†αž„ αž–αžΈαž–αŸ’αžšαŸ„αŸ‡ werf αžŸαŸ†αžαžΆαž“αŸ‹αž€αŸ’αž›αžΌαž“αžƒαŸ’αž›αžΆαŸ†αž„αž˜αŸ’αžαž„ αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž· αžαŸ‚ fetch αž”αžΎαž…αžΆαŸ†αž”αžΆαž…αŸ‹αŸ” αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡ αž“αŸ…αž–αŸαž›αž”αž“αŸ’αžαŸ‚αž˜αž‘αž·αž“αŸ’αž“αž“αŸαž™αž–αžΈαžƒαŸ’αž›αžΆαŸ†αž„ αž™αžΎαž„αž’αžΆαž…αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž”αžΆαž“αžαŸ‚αžαžαž…αžΆαŸ†αž”αžΆαž…αŸ‹αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡ (αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžšαž”αžŸαŸ‹αž™αžΎαž„αž“αŸαŸ‡αž‚αžΊαž‡αžΆαžαžαž―αž€αžŸαžΆαžš docs) αžŠαŸ‚αž›αž“αžΉαž„αž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž”αžšαž·αž˜αžΆαžŽαž‘αž·αž“αŸ’αž“αž“αŸαž™αž”αž“αŸ’αžαŸ‚αž˜αŸ”

αžŠαŸ„αž™αžŸαžΆαžš Jekyll αž‚αžΊαž‡αžΆαž§αž”αž€αžšαžŽαŸαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž…αž“αžΆαž‘αžΎαž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž…αž„αž€αŸ’αžšαž„αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‹αž·αžαž·αžœαž“αŸ’αž αž αžΎαž™αž˜αž·αž“αžαŸ’αžšαžΌαžœαž€αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αžšαžΌαž”αž—αžΆαž–αž…αž»αž„αž€αŸ’αžšαŸ„αž™ αžœαžΆαž“αžΉαž„αžŸαž˜αž αŸαžαž»αž•αž›αž€αŸ’αž“αž»αž„αž€αžΆαžšαž…αž„αž€αŸ’αžšαž„αž“αŸ…αž€αŸ’αž“αž»αž„ αžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽ werfαž αžΎαž™αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αžšαžΌαž”αž—αžΆαž–αž…αž»αž„αž€αŸ’αžšαŸ„αž™ αž“αžΆαŸ†αž…αžΌαž›αžαŸ‚αž›αž‘αŸ’αž’αž•αž›αž…αž„αž€αŸ’αžšαž„αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ”.

αž™αžΎαž„αžŸαžšαžŸαŸαžš werf.yaml

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

werf αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž”αŸ’αžšαžΎ αž‘αŸ…αž‚αŸ†αžšαžΌ αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ (werf.yaml) αž αžΎαž™αž“αŸαŸ‡αž’αŸ’αžœαžΎαž±αŸ’αž™αžœαžΆαž’αžΆαž…αž‘αŸ…αžšαž½αž… αž”αž„αŸ’αž€αžΎαž config αž—αŸ’αž›αžΆαž˜αŸ— αž’αžΆαžŸαŸ’αžšαŸαž™αž›αžΎαž‘αž·αž“αŸ’αž“αž“αŸαž™αžαžΆαž„αž€αŸ’αžšαŸ… (αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž€αžΆαžš!) αž‘αž·αž“αŸ’αž“αž“αŸαž™αžαžΆαž„αž€αŸ’αžšαŸ…αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžšαž”αžŸαŸ‹αž™αžΎαž„αž‚αžΊαž‡αžΆαž–αŸαžαŸŒαž˜αžΆαž“αž’αŸ†αž–αžΈαž€αŸ†αžŽαŸ‚ αž“αž·αž„αž€αžΆαžšαž…αŸαž‰αž•αŸ’αžŸαžΆαž™ αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αžŠαŸ‚αž›αž™αžΎαž„αž”αŸ’αžšαž˜αžΌαž›αž…αŸ†αž“αž½αž“αžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž€αžΆαžš αž αžΎαž™αž‡αžΆαž›αž‘αŸ’αž’αž•αž›αž™αžΎαž„αž‘αž‘αž½αž›αž”αžΆαž“αžšαžΌαž”αž—αžΆαž–αž–αžΈαžšαŸ– werf-doc ΠΈ werf-dev αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž›αžΎαžŸαŸ€αž‚αŸ’αžœαžΈαž•αŸ’αžŸαŸαž„αŸ—αŸ”

αž‘αž·αž“αŸ’αž“αž“αŸαž™αžαžΆαž„αž€αŸ’αžšαŸ…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“αŸ” αž“αŸαŸ‡αž‚αžΊαž‡αžΆαžŸαž˜αžΆαžŸαž—αžΆαž–αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαŸ–

  • RELEASES - αž”αž“αŸ’αž‘αžΆαžαŸ‹αžŠαŸ‚αž›αž˜αžΆαž“αž”αž‰αŸ’αž‡αžΈαž“αŸƒαž€αžΆαžšαž…αŸαž‰αž•αŸ’αžŸαžΆαž™ αž“αž·αž„αž€αŸ†αžŽαŸ‚αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαž“αŸƒ werf αž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹αž“αŸƒαž”αž‰αŸ’αž‡αžΈαžαž˜αŸ’αž›αŸƒαžŠαŸ‚αž›αž”αŸ†αž”αŸ‚αž€αžŠαŸ„αž™αž…αž“αŸ’αž›αŸ„αŸ‡αž“αŸƒαžαž˜αŸ’αž›αŸƒαž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹ <ΠΠžΠœΠ•Π _Π Π•Π›Π˜Π—Π>%<ΠΠžΠœΠ•Π _Π’Π•Π Π‘Π˜Π˜>αŸ” αž§αž‘αžΆαž αžšαžŽαŸαŸˆ 1.0%v1.0.4-beta.20
  • CHANNELS - αž”αž“αŸ’αž‘αžΆαžαŸ‹αžŠαŸ‚αž›αž˜αžΆαž“αž”αž‰αŸ’αž‡αžΈαž†αžΆαž“αŸ‚αž›αž“αž·αž„αž€αŸ†αžŽαŸ‚αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαž“αŸƒ werf αž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹αž“αŸƒαž”αž‰αŸ’αž‡αžΈαžαž˜αŸ’αž›αŸƒαžŠαŸ‚αž›αž”αŸ†αž”αŸ‚αž€αžŠαŸ„αž™αžŠαž€αžƒαŸ’αž›αžΆαž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹ <ΠšΠΠΠΠ›>%<ΠΠžΠœΠ•Π _Π’Π•Π Π‘Π˜Π˜>αŸ” αž§αž‘αžΆαž αžšαžŽαŸαŸˆ 1.0-beta%v1.0.4-beta.20 1.0-alpha%v1.0.5-alpha.22
  • ROOT_VERSION β€” αž€αŸ†αžŽαŸ‚αž…αŸαž‰αž•αŸ’αžŸαžΆαž™αžšαž”αžŸαŸ‹ werf αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αžαžΆαž˜αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜αž“αŸ…αž›αžΎαž‚αŸαž αž‘αŸ†αž–αŸαžš (αžœαžΆαž˜αž·αž“αžαŸ‚αž„αžαŸ‚αž…αžΆαŸ†αž”αžΆαž…αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž αžΆαž‰αž―αž€αžŸαžΆαžšαžŠαŸ„αž™αž›αŸαžαž…αŸαž‰αž•αŸ’αžŸαžΆαž™αžαŸ’αž–αžŸαŸ‹αž”αŸ†αž•αž»αžαž‘αŸ) αŸ” αž§αž‘αžΆαž αžšαžŽαŸαŸ– v1.0.4-beta.20
  • REVIEW_SHA - hash αž“αŸƒβ€‹αž€αžΆαžšβ€‹αž–αž·αž“αž·αžαŸ’αž™β€‹αž‘αžΎαž„β€‹αžœαž·αž‰β€‹αžŠαŸ‚αž›β€‹αž’αŸ’αž“αž€β€‹αžαŸ’αžšαžΌαžœβ€‹αž€αžΆαžšβ€‹αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž”αž„αŸ’αž€αžΎαžβ€‹αž€αŸ†αžŽαŸ‚β€‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹β€‹αžšαž„αŸ’αžœαž·αž›αž‡αž»αŸ†β€‹αžŸαžΆαž€αž›αŸ’αž”αž„αŸ”

αž’αžαŸαžšαž‘αžΆαŸ†αž„αž“αŸαŸ‡αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ†αž–αŸαž‰αž“αŸ…αž€αŸ’αž“αž»αž„ GitLab CI pipeline αž“αž·αž„αžšαž”αŸ€αž”αž–αž·αžαž”αŸ’αžšαžΆαž€αžŠαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ”

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

{{ $_ := set . "WerfVersions" (cat (env "CHANNELS") (env "RELEASES") | splitList " ") }}
{{ $Root := . }}
{{ $_ := set . "WerfRootVersion" (env "ROOT_VERSION") }}
{{ $_ := set . "WerfReviewCommit" (env "REVIEW_SHA") }}

αž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž…αž„αž€αŸ’αžšαž„αž€αŸ†αžŽαŸ‚αž‹αž·αžαž·αžœαž“αŸ’αžαž“αŸƒαž‚αŸαž αž‘αŸ†αž–αŸαžš αž‡αžΆαž‘αžΌαž‘αŸ…αž‚αžΊαžŠαžΌαž…αž‚αŸ’αž“αžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αŸ’αžšαž”αŸ‹αž€αžšαžŽαžΈαžŠαŸ‚αž›αž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžš (αžšαž½αž˜αž‘αžΆαŸ†αž„αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž€αŸ†αžŽαŸ‚αž‡αžΆ root αž€αŸαžŠαžΌαž…αž‡αžΆαž€αŸ†αžŽαŸ‚αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαŸ€αž‚αŸ’αžœαžΈαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ)αŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž™αžΎαž„αž“αžΉαž„αž•αŸ’αž›αžΆαžŸαŸ‹αž‘αžΈαžœαžΆαž‘αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αž›αž»αž€αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€αžŠαŸ„αž™αž”αŸ’αžšαžΎαž˜αž»αžαž„αžΆαžš define - αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž‘αžΎαž„αžœαž·αž‰αž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹ include. αž™αžΎαž„αž“αžΉαž„αž”αž‰αŸ’αž‡αžΌαž“αž’αžΆαž‚αž»αž™αž˜αŸ‰αž„αŸ‹αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž‘αŸ…αž€αžΆαž“αŸ‹αž‚αŸ†αžšαžΌαŸ–

  • Version - αž€αŸ†αžŽαŸ‚αžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž€αžΎαž (αžˆαŸ’αž˜αŸ„αŸ‡αžŸαŸ’αž›αžΆαž€);
  • Channel - αžˆαŸ’αž˜αŸ„αŸ‡αž“αŸƒαž†αžΆαž“αŸ‚αž›αž’αžΆαž”αŸ‹αžŠαŸαžαžŠαŸ‚αž›αžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαŸ”
  • Commit - αž”αŸ’αžšαž–αŸ’αžšαžΉαžαŸ’αž hash αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž–αž·αž“αž·αžαŸ’αž™αž‘αžΎαž„αžœαž·αž‰αŸ”
  • αž”αžšαž·αž”αž‘αŸ”

αž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαž‚αŸ†αžšαžΌαžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽ

{{- define "doc_artifact" -}}
{{- $Root := index . "Root" -}}
artifact: doc-{{ .Channel }}
from: jekyll/builder:3
mount:
- from: build_dir
  to: /usr/local/bundle
ansible:
  install:
  - shell: |
      export PATH=/usr/jekyll/bin/:$PATH
  - name: "Install Dependencies"
    shell: bundle install
    args:
      executable: /bin/bash
      chdir: /app/docs
  beforeSetup:
{{- if .Commit }}
  - shell: echo "Review SHA - {{ .Commit }}."
{{- end }}
{{- if eq .Channel "root" }}
  - name: "releases.yml HASH: {{ $Root.Files.Get "releases.yml" | sha256sum }}"
    copy:
      content: |
{{ $Root.Files.Get "releases.yml" | indent 8 }}
      dest:  /app/docs/_data/releases.yml
{{- else }}
  - file:
      path: /app/docs/_data/releases.yml
      state: touch
{{- end }}
  - file:
      path: "{{`{{ item }}`}}"
      state: directory
      mode: 0777
    with_items:
    - /app/main_site/
    - /app/ru_site/
  - file:
      dest: /app/docs/pages_ru/cli
      state: link
      src: /app/docs/pages/cli
  - shell: |
      echo -e "werfVersion: {{ .Version }}nwerfChannel: {{ .Channel }}" > /tmp/_config_additional.yml
      export PATH=/usr/jekyll/bin/:$PATH
{{- if and (ne .Version "review") (ne .Channel "root") }}
{{- $_ := set . "BaseURL" ( printf "v%s" .Channel ) }}
{{- else if ne .Channel "root" }}
{{- $_ := set . "BaseURL" .Channel }}
{{- end }}
      jekyll build -s /app/docs  -d /app/_main_site/{{ if .BaseURL }} --baseurl /{{ .BaseURL }}{{ end }} --config /app/docs/_config.yml,/tmp/_config_additional.yml
      jekyll build -s /app/docs  -d /app/_ru_site/{{ if .BaseURL }} --baseurl /{{ .BaseURL }}{{ end }} --config /app/docs/_config.yml,/app/docs/_config_ru.yml,/tmp/_config_additional.yml
    args:
      executable: /bin/bash
      chdir: /app/docs
git:
- url: https://github.com/flant/werf.git
  to: /app/
  owner: jekyll
  group: jekyll
{{- if .Commit }}
  commit: {{ .Commit }}
{{- else }}
  tag: {{ .Version }}
{{- end }}
  stageDependencies:
    install: ['docs/Gemfile','docs/Gemfile.lock']
    beforeSetup: '**/*'
  includePaths: 'docs'
  excludePaths: '**/*.sh'
{{- end }}

αžˆαŸ’αž˜αŸ„αŸ‡αžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαžαŸ’αžšαžΌαžœαžαŸ‚αž˜αžΆαž“αžαŸ‚αž˜αž½αž™αž‚αžαŸ‹αŸ” αž™αžΎαž„αž’αžΆαž…αžŸαž˜αŸ’αžšαŸαž…αž”αžΆαž“αžœαžΆ αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ αžŠαŸ„αž™αž”αž“αŸ’αžαŸ‚αž˜αžˆαŸ’αž˜αŸ„αŸ‡αž†αžΆαž“αŸ‚αž› (αžαž˜αŸ’αž›αŸƒαž“αŸƒαž’αžαŸαžš .Channel) αž‡αžΆαž”αž…αŸ’αž…αŸαž™αž“αŸƒαžˆαŸ’αž˜αŸ„αŸ‡αžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαŸ– artifact: doc-{{ .Channel }}. αž”αŸ‰αž»αž“αŸ’αžαŸ‚β€‹αž’αŸ’αž“αž€β€‹αžαŸ’αžšαžΌαžœβ€‹αž™αž›αŸ‹β€‹αžαžΆ αž–αŸαž›β€‹αž“αžΆαŸ†β€‹αž…αžΌαž›β€‹αžœαžαŸ’αžαž»β€‹αž”αž»αžšαžΆαžŽ αž’αŸ’αž“αž€β€‹αž“αžΉαž„β€‹αžαŸ’αžšαžΌαžœβ€‹αž™αŸ„αž„β€‹αž‘αŸ…β€‹αž›αžΎβ€‹αžˆαŸ’αž˜αŸ„αŸ‡β€‹αžŠαžΌαž…β€‹αž‚αŸ’αž“αžΆαŸ”

αž“αŸ…αž–αŸαž›αž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽ αž˜αž»αžαž„αžΆαžš werf αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαŸ– αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„. αž€αžΆαžšαž˜αŸ‰αŸ„αž“αž”αž„αŸ’αž αžΆαž‰αž”αž‰αŸ’αž‡αžΈαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ build_dir αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹ Jekyll αžšαžœαžΆαž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αŸ†αž–αž„αŸ‹ αž”αž„αŸ’αž€αžΎαž“αž›αŸ’αž”αžΏαž“αž™αŸ‰αžΆαž„αžŸαŸ†αžαžΆαž“αŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αŸ’αžšαž˜αžΌαž›αž•αŸ’αžαž»αŸ†αž‘αžΎαž„αžœαž·αž‰.

αž’αŸ’αž“αž€β€‹αž€αŸβ€‹αž”αŸ’αžšαž αŸ‚αž›β€‹αž‡αžΆβ€‹αž”αžΆαž“β€‹αž€αžαŸ‹β€‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹β€‹αž€αžΆαžšβ€‹αž”αŸ’αžšαžΎβ€‹αž―αž€αžŸαžΆαžšβ€‹αžŠαŸ‚αžšαŸ” releases.yml αž‚αžΊαž‡αžΆαž―αž€αžŸαžΆαžš YAML αžŠαŸ‚αž›αž˜αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž…αŸαž‰αž•αŸ’αžŸαžΆαž™αžŠαŸ‚αž›αž”αžΆαž“αžŸαŸ’αž“αžΎαžŸαž»αŸ†αž–αžΈ github.com (αžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαžŠαŸ‚αž›αž‘αž‘αž½αž›αž”αžΆαž“αž“αŸ…αž–αŸαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžšαž”αŸ’αžšαŸαž„) αŸ” αžœαžΆαž…αžΆαŸ†αž”αžΆαž…αŸ‹αž“αŸ…αž–αŸαž›αž…αž„αž€αŸ’αžšαž„αž‚αŸαž αž‘αŸ†αž–αŸαžš αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸ…αž€αŸ’αž“αž»αž„αž”αžšαž·αž”αž‘αž“αŸƒαž’αžαŸ’αžαž”αž‘αžœαžΆαž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž…αŸ†αž–αŸ„αŸ‡αž™αžΎαž„αž–αŸ’αžšαŸ„αŸ‡αžœαžΆαž’αžΆαžŸαŸ’αžšαŸαž™αž›αžΎαžŸαŸ’αžαžΆαž“αž—αžΆαž–αžšαž”αžŸαŸ‹αžœαžΆ αž”αŸ’αžšαž˜αžΌαž›αž•αŸ’αžαž»αŸ†αžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαžαŸ‚αž˜αž½αž™αž‚αžαŸ‹ - αžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαž“αŸƒαž€αŸ†αžŽαŸ‚αž«αžŸαž“αŸƒαž‚αŸαž αž‘αŸ†αž–αŸαžš (αžœαžΆαž˜αž·αž“αžαŸ’αžšαžΌαžœαž€αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž‘αŸ) αŸ”

αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαžŠαŸ„αž™αž”αŸ’αžšαžΎαžŸαŸαž…αž€αŸ’αžαžΈαžαŸ’αž›αŸ‚αž„αž€αžΆαžšαžŽαŸαžαžΆαž˜αž›αž€αŸ’αžαžαžŽαŸ’αžŒ if αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αž‚αŸ†αžšαžΌ αž“αž·αž„αž€αžΆαžšαžšαž…αž“αžΆ {{ $Root.Files.Get "releases.yml" | sha256sum }} αž“αŸ…αž€αŸ’αž“αž»αž„αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž› αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›. αžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜: αž“αŸ…αž–αŸαž›αž”αž„αŸ’αž€αžΎαžαžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αŸ†αžŽαŸ‚αž‡αžΆ root (ធថេរ .Channel αžŸαŸ’αž˜αžΎ root) αž―αž€αžŸαžΆαžš hash releases.yml αž”αŸ‰αŸ‡αž–αžΆαž›αŸ‹αžŠαž›αŸ‹αž αžαŸ’αžαž›αŸαžαžΆαž“αŸƒαžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αž‘αžΆαŸ†αž„αž˜αžΌαž› αž–αŸ’αžšαŸ„αŸ‡αžœαžΆαž‡αžΆαž•αŸ’αž“αŸ‚αž€αž˜αž½αž™αž“αŸƒαžˆαŸ’αž˜αŸ„αŸ‡αž“αŸƒαž€αž·αž…αŸ’αž…αž€αžΆαžš Ansible (αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžš name) αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž“αŸ…αž–αŸαž›αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš αž˜αžΆαžαž·αž€αžΆ αž―αž€αžŸαžΆαžš releases.yml αžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαŸ€αž”αž…αŸ†αž‘αžΎαž„αžœαž·αž‰αŸ”

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

αžŠαžΎαž˜αŸ’αž”αžΈαž”αŸ’αžšαžΎαž‚αŸ†αžšαžΌαžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαž“αŸƒαž€αŸ†αžŽαŸ‚αžŠαŸ‚αž›αž”αžΆαž“αž•αŸ’αž‘αŸαžšαž“αŸƒαž†αžΆαž“αŸ‚αž› αž“αž·αž„αž€αžΆαžšαž…αŸαž‰αž•αŸ’αžŸαžΆαž™ αž™αžΎαž„αžšαŸ€αž”αž…αŸ†αžšαž„αŸ’αžœαž·αž›αž‡αž»αŸ†αž“αŸ…αž›αžΎαž’αžαŸαžš .WerfVersions Π² werf.yaml:

{{ range .WerfVersions -}}
{{ $VersionsDict := splitn "%" 2 . -}}
{{ dict "Version" $VersionsDict._1 "Channel" $VersionsDict._0 "Root" $Root | include "doc_artifact" }}
---
{{ end -}}

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

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

{{ dict "Version" .WerfRootVersion "Channel" "root" "Root" $Root  | include "doc_artifact" }}
---
{{- if .WerfReviewCommit }}
{{ dict "Version" "review" "Channel" "review" "Commit" .WerfReviewCommit "Root" $Root  | include "doc_artifact" }}
{{- end }}

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

αžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαž”αžΆαž“αžαŸ’αžšαŸ€αž˜αžšαž½αž…αžšαžΆαž›αŸ‹αž αžΎαž™ - αžŠαž›αŸ‹αž–αŸαž›αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž“αžΆαŸ†αž…αžΌαž›αž αžΎαž™!

αžšαžΌαž”αž—αžΆαž–αž…αž»αž„αž€αŸ’αžšαŸ„αž™αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž…αž“αžΆαž‘αžΎαž„αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž›αžΎ Kubernetes αž‚αžΊαž‡αžΆ NGINX αž’αž˜αŸ’αž˜αžαžΆαžŠαŸ‚αž›αž˜αžΆαž“αž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜ nginx.conf αž“αž·αž„αž‹αž·αžαž·αžœαž“αŸ’αžαž–αžΈαžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαŸ” αž”αž“αŸ’αžαŸ‚αž˜αž–αžΈαž›αžΎαžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαž“αŸƒαž€αŸ†αžŽαŸ‚ root αž“αŸƒαž‚αŸαž αž‘αŸ†αž–αŸαžšαž™αžΎαž„αžαŸ’αžšαžΌαžœαž’αŸ’αžœαžΎαžšαž„αŸ’αžœαž·αž›αž‡αž»αŸ†αž˜αŸ’αžαž„αž‘αŸ€αžαž“αŸ…αž›αžΎαž’αžαŸαžš .WerfVersions αžŠαžΎαž˜αŸ’αž”αžΈαž“αžΆαŸ†αž…αžΌαž›αžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαž“αŸƒαž†αžΆαž“αŸ‚αž› αž“αž·αž„αž€αŸ†αžŽαŸ‚αž…αŸαž‰αž•αŸ’αžŸαžΆαž™ + αž’αž“αž»αžœαžαŸ’αžαžαžΆαž˜αž…αŸ’αž”αžΆαž”αŸ‹αžŠαžΆαž€αŸ‹αžˆαŸ’αž˜αŸ„αŸ‡αžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαžŠαŸ‚αž›αž™αžΎαž„αž”αžΆαž“αž’αž“αž»αž˜αŸαžαž˜αž»αž“αŸ” αžŠαŸ„αž™αžŸαžΆαžšαžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαž“αžΈαž˜αž½αž™αŸ—αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αŸ†αžŽαŸ‚αž“αŸƒαž‚αŸαž αž‘αŸ†αž–αŸαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž–αžΈαžšαž—αžΆαžŸαžΆ αž™αžΎαž„αž“αžΆαŸ†αž…αžΌαž›αž–αž½αž€αžœαžΆαž‘αŸ…αž€αŸ’αž“αž»αž„αž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αž•αŸ’αžαž›αŸ‹αžŠαŸ„αž™αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αŸ”

αž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆαž“αŸƒαžšαžΌαž”αž—αžΆαž–αž…αž»αž„αž€αŸ’αžšαŸ„αž™ werf-doc

image: werf-doc
from: nginx:stable-alpine
ansible:
  setup:
  - name: "Setup /etc/nginx/nginx.conf"
    copy:
      content: |
{{ .Files.Get ".werf/nginx.conf" | indent 8 }}
      dest: /etc/nginx/nginx.conf
  - file:
      path: "{{`{{ item }}`}}"
      state: directory
      mode: 0777
    with_items:
    - /app/main_site/assets
    - /app/ru_site/assets
import:
- artifact: doc-root
  add: /app/_main_site
  to: /app/main_site
  before: setup
- artifact: doc-root
  add: /app/_ru_site
  to: /app/ru_site
  before: setup
{{ range .WerfVersions -}}
{{ $VersionsDict := splitn "%" 2 . -}}
{{ $Channel := $VersionsDict._0 -}}
{{ $Version := $VersionsDict._1 -}}
- artifact: doc-{{ $Channel }}
  add: /app/_main_site
  to: /app/main_site/v{{ $Channel }}
  before: setup
{{ end -}}
{{ range .WerfVersions -}}
{{ $VersionsDict := splitn "%" 2 . -}}
{{ $Channel := $VersionsDict._0 -}}
{{ $Version := $VersionsDict._1 -}}
- artifact: doc-{{ $Channel }}
  add: /app/_ru_site
  to: /app/ru_site/v{{ $Channel }}
  before: setup
{{ end -}}

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

image: werf-dev
...
import:
- artifact: doc-root
  add: /app/_main_site
  to: /app/main_site
  before: setup
- artifact: doc-root
  add: /app/_ru_site
  to: /app/ru_site
  before: setup
{{- if .WerfReviewCommit  }}
- artifact: doc-review
  add: /app/_main_site
  to: /app/main_site/review
  before: setup
- artifact: doc-review
  add: /app/_ru_site
  to: /app/ru_site/review
  before: setup
{{- end }}

αžŠαžΌαž…αžŠαŸ‚αž›αž”αžΆαž“αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžαžΆαž„αž›αžΎ αžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž–αž·αž“αž·αžαŸ’αž™αž‘αžΎαž„αžœαž·αž‰αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαžαŸ‚αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“αžŠαŸ‚αž›αž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš REVIEW_SHA. αžœαžΆαž’αžΆαž…αž‘αŸ…αžšαž½αž…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž˜αž·αž“αž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž– werf-dev αž‘αžΆαž›αŸ‹αžαŸ‚αžŸαŸ„αŸ‡ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž˜αž·αž“αž˜αžΆαž“αž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“ REVIEW_SHAαž”αŸ‰αž»αž“αŸ’αžαŸ‚αžŠαžΎαž˜αŸ’αž”αžΈ αž€αžΆαžšαžŸαž˜αŸ’αž’αžΆαžαžαžΆαž˜αž‚αŸ„αž›αž€αžΆαžšαžŽαŸ αžšαžΌαž”αž—αžΆαž– Docker αž€αŸ’αž“αž»αž„ werf αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžšαžΌαž”αž—αžΆαž– werf-dev αž™αžΎαž„αž“αžΉαž„αž‘αž»αž€αžœαžΆαž±αŸ’αž™αžŸαžΆαž„αžŸαž„αŸ‹αžαŸ‚αž‡αžΆαž˜αž½αž™αžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαž€αŸ†αžŽαŸ‚αž‡αžΆ root (αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžΆαž„αžŸαž„αŸ‹αžšαž½αž…αž αžΎαž™αž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™) αžŠαžΎαž˜αŸ’αž”αžΈαžŸαž˜αŸ’αžšαž½αž›αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž”αŸ†αž–αž„αŸ‹αŸ”

αžŸαž“αŸ’αž“αž·αž”αžΆαžαž”αžΆαž“αžαŸ’αžšαŸ€αž˜αžšαž½αž…αžšαžΆαž›αŸ‹! αž…αžΌαžšαž”αž“αŸ’αžαž‘αŸ… CI/CD αž“αž·αž„αž€αžΆαžš nuances αžŸαŸ†αžαžΆαž“αŸ‹αŸ—αŸ”

αž”αŸ†αž–αž„αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„ GitLab CI αž“αž·αž„αž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸαž“αŸƒαž€αžΆαžšαžŸαŸ’αžαžΆαž”αž“αžΆαžαžΆαž˜αžœαž“αŸ’αž

αž“αŸ…αž–αŸαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš build αž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αŸ†αžŽαžαŸ‹αž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“αžŠαŸ‚αž›αž”αŸ’αžšαžΎαž€αŸ’αž“αž»αž„ werf.yaml. αž“αŸαŸ‡αž˜αž·αž“αž’αž“αž»αžœαžαŸ’αžαž…αŸ†αž–αŸ„αŸ‡αž’αžαŸαžš REVIEW_SHA αžŠαŸ‚αž›αž™αžΎαž„αž“αžΉαž„αž€αŸ†αžŽαžαŸ‹αž“αŸ…αž–αŸαž›αž αŸ…αž”αŸ†αž–αž„αŸ‹αž–αžΈαž‘αŸ†αž–αž€αŸ‹ GitHub αŸ”

αž™αžΎαž„αž“αžΉαž„αž”αž„αŸ’αž€αžΎαžαž‘αž·αž“αŸ’αž“αž“αŸαž™αžαžΆαž„αž€αŸ’αžšαŸ…αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αž‚αŸ’αžšαžΈαž” Bash generate_artifactsαžŠαŸ‚αž›αž“αžΉαž„αž”αž„αŸ’αž€αžΎαžαžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαž”αŸ†αž–αž„αŸ‹ GitLab αž–αžΈαžšαŸ–

  • αž αŸ’αžœαžΆαž› releases.yml αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž‘αž·αž“αŸ’αž“αž“αŸαž™αž…αŸαž‰αž•αŸ’αžŸαžΆαž™,
  • αž αŸ’αžœαžΆαž› common_envs.shαžŠαŸ‚αž›αž˜αžΆαž“αž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž“αžΆαŸ†αž…αŸαž‰αŸ”

αž˜αžΆαžαž·αž€αžΆαž―αž€αžŸαžΆαžš generate_artifacts αž’αŸ’αž“αž€αž“αžΉαž„αžšαž€αžƒαžΎαž‰αž“αŸ…αž€αŸ’αž“αž»αž„αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ” αžƒαŸ’αž›αžΆαŸ†αž„αž‡αžΆαž˜αž½αž™αž§αž‘αžΆαž αžšαžŽαŸ. αž€αžΆαžšαž‘αž‘αž½αž›αž‘αž·αž“αŸ’αž“αž“αŸαž™αžαŸ’αž›αž½αž“αžœαžΆαž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαž€αž˜αŸ’αž˜αžœαžαŸ’αžαž»αž“αŸƒαž’αžαŸ’αžαž”αž‘αž“αŸ„αŸ‡αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž‡αžΆαž―αž€αžŸαžΆαžš common_envs.sh αž˜αžΆαž“αžŸαžΆαžšαŸˆαžŸαŸ†αžαžΆαž“αŸ‹αž…αŸ†αž–αŸ„αŸ‡αž™αžΎαž„ αž–αžΈαž–αŸ’αžšαŸ„αŸ‡ αž€αžΆαžšαž„αžΆαžšαžšαž”αžŸαŸ‹ werf αž’αžΆαžŸαŸ’αžšαŸαž™αž›αžΎαžœαžΆαŸ” αž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαžαŸ’αž›αžΉαž˜αžŸαžΆαžšαžšαž”αžŸαŸ‹αžœαžΆαŸ–

export RELEASES='1.0%v1.0.6-4'
export CHANNELS='1.0-alpha%v1.0.7-1 1.0-beta%v1.0.7-1 1.0-ea%v1.0.6-4 1.0-stable%v1.0.6-4 1.0-rock-solid%v1.0.6-4'
export ROOT_VERSION='v1.0.6-4'

αž’αŸ’αž“αž€αž’αžΆαž…αž”αŸ’αžšαžΎαž›αž‘αŸ’αž’αž•αž›αž“αŸƒαžŸαŸ’αž‚αŸ’αžšαžΈαž”αž”αŸ‚αž”αž“αŸαŸ‡ αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ αžŠαŸ„αž™αž”αŸ’αžšαžΎαž˜αž»αžαž„αžΆαžš Bash source.

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

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

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž‡αŸ†αž“αžΆαž“αŸ‹ werf.yaml αž’αžΆαžŸαŸ’αžšαŸαž™αž›αžΎαž‘αž·αž“αŸ’αž“αž“αŸαž™αžαžΆαž„αž€αŸ’αžšαŸ… (αž§αž‘αžΆαž αžšαžŽαŸαž”αž‰αŸ’αž‡αžΈαž“αŸƒαž€αŸ†αžŽαŸ‚αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αžŠαžΌαž…αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžšαž”αžŸαŸ‹αž™αžΎαž„) αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αžŸαž˜αžΆαžŸαž—αžΆαž–αž“αž·αž„αžαž˜αŸ’αž›αŸƒαž“αŸƒαž‘αž·αž“αŸ’αž“αž“αŸαž™αž”αŸ‚αž”αž“αŸαŸ‡αž‚αž½αžšαžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αžαŸ‹αžαŸ’αžšαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ†αž–αž„αŸ‹αŸ” αž“αŸαŸ‡αž˜αžΆαž“αžŸαžΆαžšαŸˆαžŸαŸ†αžαžΆαž“αŸ‹αž‡αžΆαž–αž·αžŸαŸαžŸαž”αŸ’αžšαžŸαž·αž“αž”αžΎαž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαžαžΆαž„αž€αŸ’αžšαŸ…αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‡αžΆαž‰αžΉαž€αž‰αžΆαž”αŸ‹αŸ”

αž™αžΎαž„β€‹αž“αžΉαž„ αž‘αž‘αž½αž› αž“αž·αž„αž€αžαŸ‹αžαŸ’αžšαžΆαž‘αž·αž“αŸ’αž“αž“αŸαž™αžαžΆαž„αž€αŸ’αžšαŸ… αž“αŸ…αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αžŠαŸ†αž”αžΌαž„αž“αŸƒαž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžšαž”αŸ’αžšαŸαž„αž“αŸ…αž€αŸ’αž“αž»αž„ GitLab (αžŸαžΆαž„αžŸαž„αŸ‹αž‡αžΆαž˜αž»αž“) αž αžΎαž™αž”αž‰αŸ’αž‡αžΌαž“αž–αž½αž€αžœαžΆαž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹ αžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽ GitLab CI. αžœαžΆβ€‹αž“αžΉαž„β€‹αž’αž“αž»αž‰αŸ’αž‰αžΆαžβ€‹αž±αŸ’αž™β€‹αž’αŸ’αž“αž€β€‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž“αž·αž„β€‹αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜β€‹αž€αžΆαžšαž„αžΆαžšβ€‹αž”αŸ†αž–αž„αŸ‹β€‹αž‘αžΎαž„αžœαž·αž‰ (αžŸαžΆαž„αžŸαž„αŸ‹ αž–αž„αŸ’αžšαžΆαž™ αžŸαž˜αŸ’αž’αžΆαž) αž‡αžΆαž˜αž½αž™αž“αžΉαž„β€‹αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹β€‹αžŠαžΌαž…αž‚αŸ’αž“αžΆβ€‹αž“αŸ…αž€αŸ’αž“αž»αž„ werf.yaml.

αžαŸ’αž›αžΉαž˜αžŸαžΆαžšαž“αŸƒαž†αžΆαž€ αžŸαžΆαž„αžŸαž„αŸ‹αž‡αžΆαž˜αž»αž“ αž―αž€αžŸαžΆαžš .gitlab-ci.yml:

Prebuild:
  stage: prebuild
  script:
    - bash ./generate_artifacts 1> common_envs.sh
    - cat ./common_envs.sh
  artifacts:
    paths:
      - releases.yml
      - common_envs.sh
    expire_in: 2 week

αžŠαŸ„αž™αž”αžΆαž“αž…αžΆαž”αŸ‹αž™αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αžαžΆαž„αž€αŸ’αžšαŸ…αž“αŸ…αž€αŸ’αž“αž»αž„αžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽ αž’αŸ’αž“αž€αž’αžΆαž…αž”αž„αŸ’αž€αžΎαž αž“αž·αž„αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αžŠαŸ„αž™αž”αŸ’αžšαžΎαžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžš GitLab CI pipelineαŸ– Build αž“αž·αž„ DeployαŸ” αž™αžΎαž„αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αŸ†αž–αž„αŸ‹αžŠαŸ„αž™αžαŸ’αž›αž½αž“αžœαžΆαžŠαŸ„αž™αž”αŸ’αžšαžΎαž‘αŸ†αž–αž€αŸ‹αž–αžΈαžƒαŸ’αž›αžΆαŸ†αž„ GitHub werf (ឧ. αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž˜αžΆαž“αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž“αŸ…αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„αž“αŸ…αž›αžΎ GitHub)αŸ” αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž–αž½αž€αžœαžΆαž’αžΆαž…αžšαž€αž”αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž›αž€αŸ’αžαžŽαŸˆαžŸαž˜αŸ’αž”αžαŸ’αžαž·αž‚αž˜αŸ’αžšαŸ„αž„ GitLab αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€ αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹ CI/CD -> αž€αŸαŸ‡αž”αŸ†αž–αž„αŸ‹αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž”αž„αŸ’αž€αžΎαž Webhook αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαž“αŸ…αž€αŸ’αž“αž»αž„ GitHub (αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹ -> Webhooks).

αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αžŸαžΆαž„αžŸαž„αŸ‹αž“αžΉαž„αž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž“αŸαŸ‡αŸ–

Build:
  stage: build
  script:
    - type multiwerf && . $(multiwerf use 1.0 alpha --as-file)
    - type werf && source <(werf ci-env gitlab --tagging-strategy tag-or-branch --verbose)
    - source common_envs.sh
    - werf build-and-publish --stages-storage :local
  except:
    refs:
      - schedules
  dependencies:
    - Prebuild

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

αž“αŸ…αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ αž™αžΎαž„αž“αžΉαž„αžšαŸ€αž”αžšαžΆαž”αŸ‹αž’αŸ†αž–αžΈαž€αž·αž…αŸ’αž…αž€αžΆαžšαž–αžΈαžš - αžŠαŸ„αž™αž‘αŸ‚αž€αž–αžΈαž‚αŸ’αž“αžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž‘αŸ…αž€αžΆαž“αŸ‹αž•αž›αž·αžαž€αž˜αŸ’αž˜ αž“αž·αž„αžŸαŸ€αž‚αŸ’αžœαžΈαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αžŠαŸ„αž™αž”αŸ’αžšαžΎαž‚αŸ†αžšαžΌ YAMLαŸ–

.base_deploy: &base_deploy
  stage: deploy
  script:
    - type multiwerf && . $(multiwerf use 1.0 alpha --as-file)
    - type werf && source <(werf ci-env gitlab --tagging-strategy tag-or-branch --verbose)
    - source common_envs.sh
    - werf deploy --stages-storage :local
  dependencies:
    - Prebuild
  except:
    refs:
      - schedules

Deploy to Production:
  <<: *base_deploy
  variables:
    WERF_KUBE_CONTEXT: prod
  environment:
    name: production
    url: werf.io
  only:
    refs:
      - master
  except:
    variables:
      - $REVIEW_SHA
    refs:
      - schedules

Deploy to Test:
  <<: *base_deploy
  variables:
    WERF_KUBE_CONTEXT: dev
  environment:
    name: test
    url: werf.test.flant.com
  except:
    refs:
      - schedules
  only:
    variables:
      - $REVIEW_SHA

αž—αžΆαžšαž€αž·αž…αŸ’αž…αž˜αžΆαž“αž—αžΆαž–αžαž»αžŸαž‚αŸ’αž“αžΆαžαŸ‚αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž…αž„αŸ’αž’αž»αž›αž”αž„αŸ’αž αžΆαž‰αž”αžšαž·αž”αž‘αž…αž„αŸ’αž€αŸ„αž˜αžŠαŸ‚αž› werf αž‚αž½αžšαžαŸ‚αž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ (WERF_KUBE_CONTEXT) αž“αž·αž„αž€αŸ†αžŽαžαŸ‹αž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“αžšαž„αŸ’αžœαž·αž›αž‡αž»αŸ† (environment.name ΠΈ environment.url) αžŠαŸ‚αž›αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž“αŸ…αž€αŸ’αž“αž»αž„αž‚αŸ†αžšαžΌαž‚αŸ†αž“αžΌαžŸαžαžΆαž„ Helm αŸ” αž™αžΎαž„β€‹αž“αžΉαž„β€‹αž˜αž·αž“β€‹αž•αŸ’αžαž›αŸ‹β€‹αžαŸ’αž›αžΉαž˜αžŸαžΆαžšβ€‹αž“αŸƒβ€‹αž‚αŸ†αžšαžΌβ€‹αž‘αŸ αž–αŸ’αžšαŸ„αŸ‡β€‹... αž˜αž·αž“αž˜αžΆαž“αž’αŸ’αžœαžΈαž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž“αŸ…αž‘αžΈαž“αŸ„αŸ‡αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ’αžšαž’αžΆαž“αž”αž‘αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ†αžŽαž½αžšαž“αŸ„αŸ‡αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž’αŸ’αž“αž€αž’αžΆαž…αžŸαŸ’αžœαŸ‚αž„αžšαž€αž–αž½αž€αž‚αŸαž“αŸ…αž€αŸ’αž“αž»αž„ αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αžαŸ’αžαž”αž‘.

αž€αžΆαžšαž”αŸ‰αŸ‡αž…αž»αž„αž€αŸ’αžšαŸ„αž™

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

αžŠαžΎαž˜αŸ’αž”αžΈαž’αž“αž»αžœαžαŸ’αžαž’αŸ’αž“αž€αž“αžΉαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαŸ–

  • αž”αž“αŸ’αžαŸ‚αž˜αž‡αŸ†αž αžΆαž“αžŸαž˜αŸ’αž’αžΆαžαž‘αŸ… .gitlab-ci.yml;
  • αž”αž“αŸ’αžαŸ‚αž˜αž€αžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αžαžΆαž˜αž€αžΆαž›αž€αŸ†αžŽαžαŸ‹αž“αŸƒαž€αž·αž…αŸ’αž…αž€αžΆαžšαžŸαž˜αŸ’αž’αžΆαž;
  • αžšαŸ€αž”αž…αŸ†αž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžŸαž‰αŸ’αž‰αžΆαžŸαž˜αŸ’αž„αžΆαžαŸ‹αž…αžΌαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžšαžŸαŸαžšαŸ”

αž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αžŸαŸ†αž’αžΆαž .gitlab-ci.yml:

Cleanup:
  stage: cleanup
  script:
    - type multiwerf && . $(multiwerf use 1.0 alpha --as-file)
    - type werf && source <(werf ci-env gitlab --tagging-strategy tag-or-branch --verbose)
    - source common_envs.sh
    - docker login -u nobody -p ${WERF_IMAGES_CLEANUP_PASSWORD} ${WERF_IMAGES_REPO}
    - werf cleanup --stages-storage :local
  only:
    refs:
      - schedules

αž™αžΎαž„αž”αžΆαž“αžƒαžΎαž‰αžŸαŸ’αž‘αžΎαžšαžαŸ‚αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžšαž”αžŸαŸ‹αžœαžΆαžαŸ’αž–αžŸαŸ‹αž‡αžΆαž„αž”αž“αŸ’αžαž·αž… - αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αžŠαžΎαž˜αŸ’αž”αžΈαžŸαž˜αŸ’αž’αžΆαžαžœαžΆ αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž…αžΌαž›αž‘αŸ… Docker Registry αž‡αžΆαžŠαŸ†αž”αžΌαž„αžŠαŸ„αž™αž”αŸ’αžšαžΎαžŸαž‰αŸ’αž‰αžΆαžŸαž˜αŸ’αž„αžΆαžαŸ‹αžŠαŸ‚αž›αž˜αžΆαž“αžŸαž·αž‘αŸ’αž’αž·αž›αž»αž”αžšαžΌαž”αž—αžΆαž–αž“αŸ…αž€αŸ’αž“αž»αž„ Docker Registry (αž“αž·αž˜αž·αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαž—αžΆαžšαž€αž·αž…αŸ’αž… GitLab CI αžŠαŸ‚αž›αž…αŸαž‰αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž˜αž·αž“αž˜αžΆαž“ αž˜αžΆαž“αžŸαž·αž‘αŸ’αž’αž·αž”αŸ‚αž”αž“αŸαŸ‡)αŸ” αž“αž·αž˜αž·αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαžαŸ’αžšαžΌαžœαžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž“αŸ…αž€αŸ’αž“αž»αž„ GitLab αž‡αžΆαž˜αž»αž“ αž αžΎαž™αžαž˜αŸ’αž›αŸƒαžšαž”αžŸαŸ‹αžœαžΆαžαŸ’αžšαžΌαžœαžαŸ‚αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“ WERF_IMAGES_CLEANUP_PASSWORD αž‚αž˜αŸ’αžšαŸ„αž„ (αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹ CI/CD -> ធថេរ).

αž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜αž€αž·αž…αŸ’αž…αž€αžΆαžšαžŸαž˜αŸ’αž’αžΆαžαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαž›αžœαž·αž—αžΆαž‚αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž€αžΆαžšαž‚αžΊαžšαž½αž…αžšαžΆαž›αŸ‹ CI/CD ->
αž€αžΆαž›αžœαž·αž—αžΆαž‚
.

αž“αŸ„αŸ‡αž αžΎαž™αž‡αžΆαžœαžΆαŸ– αž‚αž˜αŸ’αžšαŸ„αž„αž˜αž½αž™αž“αŸ…αž€αŸ’αž“αž»αž„ Docker Registry αž“αžΉαž„αž›αŸ‚αž„αžšαžΈαž€αž…αž˜αŸ’αžšαžΎαž“αž₯αžαžˆαž”αŸ‹αžˆαžšαž–αžΈαžšαžΌαž”αž—αžΆαž–αžŠαŸ‚αž›αž˜αž·αž“αž”αŸ’αžšαžΎαŸ”

αž“αŸ…αž…αž»αž„αž”αž‰αŸ’αž…αž”αŸ‹αž“αŸƒαž•αŸ’αž“αŸ‚αž€αž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„ αžαŸ’αž‰αž»αŸ†αžŸαžΌαž˜αžšαŸ†αž›αžΉαž€αž’αŸ’αž“αž€αžαžΆ αž”αž‰αŸ’αž‡αžΈαž–αŸαž‰αž›αŸαž‰αž–αžΈαž’αžαŸ’αžαž”αž‘αž˜αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„ Git:

αž›αž‘αŸ’αž’αž•αž›

  1. αž™αžΎαž„αž”αžΆαž“αž‘αž‘αž½αž›αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž€αžΆαžšαž•αŸ’αž‚αž»αŸ†αž‘αžΌαž‡αžΈαžαž›αŸ– αžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαž˜αž½αž™αž€αŸ’αž“αž»αž„αž˜αž½αž™αž€αŸ†αžŽαŸ‚αŸ”
  2. αž€αžΆαžšαž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆαž˜αžΆαž“αž›αž€αŸ’αžαžŽαŸˆαž‡αžΆαžŸαž€αž› αž αžΎαž™αž˜αž·αž“αžαž˜αŸ’αžšαžΌαžœαž±αŸ’αž™αž˜αžΆαž“αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžŠαŸ„αž™αžŠαŸƒαž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž€αŸ†αžŽαŸ‚αžαŸ’αž˜αžΈαž“αŸƒ werf αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αŸαž‰αž•αŸ’αžŸαžΆαž™αŸ– αž―αž€αžŸαžΆαžšαž“αŸ…αž›αžΎαž‚αŸαž αž‘αŸ†αž–αŸαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αŸ”
  3. αžšαžΌαž”αž—αžΆαž–αž–αžΈαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‚αž»αŸ†αž‘αžΎαž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžœαžŽαŸ’αžŒαžœαž„αŸ’αž€αž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆαŸ”
  4. αžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž™αŸ‰αžΆαž„αž†αžΆαž”αŸ‹αžšαž αŸαžŸ, αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚ αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžαžΆαž˜αžŠαŸ‚αž›αž’αžΆαž…αž’αŸ’αžœαžΎαž‘αŸ…αž”αžΆαž“ - αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž€αŸ†αžŽαŸ‚αžαŸ’αž˜αžΈαž“αŸƒ werf αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αŸαž‰αž•αŸ’αžŸαžΆαž™ αž¬αž‘αŸ†αž–αž€αŸ‹ GitHub αžαŸ’αžšαžΌαžœαž”αžΆαž“αž αŸ…αž±αŸ’αž™αž’αŸ’αžœαžΎαž€αžΆαžšαž–αž·αž“αž·αžαŸ’αž™αž‘αžΎαž„αžœαž·αž‰ αž˜αžΆαž“αžαŸ‚αžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αŸ†αžŽαŸ‚αžŠαŸ‚αž›αž”αžΆαž“αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžΆαž„αžŸαž„αŸ‹αž‘αžΎαž„αžœαž·αž‰αŸ”
  5. αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž‚αž·αžαž’αŸ†αž–αžΈαž€αžΆαžšαž›αž»αž”αžšαžΌαž”αž—αžΆαž–αžŠαŸ‚αž›αž˜αž·αž“αž”αŸ’αžšαžΎαž‘αŸαŸ– αž€αžΆαžšαžŸαž˜αŸ’αž’αžΆαžαžαžΆαž˜αž‚αŸ„αž›αž€αžΆαžšαžŽαŸ werf αž“αžΉαž„αžšαž€αŸ’αžŸαžΆ Docker Registry αž²αŸ’αž™αž˜αžΆαž“αžŸαžŽαŸ’αžαžΆαž”αŸ‹αž’αŸ’αž“αžΆαž”αŸ‹αŸ”

αž€αžΆαžšαžšαž€αžƒαžΎαž‰

  • αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ werf αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž€αžΆαžšαž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αžΆαž“αž™αŸ‰αžΆαž„αž†αžΆαž”αŸ‹αžšαž αŸαžŸαžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αž€αžΆαžšαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž‘αžΆαŸ†αž„αž€αžΆαžšαž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆαžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„ αž“αž·αž„αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž“αŸ…αž–αŸαž›αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αžƒαŸ’αž›αžΆαŸ†αž„αžαžΆαž„αž€αŸ’αžšαŸ…αŸ”
  • αž€αžΆαžšαž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αžƒαŸ’αž›αžΆαŸ†αž„ Git αžαžΆαž„αž€αŸ’αžšαŸ…αž›αž»αž”αž”αŸ†αž”αžΆαžαŸ‹αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ’αž›αžΌαž“αžƒαŸ’αž›αžΆαŸ†αž„αž‘αžΆαŸ†αž„αž˜αžΌαž›αžšαžΆαž›αŸ‹αž–αŸαž› αž¬αž”αž„αŸ’αž€αžΎαžαž€αž„αŸ‹αž‘αžΎαž„αžœαž·αž‰αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžαž€αŸ’αž€αžœαž·αž‡αŸ’αž‡αžΆαž”αž„αŸ’αž€αžΎαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αžŠαŸαž›αŸ†αž”αžΆαž€αŸ” werf αž”αŸ’αžšαžΎαžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹ αž αžΎαž™αž’αŸ’αžœαžΎαž€αžΆαžšαž€αŸ’αž›αžΌαž“αžαŸ‚αž˜αŸ’αžαž„αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡ αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž”αŸ’αžšαžΎ fetch αž αžΎαž™αž“αŸ…αž–αŸαž›αž…αžΆαŸ†αž”αžΆαž…αŸ‹αžαŸ‚αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ”
  • αžŸαž˜αžαŸ’αžαž—αžΆαž–αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αŸ’αžšαžΎαž‚αŸ†αžšαžΌ Go αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŸαŸ†αžŽαž„αŸ‹ werf.yaml αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαž€αžΆαžšαž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆαžŠαŸ‚αž›αž›αž‘αŸ’αž’αž•αž›αžšαž”αžŸαŸ‹αžœαžΆαž’αžΆαžŸαŸ’αžšαŸαž™αž›αžΎαž‘αž·αž“αŸ’αž“αž“αŸαž™αžαžΆαž„αž€αŸ’αžšαŸ…αŸ”
  • αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž˜αŸ‰αŸ„αž“αž“αŸ…αž€αŸ’αž“αž»αž„ werf αž”αž„αŸ’αž€αžΎαž“αž›αŸ’αž”αžΏαž“αž€αžΆαžšαž”αŸ’αžšαž˜αžΌαž›αž•αŸ’αžαž»αŸ†αžœαžαŸ’αžαž»αž”αž»αžšαžΆαžŽαž™αŸ‰αžΆαž„αžαŸ’αž›αžΆαŸ†αž„ - αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αžƒαŸ’αž›αžΆαŸ†αž„αžŸαž˜αŸ’αž„αžΆαžαŸ‹αžŠαŸ‚αž›αž‡αžΆαžšαžΏαž„αž’αž˜αŸ’αž˜αžαžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ†αž–αž„αŸ‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ”
  • werf αž’αŸ’αžœαžΎαž±αŸ’αž™αžœαžΆαž„αžΆαž™αžŸαŸ’αžšαž½αž›αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž€αžΆαžšαžŸαž˜αŸ’αž’αžΆαž αžŠαŸ‚αž›αž˜αžΆαž“αžŸαžΆαžšαŸˆαžŸαŸ†αžαžΆαž“αŸ‹αž‡αžΆαž–αž·αžŸαŸαžŸαž“αŸ…αž–αŸαž›αžŸαžΆαž„αžŸαž„αŸ‹αžαžΆαž˜αžœαž“αŸ’αžαŸ”

PS

αžŸαžΌαž˜αž’αžΆαž“αž•αž„αžŠαŸ‚αžšαž“αŸ…αž›αžΎαž”αŸ’αž›αž€αŸ‹αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ–

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

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