āĻ—āĻŋāĻŸāĻ˛ā§āĻ¯āĻžāĻŦ āĻļā§‡āĻ˛ āĻ°āĻžāĻ¨āĻžāĻ°āĨ¤ āĻĄāĻ•āĻžāĻ° āĻ•āĻŽā§āĻĒā§‹āĻœā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻĒā§āĻ°āĻ¤āĻŋāĻ¯ā§‹āĻ—āĻŋāĻ¤āĻžāĻŽā§‚āĻ˛āĻ•āĻ­āĻžāĻŦā§‡ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ¯ā§‹āĻ—ā§āĻ¯ āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻž āĻšāĻžāĻ˛ā§ āĻ•āĻ°ā§āĻ¨

āĻ—āĻŋāĻŸāĻ˛ā§āĻ¯āĻžāĻŦ āĻļā§‡āĻ˛ āĻ°āĻžāĻ¨āĻžāĻ°āĨ¤ āĻĄāĻ•āĻžāĻ° āĻ•āĻŽā§āĻĒā§‹āĻœā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻĒā§āĻ°āĻ¤āĻŋāĻ¯ā§‹āĻ—āĻŋāĻ¤āĻžāĻŽā§‚āĻ˛āĻ•āĻ­āĻžāĻŦā§‡ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ¯ā§‹āĻ—ā§āĻ¯ āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻž āĻšāĻžāĻ˛ā§ āĻ•āĻ°ā§āĻ¨

āĻāĻ‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻŸāĻŋ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻ• āĻāĻŦāĻ‚ āĻŦāĻŋāĻ•āĻžāĻļāĻ•āĻžāĻ°ā§€ āĻ‰āĻ­āĻ¯āĻŧā§‡āĻ° āĻœāĻ¨ā§āĻ¯āĻ‡ āĻ†āĻ—ā§āĻ°āĻšā§‡āĻ° āĻŦāĻŋāĻˇāĻ¯āĻŧ āĻšāĻŦā§‡, āĻ¤āĻŦā§‡ āĻāĻŸāĻŋ āĻŽā§‚āĻ˛āĻ¤ āĻ…āĻŸā§‹āĻŽā§‡āĻļāĻ¨ āĻŦāĻŋāĻļā§‡āĻˇāĻœā§āĻžāĻĻā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¯āĻžāĻ°āĻž āĻ…āĻĒāĻ°ā§āĻ¯āĻžāĻĒā§āĻ¤ āĻĒāĻ°āĻŋāĻ•āĻžāĻ āĻžāĻŽā§‹ āĻ¸āĻ‚āĻ¸ā§āĻĨāĻžāĻ¨ āĻāĻŦāĻ‚/āĻ…āĻĨāĻŦāĻž āĻāĻ•āĻŸāĻŋ āĻ•āĻ¨ā§āĻŸā§‡āĻ‡āĻ¨āĻžāĻ°ā§‡āĻ° āĻ…āĻ¨ā§āĻĒāĻ¸ā§āĻĨāĻŋāĻ¤āĻŋāĻ¤ā§‡ āĻ‡āĻ¨ā§āĻŸāĻŋāĻ—ā§āĻ°ā§‡āĻļāĻ¨ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ—āĻŋāĻŸāĻ˛ā§āĻ¯āĻžāĻŦ āĻ¸āĻŋāĻ†āĻ‡/āĻ¸āĻŋāĻĄāĻŋ āĻ¸ā§‡āĻŸ āĻ†āĻĒ āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¸ā§āĻ¯āĻžāĻ° āĻ¸āĻŽā§āĻŽā§āĻ–ā§€āĻ¨ āĻšāĻ¨āĨ¤ āĻ…āĻ°ā§āĻ•ā§‡āĻ¸ā§āĻŸā§āĻ°ā§‡āĻļāĻ¨ āĻĒā§āĻ˛ā§āĻ¯āĻžāĻŸāĻĢāĻ°ā§āĻŽāĨ¤ āĻ†āĻŽāĻŋ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻŦāĻ˛āĻŦ āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻāĻ•āĻŸāĻŋ āĻāĻ•āĻ• āĻ—āĻŋāĻŸāĻ˛ā§āĻ¯āĻžāĻŦ āĻļā§‡āĻ˛ āĻ°āĻžāĻ¨āĻžāĻ°ā§‡ āĻĄāĻ•āĻžāĻ° āĻ•āĻŽā§āĻĒā§‹āĻœ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻĒāĻ°āĻŋāĻŦā§‡āĻļā§‡āĻ° āĻ¸ā§āĻĨāĻžāĻĒāĻ¨āĻž āĻ¸ā§‡āĻŸ āĻ†āĻĒ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻ¯āĻŧ āĻāĻŦāĻ‚ āĻ¯āĻžāĻ¤ā§‡ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āĻ¨ āĻĒāĻ°āĻŋāĻŦā§‡āĻļ āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ, āĻšāĻžāĻ˛ā§ āĻ•āĻ°āĻž āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻžāĻ—ā§āĻ˛āĻŋ āĻāĻ•ā§‡ āĻ…āĻĒāĻ°ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻšāĻ¸ā§āĻ¤āĻ•ā§āĻˇā§‡āĻĒ āĻ¨āĻž āĻ•āĻ°ā§‡āĨ¤


āĻ¸āĻ¨ā§āĻ¤ā§āĻˇā§āĻŸ

