αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αž‡αžΆαž˜αž½αž™ Docker αž“αž·αž„ Gitlab CI

αžαŸ’αž‰αž»αŸ†αžŸαŸ’αž“αžΎαž±αŸ’αž™αž’αžΆαž“αž”αŸ’αžšαžαž·αž…αžΆαžšαž·αž€αž“αŸƒαžšαž”αžΆαž™αž€αžΆαžšαžŽαŸαžŠαŸ„αž™ Alexander Sigachev αž–αžΈ Inventos "αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž‡αžΆαž˜αž½αž™ Docker + Gitlab CI"

αž’αŸ’αž“αž€αžŠαŸ‚αž›αž‘αžΎαž”αžαŸ‚αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎ Docker + Gitlab CI αžαŸ‚αž„αžαŸ‚αžŸαž½αžšαžŸαŸ†αžŽαž½αžšαž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αŸ” αž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜? αžαžΎαžαŸ’αžšαžΌαžœαžšαŸ€αž”αž…αŸ†αž™αŸ‰αžΆαž„αžŠαžΌαž…αž˜αŸ’αžαŸαž…? αžαžΎαžαŸ’αžšαžΌαžœαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž™αŸ‰αžΆαž„αžŠαžΌαž…αž˜αŸ’αžαŸαž…?

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

αž’αŸ’αž“αž€αžŽαžΆαžαŸ’αžœαž›αŸ‹αžŸαžΌαž˜αž“αŸ…αž€αŸ’αžšαŸ„αž˜αž†αŸ’αž˜αžΆαŸ”

αžˆαŸ’αž˜αŸ„αŸ‡αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž‚αžΊ Alexander Sigachev αŸ” αžαŸ’αž‰αž»αŸ†αž’αŸ’αžœαžΎαž€αžΆαžšαž±αŸ’αž™ Inventos αŸ” αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž”αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž’αŸ†αž–αžΈαž”αž‘αž–αž·αžŸαŸ„αž’αž“αŸαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ Docker αž“αž·αž„αžšαž”αŸ€αž”αžŠαŸ‚αž›αž™αžΎαž„αž€αŸ†αž–αž»αž„αž’αž“αž»αžœαžαŸ’αžαžœαžΆαž”αž“αŸ’αžαž·αž…αž˜αŸ’αžαž„αŸ—αž›αžΎαž‚αž˜αŸ’αžšαŸ„αž„αž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ’αžšαž»αž˜αž αŸŠαž»αž“αŸ”

αž”αŸ’αžšαž’αžΆαž“αž”αž‘αž”αž‘αž”αž„αŸ’αž αžΆαž‰αŸ– αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαžŠαŸ„αž™αž”αŸ’αžšαžΎ Docker αž“αž·αž„ Gitlab CI αŸ”

αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αž‡αžΆαž˜αž½αž™ Docker αž“αž·αž„ Gitlab CI

αž“αŸαŸ‡αž‡αžΆαž€αžΆαžšαž“αž·αž™αžΆαž™αž›αžΎαž€αž‘αžΈαž–αžΈαžšαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž’αŸ†αž–αžΈ Docker αŸ” αž“αŸ…αž–αŸαž›αž“αŸƒαžšαž”αžΆαž™αž€αžΆαžšαžŽαŸαžŠαŸ†αž”αžΌαž„ αž™αžΎαž„αž”αŸ’αžšαžΎαžαŸ‚ Docker in Development αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” αž…αŸ†αž“αž½αž“αž”αž»αž‚αŸ’αž‚αž›αž·αž€αžŠαŸ‚αž›αž”αŸ’αžšαžΎ Docker αž˜αžΆαž“αž”αŸ’αžšαž αŸ‚αž› 2-3 αž“αžΆαž€αŸ‹αŸ” αž”αž“αŸ’αžαž·αž…αž˜αŸ’αžŠαž„αŸ— αž”αž‘αž–αž·αžŸαŸ„αž’αž“αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αž‘αž½αž› αž αžΎαž™αž™αžΎαž„αžˆαžΆαž“αž‘αŸ…αž˜αž»αžαž”αž“αŸ’αžαž·αž…αž‘αŸ€αžαŸ” αž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ…αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ” αžšαž”αžΆαž™αž€αžΆαžšαžŽαŸαžŠαŸ†αž”αžΌαž„.

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

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

αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αž‡αžΆαž˜αž½αž™ Docker αž“αž·αž„ Gitlab CI

αžαžΎαž™αžΎαž„αž€αŸ†αž–αž»αž„αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αž‰αŸ’αž αžΆαž’αŸ’αžœαžΈαžαŸ’αž›αŸ‡?

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

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

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

αž αŸαžαž»αž•αž›αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž‚αžΊαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžšαž“αŸƒαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαŸ” αžαžΆαž˜αž”αž‘αž–αž·αžŸαŸ„αž’αž“αŸαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ† αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαžαŸ‚αž„αžαŸ‚αž˜αžΆαž“αž‚αŸ†αž“αž·αžαž•αŸ’αžαž½αž…αž•αŸ’αžαžΎαž˜αŸ” αž€αŸ’αž“αž»αž„αž‚αŸ’αžšαž”αŸ‹αž€αžšαžŽαžΈαž‘αžΈαž”αŸ’αžšαžΆαŸ† αžŠαŸ‚αž“αž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž…αžΌαž› αž§αž‘αžΆαž αžšαžŽαŸ vasya.dev αŸ” αž’αž„αŸ’αž‚αž»αž™αž€αŸ’αž”αŸ‚αžšαž‚αžΆαžαŸ‹αž‚αžΊαž‡αžΆαž’αŸ’αž“αž€αž‡αž·αžαžαžΆαž„αžšαž”αžŸαŸ‹αž‚αžΆαžαŸ‹αžˆαŸ’αž˜αŸ„αŸ‡ Petya αžŠαŸ‚αž›αžŠαŸ‚αž“αž‚αžΊ petya.dev αŸ” αž–αž½αž€αž‚αŸαž”αž„αŸ’αž€αžΎαžαž‚αŸαž αž‘αŸ†αž–αŸαžš αž¬αžŸαž˜αžΆαžŸαž’αžΆαžαž»αž˜αž½αž™αž…αŸ†αž“αž½αž“αž“αŸƒαž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŠαŸ„αž™αž”αŸ’αžšαžΎαžˆαŸ’αž˜αŸ„αŸ‡αžŠαŸ‚αž“αž“αŸαŸ‡αŸ”

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

