āĻŽāĻžāĻ­ā§‡āĻ¨ āĻ¸ā§‡āĻ¨ā§āĻŸā§āĻ°āĻžāĻ˛ā§‡ āĻāĻ•āĻŸāĻŋ āĻœāĻžāĻ­āĻž āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒ āĻ†āĻĒāĻ˛ā§‹āĻĄ āĻ•āĻ°āĻ¤ā§‡ āĻ—āĻŋāĻŸāĻ˛ā§āĻ¯āĻžāĻŦ āĻ¸āĻŋāĻ†āĻ‡ āĻ¸ā§‡āĻŸ āĻ†āĻĒ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

āĻāĻ‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻŸāĻŋ āĻœāĻžāĻ­āĻž āĻĄā§‡āĻ­ā§‡āĻ˛āĻĒāĻžāĻ°āĻĻā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¯āĻžāĻĻā§‡āĻ° āĻ—āĻŋāĻŸāĻ˛ā§āĻ¯āĻžāĻŦ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ¸ā§‹āĻ¨āĻžāĻŸāĻžāĻ‡āĻĒ āĻāĻŦāĻ‚/āĻ…āĻĨāĻŦāĻž āĻŽāĻžāĻ­ā§‡āĻ¨ āĻ¸ā§‡āĻ¨ā§āĻŸā§āĻ°āĻžāĻ˛ āĻ°āĻŋāĻĒā§‹āĻœāĻŋāĻŸāĻ°āĻŋāĻ¤ā§‡ āĻĻā§āĻ°ā§āĻ¤ āĻ¤āĻžāĻĻā§‡āĻ° āĻĒāĻŖā§āĻ¯ āĻĒā§āĻ°āĻ•āĻžāĻļ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤ āĻāĻ‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§‡, āĻ†āĻŽāĻŋ āĻāĻ‡ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ gitlab-runner, gitlab-ci āĻāĻŦāĻ‚ maven-plugin āĻ¸ā§‡āĻŸ āĻ†āĻĒ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ•āĻĨāĻž āĻŦāĻ˛āĻŦāĨ¤

āĻĒā§‚āĻ°ā§āĻŦāĻļāĻ°ā§āĻ¤:

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

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

āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻ¤āĻĨā§āĻ¯

  • āĻ¸ā§‹āĻ¨āĻžāĻŸāĻžāĻ‡āĻĒ āĻ“āĻāĻ¸āĻāĻ¸ āĻ°āĻŋāĻĒā§‹āĻœāĻŋāĻŸāĻ°āĻŋ āĻšā§‹āĻ¸ā§āĻŸāĻŋāĻ‚ āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻžāĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻŽāĻžāĻ­ā§‡āĻ¨ āĻ¸ā§‡āĻ¨ā§āĻŸā§āĻ°āĻžāĻ˛ā§‡ āĻ¨āĻŋāĻĻāĻ°ā§āĻļāĻ¨āĻ—ā§āĻ˛āĻŋ āĻĒā§āĻ°āĻ•āĻžāĻļ āĻ•āĻ°āĻžāĻ° āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ° āĻāĻ•āĻŸāĻŋ āĻŦāĻŋāĻļāĻĻ āĻŦāĻŋāĻŦāĻ°āĻŖ āĻ‡āĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§‡āĻ‡ āĻŦāĻ°ā§āĻŖāĻŋāĻ¤ āĻšāĻ¯āĻŧā§‡āĻ›ā§‡ āĻāĻ‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€ googolplex, āĻ¤āĻžāĻ‡ āĻ†āĻŽāĻŋ āĻāĻ‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻŸāĻŋ āĻ¸āĻ āĻŋāĻ• āĻœāĻžāĻ¯āĻŧāĻ—āĻžāĻ¯āĻŧ āĻ‰āĻ˛ā§āĻ˛ā§‡āĻ– āĻ•āĻ°āĻŦāĨ¤
  • āĻ āĻĒā§āĻ°āĻžāĻ•-āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻ¨ āĻ•āĻ°ā§āĻ¨ āĻ¸ā§‹āĻ¨āĻžāĻŸāĻžāĻ‡āĻĒ āĻœāĻŋāĻ°āĻž āĻāĻŦāĻ‚ āĻ¸āĻ‚āĻ—ā§āĻ°āĻšāĻ¸ā§āĻĨāĻ˛ āĻ–ā§āĻ˛āĻ¤ā§‡ āĻāĻ•āĻŸāĻŋ āĻŸāĻŋāĻ•āĻŋāĻŸ āĻļā§āĻ°ā§ āĻ•āĻ°ā§āĻ¨ (āĻ†āĻ°ā§‹ āĻŦāĻŋāĻļāĻĻ āĻŦāĻŋāĻŦāĻ°āĻŖā§‡āĻ° āĻœāĻ¨ā§āĻ¯, āĻŦāĻŋāĻ­āĻžāĻ—āĻŸāĻŋ āĻĒāĻĄāĻŧā§āĻ¨ āĻāĻ•āĻŸāĻŋ āĻ¸ā§‹āĻ¨āĻžāĻŸāĻžāĻ‡āĻĒ āĻœāĻŋāĻ°āĻž āĻŸāĻŋāĻ•āĻŋāĻŸ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨) āĻ°āĻŋāĻĒā§‹āĻœāĻŋāĻŸāĻ°āĻŋ āĻ–ā§‹āĻ˛āĻžāĻ° āĻĒāĻ°ā§‡, JIRA āĻ˛āĻ—āĻ‡āĻ¨/āĻĒāĻžāĻ¸āĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻĄ āĻĒā§‡āĻ¯āĻŧāĻžāĻ° (āĻāĻ° āĻĒāĻ°ā§‡ āĻ¸ā§‹āĻ¨āĻžāĻŸāĻžāĻ‡āĻĒ āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻ‰āĻ˛ā§āĻ˛ā§‡āĻ– āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡) āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻšāĻŦā§‡ āĻ¸ā§‹āĻ¨āĻžāĻŸāĻžāĻ‡āĻĒ āĻ¨ā§‡āĻ•ā§āĻ¸āĻžāĻ¸ā§‡ āĻļāĻŋāĻ˛ā§āĻĒāĻ•āĻ°ā§āĻŽ āĻ†āĻĒāĻ˛ā§‹āĻĄ āĻ•āĻ°āĻ¤ā§‡āĨ¤
  • āĻ†āĻ°āĻ“, āĻāĻ•āĻŸāĻŋ GPG āĻ•ā§€ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻžāĻ° āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻŸāĻŋ āĻ–ā§āĻŦ āĻļā§āĻˇā§āĻ•āĻ­āĻžāĻŦā§‡ āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤ āĻ†āĻ°ā§‹ āĻŦāĻŋāĻ¸ā§āĻ¤āĻžāĻ°āĻŋāĻ¤ āĻœāĻžāĻ¨āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻŦāĻŋāĻ­āĻžāĻ— āĻĻā§‡āĻ–ā§āĻ¨. āĻ†āĻ°ā§āĻŸāĻŋāĻĢā§āĻ¯āĻžāĻ•ā§āĻŸ āĻ¸āĻžāĻ‡āĻ¨ āĻ‡āĻ¨ āĻ•āĻ°āĻ¤ā§‡ GnuPG āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ° āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡
  • āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻāĻ•āĻŸāĻŋ GPG āĻ•ā§€ (gnupg/gnupg2) āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ Linux āĻ•āĻ¨āĻ¸ā§‹āĻ˛ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡āĻ¨, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ RNG-āĻ¸āĻ°āĻžā§āĻœāĻžāĻŽ āĻāĻ¨āĻŸā§āĻ°āĻĒāĻŋ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡āĨ¤ āĻ…āĻ¨ā§āĻ¯āĻĨāĻžāĻ¯āĻŧ, āĻ•ā§€ āĻœā§‡āĻ¨āĻžāĻ°ā§‡āĻļāĻ¨ āĻ–ā§āĻŦ āĻĻā§€āĻ°ā§āĻ˜ āĻ¸āĻŽāĻ¯āĻŧ āĻ¨āĻŋāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤
  • āĻ¸ā§āĻŸā§‹āĻ°ā§‡āĻœ āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻž āĻĒāĻžāĻŦāĻ˛āĻŋāĻ• GPG āĻ•ā§€

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