āĻ…āĻĒāĻ°āĻŋāĻšāĻžāĻ°ā§āĻ¯

  1. āĻ†āĻŽāĻžāĻ° āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ā§‡, āĻāĻŸāĻŋ āĻĒā§āĻ°āĻžāĻ¯āĻŧāĻļāĻ‡ āĻ˜āĻŸā§‡āĻ›āĻŋāĻ˛ āĻ¯ā§‡ āĻ‡āĻ¨ā§āĻŸāĻŋāĻ—ā§āĻ°ā§‡āĻļāĻ¨ āĻŸā§‡āĻ¸ā§āĻŸāĻŋāĻ‚ āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒāĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ "āĻšāĻŋāĻ•āĻŋāĻ¤ā§āĻ¸āĻž" āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛āĨ¤ āĻāĻŦāĻ‚ āĻĒā§āĻ°āĻžāĻ¯āĻŧāĻ‡ āĻĒā§āĻ°āĻĨāĻŽ āĻāĻŦāĻ‚ āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻ‰āĻ˛ā§āĻ˛ā§‡āĻ–āĻ¯ā§‹āĻ—ā§āĻ¯ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻšāĻ˛ CI āĻĒāĻžāĻ‡āĻĒāĻ˛āĻžāĻ‡āĻ¨, āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻ‡āĻ¨ā§āĻŸāĻŋāĻ—ā§āĻ°ā§‡āĻļāĻ¨ āĻŸā§‡āĻ¸ā§āĻŸāĻŋāĻ‚ āĻŦāĻŋāĻ•āĻļāĻŋāĻ¤ āĻšāĻšā§āĻ›ā§‡ āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻž(āĻ—ā§āĻ˛āĻŋ) āĻāĻ•āĻŸāĻŋ āĻĄā§‡āĻ­/āĻ¸ā§āĻŸā§‡āĻœ āĻĒāĻ°āĻŋāĻŦā§‡āĻļā§‡ āĻ¸āĻžā§āĻšāĻžāĻ˛āĻŋāĻ¤ āĻšāĻ¯āĻŧāĨ¤ āĻāĻŸāĻŋ āĻŦā§‡āĻļ āĻ•āĻ¯āĻŧā§‡āĻ•āĻŸāĻŋ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻžāĻ° āĻ¸ā§ƒāĻˇā§āĻŸāĻŋ āĻ•āĻ°ā§‡āĻ›ā§‡:

    • āĻ‡āĻ¨ā§āĻŸāĻŋāĻ—ā§āĻ°ā§‡āĻļāĻ¨ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻžāĻ° āĻ¤ā§āĻ°ā§āĻŸāĻŋāĻ° āĻ•āĻžāĻ°āĻŖā§‡, āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻ¸āĻžāĻ°ā§āĻ•āĻŋāĻŸāĻŸāĻŋ āĻ­āĻžāĻ™āĻž āĻĄā§‡āĻŸāĻž āĻĻā§āĻŦāĻžāĻ°āĻž āĻ•ā§āĻˇāĻ¤āĻŋāĻ—ā§āĻ°āĻ¸ā§āĻ¤ āĻšāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤ āĻāĻŽāĻ¨ āĻ•āĻŋāĻ›ā§ āĻ˜āĻŸāĻ¨āĻž āĻ˜āĻŸā§‡āĻ›ā§‡ āĻ¯āĻ–āĻ¨ āĻāĻ•āĻŸāĻŋ āĻ­āĻžāĻ™āĻž JSON āĻĢāĻ°ā§āĻŽā§āĻ¯āĻžāĻŸā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻāĻ•āĻŸāĻŋ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻžāĻŸāĻŋ āĻ•ā§āĻ°ā§āĻ¯āĻžāĻļ āĻ•āĻ°ā§‡, āĻ¯āĻž āĻ¸ā§āĻŸā§āĻ¯āĻžāĻ¨ā§āĻĄāĻŸāĻŋāĻ•ā§‡ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖāĻ°ā§‚āĻĒā§‡ āĻ…āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻ° āĻ•āĻ°ā§‡ āĻ¤ā§āĻ˛ā§‡āĻ›āĻŋāĻ˛āĨ¤
    • āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻĄā§‡āĻŸāĻž āĻŦā§ƒāĻĻā§āĻ§āĻŋāĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻžāĻĨā§‡ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻ¸āĻžāĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ° āĻŽāĻ¨ā§āĻĨāĻ°āĻ¤āĻžāĨ¤ āĻ†āĻŽāĻŋ āĻŽāĻ¨ā§‡ āĻ•āĻ°āĻŋ āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ āĻĒāĻ°āĻŋāĻˇā§āĻ•āĻžāĻ°/āĻ°ā§‹āĻ˛ āĻŦā§āĻ¯āĻžāĻ• āĻ•āĻ°āĻžāĻ° āĻ¸āĻžāĻĨā§‡ āĻāĻ•āĻŸāĻŋ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻ•āĻ°āĻžāĻ° āĻ•ā§‹āĻ¨ āĻ…āĻ°ā§āĻĨ āĻ¨ā§‡āĻ‡āĨ¤ āĻ†āĻŽāĻžāĻ° āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ā§‡, āĻ†āĻŽāĻŋ āĻāĻŽāĻ¨ āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒā§‡āĻ° āĻ¸āĻŽā§āĻŽā§āĻ–ā§€āĻ¨ āĻšāĻ‡āĻ¨āĻŋ āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻāĻ‡ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻŸāĻŋ āĻ¸ā§āĻšāĻžāĻ°ā§āĻ­āĻžāĻŦā§‡ āĻšāĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤
    • āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻ¸āĻžāĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ° āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻžāĻ°āĻŋāĻ¤āĻž āĻŦā§āĻ¯āĻžāĻšāĻ¤ āĻ•āĻ°āĻžāĻ° āĻā§āĻāĻ•āĻŋāĨ¤ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€/āĻ—ā§āĻ°ā§āĻĒ/āĻĒāĻžāĻ¸āĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻĄ/āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻ¨ā§€āĻ¤āĻŋāĨ¤
    • āĻ¸ā§āĻŦāĻ¯āĻŧāĻ‚āĻ•ā§āĻ°āĻŋāĻ¯āĻŧ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻĨā§‡āĻ•ā§‡ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻĄā§‡āĻŸāĻž āĻŽā§āĻ¯āĻžāĻ¨ā§āĻ¯āĻŧāĻžāĻ˛ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻ•āĻĻā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻœā§€āĻŦāĻ¨ āĻ•āĻ āĻŋāĻ¨ āĻ•āĻ°ā§‡ āĻ¤ā§‹āĻ˛ā§‡āĨ¤

    āĻ•ā§‡āĻ‰ āĻ•ā§‡āĻ‰ āĻŦāĻ˛āĻŦā§‡āĻ¨ āĻ¯ā§‡ āĻ­āĻžāĻ˛ āĻ…āĻŸā§‹āĻŸā§‡āĻ¸ā§āĻŸā§‡āĻ° āĻ¨āĻŋāĻœā§‡āĻ° āĻĒāĻ°ā§‡ āĻĄā§‡āĻŸāĻž āĻĒāĻ°āĻŋāĻˇā§āĻ•āĻžāĻ° āĻ•āĻ°āĻž āĻ‰āĻšāĻŋāĻ¤āĨ¤ āĻ†āĻŽāĻžāĻ° āĻŦāĻŋāĻ°ā§āĻĻā§āĻ§ā§‡ āĻ¯ā§āĻ•ā§āĻ¤āĻŋ āĻ†āĻ›ā§‡:

    • āĻĄāĻžāĻ‡āĻ¨āĻžāĻŽāĻŋāĻ• āĻ¸ā§āĻŸā§āĻ¯āĻžāĻ¨ā§āĻĄ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ–ā§āĻŦāĻ‡ āĻ¸ā§āĻŦāĻŋāĻ§āĻžāĻœāĻ¨āĻ•āĨ¤
    • āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻŦāĻ¸ā§āĻ¤ā§ API āĻāĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻĨā§‡āĻ•ā§‡ āĻ¸āĻ°āĻžāĻ¨ā§‹ āĻ¯āĻžāĻŦā§‡ āĻ¨āĻžāĨ¤ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻāĻ•āĻŸāĻŋ āĻŦāĻ¸ā§āĻ¤ā§ āĻŽā§āĻ›ā§‡ āĻĢā§‡āĻ˛āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ•āĻ˛ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻŋāĻ¤ āĻšāĻ¯āĻŧāĻ¨āĻŋ āĻ•āĻžāĻ°āĻŖ āĻāĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻ¸āĻžāĻ¯āĻŧāĻŋāĻ• āĻ¯ā§āĻ•ā§āĻ¤āĻŋāĻ° āĻŦāĻŋāĻ°ā§‹āĻ§āĻŋāĻ¤āĻž āĻ•āĻ°ā§‡ā§ˇ
    • API āĻāĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻāĻ•āĻŸāĻŋ āĻŦāĻ¸ā§āĻ¤ā§ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ, āĻĒā§āĻ°āĻšā§āĻ° āĻĒāĻ°āĻŋāĻŽāĻžāĻŖā§‡ āĻŽā§‡āĻŸāĻžāĻĄā§‡āĻŸāĻž āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡, āĻ¯āĻž āĻŽā§āĻ›ā§‡ āĻĢā§‡āĻ˛āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻžāĻ¯ā§āĻ•ā§āĻ¤āĨ¤
    • āĻ¯āĻĻāĻŋ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ—ā§āĻ˛āĻŋāĻ° āĻ¨āĻŋāĻœā§‡āĻĻā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¤āĻž āĻĨāĻžāĻ•ā§‡, āĻ¤āĻŦā§‡ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻšāĻžāĻ˛āĻžāĻ¨ā§‹āĻ° āĻĒāĻ°ā§‡ āĻĄā§‡āĻŸāĻž āĻĒāĻ°āĻŋāĻˇā§āĻ•āĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻŸāĻŋ āĻŽāĻžāĻĨāĻžāĻŦā§āĻ¯āĻĨāĻžāĻ¯āĻŧ āĻĒāĻ°āĻŋāĻŖāĻ¤ āĻšāĻ¯āĻŧāĨ¤
    • āĻ…āĻ¤āĻŋāĻ°āĻŋāĻ•ā§āĻ¤ (āĻāĻŦāĻ‚, āĻ†āĻŽāĻžāĻ° āĻŽāĻ¤ā§‡, āĻ¨ā§āĻ¯āĻžāĻ¯ā§āĻ¯ āĻ¨āĻ¯āĻŧ) API-āĻ¤ā§‡ āĻ•āĻ˛āĨ¤
    • āĻāĻŦāĻ‚ āĻĒā§āĻ°āĻ§āĻžāĻ¨ āĻ¯ā§āĻ•ā§āĻ¤āĻŋ: āĻ¯āĻ–āĻ¨ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻĄā§‡āĻŸāĻž āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ āĻĨā§‡āĻ•ā§‡ āĻ¸āĻ°āĻžāĻ¸āĻ°āĻŋ āĻ¸āĻžāĻĢ āĻ•āĻ°āĻž āĻļā§āĻ°ā§ āĻšāĻ¯āĻŧāĨ¤ āĻāĻŸāĻŋ āĻāĻ•āĻŸāĻŋ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦ PK/FK āĻ¸āĻžāĻ°ā§āĻ•āĻžāĻ¸ā§‡ āĻĒāĻ°āĻŋāĻŖāĻ¤ āĻšāĻšā§āĻ›ā§‡! āĻ†āĻŽāĻ°āĻž āĻĄā§‡āĻ­ā§‡āĻ˛āĻĒāĻžāĻ°āĻĻā§‡āĻ° āĻ•āĻžāĻ› āĻĨā§‡āĻ•ā§‡ āĻļā§āĻ¨ā§‡āĻ›āĻŋ: "āĻ†āĻŽāĻŋ āĻāĻ‡āĻŽāĻžāĻ¤ā§āĻ° āĻāĻ•āĻŸāĻŋ āĻšāĻŋāĻšā§āĻ¨ āĻ¯ā§‹āĻ—/āĻŽā§āĻ›ā§‡ āĻĢā§‡āĻ˛ā§‡āĻ›āĻŋ/āĻ¨āĻžāĻŽ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°ā§‡āĻ›āĻŋ, āĻ•ā§‡āĻ¨ 100500 āĻ‡āĻ¨ā§āĻŸāĻŋāĻ—ā§āĻ°ā§‡āĻļāĻ¨ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ§āĻ°āĻž āĻĒāĻĄāĻŧā§‡āĻ›āĻŋāĻ˛?"

    āĻ†āĻŽāĻžāĻ° āĻŽāĻ¤ā§‡, āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻ…āĻ¨ā§āĻ•ā§‚āĻ˛ āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ āĻšāĻ˛ āĻāĻ•āĻŸāĻŋ āĻ—āĻ¤āĻŋāĻļā§€āĻ˛ āĻĒāĻ°āĻŋāĻŦā§‡āĻļāĨ¤

  2. āĻ…āĻ¨ā§‡āĻ• āĻ˛ā§‹āĻ• āĻāĻ•āĻŸāĻŋ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻĒāĻ°āĻŋāĻŦā§‡āĻļ āĻšāĻžāĻ˛āĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯ āĻĄāĻ•āĻžāĻ°-āĻ•āĻŽā§āĻĒā§‹āĻœ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ CI/CD-āĻ āĻ‡āĻ¨ā§āĻŸāĻŋāĻ—ā§āĻ°ā§‡āĻļāĻ¨ āĻŸā§‡āĻ¸ā§āĻŸāĻŋāĻ‚ āĻĒāĻ°āĻŋāĻšāĻžāĻ˛āĻ¨āĻž āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ–ā§āĻŦ āĻ•āĻŽ āĻ˛ā§‹āĻ•āĻ‡ āĻĄāĻ•āĻžāĻ°-āĻ•āĻŽā§āĻĒā§‹āĻœ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡āĨ¤ āĻāĻŦāĻ‚ āĻāĻ–āĻžāĻ¨ā§‡ āĻ†āĻŽāĻŋ āĻ•ā§āĻŦāĻžāĻ°āĻ¨ā§‡āĻŸ, āĻāĻžāĻāĻ• āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻ§āĻžāĻ°āĻ• āĻ…āĻ°ā§āĻ•ā§‡āĻ¸ā§āĻŸā§āĻ°ā§‡āĻļāĻ¨ āĻĒā§āĻ˛ā§āĻ¯āĻžāĻŸāĻĢāĻ°ā§āĻŽāĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻŦāĻŋāĻŦā§‡āĻšāĻ¨āĻž āĻ•āĻ°āĻ›āĻŋ āĻ¨āĻžāĨ¤ āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ•ā§‹āĻŽā§āĻĒāĻžāĻ¨āĻŋ āĻ¤āĻžāĻĻā§‡āĻ° āĻ†āĻ›ā§‡ āĻ¨āĻž. docker-compose.yml āĻ¸āĻžāĻ°ā§āĻŦāĻœāĻ¨ā§€āĻ¨ āĻšāĻ˛ā§‡ āĻ­āĻžāĻ˛ā§‹ āĻšāĻŦā§‡āĨ¤
  3. āĻāĻŽāĻ¨āĻ•āĻŋ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ¨āĻŋāĻœāĻ¸ā§āĻŦ QA āĻ°āĻžāĻ¨āĻžāĻ° āĻĨāĻžāĻ•āĻ˛ā§‡āĻ“, āĻ†āĻŽāĻ°āĻž āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ āĻ¯ā§‡ āĻĄāĻ•āĻžāĻ°-āĻ•āĻŽā§āĻĒā§‹āĻœā§‡āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻšāĻžāĻ˛ā§ āĻ•āĻ°āĻž āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻžāĻ—ā§āĻ˛āĻŋ āĻāĻ•ā§‡ āĻ…āĻĒāĻ°ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻšāĻ¸ā§āĻ¤āĻ•ā§āĻˇā§‡āĻĒ āĻ•āĻ°ā§‡ āĻ¨āĻž?
  4. āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻŋāĻ¤ āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻžāĻ° āĻ˛āĻ— āĻ¸āĻ‚āĻ—ā§āĻ°āĻš āĻ•āĻ°āĻ¤ā§‡?
  5. āĻ°āĻžāĻ¨āĻžāĻ° āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻĒāĻ°āĻŋāĻˇā§āĻ•āĻžāĻ° āĻ•āĻ°āĻŦā§‡āĻ¨?