αžŠαžΌαž…αž‚αŸ’αž“αžΆαž“αŸαŸ‡αžŠαŸ‚αžšαž€αžΎαžαž‘αžΎαž„αž‡αžΆαž˜αž½αž™αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ” αž˜αžΆαž“αž“αžšαžŽαžΆαž˜αŸ’αž“αžΆαž€αŸ‹αž˜αž·αž“αžαŸ’αžœαž›αŸ‹αž–αžΈαžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž– αž“αž·αž„αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹ root αž‘αž‘αŸαŸ” αž“αŸ…αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αžŠαŸ†αž‘αžΎαž„ MySQL αž”αžΆαž“αžŸαž½αžšαž“αžšαžŽαžΆαž˜αŸ’αž“αžΆαž€αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹ αž αžΎαž™αž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž”αŸ’αžšαŸ‚αž‘αŸ…αž‡αžΆ 123 αŸ” αžœαžΆαž‡αžΆαžšαžΏαž™αŸ—αž€αžΎαžαž‘αžΎαž„αžŠαŸ‚αž›αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž₯αžαžˆαž”αŸ‹αžˆαžšαž’αžΆαžŸαŸ’αžšαŸαž™αž›αžΎαž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αžαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαŸ” αž˜αžΆαž“αž“αžšαžŽαžΆαž˜αŸ’αž“αžΆαž€αŸ‹αž€αŸ‚ αž’αŸ’αž“αž€αžŽαžΆαž˜αŸ’αž“αžΆαž€αŸ‹αž˜αž·αž“αž”αžΆαž“αž€αŸ‚αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αŸ” αž˜αžΆαž“αž›αŸ’αž”αž·αž…αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž™αžΎαž„αž™αž€αž”αŸ’αžšαž—αŸαž‘αž“αŸƒαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž˜αž½αž™αž…αŸ†αž“αž½αž“αž“αŸ…αž€αŸ’αž“αž»αž„ .gitignore αž αžΎαž™αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž“αžΈαž˜αž½αž™αŸ—αžαŸ’αžšαžΌαžœαžŠαŸ†αž‘αžΎαž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ” αž“αŸαŸ‡αž’αŸ’αžœαžΎαž±αŸ’αž™αž˜αžΆαž“αž€αžΆαžšαž›αŸ†αž”αžΆαž€αž€αŸ’αž“αž»αž„αž€αžΆαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αŸ” αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαŸ„αž˜αžšαž”αžŸαŸ‹αž•αŸ’αžŸαŸαž„αž‘αŸ€αž αžœαžΆαž…αžΆαŸ†αž”αžΆαž…αŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαž…αž„αž…αžΆαŸ†αž’αŸ†αž–αžΈαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ” αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžαŸ’αžšαžΌαžœαžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ αž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹αžαŸ’αžšαžΌαžœαžαŸ‚αž”αž‰αŸ’αž…αžΌαž› αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαŸ’αžšαžΌαžœαžαŸ‚αž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡ αžαžΆαžšαžΆαž„αžαŸ’αžšαžΌαžœαžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαŸ”αž›αŸ”

αž”αž‰αŸ’αž αžΆαž˜αž½αž™αž‘αŸ€αžαž‚αžΊαž€αŸ†αžŽαŸ‚αž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆαž“αŸƒαž”αžŽαŸ’αžŽαžΆαž›αŸαž™αŸ” αžœαžΆαž‡αžΆαžšαžΏαž™αŸ—αž€αžΎαžαž‘αžΎαž„αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž‚αž˜αŸ’αžšαŸ„αž„αž•αŸ’αžŸαŸαž„αŸ—αŸ” αž˜αžΆαž“αž‚αž˜αŸ’αžšαŸ„αž„ Legacy αžŠαŸ‚αž›αž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž€αžΆαž›αž–αžΈαž”αŸ’αžšαžΆαŸ†αž†αŸ’αž“αžΆαŸ†αž˜αž»αž“ (αž…αžΆαž”αŸ‹αž–αžΈαž†αŸ’αž“αžΆαŸ† 2017 - ed. note)αŸ” αž“αŸ…αž–αŸαž›αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ αž™αžΎαž„αž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‡αžΆαž˜αž½αž™ MySQL 5.5 αŸ” αžœαžΆαž€αŸαž˜αžΆαž“αž‚αž˜αŸ’αžšαŸ„αž„αž‘αŸ†αž“αžΎαž”αž•αž„αžŠαŸ‚αžš αžŠαŸ‚αž›αž™αžΎαž„αž–αŸ’αž™αžΆαž™αžΆαž˜αž’αž“αž»αžœαžαŸ’αžαž€αŸ†αžŽαŸ‚αž‘αŸ†αž“αžΎαž”αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαž“αŸƒ MySQL αž§αž‘αžΆαž αžšαžŽαŸ 5.7 αž¬αž…αžΆαžŸαŸ‹αž‡αžΆαž„αž“αŸαŸ‡ (αž€αŸ’αž“αž»αž„αž†αŸ’αž“αžΆαŸ† 2017 - ed. note)

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

αž”αž‰αŸ’αž αžΆαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž‚αžΊαž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž’αŸ’αžœαžΎαž€αžΆαžšαž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž€αŸ’αž“αž»αž„αžŸαŸ’αžšαž»αž€ αž‚αžΆαžαŸ‹αž”αŸ’αžšαžΎαž’αž“αž’αžΆαž“αž€αŸ’αž“αž»αž„αžŸαŸ’αžšαž»αž€ αž―αž€αžŸαžΆαžšαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“ RAM αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αŸ” αž’αž“αŸ’αžαžšαž€αž˜αŸ’αž˜αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸ…αž–αŸαž›αž”αž„αŸ’αž€αžΎαžαžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž…αŸ†αž–αŸ„αŸ‡αž”αž‰αŸ’αž αžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž€αŸ’αž“αž»αž„αž€αŸ’αžšαž”αžαŸαžŽαŸ’αžŒαž“αŸƒαž€αžΆαžšαž–αž·αžαžŠαŸ‚αž›αžαžΆαžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αžαŸ‚αž˜αž½αž™αŸ” αž§αž‘αžΆαž αžšαžŽαŸαž˜αž½αž™αž‚αžΊαž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž™αžΎαž„αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ backend αž“αŸ…αž€αŸ’αž“αž»αž„αž•αž›αž·αžαž€αž˜αŸ’αž˜ 3 αž αžΎαž™αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž―αž€αžŸαžΆαžšαž‘αŸ…αžαž root αž αžΎαž™αž–αžΈαž‘αžΈαž“αŸ„αŸ‡ nginx αž™αž€αž―αž€αžŸαžΆαžšαžŠαžΎαž˜αŸ’αž”αžΈαž†αŸ’αž›αžΎαž™αžαž”αž‘αŸ…αž“αžΉαž„αžŸαŸ†αžŽαžΎαŸ” αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž€αžΌαžŠαž”αŸ‚αž”αž“αŸαŸ‡αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αž•αž›αž·αžαž€αž˜αŸ’αž˜ αžœαžΆαž”αž„αŸ’αž αžΆαž‰αžαžΆαž―αž€αžŸαžΆαžšαž˜αžΆαž“αžœαžαŸ’αžαž˜αžΆαž“αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž˜αž½αž™αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαŸ„αž˜ 3 serverαŸ”

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

Frondend-developer αžŠαŸ‚αž›αž’αž—αž·αžœαžŒαŸ’αžαž›αžΎ JS αžŸαŸ’αž‘αžΎαžšαžαŸ‚αž‚αŸ’αž˜αžΆαž“αž₯αž‘αŸ’αž’αž·αž–αž›αž›αžΎ Backend αž‘αŸαŸ” αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸ backend αž’αž—αž·αžœαžŒαŸ’αžαž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžšαž”αžŸαŸ‹αž™αžΎαž„ Ruby on Rails αž“αž·αž„αž˜αž·αž“αž‡αŸ’αžšαŸ€αžαž‡αŸ’αžšαŸ‚αž€αž‡αžΆαž˜αž½αž™ Frondend αž‘αŸαŸ” αž’αž“αŸ’αžαžšαž€αž˜αŸ’αž˜αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαžŠαŸ„αž™αž”αŸ’αžšαžΎ API αŸ”

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

αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αž‡αžΆαž˜αž½αž™ Docker αž“αž·αž„ Gitlab CI

αž§αž”αž€αžšαžŽαŸαŸ” αžαžΎαž™αžΎαž„αž”αŸ’αžšαžΎαž’αŸ’αžœαžΈ?

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

αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αž‡αžΆαž˜αž½αž™ Docker αž“αž·αž„ Gitlab CI

αžšαž”αžΆαž™αž€αžΆαžšαžŽαŸαž˜αžΆαž“αž–αžΈαžšαž•αŸ’αž“αŸ‚αž€αŸ”

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

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

αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αž‡αžΆαž˜αž½αž™ Docker αž“αž·αž„ Gitlab CI