āĻ—āĻŋāĻŸāĻ˛ā§āĻ¯āĻžāĻŦā§‡ āĻāĻ•āĻŸāĻŋ āĻ¸ā§āĻĨāĻžāĻĒāĻ¨āĻž āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒ āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

  • āĻĒā§āĻ°āĻĨāĻŽāĻ¤, āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒ āĻ¤ā§ˆāĻ°āĻŋ āĻāĻŦāĻ‚ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻļāĻŋāĻ˛ā§āĻĒāĻ•āĻ°ā§āĻŽ āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻĒāĻžāĻ‡āĻĒāĻ˛āĻžāĻ‡āĻ¨ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻž āĻšāĻŦā§‡āĨ¤ āĻ†āĻŽāĻŋ āĻ†āĻŽāĻžāĻ° āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒāĻ•ā§‡ āĻ¸āĻšāĻœ āĻāĻŦāĻ‚ āĻœāĻŸāĻŋāĻ˛ āĻŦāĻ˛ā§‡āĻ›āĻŋ - āĻ¸ā§āĻĨāĻžāĻĒāĻ¨
  • āĻ¸āĻ‚āĻ—ā§āĻ°āĻšāĻ¸ā§āĻĨāĻ˛ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻžāĻ° āĻĒāĻ°ā§‡, āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ¸āĻ‚āĻ—ā§āĻ°āĻšāĻ¸ā§āĻĨāĻ˛ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ āĻ¸ā§€āĻŽāĻžāĻŦāĻĻā§āĻ§ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤
    āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒā§‡ āĻ¯āĻžāĻ¨ -> āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸ -> āĻ¸āĻ‚āĻ—ā§āĻ°āĻšāĻ¸ā§āĻĨāĻ˛ -> āĻ¸ā§āĻ°āĻ•ā§āĻˇāĻŋāĻ¤ āĻļāĻžāĻ–āĻžāĨ¤ āĻ†āĻŽāĻ°āĻž āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ¨āĻŋāĻ¯āĻŧāĻŽ āĻŽā§āĻ›ā§‡ āĻĢā§‡āĻ˛āĻŋ āĻāĻŦāĻ‚ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ°āĻ•ā§āĻˇāĻŖāĻžāĻŦā§‡āĻ•ā§āĻˇāĻŖāĻ•āĻžāĻ°ā§€ āĻ­ā§‚āĻŽāĻŋāĻ•āĻž āĻ¸āĻš āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻĻā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻĒā§āĻļ āĻāĻŦāĻ‚ āĻŽāĻžāĻ°ā§āĻœ āĻ•āĻ°āĻžāĻ° āĻ…āĻ§āĻŋāĻ•āĻžāĻ° āĻ¸āĻš āĻ“āĻ¯āĻŧāĻžāĻ‡āĻ˛ā§āĻĄāĻ•āĻžāĻ°ā§āĻĄ * āĻāĻ° āĻ¸āĻžāĻĨā§‡ āĻāĻ•āĻŸāĻŋ āĻāĻ•āĻ• āĻ¨āĻŋāĻ¯āĻŧāĻŽ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻŋāĨ¤ āĻāĻ‡ āĻ¨āĻŋāĻ¯āĻŧāĻŽāĻŸāĻŋ āĻāĻ‡ āĻĒā§āĻ°āĻœā§‡āĻ•ā§āĻŸ āĻāĻŦāĻ‚ āĻ¯ā§‡ āĻ—ā§āĻ°ā§āĻĒā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻāĻ‡ āĻĒā§āĻ°ā§‹āĻœā§‡āĻ•ā§āĻŸā§‡āĻ° āĻ…āĻ¨ā§āĻ¤āĻ°ā§āĻ—āĻ¤ āĻ‰āĻ­āĻ¯āĻŧā§‡āĻ° āĻ¸āĻ•āĻ˛ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻœāĻ¨ā§āĻ¯ āĻ•āĻžāĻœ āĻ•āĻ°āĻŦā§‡ā§ˇ
    āĻŽāĻžāĻ­ā§‡āĻ¨ āĻ¸ā§‡āĻ¨ā§āĻŸā§āĻ°āĻžāĻ˛ā§‡ āĻāĻ•āĻŸāĻŋ āĻœāĻžāĻ­āĻž āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒ āĻ†āĻĒāĻ˛ā§‹āĻĄ āĻ•āĻ°āĻ¤ā§‡ āĻ—āĻŋāĻŸāĻ˛ā§āĻ¯āĻžāĻŦ āĻ¸āĻŋāĻ†āĻ‡ āĻ¸ā§‡āĻŸ āĻ†āĻĒ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡
  • āĻ¯āĻĻāĻŋ āĻŦā§‡āĻļ āĻ•āĻ¯āĻŧā§‡āĻ•āĻŸāĻŋ āĻ°āĻ•ā§āĻˇāĻŖāĻžāĻŦā§‡āĻ•ā§āĻˇāĻŖāĻ•āĻžāĻ°ā§€ āĻĨāĻžāĻ•ā§‡, āĻ¤āĻŦā§‡ āĻ¸āĻ°ā§āĻŦā§‹āĻ¤ā§āĻ¤āĻŽ āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ āĻšāĻŦā§‡ āĻ¨ā§€āĻ¤āĻŋāĻ—āĻ¤āĻ­āĻžāĻŦā§‡ āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒā§‡ āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ āĻ¸ā§€āĻŽāĻžāĻŦāĻĻā§āĻ§ āĻ•āĻ°āĻžāĨ¤
    āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒā§‡ āĻ¯āĻžāĻ¨ -> āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸ -> āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ -> āĻĻā§ƒāĻļā§āĻ¯āĻŽāĻžāĻ¨āĻ¤āĻž, āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒ āĻŦā§ˆāĻļāĻŋāĻˇā§āĻŸā§āĻ¯, āĻ…āĻ¨ā§āĻŽāĻ¤āĻŋ āĻāĻŦāĻ‚ āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒā§‡āĻ° āĻĻā§ƒāĻļā§āĻ¯āĻŽāĻžāĻ¨āĻ¤āĻž āĻ¸ā§‡āĻŸ āĻ•āĻ°ā§āĻ¨ āĻŦā§‡āĻ¸āĻ°āĻ•āĻžāĻ°ā§€.
    āĻ†āĻŽāĻžāĻ° āĻ•āĻžāĻ›ā§‡ āĻĒāĻžāĻŦāĻ˛āĻŋāĻ• āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒ āĻ†āĻ›ā§‡, āĻ¯ā§‡āĻšā§‡āĻ¤ā§ āĻ†āĻŽāĻŋ āĻ†āĻŽāĻžāĻ° āĻ¨āĻŋāĻœā§‡āĻ° āĻ—āĻŋāĻŸāĻ˛ā§āĻ¯āĻžāĻŦ āĻ°āĻžāĻ¨āĻžāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŋ āĻāĻŦāĻ‚ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ†āĻŽāĻžāĻ° āĻ•āĻžāĻ›ā§‡ āĻ¸āĻ‚āĻ—ā§āĻ°āĻšāĻ¸ā§āĻĨāĻ˛āĻŸāĻŋ āĻ¸āĻ‚āĻļā§‹āĻ§āĻ¨ āĻ•āĻ°āĻžāĻ° āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ āĻ†āĻ›ā§‡āĨ¤ āĻ āĻŋāĻ• āĻ†āĻ›ā§‡, āĻ†āĻ¸āĻ˛ā§‡ āĻĒāĻžāĻŦāĻ˛āĻŋāĻ• āĻĒāĻžāĻ‡āĻĒāĻ˛āĻžāĻ‡āĻ¨ āĻ˛āĻ—āĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻŦā§āĻ¯āĻ•ā§āĻ¤āĻŋāĻ—āĻ¤ āĻ¤āĻĨā§āĻ¯ āĻĻā§‡āĻ–āĻžāĻ¨ā§‹ āĻ†āĻŽāĻžāĻ° āĻ¸ā§āĻŦāĻžāĻ°ā§āĻĨā§‡ āĻ¨āĻ¯āĻŧāĨ¤
  • āĻ¸āĻ‚āĻ—ā§āĻ°āĻšāĻ¸ā§āĻĨāĻ˛ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¨āĻŋāĻ¯āĻŧāĻŽ āĻ•āĻ ā§‹āĻ° āĻ•āĻ°āĻž
    āĻĒā§āĻ°āĻœā§‡āĻ•ā§āĻŸā§‡ āĻ¯āĻžāĻ¨ -> āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸ -> āĻ°āĻŋāĻĒā§‹āĻœāĻŋāĻŸāĻ°āĻŋ -> āĻĒā§āĻļ āĻ°ā§āĻ˛āĻ¸ āĻāĻŦāĻ‚ āĻĢā§āĻ˛ā§āĻ¯āĻžāĻ— āĻ•āĻŽāĻŋāĻŸāĻ° āĻ¸ā§€āĻŽāĻžāĻŦāĻĻā§āĻ§āĻ¤āĻž āĻ¸ā§‡āĻŸ āĻ•āĻ°ā§āĻ¨, āĻ˛ā§‡āĻ–āĻ• āĻāĻ•āĻœāĻ¨ āĻ—āĻŋāĻŸāĻ˛ā§āĻ¯āĻžāĻŦ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€ āĻ•āĻŋāĻ¨āĻž āĻ¤āĻž āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°ā§āĻ¨āĨ¤ āĻ†āĻŽāĻŋ āĻ¸ā§‡āĻŸāĻŋāĻ‚ āĻ¸ā§āĻĒāĻžāĻ°āĻŋāĻļ āĻ¸ā§āĻŦāĻžāĻ•ā§āĻˇāĻ° āĻ•āĻŽāĻŋāĻŸ, āĻāĻŦāĻ‚ āĻ¸ā§āĻŦāĻžāĻ•ā§āĻˇāĻ°āĻŦāĻŋāĻšā§€āĻ¨ āĻ•āĻŽāĻŋāĻŸ āĻĢā§āĻ˛ā§āĻ¯āĻžāĻ— āĻĒā§āĻ°āĻ¤ā§āĻ¯āĻžāĻ–ā§āĻ¯āĻžāĻ¨ āĻ•āĻ°ā§āĻ¨āĨ¤
  • āĻāĻ° āĻĒāĻ°ā§‡, āĻ•āĻžāĻœāĻ—ā§āĻ˛āĻŋ āĻšāĻžāĻ˛āĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻŸā§āĻ°āĻŋāĻ—āĻžāĻ° āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡
    āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒā§‡ āĻ¯āĻžāĻ¨ -> āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸ -> CI / CD -> āĻĒāĻžāĻ‡āĻĒāĻ˛āĻžāĻ‡āĻ¨ āĻŸā§āĻ°āĻŋāĻ—āĻžāĻ° āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻŸā§āĻ°āĻŋāĻ—āĻžāĻ°-āĻŸā§‹āĻ•ā§‡āĻ¨ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨
    āĻāĻ‡ āĻŸā§‹āĻ•ā§‡āĻ¨āĻŸāĻŋ āĻ…āĻŦāĻŋāĻ˛āĻŽā§āĻŦā§‡ āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ—ā§āĻ°ā§āĻĒā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛ā§‡āĻ° āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨ā§‡ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤
    āĻ—ā§āĻ°ā§āĻĒā§‡ āĻ¯āĻžāĻ¨ -> āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸ -> CI / CD -> āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛ āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛ āĻ¯ā§‹āĻ— āĻ•āĻ°ā§āĻ¨ DEPLOY_TOKEN āĻŽāĻžāĻ¨āĻŸāĻŋāĻ¤ā§‡ āĻŸā§āĻ°āĻŋāĻ—āĻžāĻ°-āĻŸā§‹āĻ•ā§‡āĻ¨ āĻ¸āĻšāĨ¤

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

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

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

āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ°āĻžāĻ¨āĻžāĻ°

āĻ†āĻŽāĻŋ āĻ†āĻŽāĻžāĻ° āĻ¨āĻŋāĻœāĻ¸ā§āĻŦ āĻ°āĻžāĻ¨āĻžāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŋ, āĻ•āĻžāĻ°āĻŖ āĻĒā§āĻ°āĻĨāĻŽāĻ¤ āĻāĻŸāĻŋ āĻ¸ā§āĻŦāĻŋāĻ§āĻžāĻœāĻ¨āĻ•, āĻĻā§āĻ°ā§āĻ¤, āĻ¸āĻ¸ā§āĻ¤āĻžāĨ¤
āĻ°āĻžāĻ¨āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻŽāĻŋ 1 CPU, 2 GB RAM, 20 GB HDD āĻ¸āĻš Linux VDS āĻ¸ā§āĻĒāĻžāĻ°āĻŋāĻļ āĻ•āĻ°āĻ›āĻŋāĨ¤ āĻ‡āĻ¸ā§āĻ¯ā§ āĻŽā§‚āĻ˛ā§āĻ¯ ~ 3000â‚Ŋ āĻĒā§āĻ°āĻ¤āĻŋ āĻŦāĻ›āĻ°āĨ¤

āĻ†āĻŽāĻžāĻ° āĻ°āĻžāĻ¨āĻžāĻ°

āĻ°āĻžāĻ¨āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻŽāĻŋ VDS 4 CPU, 4 GB RAM, 50 GB SSD āĻ¨āĻŋāĻ¯āĻŧā§‡āĻ›āĻŋāĨ¤ āĻāĻŸāĻŋāĻ° āĻĻāĻžāĻŽ ~11000â‚Ŋ āĻāĻŦāĻ‚ āĻāĻŸāĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻ•āĻ–āĻ¨āĻ‡ āĻ†āĻĢāĻ¸ā§‹āĻ¸ āĻšāĻ¯āĻŧāĻ¨āĻŋā§ˇ
āĻ†āĻŽāĻžāĻ° āĻŽā§‹āĻŸ 7 āĻŸāĻŋ āĻŽā§‡āĻļāĻŋāĻ¨ āĻ†āĻ›ā§‡āĨ¤ āĻ†āĻ°ā§āĻŦāĻžāĻ¤ā§‡ 5āĻŸāĻŋ āĻāĻŦāĻ‚ āĻ‡āĻšā§‹āĻ°ā§‡ 2āĻŸāĻŋāĨ¤

āĻ¸ā§āĻ¤āĻ°āĻžāĻ‚, āĻ†āĻŽāĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻ°āĻžāĻ¨āĻžāĻ° āĻ†āĻ›ā§‡. āĻāĻ–āĻ¨ āĻ†āĻŽāĻ°āĻž āĻāĻŸāĻŋ āĻ¸ā§‡āĻŸ āĻ†āĻĒ āĻ•āĻ°āĻŦāĨ¤
āĻ†āĻŽāĻ°āĻž SSH āĻāĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻŽā§‡āĻļāĻŋāĻ¨ā§‡ āĻ¯āĻžāĻ‡ āĻāĻŦāĻ‚ java, git, maven, gnupg2 āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°āĻŋāĨ¤

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