āĻ†āĻŽāĻžāĻ° āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒāĻ—ā§āĻ˛āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻŽāĻžāĻ° āĻ¨āĻŋāĻœāĻ¸ā§āĻŦ āĻ—āĻŋāĻŸāĻ˛ā§āĻ¯āĻžāĻŦ āĻ°āĻžāĻ¨āĻžāĻ° āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡ āĻāĻŦāĻ‚ āĻ†āĻŽāĻŋ āĻŦāĻŋāĻ•āĻžāĻļā§‡āĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻāĻ‡ āĻĒā§āĻ°āĻļā§āĻ¨ā§‡āĻ° āĻ¸āĻŽā§āĻŽā§āĻ–ā§€āĻ¨ āĻšāĻ¯āĻŧā§‡āĻ›āĻŋ āĻœāĻžāĻ­āĻž āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻĨā§‡āĻ•ā§‡ āĻŸā§‡āĻ¸ā§āĻŸāĻ°ā§‡āĻ˛. āĻ†āĻ°āĻ“ āĻ¸ā§āĻĒāĻˇā§āĻŸāĻ­āĻžāĻŦā§‡, āĻ‡āĻ¨ā§āĻŸāĻŋāĻ—ā§āĻ°ā§‡āĻļāĻ¨ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻšāĻžāĻ˛āĻžāĻ¨ā§‹āĻ° āĻ¸āĻŽāĻ¯āĻŧāĨ¤ āĻ¨ā§€āĻšā§‡ āĻ†āĻŽāĻ°āĻž āĻāĻ‡ āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒā§‡āĻ° āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻāĻ‡ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻžāĻ—ā§āĻ˛āĻŋ āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ āĻ•āĻ°āĻŦāĨ¤

āĻŦāĻŋāĻˇāĻ¯āĻŧāĻŦāĻ¸ā§āĻ¤ā§

āĻ—āĻŋāĻŸāĻ˛ā§āĻ¯āĻžāĻŦ āĻļā§‡āĻ˛ āĻ°āĻžāĻ¨āĻžāĻ°

āĻāĻ•āĻœāĻ¨ āĻ°āĻžāĻ¨āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻ†āĻŽāĻŋ 4 vCPU, 4 GB RAM, 50 GB HDD āĻ¸āĻš āĻāĻ•āĻŸāĻŋ Linux āĻ­āĻžāĻ°ā§āĻšā§āĻ¯āĻŧāĻžāĻ˛ āĻŽā§‡āĻļāĻŋāĻ¨ā§‡āĻ° āĻ¸ā§āĻĒāĻžāĻ°āĻŋāĻļ āĻ•āĻ°āĻ›āĻŋāĨ¤
āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻ¨ā§‡āĻŸā§‡ āĻ—āĻŋāĻŸāĻ˛ā§āĻ¯āĻžāĻŦ-āĻ°āĻžāĻ¨āĻžāĻ° āĻ¸ā§‡āĻŸ āĻ†āĻĒ āĻ•āĻ°āĻžāĻ° āĻŦāĻŋāĻˇāĻ¯āĻŧā§‡ āĻ…āĻ¨ā§‡āĻ• āĻ¤āĻĨā§āĻ¯ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡, āĻ¤āĻžāĻ‡ āĻ¸āĻ‚āĻ•ā§āĻˇā§‡āĻĒā§‡:

  • SSH āĻāĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻŽā§‡āĻļāĻŋāĻ¨ā§‡ āĻ˛āĻ—āĻ‡āĻ¨ āĻ•āĻ°ā§āĻ¨
  • āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¯āĻĻāĻŋ 8 āĻ—āĻŋāĻ—āĻžāĻŦāĻžāĻ‡āĻŸā§‡āĻ° āĻ•āĻŽ āĻ°â€ā§āĻ¯āĻžāĻŽ āĻĨāĻžāĻ•ā§‡ āĻ¤āĻŦā§‡ āĻ†āĻŽāĻŋ āĻ¸ā§āĻĒāĻžāĻ°āĻŋāĻļ āĻ•āĻ°āĻŋ 10 āĻœāĻŋāĻŦāĻŋ āĻ…āĻĻāĻ˛āĻŦāĻĻāĻ˛ āĻ•āĻ°ā§āĻ¨āĻ¯āĻžāĻ¤ā§‡ āĻ“āĻ“āĻāĻŽ āĻ•āĻŋāĻ˛āĻžāĻ° āĻāĻ¸ā§‡ āĻ°â€ā§āĻ¯āĻžāĻŽā§‡āĻ° āĻ…āĻ­āĻžāĻŦā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ•āĻžāĻœāĻ—ā§āĻ˛ā§‹ āĻŽā§‡āĻ°ā§‡ āĻĢā§‡āĻ˛āĻ¤ā§‡ āĻ¨āĻž āĻĒāĻžāĻ°ā§‡āĨ¤ āĻāĻŸāĻŋ āĻ˜āĻŸāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻ¯āĻ–āĻ¨ 5āĻŸāĻŋāĻ° āĻŦā§‡āĻļāĻŋ āĻ•āĻžāĻœ āĻāĻ•āĻ¸āĻžāĻĨā§‡ āĻšāĻžāĻ˛ā§ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻ•āĻžāĻœāĻ—ā§āĻ˛āĻŋ āĻ†āĻ°āĻ“ āĻ§ā§€āĻ°ā§‡ āĻ§ā§€āĻ°ā§‡ āĻ¤āĻŦā§‡ āĻ¸ā§āĻĨāĻŋāĻ°āĻ­āĻžāĻŦā§‡ āĻ…āĻ—ā§āĻ°āĻ¸āĻ° āĻšāĻŦā§‡āĨ¤

    OOM āĻšāĻ¤ā§āĻ¯āĻžāĻ•āĻžāĻ°ā§€āĻ° āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ

    āĻ†āĻĒāĻ¨āĻŋ āĻŸāĻžāĻ¸ā§āĻ• āĻ˛āĻ— āĻĻā§‡āĻ–āĻ¤ā§‡ āĻšāĻ˛ā§‡ bash: line 82: 26474 Killed, āĻ¤āĻžāĻ°āĻĒāĻ° āĻļā§āĻ§ā§ āĻ°āĻžāĻ¨āĻžāĻ° āĻ‰āĻĒāĻ° āĻšāĻžāĻ˛āĻžāĻ¨ā§‹ sudo dmesg | grep 26474

    [26474]  1002 26474  1061935   123806     339        0             0 java
    Out of memory: Kill process 26474 (java) score 127 or sacrifice child
    Killed process 26474 (java) total-vm:4247740kB, anon-rss:495224kB, file-rss:0kB, shmem-rss:0kB

    āĻāĻŦāĻ‚ āĻ¯āĻĻāĻŋ āĻ›āĻŦāĻŋāĻŸāĻŋ āĻāĻ°āĻ•āĻŽ āĻ•āĻŋāĻ›ā§ āĻĻā§‡āĻ–āĻžāĻ¯āĻŧ, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻšāĻ¯āĻŧ āĻ¸ā§‹āĻ¯āĻŧāĻžāĻĒ āĻ¯ā§‹āĻ— āĻ•āĻ°ā§āĻ¨ āĻŦāĻž RAM āĻ¯ā§‹āĻ— āĻ•āĻ°ā§āĻ¨āĨ¤

  • āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°ā§āĻ¨ gitlab-āĻ°āĻžāĻ¨āĻžāĻ°, āĻĄāĻ•āĻļā§āĻ°āĻŽāĻŋāĻ•, Docker-āĻ°āĻšāĻ¨āĻž, āĻ¤ā§ˆāĻ°āĻŋāĨ¤
  • āĻāĻ•āĻœāĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡ gitlab-runner āĻ—ā§āĻ°ā§āĻĒā§‡ docker
    sudo groupadd docker
    sudo usermod -aG docker gitlab-runner
  • āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻ¨ gitlab-āĻ°āĻžāĻ¨āĻžāĻ°
  • āĻ¸āĻŽā§āĻĒāĻžāĻĻāĻ¨āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ–ā§āĻ˛ā§āĻ¨ /etc/gitlab-runner/config.toml āĻāĻŦāĻ‚ āĻ¯ā§‹āĻ— āĻ•āĻ°

    concurrent=20
    [[runners]]
      request_concurrency = 10

    āĻāĻŸāĻŋ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻāĻ• āĻ°āĻžāĻ¨āĻžāĻ°ā§‡ āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻ•āĻžāĻœāĻ—ā§āĻ˛āĻŋ āĻšāĻžāĻ˛āĻžāĻ¨ā§‹āĻ° āĻ…āĻ¨ā§āĻŽāĻ¤āĻŋ āĻĻā§‡āĻŦā§‡āĨ¤ āĻ†āĻ°āĻ“ āĻĒāĻĄāĻŧā§āĻ¨ āĻāĻ–āĻžāĻ¨ā§‡.
    āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¯āĻĻāĻŋ āĻ†āĻ°āĻ“ āĻļāĻ•ā§āĻ¤āĻŋāĻļāĻžāĻ˛ā§€ āĻŽā§‡āĻļāĻŋāĻ¨ āĻĨāĻžāĻ•ā§‡, āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ 8 vCPU, 16 GB RAM, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻāĻ‡ āĻ¸āĻ‚āĻ–ā§āĻ¯āĻžāĻ—ā§āĻ˛āĻŋ āĻ•āĻŽāĻĒāĻ•ā§āĻˇā§‡ 2 āĻ—ā§āĻŖ āĻŦāĻĄāĻŧ āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤ āĻ¤āĻŦā§‡ āĻāĻŸāĻŋ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ¨āĻŋāĻ°ā§āĻ­āĻ° āĻ•āĻ°ā§‡ āĻāĻ‡ āĻ°āĻžāĻ¨āĻžāĻ°āĻŸāĻŋāĻ¤ā§‡ āĻ āĻŋāĻ• āĻ•ā§€ āĻšāĻžāĻ˛ā§ āĻ•āĻ°āĻž āĻšāĻŦā§‡ āĻāĻŦāĻ‚ āĻ•ā§€ āĻĒāĻ°āĻŋāĻŽāĻžāĻŖā§‡āĨ¤