Docker αž‚αžΊαž‡αžΆαž”αž…αŸ’αž…αŸαž€αžœαž·αž‘αŸ’αž™αžΆαžŠαŸ‚αž›αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™ (αž”αŸ’αžšαžΎαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž”αŸ’αžšαž€αžΆαžŸ) αžŠαžΎαž˜αŸ’αž”αžΈαž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαžŸαž˜αžΆαžŸαž’αžΆαžαž»αž…αžΆαŸ†αž”αžΆαž…αŸ‹αŸ” αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ Dockerfile αŸ” αž“αŸ…αž‘αžΈαž“αŸαŸ‡αž™αžΎαž„αž”αŸ’αžšαž€αžΆαžŸαžαžΆαž™αžΎαž„αž€αŸ†αž–αž»αž„αž‘αž‘αž½αž›αž˜αžšαžαž€αž–αžΈαžšαžΌαž”αž—αžΆαž– Ruby: 2.3.0 Docker αž•αŸ’αž›αžΌαžœαž€αžΆαžšαŸ” αžœαžΆαž˜αžΆαž“αž€αŸ†αžŽαŸ‚ Ruby 2.3 αžŠαŸ‚αž›αž”αžΆαž“αžŠαŸ†αž‘αžΎαž„αŸ” αž™αžΎαž„αžŠαŸ†αž‘αžΎαž„αž”αžŽαŸ’αžŽαžΆαž›αŸαž™αžŸαžΆαž„αžŸαž„αŸ‹αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž€αžΆαžš αž“αž·αž„ NodeJS αŸ” αž™αžΎαž„αž–αž·αž–αžŽαŸŒαž“αžΆαžαžΆαž™αžΎαž„αž”αž„αŸ’αž€αžΎαžαžαžαž―αž€αžŸαžΆαžš /app. αž€αŸ†αžŽαžαŸ‹αžαžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‡αžΆαžαžαž€αžΆαžšαž„αžΆαžšαŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αžαžαž“αŸαŸ‡ αž™αžΎαž„αžŠαžΆαž€αŸ‹ Gemfile αž“αž·αž„ Gemfile.lock αž’αž”αŸ’αž”αž”αžšαž˜αžΆαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž€αžΆαžšαŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž™αžΎαž„αž”αž„αŸ’αž€αžΎαžαž‚αž˜αŸ’αžšαŸ„αž„αžŠαŸ‚αž›αžŠαŸ†αž‘αžΎαž„αžšαžΌαž”αž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™αž“αŸαŸ‡αŸ” αž™αžΎαž„αž”αž„αŸ’αž αžΆαž‰αžαžΆαž€αž»αž„αžαžΊαž“αŸαžšαž“αžΉαž„αžšαž½αž…αžšαžΆαž›αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαžŸαŸ’αžαžΆαž”αŸ‹αž“αŸ…αž›αžΎαž…αŸ’αžšαž€αžαžΆαž„αž€αŸ’αžšαŸ… 3000αŸ” αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž…αž»αž„αž€αŸ’αžšαŸ„αž™αž‚αžΊαž‡αžΆαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžŠαŸ‚αž›αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž”αžŸαŸ‹αž™αžΎαž„αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž™αžΎαž„αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‚αž˜αŸ’αžšαŸ„αž„ αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž“αžΉαž„αž–αŸ’αž™αžΆαž™αžΆαž˜αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αŸ”

αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αž‡αžΆαž˜αž½αž™ Docker αž“αž·αž„ Gitlab CI

αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸαžαž·αž…αžαž½αž…αž”αŸ†αž•αž»αžαž“αŸƒαž―αž€αžŸαžΆαžš docker-compose αŸ” αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡αž™αžΎαž„αž”αž„αŸ’αž αžΆαž‰αžαžΆαž˜αžΆαž“αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αžšαžœαžΆαž„αž’αž»αž„αž–αžΈαžšαŸ” αž“αŸαŸ‡αž‚αžΊαžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž‘αŸ…αž€αŸ’αž“αž»αž„αžŸαŸαžœαžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ αž“αž·αž„αžŸαŸαžœαžΆαž‚αŸαž αž‘αŸ†αž–αŸαžšαŸ” αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‚αŸαž αž‘αŸ†αž–αŸαžšαžšαž”αžŸαŸ‹αž™αžΎαž„αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž—αžΆαž‚αž…αŸ’αžšαžΎαž“αž‘αžΆαž˜αž‘αžΆαžšαž”αŸ’αžšαž—αŸαž‘αž“αŸƒαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž˜αž½αž™αž…αŸ†αž“αž½αž“αž‡αžΆαž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ„αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ” αžŠαŸ„αž™αžŸαžΆαžšαž™αžΎαž„αž€αŸ†αž–αž»αž„αž”αŸ’αžšαžΎ MySQL αž§αž‘αžΆαž αžšαžŽαŸαž‚αžΊαž‡αžΆαž˜αž½αž™ MySQL αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž‚αŸ’αž˜αžΆαž“αž’αŸ’αžœαžΈαžšαžΆαžšαžΆαŸ†αž„αž™αžΎαž„αž–αžΈαž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž•αŸ’αžŸαŸαž„αž‘αŸ€αž (PostgreSQL, Redis) αŸ”

αž™αžΎαž„αž™αž€αž–αžΈαž”αŸ’αžšαž—αž–αž•αŸ’αž›αžΌαžœαž€αžΆαžšαž–αžΈ Docker hub αžšαžΌαž”αž—αžΆαž–αž“αŸƒ MySQL 5.7.14 αžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαŸ” αž™αžΎαž„αž”αŸ’αžšαž˜αžΌαž›αžšαžΌαž”αž—αžΆαž–αžŠαŸ‚αž›αž‘αž‘αž½αž›αžαž»αžŸαžαŸ’αžšαžΌαžœαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‚αŸαž αž‘αŸ†αž–αŸαžšαžšαž”αžŸαŸ‹αž™αžΎαž„αž–αžΈαžαžαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αŸ” αžœαžΆβ€‹αž”αŸ’αžšαž˜αžΌαž›β€‹αžšαžΌαž”αž—αžΆαž–β€‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹β€‹αž™αžΎαž„β€‹αž’αŸ†αž‘αž»αž„β€‹αž–αŸαž›β€‹αž”αžΎαž€β€‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšβ€‹αžŠαŸ†αž”αžΌαž„αŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžŠαŸ‚αž›αž™αžΎαž„αž€αŸ†αž–αž»αž„αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž“αŸ…αž‘αžΈαž“αŸαŸ‡αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž™αžΎαž„αžαŸ’αžšαž›αž”αŸ‹αž‘αŸ…αžœαž·αž‰αž™αžΎαž„αž“αžΉαž„αžƒαžΎαž‰αžαžΆαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžαžΆαž˜αžšαž™αŸˆ Puma αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αŸ” Puma αž‚αžΊαž‡αžΆαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžŠαŸ‚αž›αžŸαžšαžŸαŸαžšαž“αŸ…αž€αŸ’αž“αž»αž„ Ruby αŸ” αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž‘αžΈαž–αžΈαžšαž™αžΎαž„αž”αžŠαž·αžŸαŸαž’αŸ” αž–αžΆαž€αŸ’αž™β€‹αž”αž‰αŸ’αž‡αžΆβ€‹αž“αŸαŸ‡β€‹αž’αžΆαž…β€‹αž’αŸ’αžœαžΎβ€‹αžαžΆαž˜β€‹αž’αŸ†αž–αžΎβ€‹αž…αž·αžαŸ’αžβ€‹αž’αžΆαžŸαŸ’αžšαŸαž™β€‹αž›αžΎβ€‹αžαž˜αŸ’αžšαžΌαžœβ€‹αž€αžΆαžšβ€‹αž¬β€‹αž€αž·αž…αŸ’αž…αž€αžΆαžšβ€‹αžšαž”αžŸαŸ‹β€‹αž™αžΎαž„αŸ”