āĻ—āĻŋāĻŸāĻ˛ā§āĻ¯āĻžāĻŦ āĻ°āĻžāĻ¨āĻžāĻ° āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

  • āĻāĻ•āĻŸāĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻ—ā§āĻ°ā§āĻĒ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨ runner
    sudo groupadd runner
  • āĻŽā§āĻ¯āĻžāĻ­ā§‡āĻ¨ āĻ•ā§āĻ¯āĻžāĻļā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻĄāĻŋāĻ°ā§‡āĻ•ā§āĻŸāĻ°āĻŋ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨ āĻāĻŦāĻ‚ āĻ—ā§āĻ°ā§āĻĒ āĻ…āĻ§āĻŋāĻ•āĻžāĻ° āĻŦāĻ°āĻžāĻĻā§āĻĻ āĻ•āĻ°ā§āĻ¨ runner
    āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻāĻ•āĻ‡ āĻŽā§‡āĻļāĻŋāĻ¨ā§‡ āĻāĻ•āĻžāĻ§āĻŋāĻ• āĻ°āĻžāĻ¨āĻžāĻ° āĻšāĻžāĻ˛āĻžāĻ¨ā§‹āĻ° āĻĒāĻ°āĻŋāĻ•āĻ˛ā§āĻĒāĻ¨āĻž āĻ¨āĻž āĻ•āĻ°ā§‡āĻ¨ āĻ¤āĻŦā§‡ āĻ†āĻĒāĻ¨āĻŋ āĻāĻ‡ āĻĒāĻĻāĻ•ā§āĻˇā§‡āĻĒāĻŸāĻŋ āĻāĻĄāĻŧāĻŋāĻ¯āĻŧā§‡ āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨āĨ¤

    mkdir -p /usr/cache/.m2/repository
    chown -R :runner /usr/cache
    chmod -R 770 /usr/cache
  • āĻāĻ•āĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨ gitlab-deployer āĻāĻŦāĻ‚ āĻ—ā§āĻ°ā§āĻĒā§‡ āĻ¯ā§‹āĻ— āĻ•āĻ°ā§āĻ¨ runner
    useradd -m -d /home/gitlab-deployer gitlab-deployer
    usermod -a -G runner gitlab-deployer
  • āĻĢāĻžāĻ‡āĻ˛ā§‡ āĻ¯ā§‹āĻ— āĻ•āĻ°ā§āĻ¨ /etc/ssh/sshd_config āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§€ āĻ˛āĻžāĻ‡āĻ¨
    AllowUsers root@* [email protected]
  • āĻ°āĻŋāĻŦā§āĻŸ āĻ•āĻ°ā§āĻ¨ sshd
    systemctl restart sshd
  • āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻĒāĻžāĻ¸āĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻĄ āĻ¸ā§‡āĻŸ āĻ•āĻ°ā§āĻ¨ gitlab-deployer (āĻāĻŸāĻŋ āĻ¸āĻšāĻœ āĻšāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡, āĻ¯ā§‡āĻšā§‡āĻ¤ā§ āĻ¸ā§āĻĨāĻžāĻ¨ā§€āĻ¯āĻŧ āĻšā§‹āĻ¸ā§āĻŸā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ¸ā§€āĻŽāĻžāĻŦāĻĻā§āĻ§āĻ¤āĻž āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡)
    passwd gitlab-deployer
  • āĻ—āĻŋāĻŸāĻ˛ā§āĻ¯āĻžāĻŦ āĻ°āĻžāĻ¨āĻžāĻ° āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°ā§āĻ¨ (āĻ˛āĻŋāĻ¨āĻžāĻ•ā§āĻ¸ x86-64)
    sudo wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
    sudo chmod +x /usr/local/bin/gitlab-runner
    ln -s /usr/local/bin/gitlab-runner /etc/alternatives/gitlab-runner
    ln -s /etc/alternatives/gitlab-runner /usr/bin/gitlab-runner
  • gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners āĻ āĻ¯āĻžāĻ¨ āĻāĻŦāĻ‚ āĻ°ā§‡āĻœāĻŋāĻ¸ā§āĻŸā§āĻ°ā§‡āĻļāĻ¨ āĻŸā§‹āĻ•ā§‡āĻ¨ āĻ•āĻĒāĻŋ āĻ•āĻ°ā§āĻ¨

āĻĒāĻ°ā§āĻĻāĻž

āĻŽāĻžāĻ­ā§‡āĻ¨ āĻ¸ā§‡āĻ¨ā§āĻŸā§āĻ°āĻžāĻ˛ā§‡ āĻāĻ•āĻŸāĻŋ āĻœāĻžāĻ­āĻž āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒ āĻ†āĻĒāĻ˛ā§‹āĻĄ āĻ•āĻ°āĻ¤ā§‡ āĻ—āĻŋāĻŸāĻ˛ā§āĻ¯āĻžāĻŦ āĻ¸āĻŋāĻ†āĻ‡ āĻ¸ā§‡āĻŸ āĻ†āĻĒ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

  • āĻ°āĻžāĻ¨āĻžāĻ° āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻ¨
    gitlab-runner register --config /etc/gitlab-runner/gitlab-deployer-config.toml

āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž

Runtime platform arch=amd64 os=linux pid=17594 revision=3001a600 version=11.10.0
Running in system-mode.
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
https://gitlab.com/
Please enter the gitlab-ci token for this runner:
REGISTRATION_TOKEN
Please enter the gitlab-ci description for this runner:
[ih1174328.vds.myihor.ru]: Deploy Runner
Please enter the gitlab-ci tags for this runner (comma separated):
deploy
Registering runner... succeeded                     runner=ZvKdjJhx
Please enter the executor: docker-ssh, parallels, virtualbox, docker-ssh+machine, kubernetes, docker, ssh, docker+machine, shell:
shell
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

  • āĻ°āĻžāĻ¨āĻžāĻ° āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻŋāĻ¤ āĻ•āĻŋāĻ¨āĻž āĻ¤āĻž āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°ā§āĻ¨āĨ¤ gitlab.com-āĻ āĻ¯āĻžāĻ¨ -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners -> Runners āĻ¸āĻ•ā§āĻ°āĻŋāĻ¯āĻŧ āĻāĻ‡ āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒā§‡āĻ° āĻœāĻ¨ā§āĻ¯

āĻĒāĻ°ā§āĻĻāĻž

āĻŽāĻžāĻ­ā§‡āĻ¨ āĻ¸ā§‡āĻ¨ā§āĻŸā§āĻ°āĻžāĻ˛ā§‡ āĻāĻ•āĻŸāĻŋ āĻœāĻžāĻ­āĻž āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒ āĻ†āĻĒāĻ˛ā§‹āĻĄ āĻ•āĻ°āĻ¤ā§‡ āĻ—āĻŋāĻŸāĻ˛ā§āĻ¯āĻžāĻŦ āĻ¸āĻŋāĻ†āĻ‡ āĻ¸ā§‡āĻŸ āĻ†āĻĒ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

  • āĻ¯ā§‹āĻ— āĻ•āĻ°āĻžāĻ° āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻ†āĻ˛āĻžāĻĻāĻž āĻ¸ā§‡āĻŦāĻž /etc/systemd/system/gitlab-deployer.service
    [Unit]
    Description=GitLab Deploy Runner
    After=syslog.target network.target
    ConditionFileIsExecutable=/usr/local/bin/gitlab-runner
    [Service]
    StartLimitInterval=5
    StartLimitBurst=10
    ExecStart=/usr/local/bin/gitlab-runner "run" "--working-directory" "/home/gitlab-deployer" "--config" "/etc/gitlab-runner/gitlab-deployer-config.toml" "--service" "gitlab-deployer" "--syslog" "--user" "gitlab-deployer"
    Restart=always
    RestartSec=120
    [Install]
    WantedBy=multi-user.target
  • āĻ†āĻŽāĻ°āĻž āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻž āĻļā§āĻ°ā§ āĻ•āĻ°āĻŋāĨ¤
    systemctl enable gitlab-deployer.service
    systemctl start gitlab-deployer.service
    systemctl status gitlab-deployer.service
  • āĻ°āĻžāĻ¨āĻžāĻ° āĻšāĻ˛āĻ›ā§‡ āĻ•āĻŋāĻ¨āĻž āĻ¤āĻž āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°ā§āĻ¨āĨ¤

āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ

āĻŽāĻžāĻ­ā§‡āĻ¨ āĻ¸ā§‡āĻ¨ā§āĻŸā§āĻ°āĻžāĻ˛ā§‡ āĻāĻ•āĻŸāĻŋ āĻœāĻžāĻ­āĻž āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒ āĻ†āĻĒāĻ˛ā§‹āĻĄ āĻ•āĻ°āĻ¤ā§‡ āĻ—āĻŋāĻŸāĻ˛ā§āĻ¯āĻžāĻŦ āĻ¸āĻŋāĻ†āĻ‡ āĻ¸ā§‡āĻŸ āĻ†āĻĒ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

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

GPG āĻ•ā§€ āĻĒā§āĻ°āĻœāĻ¨ā§āĻŽ

  • āĻāĻ•āĻ‡ āĻŽā§‡āĻļāĻŋāĻ¨ āĻĨā§‡āĻ•ā§‡ āĻ†āĻŽāĻ°āĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻ…āĻ§ā§€āĻ¨ā§‡ ssh āĻāĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻ¯āĻžāĻ‡ gitlab-deployer (āĻāĻŸāĻŋ GPG āĻ•ā§€ āĻĒā§āĻ°āĻœāĻ¨ā§āĻŽā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ—ā§āĻ°ā§āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ)

    ssh [email protected]

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

    gpg --gen-key 

  • āĻšā§‡āĻ•

    gpg --list-keys -a
    /home/gitlab-deployer/.gnupg/pubring.gpg
    ----------------------------------------
    pub   4096R/00000000 2019-04-19
    uid                  Petruha Petrov <[email protected]>
    sub   4096R/11111111 2019-04-19

  • āĻ•ā§€ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻĒāĻžāĻŦāĻ˛āĻŋāĻ• āĻ•ā§€ āĻ†āĻĒāĻ˛ā§‹āĻĄ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

    gpg --keyserver keys.gnupg.net --send-key 00000000
    gpg: sending key 00000000 to hkp server keys.gnupg.net

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