āĻ¯ā§‡ āĻ¯āĻĨā§‡āĻˇā§āĻŸāĨ¤

āĻŦāĻŋāĻˇāĻ¯āĻŧāĻŦāĻ¸ā§āĻ¤ā§

docker-compose.yml āĻĒā§āĻ°āĻ¸ā§āĻ¤ā§āĻ¤ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

āĻĒā§āĻ°āĻ§āĻžāĻ¨ āĻ•āĻžāĻœ āĻšāĻ˛ āĻāĻ•āĻŸāĻŋ āĻ¸āĻžāĻ°ā§āĻŦāĻœāĻ¨ā§€āĻ¨ docker-compose.yml, āĻ¯āĻž āĻĄā§‡āĻ­ā§‡āĻ˛āĻĒāĻžāĻ°/āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻ•āĻ°āĻž āĻ¸ā§āĻĨāĻžāĻ¨ā§€āĻ¯āĻŧāĻ­āĻžāĻŦā§‡ āĻāĻŦāĻ‚ CI āĻĒāĻžāĻ‡āĻĒāĻ˛āĻžāĻ‡āĻ¨ā§‡ āĻ‰āĻ­āĻ¯āĻŧāĻ‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤

āĻĒā§āĻ°āĻĨāĻŽāĻ¤, āĻ†āĻŽāĻ°āĻž CI-āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻ¨āĻ¨ā§āĻ¯ āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻžāĻ° āĻ¨āĻžāĻŽ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻŋāĨ¤ GitLab CI-āĻāĻ° āĻ…āĻ¨āĻ¨ā§āĻ¯ āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛āĻ—ā§āĻ˛āĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻāĻ•āĻŸāĻŋ āĻšāĻ˛ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨āĻļā§€āĻ˛ CI_JOB_ID. āĻ¯āĻĻāĻŋ āĻ†āĻĒāĻ¨āĻŋ āĻ‰āĻ˛ā§āĻ˛ā§‡āĻ– āĻ•āĻ°ā§‡āĻ¨ container_name āĻ…āĻ°ā§āĻĨ āĻ¸āĻš "service-${CI_JOB_ID:-local}", āĻ¤āĻžāĻ°āĻĒāĻ° āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡:

  • āĻ¯āĻĻāĻŋ CI_JOB_ID āĻĒāĻ°āĻŋāĻŦā§‡āĻļ āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛ā§‡ āĻ¸āĻ‚āĻœā§āĻžāĻžāĻ¯āĻŧāĻŋāĻ¤ āĻ¨āĻ¯āĻŧ,
    āĻ¤āĻžāĻšāĻ˛ā§‡ āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻžāĻ° āĻ¨āĻžāĻŽ āĻšāĻŦā§‡ service-local
  • āĻ¯āĻĻāĻŋ CI_JOB_ID āĻĒāĻ°āĻŋāĻŦā§‡āĻļ āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛ā§‡ āĻ¸āĻ‚āĻœā§āĻžāĻžāĻ¯āĻŧāĻŋāĻ¤ (āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ 123),
    āĻ¤āĻžāĻšāĻ˛ā§‡ āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻžāĻ° āĻ¨āĻžāĻŽ āĻšāĻŦā§‡ service-123

āĻĻā§āĻŦāĻŋāĻ¤ā§€āĻ¯āĻŧāĻ¤, āĻ†āĻŽāĻ°āĻž āĻšāĻžāĻ˛ā§ āĻ•āĻ°āĻž āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻžāĻ—ā§āĻ˛āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻ¨ā§‡āĻŸāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ• āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻŋāĨ¤ āĻāĻ•āĻžāĻ§āĻŋāĻ• āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻĒāĻ°āĻŋāĻŦā§‡āĻļ āĻšāĻžāĻ˛āĻžāĻ¨ā§‹āĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻāĻŸāĻŋ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ¨ā§‡āĻŸāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ•-āĻ¸ā§āĻ¤āĻ°ā§‡āĻ° āĻŦāĻŋāĻšā§āĻ›āĻŋāĻ¨ā§āĻ¨āĻ¤āĻž āĻĻā§‡āĻ¯āĻŧāĨ¤

networks:
  default:
    external:
      name: service-network-${CI_JOB_ID:-local}

āĻ†āĻ¸āĻ˛ā§‡, āĻāĻŸāĻŋ āĻ¸āĻžāĻĢāĻ˛ā§āĻ¯ā§‡āĻ° āĻĒā§āĻ°āĻĨāĻŽ āĻ§āĻžāĻĒ =)

āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻ¸āĻš āĻ†āĻŽāĻžāĻ° docker-compose.yml āĻāĻ° āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ

version: "3"

# ДĐģŅ ĐēĐžŅ€Ņ€ĐĩĐēŅ‚ĐŊОК Ņ€Đ°ĐąĐžŅ‚Ņ‹ web (php) и fmt ĐŊŅƒĐļĐŊĐž, 
# Ņ‡Ņ‚ОйŅ‹ ĐēĐžĐŊŅ‚ĐĩĐšĐŊĐĩŅ€Ņ‹ иĐŧĐĩĐģи ОйŅ‰Đ¸Đš иŅĐŋĐžĐģĐŊŅĐĩĐŧŅ‹Đš ĐēĐžĐŊŅ‚ĐĩĐŊŅ‚.
# В ĐŊĐ°ŅˆĐĩĐŧ ŅĐģŅƒŅ‡Đ°Đĩ, ŅŅ‚Đž диŅ€ĐĩĐēŅ‚ĐžŅ€Đ¸Ņ /var/www/testrail
volumes:
  static-content:

# ИСОĐģиŅ€ŅƒĐĩĐŧ ĐžĐēŅ€ŅƒĐļĐĩĐŊиĐĩ ĐŊĐ° ŅĐĩŅ‚ĐĩвОĐŧ ŅƒŅ€ĐžĐ˛ĐŊĐĩ
networks:
  default:
    external:
      name: testrail-network-${CI_JOB_ID:-local}

services:
  db:
    image: mysql:5.7.22
    # КаĐļĐ´Ņ‹Đš container_name ŅĐžĐ´ĐĩŅ€ĐļиŅ‚ ${CI_JOB_ID:-local}
    container_name: "testrail-mysql-${CI_JOB_ID:-local}"
    environment:
      MYSQL_HOST: db
      MYSQL_DATABASE: mydb
      MYSQL_ROOT_PASSWORD: 1234
      SKIP_GRANT_TABLES: 1
      SKIP_NETWORKING: 1
      SERVICE_TAGS: dev
      SERVICE_NAME: mysql
    networks:
    - default

  migration:
    image: registry.gitlab.com/touchbit/image/testrail/migration:latest
    container_name: "testrail-migration-${CI_JOB_ID:-local}"
    links:
    - db
    depends_on:
    - db
    networks:
    - default

  fpm:
    image: registry.gitlab.com/touchbit/image/testrail/fpm:latest
    container_name: "testrail-fpm-${CI_JOB_ID:-local}"
    volumes:
    - static-content:/var/www/testrail
    links:
    - db
    networks:
    - default

  web:
    image: registry.gitlab.com/touchbit/image/testrail/web:latest
    container_name: "testrail-web-${CI_JOB_ID:-local}"
    # ЕŅĐģи ĐŋĐĩŅ€ĐĩĐŧĐĩĐŊĐŊŅ‹Đĩ TR_HTTP_PORT иĐģи TR_HTTPS_PORTS ĐŊĐĩ ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊŅ‹,
    # Ņ‚Đž ŅĐĩŅ€Đ˛Đ¸Ņ ĐŋОдĐŊиĐŧĐ°ĐĩŅ‚ŅŅ ĐŊĐ° 80 и 443 ĐŋĐžŅ€Ņ‚Ņƒ ŅĐžĐžŅ‚вĐĩŅ‚ŅŅ‚вĐĩĐŊĐŊĐž.
    ports:
      - ${TR_HTTP_PORT:-80}:80
      - ${TR_HTTPS_PORT:-443}:443
    volumes:
      - static-content:/var/www/testrail
    links:
      - db
      - fpm
    networks:
      - default