αž™αžΎαž„αž€αŸαž–αžŽαŸŒαž“αžΆαžαžΆ αž™αžΎαž„αžαŸ’αžšαžΌαžœαž”αž‰αŸ’αž‡αžΌαž“αž…αŸ’αžšαž€αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαžšαž”αžŸαŸ‹αž™αžΎαž„αž–αžΈ 3000 αž‘αŸ… 3000 αž“αŸ…αž›αžΎαž…αŸ’αžšαž€αž€αž»αž„αžαžΊαž“αŸαžšαŸ” αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αžŠαŸ„αž™αž”αŸ’αžšαžΎ iptables αž“αž·αž„αž™αž“αŸ’αžαž€αžΆαžšαžšαž”αžŸαŸ‹αžœαžΆ αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αž”αŸ‹αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„ Docker αŸ”

αžŠαžΌαž…αž–αžΈαž˜αž»αž“ αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž€αŸαž’αžΆαž…αž…αžΌαž›αž”αŸ’αžšαžΎαž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ IP αžŽαžΆαž€αŸαž”αžΆαž“αžŠαŸ‚αžš αž§αž‘αžΆαž αžšαžŽαŸ 127.0.0.1 αž‚αžΊαž‡αžΆαž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ IP αž€αŸ’αž“αž»αž„αžŸαŸ’αžšαž»αž€ αž¬αžαžΆαž„αž€αŸ’αžšαŸ…αžšαž”αžŸαŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αŸ”

αž”αž“αŸ’αž‘αžΆαžαŸ‹αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž“αž·αž™αžΆαž™αžαžΆ web container αž’αžΆαžŸαŸ’αžšαŸαž™αž›αžΎ db containerαŸ” αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž™αžΎαž„αž αŸ…αž€αžΆαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž“αŸƒ web container αž“αŸ„αŸ‡ docker-compose αž‡αžΆαžŠαŸ†αž”αžΌαž„αž“αžΉαž„αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ database αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž–αž½αž€αž™αžΎαž„αŸ” αžšαž½αž…β€‹αž αžΎαž™β€‹αž“αŸ…β€‹αž–αŸαž›β€‹αž…αžΆαž”αŸ‹β€‹αž•αŸ’αžŠαžΎαž˜β€‹αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“β€‹αž‘αž·αž“αŸ’αž“αž“αŸαž™ (αžαžΆαž˜β€‹αž–αž·αžβ€‹αž€αŸ’αžšαŸ„αž™β€‹αž€αžΆαžšβ€‹αž”αžΎαž€β€‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšβ€‹αž€αž»αž„αžαžΊαž“αŸαžš! αž“αŸαŸ‡β€‹αž˜αž·αž“β€‹αž’αžΆαž“αžΆβ€‹αž€αžΆαžšβ€‹αžαŸ’αžšαŸ€αž˜β€‹αžαŸ’αž›αž½αž“β€‹αžšαž”αžŸαŸ‹β€‹αžƒαŸ’αž›αžΆαŸ†αž„β€‹αž‘αž·αž“αŸ’αž“αž“αŸαž™) αž“αžΉαž„β€‹αž”αžΎαž€β€‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšβ€‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈβ€‹αžŠαŸ‚αž›β€‹αž‡αžΆβ€‹αž•αŸ’αž“αŸ‚αž€β€‹αžαžΆαž„β€‹αž€αŸ’αžšαŸ„αž™β€‹αžšαž”αžŸαŸ‹β€‹αž™αžΎαž„αŸ”

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

αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αž‡αžΆαž˜αž½αž™ Docker αž“αž·αž„ Gitlab CI

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

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

αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αž‡αžΆαž˜αž½αž™ Docker αž“αž·αž„ Gitlab CI

Docker αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž€αž”αŸ’αžšαŸ‚ Python, Ruby, NodeJS, PHP αž“αŸƒαž€αŸ†αžŽαŸ‚αžŠαŸ‚αž›αž…αž„αŸ‹αž”αžΆαž“αŸ” αž™αžΎαž„αž€αž˜αŸ’αž…αžΆαžαŸ‹αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž€αŸ†αžŽαŸ‚αž˜αž½αž™αž…αŸ†αž“αž½αž“αŸ” αž–αžΈαž˜αž»αž“ Ruby αž”αžΆαž“αž”αŸ’αžšαžΎαž€αž‰αŸ’αž…αž”αŸ‹ rpm αžŠαŸ‚αž›αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž€αŸ†αžŽαŸ‚αž’αžΆαžŸαŸ’αžšαŸαž™αž›αžΎαž‚αž˜αŸ’αžšαŸ„αž„αŸ” αžœαžΆαž€αŸαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž•αž„αžŠαŸ‚αžš αžŸαžΌαž˜αž’αžšαž‚αž»αžŽαžŠαž›αŸ‹ Docker container αžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αž‘αŸαžšαž€αžΌαžŠαžŠαŸ„αž™αžšαž›αžΌαž“ αž“αž·αž„αž€αŸ†αžŽαŸ‚αžœαžΆαžšαž½αž˜αž‚αŸ’αž“αžΆαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™αŸ” αž™αžΎαž„αž‚αŸ’αž˜αžΆαž“αž”αž‰αŸ’αž αžΆαž€αŸ’αž“αž»αž„αž€αžΆαžšαž™αž›αŸ‹αžŠαžΉαž„αž’αŸ†αž–αžΈαž€αŸ†αžŽαŸ‚αž‘αžΆαŸ†αž„αž’αŸ’αž“αž€αž”αž€αž”αŸ’αžšαŸ‚ αž“αž·αž„αž€αžΌαžŠαž“αŸ„αŸ‡αž‘αŸαŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αž€αŸ†αžŽαŸ‚ αžŸαžΌαž˜αž”αž“αŸ’αž‘αžΆαž”αž’αž»αž„αž…αžΆαžŸαŸ‹ αž αžΎαž™αž›αžΎαž€αž’αž»αž„αžαŸ’αž˜αžΈαŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž˜αžΆαž“αž’αŸ’αžœαžΈαžαž»αžŸ αž™αžΎαž„αž’αžΆαž…αž‘αž˜αŸ’αž›αžΆαž€αŸ‹αž’αž»αž„αžαŸ’αž˜αžΈ αž›αžΎαž€αž’αž»αž„αž…αžΆαžŸαŸ‹αŸ”

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

αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αž‡αžΆαž˜αž½αž™ Docker αž“αž·αž„ Gitlab CI αž“αŸ…αž›αžΎ Frontend αž™αžΎαž„αž”αŸ’αžšαžΎ JavaScipt αž“αž·αž„ NodeJS αŸ”

αž₯αž‘αžΌαžœαž“αŸαŸ‡αž™αžΎαž„αž˜αžΆαž“αž‚αž˜αŸ’αžšαŸ„αž„αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž“αŸ…αž›αžΎ ReacJS αŸ” αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž”αžΆαž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž“αŸ…αž€αŸ’αž“αž»αž„αž€αž»αž„αžαžΊαž“αŸαžš αž αžΎαž™αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαžŠαŸ„αž™αž”αŸ’αžšαžΎ hot-reload αŸ”

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ αž€αž·αž…αŸ’αž…αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„ JavaScipt αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ αž αžΎαž™αž€αžΌαžŠαžŠαŸ‚αž›αž”αžΆαž“αž…αž„αž€αŸ’αžšαž„αž‡αžΆαž‹αž·αžαž·αžœαž“αŸ’αžαžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αžαž›αŸ‹αžαžΆαž˜αžšαž™αŸˆαž’αž“αž’αžΆαž“αžŸαž“αŸ’αžŸαŸ† nginx αŸ”

αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αž‡αžΆαž˜αž½αž™ Docker αž“αž·αž„ Gitlab CI

αž“αŸ…αž‘αžΈαž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαž“αŸƒαž‚αž˜αŸ’αžšαŸ„αž„αž…αž»αž„αž€αŸ’αžšαŸ„αž™αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ”

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

αžαžΎαž™αžΎαž„αž”αžΆαž“αž’αŸ’αžœαžΎαž’αŸ’αžœαžΈαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžšαžΏαž„αž“αŸαŸ‡?