āĻŽāĻžāĻ­ā§‡āĻ¨ āĻ¸ā§‡āĻŸāĻ†āĻĒ

  • āĻ†āĻŽāĻ°āĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻ…āĻ§ā§€āĻ¨ā§‡ āĻ¯āĻžāĻ¨ gitlab-deployer
    su gitlab-deployer 
  • āĻŽā§āĻ¯āĻžāĻ­ā§‡āĻ¨ āĻĄāĻŋāĻ°ā§‡āĻ•ā§āĻŸāĻ°āĻŋ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨ āĻ¸āĻ‚āĻ—ā§āĻ°āĻšāĻ¸ā§āĻĨāĻ˛ā§‡āĻ° āĻāĻŦāĻ‚ āĻ•ā§āĻ¯āĻžāĻļā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ˛āĻŋāĻ™ā§āĻ• āĻ•āĻ°ā§āĻ¨ (āĻ•ā§‹āĻ¨ āĻ­ā§āĻ˛ āĻ•āĻ°āĻŦā§‡āĻ¨ āĻ¨āĻž)
    āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻāĻ•āĻ‡ āĻŽā§‡āĻļāĻŋāĻ¨ā§‡ āĻāĻ•āĻžāĻ§āĻŋāĻ• āĻ°āĻžāĻ¨āĻžāĻ° āĻšāĻžāĻ˛āĻžāĻ¨ā§‹āĻ° āĻĒāĻ°āĻŋāĻ•āĻ˛ā§āĻĒāĻ¨āĻž āĻ¨āĻž āĻ•āĻ°ā§‡āĻ¨ āĻ¤āĻŦā§‡ āĻāĻ‡ āĻĒāĻĻāĻ•ā§āĻˇā§‡āĻĒāĻŸāĻŋ āĻāĻĄāĻŧāĻžāĻ¨ā§‹ āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤

    mkdir -p ~/.m2/repository
    ln -s /usr/cache/.m2/repository /home/gitlab-deployer/.m2/repository
  • āĻāĻ•āĻŸāĻŋ āĻŽāĻžāĻ¸ā§āĻŸāĻžāĻ° āĻ•ā§€ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • ~/.m2/settings-security.xml āĻĢāĻžāĻ‡āĻ˛ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • āĻ¸ā§‹āĻ¨āĻžāĻŸāĻžāĻ‡āĻĒ āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸ āĻĨā§‡āĻ•ā§‡ āĻĒāĻžāĻ¸āĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻĄ āĻāĻ¨āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • ~/.m2/settings.xml āĻĢāĻžāĻ‡āĻ˛ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨
    <settings>  
    <profiles>
        <profile>
            <id>env</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <gpg.passphrase>GPG_SECRET_KEY_PASSPHRASE</gpg.passphrase>
            </properties>
        </profile>
    </profiles>
    <servers>
        <server>
            <id>sonatype</id>
            <username>SONATYPE_USERNAME</username>
            <password>{98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}</password>
        </server>
    </servers>
    </settings>

āĻ•ā§‹āĻĨāĻžāĻ¯āĻŧ,
GPG_SECRET_KEY_PASSPHRASE - GPG āĻ•ā§€ āĻĒāĻžāĻ¸āĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻĄ
SONATYPE_USERNAME - āĻ¸ā§‹āĻ¨āĻžāĻŸāĻžāĻ‡āĻĒ āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸ āĻ˛āĻ—āĻ‡āĻ¨

āĻāĻŸāĻŋ āĻ°āĻžāĻ¨āĻžāĻ° āĻ¸ā§‡āĻŸāĻ†āĻĒ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ•āĻ°ā§‡, āĻ†āĻĒāĻ¨āĻŋ āĻŦāĻŋāĻ­āĻžāĻ—ā§‡ āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ āĻ—āĻŋāĻŸāĻ˛ā§āĻ¯āĻžāĻŦ āĻ¸āĻŋāĻ†āĻ‡

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

āĻļā§‡āĻ¯āĻŧāĻžāĻ°ā§āĻĄ āĻ°āĻžāĻ¨āĻžāĻ°

GPG āĻ•ā§€ āĻĒā§āĻ°āĻœāĻ¨ā§āĻŽ

  • āĻĒā§āĻ°āĻĨāĻŽāĻ¤, āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻāĻ•āĻŸāĻŋ GPG āĻ•ā§€ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤ āĻāĻŸāĻŋ āĻ•āĻ°āĻ¤ā§‡, gnupg āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°ā§āĻ¨āĨ¤

    yum install -y gnupg

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

    gpg --gen-key 

  • āĻŽā§‚āĻ˛ āĻ¤āĻĨā§āĻ¯ āĻĒā§āĻ¨āĻ°ā§āĻĻā§āĻ§āĻžāĻ° āĻ•āĻ°ā§āĻ¨

    gpg --list-keys -a
    pub   rsa3072 2019-04-24 [SC] [expires: 2021-04-23]
      2D0D1706366FC4AEF79669E24D09C55BBA3FD728
    uid           [ultimate] tttemp <[email protected]>
    sub   rsa3072 2019-04-24 [E] [expires: none]

  • āĻ•ā§€ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻĒāĻžāĻŦāĻ˛āĻŋāĻ• āĻ•ā§€ āĻ†āĻĒāĻ˛ā§‹āĻĄ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

    gpg --keyserver keys.gnupg.net --send-key 2D0D1706366FC4AEF79669E24D09C55BBA3FD728
    gpg: sending key 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 to hkp server keys.gnupg.net

  • āĻāĻ•āĻŸāĻŋ āĻŦā§āĻ¯āĻ•ā§āĻ¤āĻŋāĻ—āĻ¤ āĻ•ā§€ āĻĒāĻžāĻšā§āĻ›ā§‡āĻ¨

    gpg --export-secret-keys --armor 2D0D1706366FC4AEF79669E24D09C55BBA3FD728
    -----BEGIN PGP PRIVATE KEY BLOCK-----
    lQWGBFzAqp8BDADN41CPwJ/gQwiKEbyA902DKw/WSB1AvZQvV/ZFV77xGeG4K7k5
    ...
    =2Wd2
    -----END PGP PRIVATE KEY BLOCK-----

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

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

āĻŽāĻžāĻ­ā§‡āĻ¨ āĻ¸ā§‡āĻŸāĻ†āĻĒ

  • āĻāĻ•āĻŸāĻŋ āĻŽāĻžāĻ¸ā§āĻŸāĻžāĻ° āĻ•ā§€ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒ āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸ -> āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸ -> CI / CD -> āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛āĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻ¯āĻžāĻ¨ āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛ā§‡ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°ā§āĻ¨ SETTINGS_SECURITY_XML āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻ–āĻŋāĻ¤ āĻ˛āĻžāĻ‡āĻ¨:
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • āĻ¸ā§‹āĻ¨āĻžāĻŸāĻžāĻ‡āĻĒ āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸ āĻĨā§‡āĻ•ā§‡ āĻĒāĻžāĻ¸āĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻĄ āĻāĻ¨āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒ āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸ -> āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸ -> CI / CD -> āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛āĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻ¯āĻžāĻ¨ āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛ā§‡ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°ā§āĻ¨ SETTINGS_XML āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻ–āĻŋāĻ¤ āĻ˛āĻžāĻ‡āĻ¨:
    <settings>  
    <profiles>
        <profile>
            <id>env</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <gpg.passphrase>GPG_SECRET_KEY_PASSPHRASE</gpg.passphrase>
            </properties>
        </profile>
    </profiles>
    <servers>
        <server>
            <id>sonatype</id>
            <username>sonatype_username</username>
            <password>{98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}</password>
        </server>
    </servers>
    </settings>

āĻ•ā§‹āĻĨāĻžāĻ¯āĻŧ,
GPG_SECRET_KEY_PASSPHRASE - GPG āĻ•ā§€ āĻĒāĻžāĻ¸āĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻĄ
SONATYPE_USERNAME - āĻ¸ā§‹āĻ¨āĻžāĻŸāĻžāĻ‡āĻĒ āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸ āĻ˛āĻ—āĻ‡āĻ¨

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

āĻĄāĻ•āĻžāĻ° āĻ‡āĻŽā§‡āĻœ āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻ•āĻ°ā§āĻ¨

  • āĻ†āĻŽāĻ°āĻž āĻœāĻžāĻ­āĻž āĻāĻ° āĻĒāĻ›āĻ¨ā§āĻĻāĻ¸āĻ‡ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻĄāĻŋāĻĒā§āĻ˛ā§‹āĻ¯āĻŧ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ•āĻžāĻœāĻ—ā§āĻ˛āĻŋ āĻšāĻžāĻ˛āĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻŽā§‹āĻŸāĻžāĻŽā§āĻŸāĻŋ āĻ¸āĻšāĻœ āĻĄāĻ•āĻžāĻ°āĻĢāĻžāĻ‡āĻ˛ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻŋāĨ¤ āĻ¨ā§€āĻšā§‡ āĻ†āĻ˛āĻĒāĻžāĻ‡āĻ¨ āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ.

    FROM java:8u111-jdk-alpine
    RUN apk add gnupg maven git --update-cache 
    --repository http://dl-4.alpinelinux.org/alpine/edge/community/ --allow-untrusted && 
    mkdir ~/.m2/

  • āĻ†āĻĒāĻ¨āĻžāĻ° āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ§āĻžāĻ°āĻ• āĻ¨āĻŋāĻ°ā§āĻŽāĻžāĻŖ

    docker build -t registry.gitlab.com/group/deploy .

  • āĻ†āĻŽāĻ°āĻž āĻĒā§āĻ°āĻŽāĻžāĻŖā§€āĻ•āĻ°āĻŖ āĻāĻŦāĻ‚ āĻ°ā§‡āĻœāĻŋāĻ¸ā§āĻŸā§āĻ°āĻŋ āĻŽāĻ§ā§āĻ¯ā§‡ āĻ§āĻžāĻ°āĻ• āĻ˛ā§‹āĻĄ.

    docker login -u USER -p PASSWORD registry.gitlab.com
    docker push registry.gitlab.com/group/deploy

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

āĻ—āĻŋāĻŸāĻ˛ā§āĻ¯āĻžāĻŦ āĻ¸āĻŋāĻ†āĻ‡

āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒ āĻ¸ā§āĻĨāĻžāĻĒāĻ¨

āĻĄāĻŋāĻĒā§āĻ˛ā§‹āĻ¯āĻŧ āĻĒā§āĻ°āĻœā§‡āĻ•ā§āĻŸā§‡āĻ° āĻ°ā§āĻŸā§‡ .gitlab-ci.yml āĻĢāĻžāĻ‡āĻ˛āĻŸāĻŋ āĻ¯ā§‹āĻ— āĻ•āĻ°ā§āĻ¨
āĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ āĻĻā§āĻŸāĻŋ āĻĒāĻžāĻ°āĻ¸ā§āĻĒāĻ°āĻŋāĻ• āĻāĻ•āĻšā§‡āĻŸāĻŋāĻ¯āĻŧāĻž āĻ¸ā§āĻĨāĻžāĻĒāĻ¨āĻžāĻ° āĻ•āĻžāĻœ āĻ‰āĻĒāĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻ•āĻ°ā§‡āĨ¤ āĻ¯āĻĨāĻžāĻ•ā§āĻ°āĻŽā§‡ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ°āĻžāĻ¨āĻžāĻ° āĻŦāĻž āĻļā§‡āĻ¯āĻŧāĻžāĻ°ā§āĻĄ āĻ°āĻžāĻ¨āĻžāĻ°āĨ¤

gitlab-ci.yml

stages:
  - deploy

Specific Runner:
  extends: .java_deploy_template
  # ЗадаŅ‡Đ° ĐąŅƒĐ´ĐĩŅ‚ вŅ‹ĐŋĐžĐģĐŊŅŅ‚ŅŒŅŅ ĐŊĐ° ваŅˆĐĩĐŧ shell-Ņ€Đ°ĐŊĐŊĐĩŅ€Đĩ
  tags:
    - deploy