āĻ¸ā§āĻĨāĻžāĻ¨ā§€āĻ¯āĻŧ āĻ°āĻžāĻ¨ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ

docker-compose -f docker-compose.yml up -d
Starting   testrail-mysql-local     ... done
Starting   testrail-migration-local ... done
Starting   testrail-fpm-local       ... done
Recreating testrail-web-local       ... done

āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ¸āĻŋāĻ†āĻ‡āĻ¤ā§‡ āĻ˛āĻžā§āĻš āĻ•āĻ°āĻžāĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻŦāĻ•āĻŋāĻ›ā§ āĻāĻ¤ āĻ¸āĻšāĻœ āĻ¨āĻ¯āĻŧāĨ¤

āĻŦāĻŋāĻˇāĻ¯āĻŧāĻŦāĻ¸ā§āĻ¤ā§

āĻŽā§‡āĻ•āĻĢāĻžāĻ‡āĻ˛ āĻĒā§āĻ°āĻ¸ā§āĻ¤ā§āĻ¤ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

āĻ†āĻŽāĻŋ āĻŽā§‡āĻ•āĻĢāĻžāĻ‡āĻ˛ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŋ āĻ•āĻžāĻ°āĻŖ āĻāĻŸāĻŋ āĻ¸ā§āĻĨāĻžāĻ¨ā§€āĻ¯āĻŧ āĻĒāĻ°āĻŋāĻŦā§‡āĻļ āĻŦā§āĻ¯āĻŦāĻ¸ā§āĻĨāĻžāĻĒāĻ¨āĻž āĻāĻŦāĻ‚ āĻ¸āĻŋāĻ†āĻ‡ āĻ‰āĻ­āĻ¯āĻŧā§‡āĻ° āĻœāĻ¨ā§āĻ¯āĻ‡ āĻ–ā§āĻŦ āĻ¸ā§āĻŦāĻŋāĻ§āĻžāĻœāĻ¨āĻ•āĨ¤ āĻ†āĻ°ā§‹ āĻ…āĻ¨āĻ˛āĻžāĻ‡āĻ¨ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯

# ĐŖ ĐŧĐĩĐŊŅ в ĐŋŅ€ĐžĐĩĐēŅ‚Đ°Ņ… вŅĐĩ вŅĐŋĐžĐŧĐžĐŗĐ°Ņ‚ĐĩĐģŅŒĐŊŅ‹Đĩ вĐĩŅ‰Đ¸ ĐģĐĩĐļĐ°Ņ‚ в диŅ€ĐĩĐēŅ‚ĐžŅ€Đ¸Đ¸ `.indirect`,
# в Ņ‚ĐžĐŧ Ņ‡Đ¸ŅĐģĐĩ и `docker-compose.yml`

# ИŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ bash Ņ ĐžĐŋŅ†Đ¸ĐĩĐš pipefail 
# pipefail - Ņ„ĐĩĐšĐģиŅ‚ вŅ‹ĐŋĐžĐģĐŊĐĩĐŊиĐĩ ĐŋĐ°ĐšĐŋĐ°, ĐĩŅĐģи ĐēĐžĐŧĐ°ĐŊĐ´Đ° вŅ‹ĐŋĐžĐģĐŊиĐģĐ°ŅŅŒ Ņ ĐžŅˆĐ¸ĐąĐēОК
SHELL=/bin/bash -o pipefail

# ОŅŅ‚Đ°ĐŊавĐģиваĐĩĐŧ ĐēĐžĐŊŅ‚ĐĩĐšĐŊĐĩŅ€Ņ‹ и ŅƒĐ´Đ°ĐģŅĐĩĐŧ ŅĐĩŅ‚ŅŒ
docker-kill:
    docker-compose -f $${CI_JOB_ID:-.indirect}/docker-compose.yml kill
    docker network rm network-$${CI_JOB_ID:-testrail} || true

# ПŅ€ĐĩдваŅ€Đ¸Ņ‚ĐĩĐģŅŒĐŊĐž вŅ‹ĐŋĐžĐģĐŊŅĐĩĐŧ docker-kill 
docker-up: docker-kill
    # ХОСдаĐĩĐŧ ŅĐĩŅ‚ŅŒ Đ´ĐģŅ ĐžĐēŅ€ŅƒĐļĐĩĐŊиŅ 
    docker network create network-$${CI_JOB_ID:-testrail}
    # ЗабиŅ€Đ°ĐĩĐŧ ĐŋĐžŅĐģĐĩĐ´ĐŊиĐĩ ОйŅ€Đ°ĐˇŅ‹ иС docker-registry
    docker-compose -f $${CI_JOB_ID:-.indirect}/docker-compose.yml pull
    # ЗаĐŋŅƒŅĐēĐ°ĐĩĐŧ ĐžĐēŅ€ŅƒĐļĐĩĐŊиĐĩ
    # force-recreate - ĐŋŅ€Đ¸ĐŊŅƒĐ´Đ¸Ņ‚ĐĩĐģŅŒĐŊĐžĐĩ ĐŋĐĩŅ€ĐĩŅĐžĐˇĐ´Đ°ĐŊиĐĩ ĐēĐžĐŊŅ‚ĐĩĐšĐŊĐĩŅ€ĐžĐ˛
    # renew-anon-volumes - ĐŊĐĩ иŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ volumes ĐŋŅ€ĐĩĐ´Ņ‹Đ´ŅƒŅ‰Đ¸Ņ… ĐēĐžĐŊŅ‚ĐĩĐšĐŊĐĩŅ€ĐžĐ˛
    docker-compose -f $${CI_JOB_ID:-.indirect}/docker-compose.yml up --force-recreate --renew-anon-volumes -d
    # НŅƒ и, ĐŊĐ° вŅŅĐēиК ŅĐģŅƒŅ‡Đ°Đš, вŅ‹Đ˛ĐĩŅŅ‚и Ņ‡Ņ‚Đž Ņ‚Đ°Đŧ Ņƒ ĐŊĐ°Ņ в ĐŋŅ€Đ¸ĐŊŅ†Đ¸ĐŋĐĩ СаĐŋŅƒŅ‰ĐĩĐŊĐž ĐŊĐ° ĐŧĐ°ŅˆĐ¸ĐŊĐēĐĩ
    docker ps

# КоĐģĐģĐĩĐēŅ‚иĐŧ ĐģĐžĐŗи ŅĐĩŅ€Đ˛Đ¸ŅĐžĐ˛
docker-logs:
    mkdir ./logs || true
    docker logs testrail-web-$${CI_JOB_ID:-local}       >& logs/testrail-web.log
    docker logs testrail-fpm-$${CI_JOB_ID:-local}       >& logs/testrail-fpm.log
    docker logs testrail-migration-$${CI_JOB_ID:-local} >& logs/testrail-migration.log
    docker logs testrail-mysql-$${CI_JOB_ID:-local}     >& logs/testrail-mysql.log

# ОŅ‡Đ¸ŅŅ‚ĐēĐ° Ņ€Đ°ĐŊĐŊĐĩŅ€Đ°
docker-clean:
    @echo ОŅŅ‚Đ°ĐŊавĐģиваĐĩĐŧ вŅĐĩ testrail-ĐēĐžĐŊŅ‚ĐĩĐšĐŊĐĩŅ€Ņ‹
    docker kill $$(docker ps --filter=name=testrail -q) || true
    @echo ОŅ‡Đ¸ŅŅ‚ĐēĐ° Đ´ĐžĐēĐĩŅ€ ĐēĐžĐŊŅ‚ĐĩĐšĐŊĐĩŅ€ĐžĐ˛
    docker rm -f $$(docker ps -a -f --filter=name=testrail status=exited -q) || true
    @echo ОŅ‡Đ¸ŅŅ‚ĐēĐ° dangling ОйŅ€Đ°ĐˇĐžĐ˛
    docker rmi -f $$(docker images -f "dangling=true" -q) || true
    @echo ОŅ‡Đ¸ŅŅ‚ĐēĐ° testrail ОйŅ€Đ°ĐˇĐžĐ˛
    docker rmi -f $$(docker images --filter=reference='registry.gitlab.com/touchbit/image/testrail/*' -q) || true
    @echo ОŅ‡Đ¸ŅŅ‚ĐēĐ° вŅĐĩŅ… ĐŊĐĩиŅĐŋĐžĐģŅŒĐˇŅƒĐĩĐŧŅ‹Ņ… volume
    docker volume rm -f $$(docker volume ls -q) || true
    @echo ОŅ‡Đ¸ŅŅ‚ĐēĐ° вŅĐĩŅ… testrail ŅĐĩŅ‚ĐĩĐš
    docker network rm $(docker network ls --filter=name=testrail -q) || true
    docker ps

āĻšā§‡āĻ•

āĻĄāĻ•āĻžāĻ° āĻ†āĻĒ āĻ•āĻ°āĻž