αž™αžΎαž„αž”αžΆαž“αž”αŸ‚αž„αž…αŸ‚αž€αž‘αŸ…αž‡αžΆαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαžΌαž…αž‡αžΆαŸ– αž•αŸ’αž“αŸ‚αž€αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž“αŸ…αž›αžΎ JS αžŠαŸ‚αž›αž‡αžΆαž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ„αž™αžŠαŸ‚αž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžαžΆαž˜αžšαž™αŸˆαž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹ REST αž“αŸ…αž€αŸ’αžšαŸ„αž˜ Ruby on Rails αŸ” αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ„αž™αž˜αžΆαž“αž’αž“αŸ’αžαžšαž€αž˜αŸ’αž˜αž‡αžΆαž˜αž½αž™αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ” αž›αž‘αŸ’αž’αž•αž›β€‹αžŠαŸ‚αž›β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž”αž„αŸ’αž€αžΎαžβ€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž•αŸ’αžαž›αŸ‹β€‹αž±αŸ’αž™β€‹αž’αžαž·αžαž·αž‡αž“αŸ” αž”αž“αŸ’αž‘αŸ‡αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž’αŸ’αžœαžΎαž’αž“αŸ’αžαžšαž€αž˜αŸ’αž˜αž‡αžΆαž˜αž½αž™αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ„αž™ αž“αž·αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžαžΆαž˜αžšαž™αŸˆαž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹ REST αŸ”

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

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

αž€αžΆαžšαž‡αžΌαž“αžŠαŸ†αžŽαžΉαž„αž‡αŸ†αžšαž»αž‰αž’αž“αŸ’αžαžšαž€αž˜αŸ’αž˜αž‡αžΆαž˜αž½αž™αžŸαž˜αžΆαžŸαž—αžΆαž‚αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž“αŸ…αž€αŸ’αž“αž»αž„ NodeJS αŸ”

αž‡αž½αžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžΆαž„αžŸαž„αŸ‹ αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž€αžΆαžšαž‡αžΌαž“αžŠαŸ†αžŽαžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‰αžΎαž‘αŸ…αžαžΆαž˜αž™αž“αŸ’αžαž€αžΆαžšαžšαž”αžŸαŸ‹αžœαžΆαŸ”

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

αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αž‡αžΆαž˜αž½αž™ Docker αž“αž·αž„ Gitlab CI

αžŠαžΌαž…αž‚αŸ’αž“αžΆαž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸ…αž€αŸ’αž“αž»αž„αž›αŸαžαŸ” αž“αŸαŸ‡αž‡αžΆαž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αž€αžΆαžšαž”αŸ’αžšαžΎαž€αžΌαžŠαž‘αžΎαž„αžœαž·αž‰αž˜αžΆαž“αžŸαžΆαžšαŸˆαžŸαŸ†αžαžΆαž“αŸ‹αŸ”

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

αž“αŸ…αž–αŸαž›αž“αŸ„αŸ‡αž™αžΎαž„αž€αŸ†αž–αž»αž„αž”αŸ’αžšαžΎαž€αŸ†αžŽαŸ‚ 4 αž“αŸƒ NodeJS αŸ” αž₯αž‘αžΌαžœαž“αŸαŸ‡ (αž€αŸ’αž“αž»αž„αž†αŸ’αž“αžΆαŸ† 2017 - ed. note) αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαžαŸ’αž˜αžΈαŸ— αž™αžΎαž„αž”αŸ’αžšαžΎαž€αŸ†αžŽαŸ‚ 7 αž“αŸƒ NodeJS αŸ” αž˜αž·αž“αž˜αžΆαž“αž”αž‰αŸ’αž αžΆαž“αŸ…αž€αŸ’αž“αž»αž„αžŸαž˜αžΆαžŸαž’αžΆαžαž»αžαŸ’αž˜αžΈαžŠαžΎαž˜αŸ’αž”αžΈαž–αžΆαž€αŸ‹αž–αŸαž“αŸ’αž’αž“αžΉαž„αž€αŸ†αžŽαŸ‚αžαŸ’αž˜αžΈαž“αŸƒαž”αžŽαŸ’αžŽαžΆαž›αŸαž™αž‘αŸαŸ”

αž”αžΎαž…αžΆαŸ†αž”αžΆαž…αŸ‹ αž’αŸ’αž“αž€αž’αžΆαž…αž€αŸ‚αž”αŸ’αžšαŸ‚ αž“αž·αž„αž›αžΎαž€αž€αŸ†αžŽαŸ‚ NodeJS αž–αžΈαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž‡αžΌαž“αžŠαŸ†αžŽαžΉαž„ Push αŸ”

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

αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αž‡αžΆαž˜αž½αž™ Docker αž“αž·αž„ Gitlab CI

αžαžΎαž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž€αžΆαžšαž’αŸ’αžœαžΈαžαŸ’αž›αŸ‡αžŠαžΎαž˜αŸ’αž”αžΈαž”αž“αŸ’αžαŸ‚αž˜ Docker? αž™αžΎαž„αž”αž“αŸ’αžαŸ‚αž˜ Dockerfile αž‘αŸ…αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„αžšαž”αžŸαŸ‹αž™αžΎαž„ αžŠαŸ‚αž›αž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™αž…αžΆαŸ†αž”αžΆαž…αŸ‹αŸ” αž€αŸ’αž“αž»αž„αž§αž‘αžΆαž αžšαžŽαŸαž“αŸαŸ‡ αžŸαž˜αžΆαžŸαž’αžΆαžαž»αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ†αž”αŸ‚αž€αž‡αžΆαž‘αžΌαž‡αžΈαžαž›αŸ” αž“αŸαŸ‡αž‚αžΊαž‡αžΆαžŸαŸ†αžŽαž»αŸ†αž’αž”αŸ’αž”αž”αžšαž˜αžΆαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαžΆαž„αž€αŸ’αžšαŸ„αž™αŸ”

αž“αŸ…αž–αŸαž›αž”αž„αŸ’αž€αžΎαžαž‚αž˜αŸ’αžšαŸ„αž„αžαŸ’αž˜αžΈ αž™αžΎαž„αž”αž„αŸ’αž€αžΎαž Dockerfile αž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž’αŸαž€αžΌαžŠαŸ‚αž›αž…αž„αŸ‹αž”αžΆαž“ (Python, Ruby, NodeJS)αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„ docker-compose αžœαžΆαž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™αž…αžΆαŸ†αž”αžΆαž…αŸ‹ - αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ” αž™αžΎαž„αž–αžŽαŸŒαž“αžΆαžαžΆαž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αŸƒαž€αŸ†αžŽαŸ‚αž”αŸ‚αž”αž“αŸ„αŸ‡ αž αžΎαž™αž•αŸ’αž‘αž»αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αŸ…αž‘αžΈαž“αŸ„αŸ‡ αž“αž·αž„αž‘αžΈαž“αŸ„αŸ‡αŸ”

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

αžŠαžΎαž˜αŸ’αž”αžΈαžšαž€αŸ’αžŸαžΆαž‘αž»αž€ nginx αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹ mysql αž™αžΎαž„αž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αžαž Docker αžŠαŸ‚αž›αž™αžΎαž„αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž…αžΆαŸ†αž”αžΆαž…αŸ‹αŸ” αž“αŸ…αž–αŸαž›αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž’αŸ’αžœαžΎαž€αžΆαžšαž€αŸ’αž›αžΌαž“ git αž“αŸƒαžƒαŸ’αž›αžΆαŸ†αž„αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αžšαž”αžŸαŸ‹αž‚αžΆαžαŸ‹ αž‚αžΆαžαŸ‹αž˜αžΆαž“αž‚αž˜αŸ’αžšαŸ„αž„αžšαž½αž…αžšαžΆαž›αŸ‹αž αžΎαž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž€αŸ’αž“αž»αž„αžαŸ†αž”αž“αŸ‹αŸ” αž˜αž·αž“αž˜αžΆαž“αžŸαŸ†αžŽαž½αžšαžαžΆαžαžΎαž…αŸ’αžšαž€αž’αŸ’αžœαžΈαž¬αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž’αŸ’αžœαžΈαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž’αž“αž»αžœαžαŸ’αžαŸ”

αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αž‡αžΆαž˜αž½αž™ Docker αž“αž·αž„ Gitlab CI

αž”αž“αŸ’αž‘αžΆαž”αŸ‹ αž™αžΎαž„αž˜αžΆαž“αžŸαž˜αžΆαžŸαž—αžΆαž‚αž‡αžΆαž…αŸ’αžšαžΎαž“αŸ– αž’αŸ’αž“αž€αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ αž‡αžΌαž“αžŠαŸ†αžŽαžΉαž„-API αž€αžΆαžšαž‡αžΌαž“αžŠαŸ†αžŽαžΉαž„αžšαž»αž‰αŸ”

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

αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αž‡αžΆαž˜αž½αž™ Docker αž“αž·αž„ Gitlab CI

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

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

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž˜αžΆαž“αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαž€αŸ’αž“αž»αž„αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‡αžΆαž˜αž½αž™αž€αžΆαžšαž‡αžΌαž“αžŠαŸ†αžŽαžΉαž„αž‡αŸ†αžšαž»αž‰ αž“αŸ„αŸ‡ docker-compose.yaml αž“αž·αž„ docker-compose-push.yaml αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ”

αžŠαŸ„αž™αžŸαžΆαžš docker-compose.yaml αž“αž·αž„ docker-compose-push.yaml αžŸαŸ’αžαž·αžαž“αŸ…αž€αŸ’αž“αž»αž„αžαžαž˜αž½αž™ αž”αžŽαŸ’αžαžΆαž‰αž“αž·αž˜αŸ’αž˜αž·αžαžαŸ‚αž˜αž½αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αŸ”

αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αž‡αžΆαž˜αž½αž™ Docker αž“αž·αž„ Gitlab CI

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

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

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αžšαž·αžŸαŸ’αžαžΆαž“αž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž™αžΎαž„αž”αŸ’αžšαžΎαžŠαŸ‚αž“ .dev - api.informer.dev αŸ” αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ‚αž›αž˜αžΆαž“αžŠαŸ‚αž“ .dev αž˜αžΆαž“αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαŸ”

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

αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αž‡αžΆαž˜αž½αž™ Docker αž“αž·αž„ Gitlab CI

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

αžαž»αž›αŸ’αž™αž—αžΆαž–αžˆαŸ’αž˜αŸ„αŸ‡αžŠαŸ‚αž“αž€αŸ†αžŽαžαŸ‹αž€αž»αž„αžαžΊαž“αŸαžšαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‘αžΆαž€αŸ‹αž‘αž„αŸ”

αžœαžΆαž’αžΆαž…αž‡αžΆ nginx αžŠαŸ‚αž›αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αž’αŸ’αž“αž€αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ JS αŸ” αž“αŸαŸ‡αž’αžΆαž…αž‡αžΆ nginx αžŠαŸ‚αž›αž•αŸ’αžαž›αŸ‹ API αž¬αž―αž€αžŸαžΆαžšαž‹αž·αžαž·αžœαž“αŸ’αž αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™ nginx αž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹αž“αŸƒαž€αžΆαžšαž”αž„αŸ’αž αŸ„αŸ‡αžšαžΌαž”αž—αžΆαž–αŸ”

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

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

αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αž‡αžΆαž˜αž½αž™ Docker αž“αž·αž„ Gitlab CI

αžαžΎαž§αž‘αžΆαž αžšαžŽαŸαž˜αž½αž™αžŽαžΆαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž˜αžΎαž›αžŠαžΎαž˜αŸ’αž”αžΈ dockerize αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€? αžαžΆαž˜αž‚αŸ†αž“αž·αžαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ† αž§αž‘αžΆαž αžšαžŽαŸαžŠαŸαž›αŸ’αž’αž˜αž½αž™αž‚αžΊαžšαžΌαž”αž—αžΆαž– docker αž•αŸ’αž›αžΌαžœαž€αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ MySQL αŸ”

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

Hub.docker.com αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆαž˜αžΆαž“αžαŸ†αžŽαž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ…αž€αžΆαž“αŸ‹ github.com αžŠαŸ‚αž›αž˜αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž†αŸ…αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž–αžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„αŸ”

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

αž€αŸ’αž“αž»αž„αž§αž‘αžΆαž αžšαžŽαŸαž“αŸαŸ‡αž•αž„αžŠαŸ‚αžš αž˜αžΆαž“αžŸαž˜αžαŸ’αžαž—αžΆαž–αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ„αž™αž”αŸ’αžšαžΎαž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“αŸ” αžαžΆαž˜αžšαž™αŸˆαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“αž“αŸ…αž–αŸαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž»αž„αžαžΊαž“αŸαžšαžαŸ‚αž˜αž½αž™ αž¬αžαžΆαž˜αžšαž™αŸˆ docker-compose αž™αžΎαž„αž’αžΆαž…αž“αž·αž™αžΆαž™αž”αžΆαž“αžαžΆαž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αŸ†αžŽαžαŸ‹αž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž‘αž‘αŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ docker αžŠαžΎαž˜αŸ’αž”αžΈ root αž“αŸ…αž›αžΎ MySQL αž¬αž’αŸ’αžœαžΈαž€αŸαžŠαŸ„αž™αžŠαŸ‚αž›αž™αžΎαž„αž…αž„αŸ‹αž”αžΆαž“αŸ”

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

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

αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αž‡αžΆαž˜αž½αž™ Docker αž“αž·αž„ Gitlab CI

αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž€αŸ†αžŽαŸ‚αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž“αŸƒ MySQL αž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž“αŸ…αž›αžΎ github.com αŸ” αž’αŸ’αž“αž€αž’αžΆαž…αž”αžΎαž€ Dockerfile αž αžΎαž™αž˜αžΎαž›αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž›αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž‘αžΈαž“αŸ„αŸ‡αŸ”

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

αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αž‡αžΆαž˜αž½αž™ Docker αž“αž·αž„ Gitlab CI

αž…αžΌαžšαž”αž“αŸ’αžαž‘αŸ…αž•αŸ’αž“αŸ‚αž€αž‘αžΈαž–αžΈαžšαŸ”

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

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

Gitlab CI 2 αž“αž·αž™αžΆαž™ https://goo.gl/uohKjI - αžšαžΆαž™αž€αžΆαžšαžŽαŸαž–αžΈαž€αŸ’αž›αžΉαž” Ruby Russia - αž›αž˜αŸ’αž’αž·αžαž αžΎαž™αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαžœαžΆαž“αžΉαž„αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž’αŸ’αž“αž€αŸ”

αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αž‡αžΆαž˜αž½αž™ Docker αž“αž·αž„ Gitlab CI

αž₯αž‘αžΌαžœαž“αŸαŸ‡αž™αžΎαž„αž“αžΉαž„αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž“αžΌαžœαž’αŸ’αžœαžΈαžŠαŸ‚αž›αžαž˜αŸ’αžšαžΌαžœαž±αŸ’αž™αž’αŸ’αžœαžΎαžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž±αŸ’αž™ Gitlab CI αžŸαž€αž˜αŸ’αž˜αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ Gitlab CI αž™αžΎαž„αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αžαŸ’αžšαžΌαžœαžŠαžΆαž€αŸ‹αž―αž€αžŸαžΆαžš .gitlab-ci.yml αž‡αžΆ root αž“αŸƒαž‚αž˜αŸ’αžšαŸ„αž„αŸ”

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