Shared Runner:
  extends: .java_deploy_template
  # ЗадаŅ‡Đ° ĐąŅƒĐ´ĐĩŅ‚ вŅ‹ĐŋĐžĐģĐŊŅŅ‚ŅŒŅŅ ĐŊĐ° ĐŋŅƒĐąĐģиŅ‡ĐŊĐžĐŧ docker-Ņ€Đ°ĐŊĐŊĐĩŅ€Đĩ
  tags:
    - docker
  # ОбŅ€Đ°Đˇ иС Ņ€Đ°ĐˇĐ´ĐĩĐģĐ° GitLab Runner -> Shared Runner -> Docker
  image: registry.gitlab.com/group/deploy-project:latest
  before_script:
    # ИĐŧĐŋĐžŅ€Ņ‚иŅ€ŅƒĐĩĐŧ GPG ĐēĐģŅŽŅ‡
    - printf "${GPG_SECRET_KEY}" | gpg --batch --import
    # ĐĄĐžŅ…Ņ€Đ°ĐŊŅĐĩĐŧ maven ĐēĐžĐŊŅ„иĐŗŅƒŅ€Đ°Ņ†Đ¸ŅŽ
    - printf "${SETTINGS_SECURITY_XML}" > ~/.m2/settings-security.xml
    - printf "${SETTINGS_XML}" > ~/.m2/settings.xml

.java_deploy_template:
  stage: deploy
  # ЗадаŅ‡Đ° ŅŅ€Đ°ĐąĐžŅ‚Đ°ĐĩŅ‚ ĐŋĐž Ņ‚Ņ€Đ¸ĐŗĐŗĐĩŅ€Ņƒ, ĐĩŅĐģи ĐŋĐĩŅ€ĐĩĐ´Đ°ĐŊĐ° ĐŋĐĩŅ€ĐĩĐŧĐĩĐŊĐŊĐ°Ņ DEPLOY ŅĐž СĐŊĐ°Ņ‡ĐĩĐŊиĐĩĐŧ java
  only:
    variables:
    - $DEPLOY == "java"
  variables:
    # ĐžŅ‚ĐēĐģŅŽŅ‡Đ°ĐĩĐŧ ĐēĐģĐžĐŊиŅ€ĐžĐ˛Đ°ĐŊиĐĩ Ņ‚ĐĩĐēŅƒŅ‰ĐĩĐŗĐž ĐŋŅ€ĐžĐĩĐēŅ‚Đ°
    GIT_STRATEGY: none
  script:
    # ПŅ€ĐĩĐ´ĐžŅŅ‚авĐģŅĐĩĐŧ вОСĐŧĐžĐļĐŊĐžŅŅ‚ŅŒ Ņ…Ņ€Đ°ĐŊĐĩĐŊиŅ ĐŋĐ°Ņ€ĐžĐģŅ в ĐŊĐĩСаŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ĐŊĐŊĐžĐŧ видĐĩ
    - git config --global credential.helper store
    # ĐĄĐžŅ…Ņ€Đ°ĐŊŅĐĩĐŧ вŅ€ĐĩĐŧĐĩĐŊĐŊŅ‹Đĩ ĐēŅ€ĐĩĐ´Ņ‹ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ gitlab-ci-token
    # ĐĸĐžĐēĐĩĐŊ Ņ€Đ°ĐąĐžŅ‚Đ°ĐĩŅ‚ Đ´ĐģŅ вŅĐĩŅ… ĐŋŅƒĐąĐģиŅ‡ĐŊŅ‹Ņ… ĐŋŅ€ĐžĐĩĐēŅ‚Ов gitlab.com и Đ´ĐģŅ ĐŋŅ€ĐžĐĩĐēŅ‚Ов ĐŗŅ€ŅƒĐŋĐŋŅ‹
    - echo "https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com" >> ~/.git-credentials
    # ПоĐģĐŊĐžŅŅ‚ŅŒŅŽ Ņ‡Đ¸ŅŅ‚иĐŧ Ņ‚ĐĩĐēŅƒŅ‰ŅƒŅŽ диŅ€ĐĩĐēŅ‚ĐžŅ€Đ¸ŅŽ
    - rm -rf .* *
    # КĐģĐžĐŊиŅ€ŅƒĐĩĐŧ ĐŋŅ€ĐžĐĩĐēŅ‚ ĐēĐžŅ‚ĐžŅ€Ņ‹Đš, ĐąŅƒĐ´ĐĩĐŧ Đ´ĐĩĐŋĐģОиŅ‚ŅŒ в Sonatype Nexus
    - git clone ${DEPLOY_CI_REPOSITORY_URL} .
    # ПĐĩŅ€ĐĩĐēĐģŅŽŅ‡Đ°ĐĩĐŧŅŅ ĐŊĐ° ĐŊŅƒĐļĐŊŅ‹Đš ĐēĐžĐŧĐŧиŅ‚
    - git checkout ${DEPLOY_CI_COMMIT_SHA} -f
    # ЕŅĐģи Ņ…ĐžŅ‚ŅŒ ОдиĐŊ pom.xml ŅĐžĐ´ĐĩŅ€ĐļиŅ‚ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€ autoReleaseAfterClose ваĐģиĐŧ ŅĐąĐžŅ€ĐēŅƒ.
    # В ĐŋŅ€ĐžŅ‚ивĐŊĐžĐŧ ŅĐģŅƒŅ‡Đ°Đĩ ĐĩŅŅ‚ŅŒ Ņ€Đ¸ŅĐē СаĐģиŅ‚ŅŒ ŅŅ‹Ņ€Ņ‹Đĩ Đ°Ņ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚Ņ‹ в maven central
    - >
      for pom in $(find . -name pom.xml); do
        if [[ $(grep -q autoReleaseAfterClose "$pom" && echo $?) == 0 ]]; then
          echo "File $pom contains prohibited setting: <autoReleaseAfterClose>";
          exit 1;
        fi;
      done
    # ЕŅĐģи ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€ DEPLOY_CI_COMMIT_TAG ĐŋŅƒŅŅ‚ОК, Ņ‚Đž ĐŋŅ€Đ¸ĐŊŅƒĐ´Đ¸Ņ‚ĐĩĐģŅŒĐŊĐž ŅŅ‚авиĐŧ SNAPSHOT-вĐĩŅ€ŅĐ¸ŅŽ
    - >
      if [[ "${DEPLOY_CI_COMMIT_TAG}" != "" ]]; then
        mvn versions:set -DnewVersion=${DEPLOY_CI_COMMIT_TAG}
      else
        VERSION=$(mvn -q -Dexec.executable=echo -Dexec.args='${project.version}' --non-recursive exec:exec)
        if [[ "${VERSION}" == *-SNAPSHOT ]]; then
          mvn versions:set -DnewVersion=${VERSION}
        else
          mvn versions:set -DnewVersion=${VERSION}-SNAPSHOT
        fi
      fi
    # ЗаĐŋŅƒŅĐēĐ°ĐĩĐŧ СадаŅ‡Ņƒ ĐŊĐ° ŅĐąĐžŅ€ĐēŅƒ и Đ´ĐĩĐŋĐģОК Đ°Ņ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚Ов
    - mvn clean deploy -DskipTests=true

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

āĻœāĻžāĻ­āĻž āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒ

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

gitlab-ci.yml

stages:
  - build
  - test
  - verify
  - deploy

<...>

Release:
  extends: .trigger_deploy
  # ЗаĐŋŅƒŅĐēĐ°Ņ‚ŅŒ СадаŅ‡Ņƒ Ņ‚ĐžĐģŅŒĐēĐž Đŋo Ņ‚ĐĩĐŗŅƒ.
  only:
    - tags

Snapshot:
  extends: .trigger_deploy
  # ЗаĐŋŅƒŅĐēĐ°ĐĩĐŧ СадаŅ‡Ņƒ ĐŊĐ° ĐŋŅƒĐąĐģиĐēĐ°Ņ†Đ¸ŅŽ SNAPSHOT вĐĩŅ€ŅĐ¸Đ¸ вŅ€ŅƒŅ‡ĐŊŅƒŅŽ
  when: manual
  # НĐĩ СаĐŋŅƒŅĐēĐ°Ņ‚ŅŒ СадаŅ‡Ņƒ, ĐĩŅĐģи ĐŋŅ€ĐžŅŅ‚авĐģĐĩĐŊ Ņ‚ĐĩĐŗ.
  except:
    - tags

.trigger_deploy:
  stage: deploy
  variables:
    # ОŅ‚ĐēĐģŅŽŅ‡Đ°ĐĩĐŧ ĐēĐģĐžĐŊиŅ€ĐžĐ˛Đ°ĐŊиĐĩ Ņ‚ĐĩĐēŅƒŅ‰ĐĩĐŗĐž ĐŋŅ€ĐžĐĩĐēŅ‚Đ°
    GIT_STRATEGY: none
    # ĐĄŅŅ‹ĐģĐēĐ° ĐŊĐ° Ņ‚Ņ€Đ¸ĐŗĐŗĐĩŅ€ deploy-СадаŅ‡Đ¸
    URL: "https://gitlab.com/api/v4/projects/<deploy project ID>/trigger/pipeline"
    # ПĐĩŅ€ĐĩĐŧĐĩĐŊĐŊŅ‹Đĩ deploy-СадаŅ‡Đ¸
    POST_DATA: "
      token=${DEPLOY_TOKEN}&
      ref=master&
      variables[DEPLOY]=${DEPLOY}&
      variables[DEPLOY_CI_REPOSITORY_URL]=${CI_REPOSITORY_URL}&
      variables[DEPLOY_CI_PROJECT_NAME]=${CI_PROJECT_NAME}&
      variables[DEPLOY_CI_COMMIT_SHA]=${CI_COMMIT_SHA}&
      variables[DEPLOY_CI_COMMIT_TAG]=${CI_COMMIT_TAG}
      "
  script:
    # НĐĩ иŅĐŋĐžĐģŅŒĐˇŅƒŅŽ cURL, Ņ‚Đ°Đē ĐēĐ°Đē Ņ Ņ„ĐģĐ°ĐŗĐ°Đŧи --fail --show-error
    # ĐžĐŊ ĐŊĐĩ вŅ‹Đ˛ĐžĐ´Đ¸Ņ‚ Ņ‚ĐĩĐģĐž ĐžŅ‚вĐĩŅ‚Đ°, ĐĩŅĐģи HTTP ĐēОд 400 и йОĐģĐĩĐĩ 
    - wget --content-on-error -qO- ${URL} --post-data ${POST_DATA}

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

āĻ†āĻ°ā§‹ āĻŦāĻŋāĻļāĻĻ āĻŦāĻŋāĻŦāĻ°āĻŖ

āĻ†āĻŽāĻŋ āĻāĻ•āĻŸāĻŋ āĻĒā§ƒāĻĨāĻ• āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§‡āĻ›āĻŋ gitlab-ci āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻ¤āĻŋāĻ¨āĻŋ āĻœāĻžāĻ­āĻž āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒā§‡āĻ° āĻœāĻ¨ā§āĻ¯ CI āĻŸā§‡āĻŽāĻĒā§āĻ˛ā§‡āĻŸ āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻ•āĻ°ā§‡āĻ›ā§‡āĻ¨ common.yml.

common.yml

stages:
  - build
  - test
  - verify
  - deploy

variables:
  SONAR_ARGS: "
  -Dsonar.gitlab.commit_sha=${CI_COMMIT_SHA} 
  -Dsonar.gitlab.ref_name=${CI_COMMIT_REF_NAME} 
  "

.build_java_project:
  stage: build
  tags:
    - touchbit-shell
  variables:
    SKIP_TEST: "false"
  script:
    - mvn clean
    - mvn package -DskipTests=${SKIP_TEST}
  artifacts:
    when: always
    expire_in: 30 day
    paths:
      - "*/target/reports"

.build_sphinx_doc:
  stage: build
  tags:
    - touchbit-shell
  variables:
    DOCKERFILE: .indirect/docs/Dockerfile
  script:
    - docker build --no-cache -t ${CI_PROJECT_NAME}/doc -f ${DOCKERFILE} .