$ make docker-up 
docker-compose -f ${CI_JOB_ID:-.indirect}/docker-compose.yml kill
Killing testrail-web-local   ... done
Killing testrail-fpm-local   ... done
Killing testrail-mysql-local ... done
docker network rm network-${CI_JOB_ID:-testrail} || true
network-testrail
docker network create network-${CI_JOB_ID:-testrail}
d2ec063324081c8bbc1b08fd92242c2ea59d70cf4025fab8efcbc5c6360f083f
docker-compose -f ${CI_JOB_ID:-.indirect}/docker-compose.yml pull
Pulling db        ... done
Pulling migration ... done
Pulling fpm       ... done
Pulling web       ... done
docker-compose -f ${CI_JOB_ID:-.indirect}/docker-compose.yml up --force-recreate --renew-anon-volumes -d
Recreating testrail-mysql-local ... done
Recreating testrail-fpm-local       ... done
Recreating testrail-migration-local ... done
Recreating testrail-web-local       ... done
docker ps
CONTAINER ID  PORTS                                     NAMES
a845d3cb0e5a  0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp  testrail-web-local
19d8ef001398  9000/tcp                                  testrail-fpm-local
e28840a2369c  3306/tcp, 33060/tcp                       testrail-migration-local
0e7900c23f37  3306/tcp                                  testrail-mysql-local

āĻĄāĻ•āĻžāĻ°-āĻ˛āĻ— āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨

$ make docker-logs
mkdir ./logs || true
mkdir: cannot create directory ‘./logs’: File exists
docker logs testrail-web-${CI_JOB_ID:-local}       >& logs/testrail-web.log
docker logs testrail-fpm-${CI_JOB_ID:-local}       >& logs/testrail-fpm.log
docker logs testrail-migration-${CI_JOB_ID:-local} >& logs/testrail-migration.log
docker logs testrail-mysql-${CI_JOB_ID:-local}     >& logs/testrail-mysql.log

āĻ—āĻŋāĻŸāĻ˛ā§āĻ¯āĻžāĻŦ āĻļā§‡āĻ˛ āĻ°āĻžāĻ¨āĻžāĻ°āĨ¤ āĻĄāĻ•āĻžāĻ° āĻ•āĻŽā§āĻĒā§‹āĻœā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻĒā§āĻ°āĻ¤āĻŋāĻ¯ā§‹āĻ—āĻŋāĻ¤āĻžāĻŽā§‚āĻ˛āĻ•āĻ­āĻžāĻŦā§‡ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ¯ā§‹āĻ—ā§āĻ¯ āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻž āĻšāĻžāĻ˛ā§ āĻ•āĻ°ā§āĻ¨

āĻŦāĻŋāĻˇāĻ¯āĻŧāĻŦāĻ¸ā§āĻ¤ā§

gitlab-ci.yml āĻĒā§āĻ°āĻ¸ā§āĻ¤ā§āĻ¤ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

āĻ‡āĻ¨ā§āĻŸāĻŋāĻ—ā§āĻ°ā§‡āĻļāĻ¨ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻšāĻ˛āĻŽāĻžāĻ¨

Integration:
  stage: test
  tags:
    - my-shell-runner
  before_script:
    # АŅƒŅ‚ĐĩĐŊŅ‚иŅ„иŅ†Đ¸Ņ€ŅƒĐĩĐŧŅŅ в registry
    - docker login -u gitlab-ci-token -p ${CI_JOB_TOKEN} ${CI_REGISTRY}
    # ГĐĩĐŊĐĩŅ€Đ¸Ņ€ŅƒĐĩĐŧ ĐŋŅĐĩвдОŅƒĐŊиĐēĐ°ĐģŅŒĐŊŅ‹Đĩ TR_HTTP_PORT и TR_HTTPS_PORT
    - export TR_HTTP_PORT=$(shuf -i10000-60000 -n1)
    - export TR_HTTPS_PORT=$(shuf -i10000-60000 -n1)
    # ŅĐžĐˇĐ´Đ°ĐĩĐŧ диŅ€ĐĩĐēŅ‚ĐžŅ€Đ¸ŅŽ Ņ идĐĩĐŊŅ‚иŅ„иĐēĐ°Ņ‚ĐžŅ€ĐžĐŧ СадаŅ‡Đ¸
    - mkdir ${CI_JOB_ID}
    # ĐēĐžĐŋиŅ€ŅƒĐĩĐŧ в ŅĐžĐˇĐ´Đ°ĐŊĐŊŅƒŅŽ диŅ€ĐĩĐēŅ‚ĐžŅ€Đ¸ŅŽ ĐŊĐ°Ņˆ docker-compose.yml
    # Ņ‡Ņ‚ОйŅ‹ ĐēĐžĐŊŅ‚ĐĩĐēŅŅ‚ ĐąŅ‹Đģ Ņ€Đ°ĐˇĐŊŅ‹Đš Đ´ĐģŅ ĐēĐ°ĐļдОК СадаŅ‡Đ¸
    - cp .indirect/docker-compose.yml ${CI_JOB_ID}/docker-compose.yml
  script:
    # ĐŋОдĐŊиĐŧĐ°ĐĩĐŧ ĐŊĐ°ŅˆĐĩ ĐžĐēŅ€ŅƒĐļĐĩĐŊиĐĩ
    - make docker-up
    # СаĐŋŅƒŅĐēĐ°ĐĩĐŧ Ņ‚ĐĩŅŅ‚Ņ‹ иŅĐŋĐžĐģĐŊŅĐĩĐŧŅ‹Đŧ jar (Ņƒ ĐŧĐĩĐŊŅ Ņ‚Đ°Đē)
    - java -jar itest.jar --http-port ${TR_HTTP_PORT} --https-port ${TR_HTTPS_PORT}
    # иĐģи в ĐēĐžĐŊŅ‚ĐĩĐšĐŊĐĩŅ€Đĩ
    - docker run --network=testrail-network-${CI_JOB_ID:-local} --rm itest
  after_script:
    # ŅĐžĐąĐ¸Ņ€Đ°ĐĩĐŧ ĐģĐžĐŗи
    - make docker-logs
    # ĐžŅŅ‚Đ°ĐŊавĐģиваĐĩĐŧ ĐžĐēŅ€ŅƒĐļĐĩĐŊиĐĩ
    - make docker-kill
  artifacts:
    # ŅĐžŅ…Ņ€Đ°ĐŊŅĐĩĐŧ ĐģĐžĐŗи
    when: always
    paths:
      - logs
    expire_in: 30 days

āĻāĻ‡ āĻ§āĻ°āĻ¨ā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ•āĻžāĻœ āĻšāĻžāĻ˛āĻžāĻ¨ā§‹āĻ° āĻĢāĻ˛ā§‡, āĻ†āĻ°ā§āĻŸāĻŋāĻĢā§āĻ¯āĻžāĻ•ā§āĻŸā§‡āĻ° āĻ˛āĻ— āĻĄāĻŋāĻ°ā§‡āĻ•ā§āĻŸāĻ°āĻŋāĻ¤ā§‡ āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻž āĻāĻŦāĻ‚ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻ˛āĻ— āĻĨāĻžāĻ•āĻŦā§‡āĨ¤ āĻ¯āĻž āĻ¤ā§āĻ°ā§āĻŸāĻŋāĻ° āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡ āĻ–ā§āĻŦāĻ‡ āĻ¸ā§āĻŦāĻŋāĻ§āĻžāĻœāĻ¨āĻ•āĨ¤ āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ¤āĻžāĻ° āĻ¨āĻŋāĻœāĻ¸ā§āĻŦ āĻ˛āĻ— āĻ˛ā§‡āĻ–ā§‡, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ†āĻŽāĻŋ āĻ†āĻ˛āĻžāĻĻāĻžāĻ­āĻžāĻŦā§‡ āĻāĻ‡ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ•āĻĨāĻž āĻŦāĻ˛āĻ¤ā§‡ āĻšāĻŦā§‡.

āĻ—āĻŋāĻŸāĻ˛ā§āĻ¯āĻžāĻŦ āĻļā§‡āĻ˛ āĻ°āĻžāĻ¨āĻžāĻ°āĨ¤ āĻĄāĻ•āĻžāĻ° āĻ•āĻŽā§āĻĒā§‹āĻœā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻĒā§āĻ°āĻ¤āĻŋāĻ¯ā§‹āĻ—āĻŋāĻ¤āĻžāĻŽā§‚āĻ˛āĻ•āĻ­āĻžāĻŦā§‡ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ¯ā§‹āĻ—ā§āĻ¯ āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻž āĻšāĻžāĻ˛ā§ āĻ•āĻ°ā§āĻ¨

āĻŦāĻŋāĻˇāĻ¯āĻŧāĻŦāĻ¸ā§āĻ¤ā§

āĻ°āĻžāĻ¨āĻžāĻ° āĻĒāĻ°āĻŋāĻˇā§āĻ•āĻžāĻ° āĻ•āĻ°āĻž

āĻāĻ•āĻŸāĻŋ āĻļāĻŋāĻĄāĻŋāĻ‰āĻ˛ āĻ…āĻ¨ā§āĻ¯āĻžāĻ¯āĻŧā§€ āĻ•āĻžāĻœāĻŸāĻŋ āĻšāĻžāĻ˛ā§ āĻ•āĻ°āĻž āĻšāĻŦā§‡āĨ¤

stages:
- clean
- build
- test

Clean runner:
  stage: clean
  only:
    - schedules
  tags:
    - my-shell-runner
  script:
    - make docker-clean

āĻāĻ° āĻĒāĻ°ā§‡, āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ—āĻŋāĻŸāĻ˛ā§āĻ¯āĻžāĻŦ āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒā§‡ āĻ¯āĻžāĻ¨ -> CI/CD -> āĻ¸āĻŽāĻ¯āĻŧāĻ¸ā§‚āĻšā§€ -> āĻ¨āĻ¤ā§āĻ¨ āĻ¸āĻŽāĻ¯āĻŧāĻ¸ā§‚āĻšā§€ āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻ¸āĻŽāĻ¯āĻŧāĻ¸ā§‚āĻšā§€ āĻ¯ā§‹āĻ— āĻ•āĻ°ā§āĻ¨