αž™αžΎαž„αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αžŸαŸ’αž‚αŸ’αžšαžΈαž”αžŠαŸ‚αž›αž αŸ…αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž‘αŸ… docker-compose αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž”αžŸαŸ‹αž™αžΎαž„αŸ” αž“αŸαŸ‡αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸαžαžΆαž„αž€αŸ’αžšαŸ„αž™αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ”

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

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

αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αŸ” αž™αžΎαž„β€‹αž˜αž·αž“β€‹αž”αžΆαž“β€‹αžšαŸ€αž”αž…αŸ†β€‹αž€αžΆαžšβ€‹αž…αžΆαž”αŸ‹β€‹αž•αŸ’αžαžΎβ€‹αž˜β€‹αž–αŸαž›β€‹αžœαŸαž›αžΆβ€‹αžŸαžΌαž“αŸ’αž™β€‹αŸ”

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

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

αž˜αžΆαž“αž…αŸ†αžŽαžΆαŸ†αžαžΆαž“αŸαŸ‡αž’αž“αž»αžœαžαŸ’αžαž…αŸ†αž–αŸ„αŸ‡αžαŸ‚αžŸαžΆαžαžΆαž˜αŸαž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ”

αž“αŸ…αž–αŸαž›αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžŸαžΆαžαžΆαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž‘αŸαŸ”

αžœαžΆαž’αžΆαž…αž’αŸ’αžœαžΎαž‘αŸ…αž”αžΆαž“αžŠαžΎαž˜αŸ’αž”αžΈαžšαŸ€αž”αž…αŸ†αž€αžΆαžšαž…αŸαž‰αžŠαŸ†αžŽαžΎαžšαžαžΆαž˜αžŸαžΆαžαžΆαŸ”

αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αž‡αžΆαž˜αž½αž™ Docker αž“αž·αž„ Gitlab CI

αžŠαžΎαž˜αŸ’αž”αžΈαžšαŸ€αž”αž…αŸ†αžœαžΆαž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αž αž™αžΎαž„αžαŸ’αžšαžΌαžœαžŠαŸ†αž‘αžΎαž„ Gitlab Runner αŸ”

αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαž‡αžΆ Golang αŸ” αžœαžΆβ€‹αž‚αžΊβ€‹αž‡αžΆβ€‹αž―αž€αžŸαžΆαžšβ€‹αžαŸ‚β€‹αž˜αž½αž™β€‹αžŠαžΌαž…β€‹αž‡αžΆβ€‹αž‘αžΌαž‘αŸ…β€‹αž“αŸ…β€‹αž€αŸ’αž“αž»αž„β€‹αž–αž·αž—αž– Golang αžŠαŸ‚αž›β€‹αž˜αž·αž“β€‹αžαž˜αŸ’αžšαžΌαžœβ€‹αž±αŸ’αž™β€‹αž˜αžΆαž“β€‹αž—αžΆαž–β€‹αž’αžΆαžŸαŸ’αžšαŸαž™β€‹αžŽαžΆβ€‹αž˜αž½αž™β€‹αŸ”

αž“αŸ…αž–αŸαž›αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ αž™αžΎαž„αž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡ Gitlab Runner αŸ”

αž™αžΎαž„αž‘αž‘αž½αž›αž”αžΆαž“αž‚αž“αŸ’αž›αžΉαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹αž”αžŽαŸ’αžαžΆαž‰ Gitlab αŸ”

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž™αžΎαž„αž αŸ…αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž“αŸ…αž›αžΎαž”αž“αŸ’αž‘αžΆαžαŸ‹αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαŸ”

αžŠαŸ†αž‘αžΎαž„ Gitlab Runner αž’αž“αŸ’αžαžšαž€αž˜αŸ’αž˜ (Shell, Docker, VirtualBox, SSH)

αž€αžΌαžŠαž“αŸ…αž›αžΎ Gitlab Runner αž“αžΉαž„αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž›αžΎαžšαžΆαž›αŸ‹ commit αž’αžΆαžŸαŸ’αžšαŸαž™αž›αžΎαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹ .gitlab-ci.yml αŸ”

αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αž‡αžΆαž˜αž½αž™ Docker αž“αž·αž„ Gitlab CI

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

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

αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αž‡αžΆαž˜αž½αž™ Docker αž“αž·αž„ Gitlab CI

αž™αžΎαž„β€‹αž’αžΆαž…β€‹αž–αž·αž“αž·αžαŸ’αž™β€‹αž˜αžΎαž›β€‹αž²αŸ’αž™β€‹αž”αžΆαž“β€‹αžŠαž·αžβ€‹αžŠαž›αŸ‹β€‹αž’αŸ†αž–αžΈβ€‹αž€αžΆαžšβ€‹αžŸαžΆαž„αžŸαž„αŸ‹αŸ” αž“αŸ…αž‘αžΈαž“αŸαŸ‡αž™αžΎαž„αžƒαžΎαž‰αžαžΆαžšαžŠαŸ’αž‹αž–αžΈαžšαž”αžΆαž“αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αžšαž½αž…αž αžΎαž™αŸ” αžŸαŸ’αžαžΆαž“αž—αžΆαž–αžŸαžΆαž€αž›αŸ’αž”αž„ αž“αž·αž„αžŸαŸ’αžαžΆαž“αž—αžΆαž–αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž“αŸ…αž›αžΎαž†αžΆαž€αŸ”

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž™αžΎαž„αž…αž»αž…αž›αžΎ build αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž˜αž½αž™ αž“αŸ„αŸ‡αžœαžΆαž“αžΉαž„αž˜αžΆαž“αž€αž»αž„αžŸαžΌαž› output αž“αŸƒ commands αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αŸ’αž“αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸαŸ‡αž”αžΎαž™αŸ„αž„αžαžΆαž˜ ​​.gitlab-ci.yml αŸ”

αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αž‡αžΆαž˜αž½αž™ Docker αž“αž·αž„ Gitlab CI

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

αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αž‡αžΆαž˜αž½αž™ Docker αž“αž·αž„ Gitlab CI

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

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

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

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

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

αž”αž‰αŸ’αž αžΆαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž‚αžΊαž€αžΆαžšαž”αŸ†αž”αŸ‚αž€αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αž›αžΎαž‚αž˜αŸ’αžšαŸ„αž„αž‡αžΆαž…αŸ’αžšαžΎαž“αŸ”

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

αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αž‡αžΆαž˜αž½αž™ Docker αž“αž·αž„ Gitlab CI

αžαžΎαž™αžΎαž„αž”αžΆαž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžœαžΆαžŠαŸ„αž™αžšαž”αŸ€αž”αžŽαžΆ? αž™αžΎαž„αž”αžΆαž“αž…αžΆαžαŸ‹αžαžΆαŸ†αž„ Gitlab Runner αž˜αŸ’αž“αžΆαž€αŸ‹αžŠαž›αŸ‹αž‚αž˜αŸ’αžšαŸ„αž„αž’αŸ†αŸ—αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ”

Gitlab αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš Gitlab Runners αžŠαŸ‚αž›αž”αžΆαž“αž…αŸ‚αž€αž…αžΆαž™αž‡αžΆαž…αŸ’αžšαžΎαž“αžŠαŸ‚αž›αž“αžΉαž„αž™αž€αž—αžΆαžšαž€αž·αž…αŸ’αž…αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‘αŸ…αž‡αžΆαžœαŸαž“αž€αŸ’αž“αž»αž„αž›αž€αŸ’αžαžŽαŸˆαžœαžΉαž€αžœαžšαž αžΎαž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžœαžΆαŸ”