.junit_module_test_run:
  stage: test
  tags:
    - touchbit-shell
  variables:
    MODULE: ""
  script:
    - cd ${MODULE}
    - mvn test
  artifacts:
    when: always
    expire_in: 30 day
    paths:
      - "*/target/reports"

.junit_test_run:
  stage: test
  tags:
    - touchbit-shell
  script:
    - mvn test
  artifacts:
    when: always
    expire_in: 30 day
    paths:
    - "*/target/reports"

.sonar_review:
  stage: verify
  tags:
    - touchbit-shell
  dependencies: []
  script:
    - >
      if [ "$CI_BUILD_REF_NAME" == "master" ]; then
        mvn compile sonar:sonar -Dsonar.login=$SONAR_LOGIN $SONAR_ARGS
      else
        mvn compile sonar:sonar -Dsonar.login=$SONAR_LOGIN $SONAR_ARGS -Dsonar.analysis.mode=preview
      fi

.trigger_deploy:
  stage: deploy
  tags:
    - touchbit-shell
  variables:
    URL: "https://gitlab.com/api/v4/projects/10345765/trigger/pipeline"
    POST_DATA: "
      token=${DEPLOY_TOKEN}&
      ref=master&
      variables[DEPLOY]=${DEPLOY}&
      variables[DEPLOY_CI_REPOSITORY_URL]=${CI_REPOSITORY_URL}&
      variables[DEPLOY_CI_PROJECT_NAME]=${CI_PROJECT_NAME}&
      variables[DEPLOY_CI_COMMIT_SHA]=${CI_COMMIT_SHA}&
      variables[DEPLOY_CI_COMMIT_TAG]=${CI_COMMIT_TAG}
      "
  script:
  - wget --content-on-error -qO- ${URL} --post-data ${POST_DATA}

.trigger_release_deploy:
  extends: .trigger_deploy
  only:
    - tags

.trigger_snapshot_deploy:
  extends: .trigger_deploy
  when: manual
  except:
    - tags

āĻĢāĻ˛āĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻœāĻžāĻ­āĻž āĻĒā§āĻ°āĻœā§‡āĻ•ā§āĻŸā§‡, .gitlab-ci.yml āĻ–ā§āĻŦ āĻ•āĻŽāĻĒā§āĻ¯āĻžāĻ•ā§āĻŸ āĻĻā§‡āĻ–āĻžāĻ¯āĻŧ āĻāĻŦāĻ‚ āĻ­āĻžāĻ°ā§āĻŦā§‹āĻ¸ āĻ¨āĻ¯āĻŧ

gitlab-ci.yml

include: https://gitlab.com/TouchBIT/gitlab-ci/raw/master/common.yml

Shields4J:
  extends: .build_java_project

Sphinx doc:
  extends: .build_sphinx_doc
  variables:
    DOCKERFILE: .docs/Dockerfile

Sonar review:
  extends: .sonar_review
  dependencies:
    - Shields4J

Release:
  extends: .trigger_release_deploy

Snapshot:
  extends: .trigger_snapshot_deploy

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

pom.xml āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨

āĻāĻ‡ āĻŦāĻŋāĻˇāĻ¯āĻŧ āĻŽāĻšāĻžāĻ¨ āĻŦāĻŋāĻ¸ā§āĻ¤āĻžāĻ°āĻŋāĻ¤ āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ. googolplex в āĻ¸ā§āĻ¨ā§āĻ¯āĻžāĻĒāĻļāĻŸ āĻāĻŦāĻ‚ āĻ¸ā§āĻŸā§‡āĻœāĻŋāĻ‚ āĻ°āĻŋāĻĒā§‹āĻœāĻŋāĻŸāĻ°āĻŋāĻ¤ā§‡ āĻ†āĻ°ā§āĻŸāĻŋāĻĢā§āĻ¯āĻžāĻ•ā§āĻŸāĻ—ā§āĻ˛āĻŋ āĻ¸ā§āĻŦāĻ¯āĻŧāĻ‚āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻ­āĻžāĻŦā§‡ āĻ¸āĻžāĻ‡āĻ¨ āĻāĻŦāĻ‚ āĻ†āĻĒāĻ˛ā§‹āĻĄ āĻ•āĻ°āĻ¤ā§‡ āĻŽā§āĻ¯āĻžāĻ­ā§‡āĻ¨ āĻ¸ā§‡āĻŸ āĻ†āĻĒ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡, āĻ¤āĻžāĻ‡ āĻ†āĻŽāĻŋ āĻĒā§āĻ˛āĻžāĻ—āĻ‡āĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻ•āĻŋāĻ›ā§ āĻ¸ā§‚āĻ•ā§āĻˇā§āĻŽāĻ¤āĻž āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻ•āĻ°āĻŦāĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻ•āĻ¤ āĻ¸āĻšāĻœā§‡ āĻāĻŦāĻ‚ āĻ¸ā§āĻŦāĻžāĻ­āĻžāĻŦāĻŋāĻ•āĻ­āĻžāĻŦā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ āĻ¤āĻžāĻ“ āĻ†āĻŽāĻŋ āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻ•āĻ°āĻŦ nexus-staging-maven-plugināĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻ¨āĻž āĻšāĻžāĻ¨ āĻŦāĻž org.sonatype.oss:oss-parent āĻ†āĻĒāĻ¨āĻžāĻ° āĻĒā§āĻ°ā§‹āĻœā§‡āĻ•ā§āĻŸā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻ­āĻŋāĻ­āĻžāĻŦāĻ• āĻšāĻŋāĻ¸ā§‡āĻŦā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻ¨āĻž āĻĒāĻžāĻ°ā§‡āĻ¨āĨ¤

maven-install-plugin

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

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-install-plugin</artifactId>
  <executions>
    <execution>
      <id>install-project</id>
      <!-- ЕŅĐģи Ņƒ ваŅ ĐŧĐŊĐžĐŗĐžĐŧОдŅƒĐģŅŒĐŊŅ‹Đš ĐŋŅ€ĐžĐĩĐēŅ‚ Ņ Đ´ĐĩĐŋĐģĐžĐĩĐŧ Ņ€ĐžĐ´Đ¸Ņ‚ĐĩĐģŅŒŅĐēĐžĐŗĐž ĐŋĐžĐŧиĐēĐ° -->
      <phase>install</phase>
      <!-- Đ¯Đ˛ĐŊĐž ŅƒĐēаСŅ‹Đ˛Đ°ĐĩĐŧ Ņ„Đ°ĐšĐģŅ‹ Đ´ĐģŅ ĐģĐžĐēĐ°ĐģŅŒĐŊОК ŅƒŅŅ‚Đ°ĐŊОвĐēи -->
      <configuration>
        <file>target/${project.artifactId}-${project.version}.jar</file>