āĻ—āĻŋāĻŸāĻ˛ā§āĻ¯āĻžāĻŦ āĻļā§‡āĻ˛ āĻ°āĻžāĻ¨āĻžāĻ°āĨ¤ āĻĄāĻ•āĻžāĻ° āĻ•āĻŽā§āĻĒā§‹āĻœā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻĒā§āĻ°āĻ¤āĻŋāĻ¯ā§‹āĻ—āĻŋāĻ¤āĻžāĻŽā§‚āĻ˛āĻ•āĻ­āĻžāĻŦā§‡ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ¯ā§‹āĻ—ā§āĻ¯ āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻž āĻšāĻžāĻ˛ā§ āĻ•āĻ°ā§āĻ¨

āĻŦāĻŋāĻˇāĻ¯āĻŧāĻŦāĻ¸ā§āĻ¤ā§

āĻĢāĻ˛

GitLab CI-āĻ 4āĻŸāĻŋ āĻ•āĻžāĻœ āĻšāĻžāĻ˛ā§ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡
āĻ—āĻŋāĻŸāĻ˛ā§āĻ¯āĻžāĻŦ āĻļā§‡āĻ˛ āĻ°āĻžāĻ¨āĻžāĻ°āĨ¤ āĻĄāĻ•āĻžāĻ° āĻ•āĻŽā§āĻĒā§‹āĻœā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻĒā§āĻ°āĻ¤āĻŋāĻ¯ā§‹āĻ—āĻŋāĻ¤āĻžāĻŽā§‚āĻ˛āĻ•āĻ­āĻžāĻŦā§‡ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ¯ā§‹āĻ—ā§āĻ¯ āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻž āĻšāĻžāĻ˛ā§ āĻ•āĻ°ā§āĻ¨

āĻ‡āĻ¨ā§āĻŸāĻŋāĻ—ā§āĻ°ā§‡āĻļāĻ¨ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻ¸āĻžāĻĨā§‡ āĻļā§‡āĻˇ āĻŸāĻžāĻ¸ā§āĻ•ā§‡āĻ° āĻ˛āĻ—āĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻ†āĻŽāĻ°āĻž āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āĻ¨ āĻŸāĻžāĻ¸ā§āĻ• āĻĨā§‡āĻ•ā§‡ āĻĒāĻžāĻ¤ā§āĻ° āĻĻā§‡āĻ–āĻ¤ā§‡ āĻĒāĻžāĻ‡

CONTAINER ID  NAMES
c6b76f9135ed  testrail-web-204645172
01d303262d8e  testrail-fpm-204645172
2cdab1edbf6a  testrail-migration-204645172
826aaf7c0a29  testrail-mysql-204645172
6dbb3fae0322  testrail-web-204645084
3540f8d448ce  testrail-fpm-204645084
70fea72aa10d  testrail-mysql-204645084
d8aa24b2892d  testrail-web-204644881
6d4ccd910fad  testrail-fpm-204644881
685d8023a3ec  testrail-mysql-204644881
1cdfc692003a  testrail-web-204644793
6f26dfb2683e  testrail-fpm-204644793
029e16b26201  testrail-mysql-204644793
c10443222ac6  testrail-web-204567103
04339229397e  testrail-fpm-204567103
6ae0accab28d  testrail-mysql-204567103
b66b60d79e43  testrail-web-204553690
033b1f46afa9  testrail-fpm-204553690
a8879c5ef941  testrail-mysql-204553690
069954ba6010  testrail-web-204553539
ed6b17d911a5  testrail-fpm-204553539
1a1eed057ea0  testrail-mysql-204553539

āĻ†āĻ°ā§‹ āĻŦāĻŋāĻ¸ā§āĻ¤āĻžāĻ°āĻŋāĻ¤ āĻ˛āĻ—

$ docker login -u gitlab-ci-token -p ${CI_JOB_TOKEN} ${CI_REGISTRY}
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /home/gitlab-runner/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
$ export TR_HTTP_PORT=$(shuf -i10000-60000 -n1)
$ export TR_HTTPS_PORT=$(shuf -i10000-60000 -n1)
$ mkdir ${CI_JOB_ID}
$ cp .indirect/docker-compose.yml ${CI_JOB_ID}/docker-compose.yml
$ make docker-up
docker-compose -f ${CI_JOB_ID:-.indirect}/docker-compose.yml kill
docker network rm testrail-network-${CI_JOB_ID:-local} || true
Error: No such network: testrail-network-204645172
docker network create testrail-network-${CI_JOB_ID:-local}
0a59552b4464b8ab484de6ae5054f3d5752902910bacb0a7b5eca698766d0331
docker-compose -f ${CI_JOB_ID:-.indirect}/docker-compose.yml pull
Pulling web       ... done
Pulling fpm       ... done
Pulling migration ... done
Pulling db        ... done
docker-compose -f ${CI_JOB_ID:-.indirect}/docker-compose.yml up --force-recreate --renew-anon-volumes -d
Creating volume "204645172_static-content" with default driver
Creating testrail-mysql-204645172 ... 
Creating testrail-mysql-204645172 ... done
Creating testrail-migration-204645172 ... done
Creating testrail-fpm-204645172       ... done
Creating testrail-web-204645172       ... done
docker ps
CONTAINER ID        IMAGE                                                          COMMAND                  CREATED              STATUS              PORTS                                           NAMES
c6b76f9135ed        registry.gitlab.com/touchbit/image/testrail/web:latest         "nginx -g 'daemon ofâ€Ļ"   13 seconds ago       Up 1 second         0.0.0.0:51148->80/tcp, 0.0.0.0:25426->443/tcp   testrail-web-204645172
01d303262d8e        registry.gitlab.com/touchbit/image/testrail/fpm:latest         "docker-php-entrypoiâ€Ļ"   16 seconds ago       Up 13 seconds       9000/tcp                                        testrail-fpm-204645172
2cdab1edbf6a        registry.gitlab.com/touchbit/image/testrail/migration:latest   "docker-entrypoint.sâ€Ļ"   16 seconds ago       Up 13 seconds       3306/tcp, 33060/tcp                             testrail-migration-204645172
826aaf7c0a29        mysql:5.7.22                                                   "docker-entrypoint.sâ€Ļ"   18 seconds ago       Up 16 seconds       3306/tcp                                        testrail-mysql-204645172
6dbb3fae0322        registry.gitlab.com/touchbit/image/testrail/web:latest         "nginx -g 'daemon ofâ€Ļ"   36 seconds ago       Up 22 seconds       0.0.0.0:44202->80/tcp, 0.0.0.0:20151->443/tcp   testrail-web-204645084
3540f8d448ce        registry.gitlab.com/touchbit/image/testrail/fpm:latest         "docker-php-entrypoiâ€Ļ"   38 seconds ago       Up 35 seconds       9000/tcp                                        testrail-fpm-204645084
70fea72aa10d        mysql:5.7.22                                                   "docker-entrypoint.sâ€Ļ"   40 seconds ago       Up 37 seconds       3306/tcp                                        testrail-mysql-204645084
d8aa24b2892d        registry.gitlab.com/touchbit/image/testrail/web:latest         "nginx -g 'daemon ofâ€Ļ"   About a minute ago   Up 53 seconds       0.0.0.0:31103->80/tcp, 0.0.0.0:43872->443/tcp   testrail-web-204644881
6d4ccd910fad        registry.gitlab.com/touchbit/image/testrail/fpm:latest         "docker-php-entrypoiâ€Ļ"   About a minute ago   Up About a minute   9000/tcp                                        testrail-fpm-204644881
685d8023a3ec        mysql:5.7.22                                                   "docker-entrypoint.sâ€Ļ"   About a minute ago   Up About a minute   3306/tcp                                        testrail-mysql-204644881
1cdfc692003a        registry.gitlab.com/touchbit/image/testrail/web:latest         "nginx -g 'daemon ofâ€Ļ"   About a minute ago   Up About a minute   0.0.0.0:44752->80/tcp, 0.0.0.0:23540->443/tcp   testrail-web-204644793
6f26dfb2683e        registry.gitlab.com/touchbit/image/testrail/fpm:latest         "docker-php-entrypoiâ€Ļ"   About a minute ago   Up About a minute   9000/tcp                                        testrail-fpm-204644793
029e16b26201        mysql:5.7.22                                                   "docker-entrypoint.sâ€Ļ"   About a minute ago   Up About a minute   3306/tcp                                        testrail-mysql-204644793
c10443222ac6        registry.gitlab.com/touchbit/image/testrail/web:latest         "nginx -g 'daemon ofâ€Ļ"   5 hours ago          Up 5 hours          0.0.0.0:57123->80/tcp, 0.0.0.0:31657->443/tcp   testrail-web-204567103
04339229397e        registry.gitlab.com/touchbit/image/testrail/fpm:latest         "docker-php-entrypoiâ€Ļ"   5 hours ago          Up 5 hours          9000/tcp                                        testrail-fpm-204567103
6ae0accab28d        mysql:5.7.22                                                   "docker-entrypoint.sâ€Ļ"   5 hours ago          Up 5 hours          3306/tcp                                        testrail-mysql-204567103
b66b60d79e43        registry.gitlab.com/touchbit/image/testrail/web:latest         "nginx -g 'daemon ofâ€Ļ"   5 hours ago          Up 5 hours          0.0.0.0:56321->80/tcp, 0.0.0.0:58749->443/tcp   testrail-web-204553690
033b1f46afa9        registry.gitlab.com/touchbit/image/testrail/fpm:latest         "docker-php-entrypoiâ€Ļ"   5 hours ago          Up 5 hours          9000/tcp                                        testrail-fpm-204553690
a8879c5ef941        mysql:5.7.22                                                   "docker-entrypoint.sâ€Ļ"   5 hours ago          Up 5 hours          3306/tcp                                        testrail-mysql-204553690
069954ba6010        registry.gitlab.com/touchbit/image/testrail/web:latest         "nginx -g 'daemon ofâ€Ļ"   5 hours ago          Up 5 hours          0.0.0.0:32869->80/tcp, 0.0.0.0:16066->443/tcp   testrail-web-204553539
ed6b17d911a5        registry.gitlab.com/touchbit/image/testrail/fpm:latest         "docker-php-entrypoiâ€Ļ"   5 hours ago          Up 5 hours          9000/tcp                                        testrail-fpm-204553539
1a1eed057ea0        mysql:5.7.22                                                   "docker-entrypoint.sâ€Ļ"   5 hours ago          Up 5 hours          3306/tcp                                        testrail-mysql-204553539