αžŠαžΌαž…αŸ’αž“αŸαŸ‡β€‹αž αžΎαž™β€‹αž™αžΎαž„β€‹αž˜αž·αž“β€‹αž˜αžΆαž“β€‹αž•αŸ’αž‘αŸ‡ αž™αžΎαž„β€‹αž”αžΆαž“β€‹αž€αŸ†αžŽαžαŸ‹β€‹αž€αŸ’αžšαž»αž˜β€‹αž“αŸƒβ€‹αž‚αž˜αŸ’αžšαŸ„αž„β€‹αžšαž”αžŸαŸ‹β€‹αž™αžΎαž„β€‹αž‘αŸ…β€‹αž‡αžΆ Gitlab Runner αž˜αž½αž™β€‹αžŠαŸ‚αž›β€‹αž’αžΆαž…β€‹αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™β€‹αžŠαŸ„αž™β€‹αž˜αž·αž“β€‹αž˜αžΆαž“β€‹αž”αž‰αŸ’αž αžΆβ€‹αž‡αžΆαž˜αž½αž™β€‹αž”αžšαž·αž˜αžΆαžŽβ€‹αžšαž”αžŸαŸ‹β€‹αž™αžΎαž„αŸ”

αž™αžΎαž„αž”αžΆαž“αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš nginx-proxy αž‘αŸ…αž‡αžΆαžŸαŸ’αž‚αŸ’αžšαžΈαž”αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€ αž“αž·αž„αž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž€αŸ’αžšαž‘αžΆαž…αžαŸ’αžšαž„αŸ’αž‚αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αž˜αŸ’αžšαŸ„αž„αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αžœαžΆαŸ”

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

αžŸαŸ†αžŽαžΎαžšαž”αžŸαŸ‹αž™αžΎαž„αž˜αž€αžαžΆαž˜αžšαž™αŸˆαžŠαŸ‚αž“αž“αŸ…αž›αžΎαž…αŸ’αžšαž€ 80 αž αžΎαž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž‘αŸ…αž€αŸ’αž“αž»αž„αž€αŸ’αžšαž»αž˜αž€αž»αž„αžαžΊαž“αŸαžšαžŠαŸ‚αž›αž”αž˜αŸ’αžšαžΎαžŠαŸ‚αž“αž“αŸαŸ‡αŸ”

αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αž‡αžΆαž˜αž½αž™ Docker αž“αž·αž„ Gitlab CI

αžαžΎαž˜αžΆαž“αž”αž‰αŸ’αž αžΆαž’αŸ’αžœαžΈαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž“αŸ…αž‘αžΈαž“αŸ„αŸ‡? αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž’αž»αž„αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‡αžΆ root αžαžΆαž˜αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜αŸ” αž“αŸαŸ‡αž‚αžΊαž‡αžΆ root αž˜αž·αž“αžŸαŸ’αž˜αžΎαž‘αŸ…αž“αžΉαž„ root host αž“αŸƒαž”αŸ’αžšαž–αŸαž“αŸ’αž’αŸ”

αž‘αŸ„αŸ‡αž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž”αž‰αŸ’αž…αžΌαž›αž€αž»αž„αžαžΊαž“αŸαžš αžœαžΆαž“αžΉαž„αž‡αžΆ root αž αžΎαž™αž―αž€αžŸαžΆαžšαžŠαŸ‚αž›αž™αžΎαž„αž”αž„αŸ’αž€αžΎαžαž“αŸ…αž€αŸ’αž“αž»αž„αž€αž»αž„αžαžΊαž“αŸαžšαž“αŸαŸ‡αž‘αž‘αž½αž›αž”αžΆαž“αžŸαž·αž‘αŸ’αž’αž·αž‡αžΆ root αŸ”

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

αžαžΎβ€‹αžœαžΆβ€‹αž’αžΆαž…β€‹αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™β€‹αžŠαŸ„αž™β€‹αžšαž”αŸ€αž”β€‹αžŽαžΆ? αž’αŸ’αž“αž€αž’αžΆαž…αž”αž“αŸ’αžαŸ‚αž˜αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŠαŸ‚αž›αž“αžΉαž„αž“αŸ…αž€αŸ’αž“αž»αž„αž€αž»αž„αžαžΊαž“αŸαžšαŸ”

αžαžΎαž˜αžΆαž“αž”αž‰αŸ’αž αžΆαž’αŸ’αžœαžΈαžαŸ’αž›αŸ‡αž€αžΎαžαž‘αžΎαž„αž“αŸ…αž–αŸαž›αž™αžΎαž„αž”αž“αŸ’αžαŸ‚αž˜αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹?

αž“αŸ…αž–αŸαž›αž”αž„αŸ’αž€αžΎαžαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ αž™αžΎαž„αž…αŸ’αžšαžΎαž“αžαŸ‚αž˜αž·αž“αž˜αžΆαž“αž›αŸαžαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž€αŸ’αžšαž»αž˜αžŠαžΌαž…αž‚αŸ’αž“αžΆ (UID) αž“αž·αž„αž›αŸαžαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ (GID) αž‘αŸαŸ”

αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αž‰αŸ’αž αžΆαž“αŸαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αž€αž»αž„αžαžΊαž“αŸαžš αž™αžΎαž„αž”αŸ’αžšαžΎαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŠαŸ‚αž›αž˜αžΆαž“αž›αŸαžαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹ 1000αŸ”

αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžšαž”αžŸαŸ‹αž™αžΎαž„ αžœαžΆαžŸαŸ’αžšαž”αž‚αŸ’αž“αžΆαž“αžΉαž„αž€αžΆαžšαž–αž·αžαžŠαŸ‚αž›αžαžΆαž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαžŸαŸ’αž‘αžΎαžšαžαŸ‚αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž”αŸ’αžšαžΎ Ubuntu OS αŸ” αž αžΎαž™αž“αŸ…αž›αžΎαž’αŸŠαžΌαž”αŸŠαž»αž“αž‘αžΌ αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŠαŸ†αž”αžΌαž„αž˜αžΆαž“αž›αŸαžαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹ 1000αŸ”

αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αž‡αžΆαž˜αž½αž™ Docker αž“αž·αž„ Gitlab CI

αžαžΎαž™αžΎαž„αž˜αžΆαž“αž‚αž˜αŸ’αžšαŸ„αž„αž‘αŸ?

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

αž”αž‰αŸ’αž αžΆβ€‹αžαŸ’αž›αŸ‡β€‹αžŠαŸ‚αž›β€‹αž™αžΎαž„β€‹αž”αžΆαž“β€‹αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™β€‹αž‚αžΊβ€‹αž’αžΆαž…β€‹αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™β€‹αžšαž½αž…β€‹αž αžΎαž™β€‹αžαžΆαž˜β€‹αž˜αž’αŸ’αž™αŸ„αž”αžΆαž™β€‹αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžšαŸ”

αžŠαžΌαž…αŸ’αž“αŸαŸ‡β€‹αžαŸ’αž‰αž»αŸ†β€‹αž…αž„αŸ‹β€‹αž‘αŸ…β€‹αž€αžΆαž“αŸ‹β€‹αžαŸ‚β€‹αž†αŸ’αž„αžΆαž™β€‹αž‘αŸ…β€‹αž˜αž»αžβ€‹αžœαž„αŸ‹β€‹αž—αŸ’αž›αŸαž„β€‹αž•αŸ’αž‘αžΆαž›αŸ‹αŸ”

αž§αž‘αžΆαž αžšαžŽαŸαž˜αž½αž™αž‚αžΊαž™αž“αŸ’αžαž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαžšαž”αžŸαŸ‹ Docker αžŠαŸ‚αž›αž αŸ…αžαžΆ Docker Swarm αžŠαŸ‚αž›αž…αŸαž‰αž˜αž€αž€αŸ’αžšαŸ…αž”αŸ’αžšαž’αž”αŸ‹αŸ” αžαŸ’αž‰αž»αŸ†αž…αž„αŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž’αŸ’αžœαžΈαž˜αž½αž™αž“αŸ…αž€αŸ’αž“αž»αž„αž•αž›αž·αžαž€αž˜αŸ’αž˜αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαž”αž…αŸ’αž…αŸαž€αžœαž·αž‘αŸ’αž™αžΆ Docker Swarm αŸ”

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

αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αž‡αžΆαž˜αž½αž™ Docker αž“αž·αž„ Gitlab CI

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

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