```target/${project.artifactId}-${project.version}-sources.jar</sources>
        <pomFile>dependency-reduced-pom.xml</pomFile>
        <!-- ПŅ€Đ¸ĐŊŅƒĐ´Đ¸Ņ‚ĐĩĐģŅŒĐŊĐžĐĩ ОйĐŊОвĐģĐĩĐŊиĐĩ ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊĐŊŅ‹Ņ… ĐŋŅ€ĐžĐĩĐēŅ‚Đ° -->
        <updateReleaseInfo>true</updateReleaseInfo>
        <!-- КоĐŊŅ‚Ņ€ĐžĐģŅŒĐŊŅ‹Đĩ ŅŅƒĐŧĐŧŅ‹ Đ´ĐģŅ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи Ņ†ĐĩĐģĐžŅŅ‚ĐŊĐžŅŅ‚и -->
        <createChecksum>true</createChecksum>
      </configuration>
    </execution>
  </executions>
</plugin>

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

maven-javadoc-āĻĒā§āĻ˛āĻžāĻ—āĻ‡āĻ¨

āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻœāĻžāĻ­āĻžāĻĄā§‹āĻ• āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡āĨ¤

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-javadoc-plugin</artifactId>
  <executions>
    <execution>
      <goals>
        <goal>jar</goal>
      </goals>
      <!-- ГĐĩĐŊĐĩŅ€Đ°Ņ†Đ¸Ņ javadoc Đ´ĐžĐģĐļĐŊĐ° ĐąŅ‹Ņ‚ŅŒ ĐŋĐžŅĐģĐĩ Ņ„аСŅ‹ ĐŗĐĩĐŊĐĩŅ€Đ°Ņ†Đ¸Đ¸ Ņ€ĐĩŅŅƒŅ€ŅĐžĐ˛ -->
      <phase>prepare-package</phase>
      <configuration>
        <!-- ОŅ‡ĐĩĐŊŅŒ ĐŋĐžĐŧĐžĐŗĐ°ĐĩŅ‚ в ĐŋŅƒĐąĐģиŅ‡ĐŊŅ‹Ņ… ĐŋŅ€ĐžĐĩĐēŅ‚Đ°Ņ… -->
        <failOnError>true</failOnError>
        <failOnWarnings>true</failOnWarnings>
        <!-- ĐŖйиŅ€Đ°ĐĩŅ‚ ĐžŅˆĐ¸ĐąĐēŅƒ ĐŋОиŅĐēĐ° Đ´ĐžĐēŅƒĐŧĐĩĐŊŅ‚Đ°Ņ†Đ¸Đ¸ в target диŅ€ĐĩĐēŅ‚ĐžŅ€Đ¸Đ¸ -->
        <detectOfflineLinks>false</detectOfflineLinks>
      </configuration>
    </execution>
  </executions>
</plugin>

āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¯āĻĻāĻŋ āĻāĻŽāĻ¨ āĻāĻ•āĻŸāĻŋ āĻŽāĻĄāĻŋāĻ‰āĻ˛ āĻĨāĻžāĻ•ā§‡ āĻ¯āĻžāĻ¤ā§‡ āĻœāĻžāĻ­āĻž āĻĨāĻžāĻ•ā§‡ āĻ¨āĻž (āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ¸āĻŽā§āĻĒāĻĻ)
āĻ…āĻĨāĻŦāĻž āĻ†āĻĒāĻ¨āĻŋ āĻ¨ā§€āĻ¤āĻŋāĻ—āĻ¤āĻ­āĻžāĻŦā§‡ javadoc āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ¨ āĻ¨āĻž, āĻ¤āĻžāĻ°āĻĒāĻ° āĻ¸āĻžāĻšāĻžāĻ¯ā§āĻ¯ āĻ•āĻ°āĻ¤ā§‡ maven-jar-plugin

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <executions>
    <execution>
      <id>empty-javadoc-jar</id>
      <phase>generate-resources</phase>
      <goals>
        <goal>jar</goal>
      </goals>
      <configuration>
        <classifier>javadoc</classifier>
        <classesDirectory>${basedir}/javadoc</classesDirectory>
      </configuration>
    </execution>
  </executions>
</plugin>

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

maven-gpg-āĻĒā§āĻ˛āĻžāĻ—āĻ‡āĻ¨

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-gpg-plugin</artifactId>
  <executions>
    <execution>
      <id>sign-artifacts</id>
      <!-- ХйОŅ€ĐēĐ° ĐąŅƒĐ´ĐĩŅ‚ ĐŋĐ°Đ´Đ°Ņ‚ŅŒ, ĐĩŅĐģи ĐžŅ‚ŅŅƒŅ‚ŅŅ‚вŅƒĐĩŅ‚ GPG ĐēĐģŅŽŅ‡ -->
      <!-- ПодĐŋиŅŅ‹Đ˛Đ°ĐĩĐŧ Đ°Ņ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚Ņ‹ Ņ‚ĐžĐģŅŒĐēĐž ĐŊĐ° Ņ„аСĐĩ deploy -->
      <phase>deploy</phase>
      <goals>
        <goal>sign</goal>
      </goals>
    </execution>
  </executions>
</plugin>

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

āĻ¨ā§‡āĻ•ā§āĻ¸āĻžāĻ¸-āĻ¸ā§āĻŸā§‡āĻœāĻŋāĻ‚-āĻŽāĻžāĻ­ā§‡āĻ¨-āĻĒā§āĻ˛āĻžāĻ—āĻ‡āĻ¨

āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨:

<project>
  <!-- ... -->
  <build>
    <plugins>
      <!-- ... -->
      <plugin>
        <groupId>org.sonatype.plugins</groupId>
        <artifactId>nexus-staging-maven-plugin</artifactId>
      </plugin>
    </plugins>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.sonatype.plugins</groupId>
          <artifactId>nexus-staging-maven-plugin</artifactId>
          <extensions>true</extensions>
          <configuration>
            <serverId>sonatype</serverId>
            <nexusUrl>https://oss.sonatype.org/</nexusUrl>
            <!-- ОбĐŊОвĐģŅĐĩĐŧ ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊĐŊŅ‹Đĩ, Ņ‡Ņ‚ОйŅ‹ ĐŋĐžĐŧĐĩŅ‚иŅ‚ŅŒ Đ°Ņ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚ ĐēĐ°Đē release -->
            <!-- НĐĩ вĐģиŅĐĩŅ‚ ĐŊĐ° snapshot вĐĩŅ€ŅĐ¸Đ¸ -->
            <updateReleaseInfo>true</updateReleaseInfo>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-deploy-plugin</artifactId>
          <configuration>
            <!-- ОŅ‚ĐēĐģŅŽŅ‡Đ°ĐĩĐŧ ĐŋĐģĐ°ĐŗиĐŊ -->
            <skip>true</skip>
          </configuration>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
  <distributionManagement>
    <snapshotRepository>
      <id>sonatype</id>
      <name>Nexus Snapshot Repository</name>
      <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
    </snapshotRepository>
    <repository>
      <id>sonatype</id>
      <name>Nexus Release Repository</name>
      <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
    </repository>
  </distributionManagement>
</project>

āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¯āĻĻāĻŋ āĻāĻ•āĻŸāĻŋ āĻŽāĻžāĻ˛ā§āĻŸāĻŋ-āĻŽāĻĄāĻŋāĻ‰āĻ˛ āĻĒā§āĻ°āĻœā§‡āĻ•ā§āĻŸ āĻĨāĻžāĻ•ā§‡ āĻāĻŦāĻ‚ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¸āĻ‚āĻ—ā§āĻ°āĻšāĻ¸ā§āĻĨāĻ˛ā§‡ āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻŽāĻĄāĻŋāĻ‰āĻ˛ āĻ†āĻĒāĻ˛ā§‹āĻĄ āĻ•āĻ°āĻžāĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻ¨āĻž āĻšāĻ¯āĻŧ, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻāĻ‡ āĻŽāĻĄāĻŋāĻ‰āĻ˛ā§‡āĻ° pom.xml-āĻ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤ nexus-staging-maven-plugin āĻĒāĻ¤āĻžāĻ•āĻž āĻ¸āĻš skipNexusStagingDeployMojo

<build>
  <plugins>
    <plugin>
      <groupId>org.sonatype.plugins</groupId>
      <artifactId>nexus-staging-maven-plugin</artifactId>
      <configuration>
        <skipNexusStagingDeployMojo>true</skipNexusStagingDeployMojo>
      </configuration>
    </plugin>
  </plugins>
</build>

āĻ†āĻĒāĻ˛ā§‹āĻĄ āĻ•āĻ°āĻžāĻ° āĻĒāĻ°ā§‡ āĻ¸ā§āĻ¨ā§āĻ¯āĻžāĻĒāĻļāĻŸ/āĻ°āĻŋāĻ˛āĻŋāĻœ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ āĻĒāĻžāĻ“āĻ¯āĻŧāĻž āĻ¯āĻžāĻ¯āĻŧ āĻŽāĻžā§āĻšāĻžāĻ¯āĻŧāĻ¨ āĻ¸āĻ‚āĻ—ā§āĻ°āĻšāĻ¸ā§āĻĨāĻ˛

<repositories>
  <repository>
    <id>SonatypeNexus</id>
    <url>https://oss.sonatype.org/content/groups/staging/</url>
    <!-- НĐĩ ĐŊĐ°Đ´Đž ŅƒĐēаСŅ‹Đ˛Đ°Ņ‚ŅŒ Ņ„ĐģĐ°Đŗи snapshot/release Đ´ĐģŅ Ņ€ĐĩĐŋОСиŅ‚ĐžŅ€Đ¸Ņ -->
  </repository>
</repositories>

āĻ†āĻ°ā§‹ pluses

  • āĻ¨ā§‡āĻ•ā§āĻ¸āĻžāĻ¸ āĻ°āĻŋāĻĒā§‹āĻœāĻŋāĻŸāĻ°āĻŋāĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ˛āĻ•ā§āĻˇā§āĻ¯āĻ—ā§āĻ˛āĻŋāĻ° āĻāĻ•āĻŸāĻŋ āĻ–ā§āĻŦ āĻ¸āĻŽā§ƒāĻĻā§āĻ§ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
  • āĻŽāĻžāĻ­ā§‡āĻ¨ āĻ¸ā§‡āĻ¨ā§āĻŸā§āĻ°āĻžāĻ˛ā§‡ āĻĄāĻžāĻ‰āĻ¨āĻ˛ā§‹āĻĄāĻ¯ā§‹āĻ—ā§āĻ¯āĻ¤āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸ā§āĻŦāĻ¯āĻŧāĻ‚āĻ•ā§āĻ°āĻŋāĻ¯āĻŧ āĻ°āĻŋāĻ˛āĻŋāĻœ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž

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

āĻĢāĻ˛

āĻāĻ•āĻŸāĻŋ āĻ¸ā§āĻ¨ā§āĻ¯āĻžāĻĒāĻļāĻŸ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ āĻĒā§āĻ°āĻ•āĻžāĻļ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ, āĻ¨ā§‡āĻ•ā§āĻ¸āĻžāĻ¸ā§‡ āĻ¸ā§āĻ¨ā§āĻ¯āĻžāĻĒāĻļāĻŸ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ āĻĄāĻžāĻ‰āĻ¨āĻ˛ā§‹āĻĄ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻŽā§āĻ¯āĻžāĻ¨ā§āĻ¯āĻŧāĻžāĻ˛āĻŋ āĻāĻ•āĻŸāĻŋ āĻ•āĻžāĻœ āĻļā§āĻ°ā§ āĻ•āĻ°āĻž āĻ¸āĻŽā§āĻ­āĻŦ

āĻŽāĻžāĻ­ā§‡āĻ¨ āĻ¸ā§‡āĻ¨ā§āĻŸā§āĻ°āĻžāĻ˛ā§‡ āĻāĻ•āĻŸāĻŋ āĻœāĻžāĻ­āĻž āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒ āĻ†āĻĒāĻ˛ā§‹āĻĄ āĻ•āĻ°āĻ¤ā§‡ āĻ—āĻŋāĻŸāĻ˛ā§āĻ¯āĻžāĻŦ āĻ¸āĻŋāĻ†āĻ‡ āĻ¸ā§‡āĻŸ āĻ†āĻĒ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

āĻ¯āĻ–āĻ¨ āĻāĻ‡ āĻŸāĻžāĻ¸ā§āĻ•āĻŸāĻŋ āĻšāĻžāĻ˛ā§ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ, āĻ¤āĻ–āĻ¨ āĻĄāĻŋāĻĒā§āĻ˛ā§‹āĻ¯āĻŧ āĻĒā§āĻ°āĻœā§‡āĻ•ā§āĻŸā§‡āĻ° āĻ¸āĻ‚āĻļā§āĻ˛āĻŋāĻˇā§āĻŸ āĻŸāĻžāĻ¸ā§āĻ•āĻŸāĻŋ āĻŸā§āĻ°āĻŋāĻ—āĻžāĻ° āĻšāĻ¯āĻŧ (āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ).

āĻ•ā§āĻ°āĻĒ āĻ•āĻ°āĻž āĻ˛āĻ—

Running with gitlab-runner 11.10.0 (3001a600)
  on Deploy runner JSKWyxUw
Using Shell executor...
Running on ih1174328.vds.myihor.ru...
Skipping Git repository setup
Skipping Git checkout
Skipping Git submodules setup
$ rm -rf .* *
$ git config --global credential.helper store
$ echo "https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com" >> ~/.git-credentials
$ git clone ${DEPLOY_CI_REPOSITORY_URL} .
Cloning into 'shields4j'...
$ git checkout ${DEPLOY_CI_COMMIT_SHA}
Note: checking out '850f86aa317194395c5387790da1350e437125a7'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
  git checkout -b new_branch_name
HEAD is now at 850f86a... skip deploy test-core
$ for pom in $(find . -name pom.xml); do # collapsed multi-line command
$ if [[ "${DEPLOY_CI_COMMIT_TAG}" != "" ]]; then # collapsed multi-line command
[INFO] Scanning for projects...
[INFO] Inspecting build with total of 4 modules...
[INFO] Installing Nexus Staging features:
[INFO]   ... total of 4 executions of maven-deploy-plugin replaced with nexus-staging-maven-plugin
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] 
[INFO] Shields4J                                                          [pom]
[INFO] test-core                                                          [jar]
[INFO] Shields4J client                                                   [jar]
[INFO] TestNG listener                                                    [jar]
[INFO] 
[INFO] --------------< org.touchbit.shields4j:shields4j-parent >---------------
[INFO] Building Shields4J 1.0.0                                           [1/4]
[INFO] --------------------------------[ pom ]---------------------------------
[INFO] 
[INFO] --- versions-maven-plugin:2.5:set (default-cli) @ shields4j-parent ---
[INFO] Searching for local aggregator root...
[INFO] Local aggregation root: /home/gitlab-deployer/JSKWyxUw/0/TouchBIT/deploy/shields4j
[INFO] Processing change of org.touchbit.shields4j:shields4j-parent:1.0.0 -> 1.0.0-SNAPSHOT
[INFO] Processing org.touchbit.shields4j:shields4j-parent
[INFO]     Updating project org.touchbit.shields4j:shields4j-parent
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO] 
[INFO] Processing org.touchbit.shields4j:client
[INFO]     Updating parent org.touchbit.shields4j:shields4j-parent
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO]     Updating dependency org.touchbit.shields4j:test-core
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO] 
[INFO] Processing org.touchbit.shields4j:test-core
[INFO]     Updating parent org.touchbit.shields4j:shields4j-parent
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO] 
[INFO] Processing org.touchbit.shields4j:testng
[INFO]     Updating parent org.touchbit.shields4j:shields4j-parent
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO]     Updating dependency org.touchbit.shields4j:client
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO]     Updating dependency org.touchbit.shields4j:test-core
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] Shields4J 1.0.0 .................................... SUCCESS [  0.992 s]
[INFO] test-core .......................................... SKIPPED
[INFO] Shields4J client ................................... SKIPPED
[INFO] TestNG listener 1.0.0 .............................. SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.483 s
[INFO] Finished at: 2019-04-21T02:40:42+03:00
[INFO] ------------------------------------------------------------------------
$ mvn clean deploy -DskipTests=${SKIP_TESTS}
[INFO] Scanning for projects...
[INFO] Inspecting build with total of 4 modules...
[INFO] Installing Nexus Staging features:
[INFO]   ... total of 4 executions of maven-deploy-plugin replaced with nexus-staging-maven-plugin
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] 
[INFO] Shields4J                                                          [pom]
[INFO] test-core                                                          [jar]
[INFO] Shields4J client                                                   [jar]
[INFO] TestNG listener                                                    [jar]
[INFO] 
[INFO] --------------< org.touchbit.shields4j:shields4j-parent >---------------
[INFO] Building Shields4J 1.0.0-SNAPSHOT                                  [1/4]
[INFO] --------------------------------[ pom ]---------------------------------
...
DELETED
...
[INFO]  * Bulk deploy of locally gathered snapshot artifacts finished.
[INFO] Remote deploy finished with success.
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] Shields4J 1.0.0-SNAPSHOT ........................... SUCCESS [  2.375 s]
[INFO] test-core .......................................... SUCCESS [  3.929 s]
[INFO] Shields4J client ................................... SUCCESS [  3.815 s]
[INFO] TestNG listener 1.0.0-SNAPSHOT ..................... SUCCESS [ 36.134 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 47.629 s
[INFO] Finished at: 2019-04-21T02:41:32+03:00
[INFO] ------------------------------------------------------------------------

āĻĢāĻ˛āĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻ¨ā§‡āĻ•ā§āĻ¸āĻžāĻ¸ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ āĻ˛ā§‹āĻĄ āĻšāĻ¯āĻŧ 1.0.0-āĻ¸ā§āĻ¨ā§āĻ¯āĻžāĻĒāĻļāĻŸ.

āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ¸ā§āĻ¨ā§āĻ¯āĻžāĻĒāĻļāĻŸ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ āĻ¸āĻžāĻ‡āĻŸā§‡āĻ° āĻ¸āĻ‚āĻ—ā§āĻ°āĻšāĻ¸ā§āĻĨāĻ˛ āĻĨā§‡āĻ•ā§‡ āĻ¸āĻ°āĻžāĻ¨ā§‹ āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ oss.sonatype.org āĻ†āĻĒāĻ¨āĻžāĻ° āĻ…ā§āĻ¯āĻžāĻ•āĻžāĻ‰āĻ¨ā§āĻŸā§‡āĻ° āĻ…āĻ§ā§€āĻ¨ā§‡āĨ¤

āĻŽāĻžāĻ­ā§‡āĻ¨ āĻ¸ā§‡āĻ¨ā§āĻŸā§āĻ°āĻžāĻ˛ā§‡ āĻāĻ•āĻŸāĻŋ āĻœāĻžāĻ­āĻž āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒ āĻ†āĻĒāĻ˛ā§‹āĻĄ āĻ•āĻ°āĻ¤ā§‡ āĻ—āĻŋāĻŸāĻ˛ā§āĻ¯āĻžāĻŦ āĻ¸āĻŋāĻ†āĻ‡ āĻ¸ā§‡āĻŸ āĻ†āĻĒ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

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

āĻ°āĻŋāĻ˛āĻŋāĻœ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ āĻĒā§āĻ°āĻ•āĻžāĻļāĻ¨āĻž

āĻ¯āĻ–āĻ¨ āĻŸā§āĻ¯āĻžāĻ— āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ, āĻĄāĻŋāĻĒā§āĻ˛ā§‹āĻ¯āĻŧ āĻĒā§āĻ°āĻœā§‡āĻ•ā§āĻŸā§‡āĻ° āĻ¸āĻ‚āĻļā§āĻ˛āĻŋāĻˇā§āĻŸ āĻŸāĻžāĻ¸ā§āĻ•āĻŸāĻŋ āĻ¨ā§‡āĻ•ā§āĻ¸āĻžāĻ¸ā§‡ āĻ°āĻŋāĻ˛āĻŋāĻœ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ āĻ†āĻĒāĻ˛ā§‹āĻĄ āĻ•āĻ°āĻ¤ā§‡ āĻ¸ā§āĻŦāĻ¯āĻŧāĻ‚āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻ­āĻžāĻŦā§‡ āĻŸā§āĻ°āĻŋāĻ—āĻžāĻ° āĻšāĻ¯āĻŧ (āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ).

āĻŽāĻžāĻ­ā§‡āĻ¨ āĻ¸ā§‡āĻ¨ā§āĻŸā§āĻ°āĻžāĻ˛ā§‡ āĻāĻ•āĻŸāĻŋ āĻœāĻžāĻ­āĻž āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒ āĻ†āĻĒāĻ˛ā§‹āĻĄ āĻ•āĻ°āĻ¤ā§‡ āĻ—āĻŋāĻŸāĻ˛ā§āĻ¯āĻžāĻŦ āĻ¸āĻŋāĻ†āĻ‡ āĻ¸ā§‡āĻŸ āĻ†āĻĒ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻ­āĻžāĻ˛ā§‹ āĻ…āĻ‚āĻļ āĻšāĻ˛ āĻŦāĻ¨ā§āĻ§ āĻ°āĻŋāĻ˛āĻŋāĻœ āĻ¸ā§āĻŦāĻ¯āĻŧāĻ‚āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻ­āĻžāĻŦā§‡ āĻ¨ā§‡āĻ•ā§āĻ¸āĻžāĻ¸ā§‡ āĻŸā§āĻ°āĻŋāĻ—āĻžāĻ° āĻ•āĻ°ā§‡āĨ¤

[INFO] Performing remote staging...
[INFO] 
[INFO]  * Remote staging into staging profile ID "9043b43f77dcc9"
[INFO]  * Created staging repository with ID "orgtouchbit-1037".
[INFO]  * Staging repository at https://oss.sonatype.org:443/service/local/staging/deployByRepositoryId/orgtouchbit-1037
[INFO]  * Uploading locally staged artifacts to profile org.touchbit
[INFO]  * Upload of locally staged artifacts finished.
[INFO]  * Closing staging repository with ID "orgtouchbit-1037".
Waiting for operation to complete...
.........
[INFO] Remote staged 1 repositories, finished with success.
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] Shields4J 1.0.0 .................................... SUCCESS [  9.603 s]
[INFO] test-core .......................................... SUCCESS [  3.419 s]
[INFO] Shields4J client ................................... SUCCESS [  9.793 s]
[INFO] TestNG listener 1.0.0 .............................. SUCCESS [01:23 min]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:47 min
[INFO] Finished at: 2019-04-21T04:05:46+03:00
[INFO] ------------------------------------------------------------------------

āĻāĻŦāĻ‚ āĻ¯āĻĻāĻŋ āĻ•āĻŋāĻ›ā§ āĻ­ā§āĻ˛ āĻšāĻ¯āĻŧā§‡ āĻ¯āĻžāĻ¯āĻŧ, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻ•āĻžāĻœāĻŸāĻŋ āĻŦā§āĻ¯āĻ°ā§āĻĨ āĻšāĻŦā§‡

[INFO] Performing remote staging...
[INFO] 
[INFO]  * Remote staging into staging profile ID "9043b43f77dcc9"
[INFO]  * Created staging repository with ID "orgtouchbit-1038".
[INFO]  * Staging repository at https://oss.sonatype.org:443/service/local/staging/deployByRepositoryId/orgtouchbit-1038
[INFO]  * Uploading locally staged artifacts to profile org.touchbit
[INFO]  * Upload of locally staged artifacts finished.
[INFO]  * Closing staging repository with ID "orgtouchbit-1038".
Waiting for operation to complete...
.......
[ERROR] Rule failure while trying to close staging repository with ID "orgtouchbit-1039".
[ERROR] 
[ERROR] Nexus Staging Rules Failure Report
[ERROR] ==================================
[ERROR] 
[ERROR] Repository "orgtouchbit-1039" failures
[ERROR]   Rule "signature-staging" failures
[ERROR]     * No public key: Key with id: (1f42b618d1cbe1b5) was not able to be located on &lt;a href=http://keys.gnupg.net:11371/&gt;http://keys.gnupg.net:11371/&lt;/a&gt;. Upload your public key and try the operation again.
...
[ERROR] Cleaning up local stage directory after a Rule failure during close of staging repositories: [orgtouchbit-1039]
[ERROR]  * Deleting context 9043b43f77dcc9.properties
[ERROR] Cleaning up remote stage repositories after a Rule failure during close of staging repositories: [orgtouchbit-1039]
[ERROR]  * Dropping failed staging repository with ID "orgtouchbit-1039" (Rule failure during close of staging repositories: [orgtouchbit-1039]).
[ERROR] Remote staging finished with a failure: Staging rules failure!
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] Shields4J 1.0.0 .................................... SUCCESS [  4.073 s]
[INFO] test-core .......................................... SUCCESS [  2.788 s]
[INFO] Shields4J client ................................... SUCCESS [  3.962 s]
[INFO] TestNG listener 1.0.0 .............................. FAILURE [01:07 min]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------

āĻĢāĻ˛āĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ•ā§‡āĻŦāĻ˛ āĻāĻ•āĻŸāĻŋ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤ āĻ…āĻĨāĻŦāĻž āĻāĻ‡ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ āĻŽā§āĻ›ā§‡ āĻĻāĻŋāĻ¨ āĻŦāĻž āĻĒā§āĻ°āĻ•āĻžāĻļ āĻ•āĻ°ā§āĻ¨.

āĻŽāĻžāĻ­ā§‡āĻ¨ āĻ¸ā§‡āĻ¨ā§āĻŸā§āĻ°āĻžāĻ˛ā§‡ āĻāĻ•āĻŸāĻŋ āĻœāĻžāĻ­āĻž āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒ āĻ†āĻĒāĻ˛ā§‹āĻĄ āĻ•āĻ°āĻ¤ā§‡ āĻ—āĻŋāĻŸāĻ˛ā§āĻ¯āĻžāĻŦ āĻ¸āĻŋāĻ†āĻ‡ āĻ¸ā§‡āĻŸ āĻ†āĻĒ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

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

āĻ…āĻ¨ā§āĻ¯ āĻĒā§āĻ°āĻ¸āĻ™ā§āĻ—

āĻāĻŸāĻŋ āĻ†āĻŽāĻžāĻ° āĻ•āĻžāĻ›ā§‡ āĻāĻ•āĻŸāĻŋ āĻ‰āĻĻā§āĻ˜āĻžāĻŸāĻ¨ āĻ›āĻŋāĻ˛ āĻ¯ā§‡ āĻŽā§āĻ¯āĻžāĻ­ā§‡āĻ¨ āĻ…āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻĒāĻžāĻŦāĻ˛āĻŋāĻ• āĻ°āĻŋāĻĒā§‹āĻœāĻŋāĻŸāĻ°āĻŋāĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻ¸ā§‚āĻšā§€ āĻ•āĻ°ā§‡āĨ¤
āĻ†āĻŽāĻžāĻ•ā§‡ robots.txt āĻ†āĻĒāĻ˛ā§‹āĻĄ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛ āĻ•āĻžāĻ°āĻŖ āĻāĻŸāĻŋ āĻ†āĻŽāĻžāĻ° āĻĒā§āĻ°āĻžāĻ¨ā§‹ āĻ¸āĻ‚āĻ—ā§āĻ°āĻšāĻ¸ā§āĻĨāĻ˛āĻ•ā§‡ āĻ¸ā§‚āĻšāĻŋāĻ¤ āĻ•āĻ°ā§‡āĻ›ā§‡āĨ¤

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

āĻ‰āĻĒāĻ¸āĻ‚āĻšāĻžāĻ°

āĻ†āĻŽāĻ°āĻž āĻ¯āĻž āĻ†āĻ›ā§‡

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

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

āĻ†āĻŽāĻŋ āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ–ā§āĻļāĻŋ āĻšāĻŦā§‡.

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

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

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

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