āĻ¸āĻŦ āĻ•āĻžāĻœ āĻ¸āĻĢāĻ˛āĻ­āĻžāĻŦā§‡ āĻ¸āĻŽā§āĻĒāĻ¨ā§āĻ¨ āĻšāĻ¯āĻŧā§‡āĻ›ā§‡

āĻŸāĻžāĻ¸ā§āĻ• āĻ†āĻ°ā§āĻŸāĻŋāĻĢā§āĻ¯āĻžāĻ•ā§āĻŸāĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻž āĻāĻŦāĻ‚ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻ˛āĻ— āĻĨāĻžāĻ•ā§‡
āĻ—āĻŋāĻŸāĻ˛ā§āĻ¯āĻžāĻŦ āĻļā§‡āĻ˛ āĻ°āĻžāĻ¨āĻžāĻ°āĨ¤ āĻĄāĻ•āĻžāĻ° āĻ•āĻŽā§āĻĒā§‹āĻœā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻĒā§āĻ°āĻ¤āĻŋāĻ¯ā§‹āĻ—āĻŋāĻ¤āĻžāĻŽā§‚āĻ˛āĻ•āĻ­āĻžāĻŦā§‡ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ¯ā§‹āĻ—ā§āĻ¯ āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻž āĻšāĻžāĻ˛ā§ āĻ•āĻ°ā§āĻ¨

āĻ—āĻŋāĻŸāĻ˛ā§āĻ¯āĻžāĻŦ āĻļā§‡āĻ˛ āĻ°āĻžāĻ¨āĻžāĻ°āĨ¤ āĻĄāĻ•āĻžāĻ° āĻ•āĻŽā§āĻĒā§‹āĻœā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻĒā§āĻ°āĻ¤āĻŋāĻ¯ā§‹āĻ—āĻŋāĻ¤āĻžāĻŽā§‚āĻ˛āĻ•āĻ­āĻžāĻŦā§‡ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ¯ā§‹āĻ—ā§āĻ¯ āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻž āĻšāĻžāĻ˛ā§ āĻ•āĻ°ā§āĻ¨

āĻ¸āĻŦāĻ•āĻŋāĻ›ā§ āĻ¸ā§āĻ¨ā§āĻĻāĻ° āĻŦāĻ˛ā§‡ āĻŽāĻ¨ā§‡ āĻšāĻšā§āĻ›ā§‡, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻāĻ•āĻŸāĻŋ nuance āĻ†āĻ›ā§‡āĨ¤ āĻ‡āĻ¨ā§āĻŸāĻŋāĻ—ā§āĻ°ā§‡āĻļāĻ¨ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻšāĻ˛āĻžāĻ•āĻžāĻ˛ā§€āĻ¨ āĻĒāĻžāĻ‡āĻĒāĻ˛āĻžāĻ‡āĻ¨ āĻœā§‹āĻ° āĻ•āĻ°ā§‡ āĻŦāĻžāĻ¤āĻŋāĻ˛ āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡, āĻāĻ‡ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡ āĻ•āĻ¨āĻŸā§‡āĻ‡āĻ¨āĻžāĻ° āĻšāĻžāĻ˛āĻžāĻ¨ā§‹ āĻŦāĻ¨ā§āĻ§ āĻ•āĻ°āĻž āĻšāĻŦā§‡ āĻ¨āĻžāĨ¤ āĻ¸āĻŽāĻ¯āĻŧā§‡ āĻ¸āĻŽāĻ¯āĻŧā§‡ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ°āĻžāĻ¨āĻžāĻ° āĻĒāĻ°āĻŋāĻˇā§āĻ•āĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤ āĻĻā§āĻ°ā§āĻ­āĻžāĻ—ā§āĻ¯āĻŦāĻļāĻ¤, āĻ—āĻŋāĻŸāĻ˛ā§āĻ¯āĻžāĻŦ āĻ¸āĻŋāĻ‡-āĻ¤ā§‡ āĻ‰āĻ¨ā§āĻ¨āĻ¤āĻŋāĻ° āĻ•āĻžāĻœāĻŸāĻŋ āĻāĻ–āĻ¨āĻ“ āĻ¸ā§āĻĨāĻŋāĻ¤āĻŋāĻ¤ā§‡ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡ āĻ–ā§‹āĻ˛āĻž

āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ†āĻŽāĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻ¸āĻŽāĻ¯āĻŧāĻ¸ā§‚āĻšā§€ āĻ…āĻ¨ā§āĻ¯āĻžāĻ¯āĻŧā§€ āĻāĻ•āĻŸāĻŋ āĻŸāĻžāĻ¸ā§āĻ• āĻ˛āĻžā§āĻš āĻ¯ā§‹āĻ— āĻ•āĻ°ā§‡āĻ›āĻŋ, āĻāĻŦāĻ‚ āĻ•ā§‡āĻ‰ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻŽā§āĻ¯āĻžāĻ¨ā§āĻ¯āĻŧāĻžāĻ˛āĻŋ āĻšāĻžāĻ˛āĻžāĻ¤ā§‡ āĻ¨āĻŋāĻˇā§‡āĻ§ āĻ•āĻ°ā§‡ āĻ¨āĻžāĨ¤
āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒā§‡ āĻ¯āĻžāĻ¨ -> CI/CD -> āĻ¸āĻŽāĻ¯āĻŧāĻ¸ā§‚āĻšā§€ āĻāĻŦāĻ‚ āĻ•āĻžāĻœāĻŸāĻŋ āĻšāĻžāĻ˛āĻžāĻ¨ Clean runner

āĻ—āĻŋāĻŸāĻ˛ā§āĻ¯āĻžāĻŦ āĻļā§‡āĻ˛ āĻ°āĻžāĻ¨āĻžāĻ°āĨ¤ āĻĄāĻ•āĻžāĻ° āĻ•āĻŽā§āĻĒā§‹āĻœā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻĒā§āĻ°āĻ¤āĻŋāĻ¯ā§‹āĻ—āĻŋāĻ¤āĻžāĻŽā§‚āĻ˛āĻ•āĻ­āĻžāĻŦā§‡ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ¯ā§‹āĻ—ā§āĻ¯ āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻž āĻšāĻžāĻ˛ā§ āĻ•āĻ°ā§āĻ¨

āĻŽā§‹āĻŸ:

  • āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻļā§‡āĻ˛ āĻ°āĻžāĻ¨āĻžāĻ° āĻ†āĻ›ā§‡āĨ¤
  • āĻ•āĻžāĻœ āĻāĻŦāĻ‚ āĻĒāĻ°āĻŋāĻŦā§‡āĻļā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻ•ā§‹āĻ¨ āĻĻā§āĻŦāĻ¨ā§āĻĻā§āĻŦ āĻ¨ā§‡āĻ‡āĨ¤
  • āĻ†āĻŽāĻ°āĻž āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛āĻ­āĻžāĻŦā§‡ āĻ‡āĻ¨ā§āĻŸāĻŋāĻ—ā§āĻ°ā§‡āĻļāĻ¨ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻšāĻžāĻ˛āĻžāĻ‡āĨ¤
  • āĻ†āĻĒāĻ¨āĻŋ āĻ¸ā§āĻĨāĻžāĻ¨ā§€āĻ¯āĻŧāĻ­āĻžāĻŦā§‡ āĻŦāĻž āĻāĻ•āĻŸāĻŋ āĻĒāĻžāĻ¤ā§āĻ°ā§‡ āĻ‡āĻ¨ā§āĻŸāĻŋāĻ—ā§āĻ°ā§‡āĻļāĻ¨ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻšāĻžāĻ˛āĻžāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨āĨ¤
  • āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻž āĻāĻŦāĻ‚ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻ˛āĻ—āĻ—ā§āĻ˛āĻŋ āĻ¸āĻ‚āĻ—ā§āĻ°āĻš āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ āĻāĻŦāĻ‚ āĻĒāĻžāĻ‡āĻĒāĻ˛āĻžāĻ‡āĻ¨ā§‡āĻ° āĻ•āĻžāĻœā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻ‚āĻ¯ā§āĻ•ā§āĻ¤ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤
  • āĻĒā§āĻ°āĻžāĻ¨ā§‹ āĻĄāĻ•āĻžāĻ° āĻ‡āĻŽā§‡āĻœ āĻĨā§‡āĻ•ā§‡ āĻ°āĻžāĻ¨āĻžāĻ° āĻĒāĻ°āĻŋāĻˇā§āĻ•āĻžāĻ° āĻ•āĻ°āĻž āĻ¸āĻŽā§āĻ­āĻŦāĨ¤

āĻ¸ā§‡āĻŸāĻ†āĻĒ āĻ¸āĻŽāĻ¯āĻŧ ~2 āĻ˜āĻ¨ā§āĻŸāĻžāĨ¤
āĻ¯ā§‡ āĻ¸āĻŦ, āĻ†āĻ¸āĻ˛ā§‡. āĻ†āĻŽāĻŋ āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻĒā§‡āĻ¯āĻŧā§‡ āĻ–ā§āĻļāĻŋ āĻšāĻŦā§‡.

āĻŦāĻŋāĻˇāĻ¯āĻŧāĻŦāĻ¸ā§āĻ¤ā§

āĻ‰āĻ¤ā§āĻ¸: www.habr.com

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