рдорд╛рд╡реЗрди рд╕реЗрдВрдЯреНрд░рд▓ рдореЗрдВ рдПрдХ рдЬрд╛рд╡рд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрд┐рдЯрд▓реИрдм рд╕реАрдЖрдИ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛


рдпрд╣ рдЖрд▓реЗрдЦ рдЬрд╛рд╡рд╛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд╣реИ, рдЬрд┐рдиреНрд╣реЗрдВ рдЧрд┐рдЯрд▓реИрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдЙрддреНрдкрд╛рджреЛрдВ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рд╕реЛрдирд╛рдЯрд╛рдЗрдк рдФрд░ / рдпрд╛ рдорд╛рд╡реЗрди рдХреЗрдВрджреНрд░реАрдп рднрдВрдбрд╛рд░ рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП gitlab-runner, gitlab-ci рдФрд░ maven-plugin рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдБрдЧрд╛ред


рдкреГрд╖реНрдарднреВрдорд┐:


  • рдорд╡рди рдФрд░ GPG рдХреБрдВрдЬреА рдХрд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рднрдВрдбрд╛рд░рдгред
  • рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реАрдЖрдИ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд┐рд╖реНрдкрд╛рджрдиред
  • рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ (рд░рд┐рд▓реАрдЬ / рд╕реНрдиреИрдкрд╢реЙрдЯ) рдХреЛ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВред
  • рдорд╛рд╡реЗрди рд╕реЗрдВрдЯреНрд░рд▓ рдореЗрдВ рдкреНрд░рдХрд╛рд╢рди рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд░рд┐рд▓реАрдЬрд╝ рд╕рдВрд╕реНрдХрд░рдг рджреЗрдЦреЗрдВред
  • рдХрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рднрдВрдбрд╛рд░ рдореЗрдВ рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХреЛ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рдиред
  • рд╕рд╛рджрдЧреА рдФрд░ рдкреНрд░рдпреЛрдЬреНрдпрддрд╛ред


рд╕рд╛рдордЧреНрд░реА




рд╕рд╛рдорд╛рдиреНрдп рдЬрд╛рдирдХрд╛рд░реА


  • рд╕реЛрдирдЯрд╛рдЗрдк рдУрдПрд╕рдПрд╕ рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рд╕реЗрд╡рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдорд╛рд╡реЗрди рд╕реЗрдВрдЯреНрд░рд▓ рдХреЛ рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рдХрд╛ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЧреЛрдЧреЛрд▓рд┐рдкреНрд▓реЗрдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рд╕рд╣реА рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░реВрдВрдЧрд╛ред
  • рд╣рдо рд╕реЛрдирд╛рдЯрд╛рдЗрдк JIRA рдХреЗ рд╕рд╛рде рдкреНрд░реА-рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯрд┐рдХрдЯ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ (рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рд╕реЗрдХреНрд╢рди рдХреЛ рдкрдврд╝рддреЗ рд╣реБрдП рд╕реЛрдирд╛рдЯрд╛рдЗрдк JIRA рдХреЗ рд▓рд┐рдП рдЯрд┐рдХрдЯ рдмрдирд╛рдПрдВ )ред рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдЦреЛрд▓рдиреЗ рдХреЗ рдмрд╛рдж, рдЬреЗрдЖрдИрдЖрд░рдП рд▓реЙрдЧрд┐рди / рдкрд╛рд╕рд╡рд░реНрдб рдЬреЛрдбрд╝реА (рдЗрд╕рдХреЗ рдмрд╛рдж рд╕реЛрдирд╛рдЯрд╛рдЗрдк рдЕрдХрд╛рдЙрдВрдЯ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХреЛ рд╕реЛрдирд╛рдЯрд╛рдЗрдк рдиреЗрдХреНрд╕рд╕ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
  • рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ GPG рдХреБрдВрдЬреА рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмрд╣реБрдд рд╢реБрд╖реНрдХ рд░реВрдк рд╕реЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП GnuPG рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рджреЗрдЦреЗрдВред
  • рдпрджрд┐ рдЖрдк GPG рдХреБрдВрдЬреА (gnupg / gnupg2) рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдирдХреНрд╕ рдХрдВрд╕реЛрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдПрдВрдЯреНрд░реЙрдкреА рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП rng-tools рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛, рдореБрдЦреНрдп рдкреАрдврд╝реА рдХреЛ рдмрд╣реБрдд рд▓рдВрдмрд╛ рд╕рдордп рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред
  • рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ GPG рдХреБрдВрдЬреА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрд╡рд╛рдПрдБ

рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП



GitLab рдореЗрдВ рдПрдХ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛


  • рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдирд╛ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдореИрдВрдиреЗ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд╕рд░рд▓ рдФрд░ рд╕реАрдзрд╛ - рддреИрдирд╛рддреА рдХрд╣рд╛
  • рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдХреНрд╕реЗрд╕ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
    рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдЬрд╛рдПрдВ -> рд╕реЗрдЯрд┐рдВрдЧреНрд╕ -> рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА -> рд╕рдВрд░рдХреНрд╖рд┐рдд рд╢рд╛рдЦрд╛рдПрдБред рд╣рдо рд╕рднреА рдирд┐рдпрдореЛрдВ рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдХреЗ рд╕рд╛рде рдПрдХрдорд╛рддреНрд░ рдирд┐рдпрдо рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рдореБрдЦреНрдп рднреВрдорд┐рдХрд╛ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкреБрд╢ рдФрд░ рдорд░реНрдЬ рдХрд░рдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдирд┐рдпрдо рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд╕рд╛рде рд╣реА рдЬрд┐рд╕ рд╕рдореВрд╣ рдореЗрдВ рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рджрд╕реНрдп рд╣реИред
  • рдпрджрд┐ рдХрдИ рдЕрдиреБрд░рдХреНрд╖рдХ рд╣реИрдВ, рддреЛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
    рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдЬрд╛рдПрдБ -> рд╕реЗрдЯрд┐рдВрдЧреНрд╕ -> рд╕рд╛рдорд╛рдиреНрдп -> тАЛтАЛрджреГрд╢реНрдпрддрд╛, рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реБрд╡рд┐рдзрд╛рдПрдБ, рдЕрдиреБрдорддрд┐рдпрд╛рдБ рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рджреГрд╢реНрдпрддрд╛ рдХреЛ рдирд┐рдЬреА рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВред
    рдореЗрд░реЗ рдкрд╛рд╕ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдбреЛрдореЗрди рдореЗрдВ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ GitLab рдзрд╛рд╡рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдХреЗрд╡рд▓ рдореЗрд░реЗ рдкрд╛рд╕ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣реБрдВрдЪ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд▓реЙрдЧ рдореЗрдВ рдирд┐рдЬреА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЪрдордХрд╛рдирд╛ рдореЗрд░реЗ рд╣рд┐рдд рдореЗрдВ рдирд╣реАрдВ рд╣реИред
  • рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдЦреНрдд рдирд┐рдпрдо
    рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдЬрд╛рдПрдВ -> рд╕реЗрдЯрд┐рдВрдЧреНрд╕ -> рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА -> рдирд┐рдпрдо рдкреБрд╢ рдХрд░реЗрдВ рдФрд░ рдЭрдВрдбреЗ рдХреЛ рд╕реЗрдЯ рдХрд░реЗрдВ рдкреНрд░рддрд┐рдмрдВрдз, рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд▓реЗрдЦрдХ рдПрдХ GitLab рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реИред рдореИрдВ рдпрд╣ рднреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдХрдорд┐рдЯреНрд╕ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЧрдП рдХрдорд┐рдЯреНрд╕ рдлреНрд▓реИрдЧ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред
  • рдЕрдЧрд▓рд╛, рдЖрдкрдХреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреНрд░рд┐рдЧрд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
    рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдЬрд╛рдПрдВ -> рд╕реЗрдЯрд┐рдВрдЧреНрд╕ -> рд╕реАрдЖрдИ / рд╕реАрдбреА -> рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдЯреНрд░рд┐рдЧрд░ рдФрд░ рдПрдХ рдирдпрд╛ рдЯреНрд░рд┐рдЧрд░-рдЯреЛрдХрди рдмрдирд╛рдПрдВ
    рдЗрд╕ рдЯреЛрдХрди рдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд╕рдореВрд╣ рдХреЗ рд▓рд┐рдП рдЪрд░ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рддреБрд░рдВрдд рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
    рд╕рдореВрд╣ -> рд╕реЗрдЯрд┐рдВрдЧреНрд╕ -> CI / CD -> рдЪрд░ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдореВрд▓реНрдп рдореЗрдВ рдЯреНрд░рд┐рдЧрд░-рдЯреЛрдХрди рдХреЗ рд╕рд╛рде рдЪрд░ DEPLOY_TOKEN рдЬреЛрдбрд╝реЗрдВред

рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП



рдЧрд┐рдЯрд▓рдм рд░рдирд░


рдпрд╣ рдЦрдВрдб рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ (рд╡рд┐рд╢рд┐рд╖реНрдЯ) рдФрд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ (рд╕рд╛рдЭрд╛) рдзрд╛рд╡рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддреИрдирд╛рддреА рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред



рд╡рд┐рд╢рд┐рд╖реНрдЯ рдзрд╛рд╡рдХ


рдореИрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдзрд╛рд╡рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ, рддреЗрдЬ, рд╕рд╕реНрддрд╛ рд╣реИред
рд░рдирд░ рдХреЗ рд▓рд┐рдП, рдореИрдВ 1 рд╕реАрдкреАрдпреВ, 2 рдЬреАрдмреА рд░реИрдо, 20 рдЬреАрдмреА рдПрдЪрдбреАрдбреА рдХреЗ рд╕рд╛рде рд▓рд┐рдирдХреНрд╕ рд╡реАрдбреАрдПрд╕ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред рдирд┐рд░реНрдЧрдо рдореВрд▓реНрдп ~ 3000тВ╜ рдкреНрд░рддрд┐ рд╡рд░реНрд╖ рд╣реИред


рдореЗрд░рд╛ рд░рдирд░

рдзрд╛рд╡рдХ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ VDS 4 рд╕реАрдкреАрдпреВ, 4 рдЬреАрдмреА рд░реИрдо, 50 рдЬреАрдмреА рдПрд╕рдПрд╕рдбреА рд▓рд┐рдпрд╛ред рдЗрд╕рдХреА рд▓рд╛рдЧрдд ~ 11,000 рд░реВрдмрд▓ рдереА рдФрд░ рдЗрд╕реЗ рдХрднреА рднреА рдкрдЫрддрд╛рд╡рд╛ рдирд╣реАрдВ рд╣реБрдЖред
рдореЗрд░реЗ рдкрд╛рд╕ рдХреБрд▓ 7 рдХрд╛рд░реЗрдВ рд╣реИрдВред 5 рдЕрд░реВрдмрд╛ рдкрд░ рдФрд░ 2 рдЗрд╣реЛрд░ рдкрд░ред


рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдзрд╛рд╡рдХ рд╣реИред рдЕрдм рд╣рдо рдЗрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВрдЧреЗред
рд╣рдо SSH рдкрд░ рдорд╢реАрди рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЬрд╛рд╡рд╛, рдЧрд┐рдЯ, рдорд╛рд╡реЗрди, gnupg2 рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред


рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП



Gitlab рдзрд╛рд╡рдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ


  • рдПрдХ рдирдпрд╛ 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@* gitlab-deployer@127.0.0.1 
  • рд░рд┐рдмреВрдЯ sshd

     systemctl restart sshd 
  • рд╣рдо gitlab-deployer рд▓рд┐рдП рдкрд╛рд╕рд╡рд░реНрдб рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ (рдпрд╣ рд╕рд░рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ gitlab-deployer рд▓рд┐рдП рдкреНрд░рддрд┐рдмрдВрдз рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ)

     passwd gitlab-deployer 
  • GitLab рдзрд╛рд╡рдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ (рд▓рд┐рдирдХреНрд╕ 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 -> рдкрд░рд┐рдирд┐рдпреЛрдЬрди-рдкреНрд░реЛрдЬреЗрдХреНрдЯ -> рд╕реЗрдЯрд┐рдВрдЧреНрд╕ -> CI / CD -> рдзрд╛рд╡рдХреЛрдВ -> рд╡рд┐рд╢рд┐рд╖реНрдЯ рдзрд╛рд╡рдХреЛрдВ рдФрд░ рдкрдВрдЬреАрдХрд░рдг рдкрдВрдЬреАрдХрд░рдг рдЯреЛрдХрди рдкрд░ рдЬрд╛рдПрдВ

рд╕реНрдХреНрд░реАрди


  • рд░рдЬрд┐рд╕реНрдЯрд░ рдзрд╛рд╡рдХ

     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 (eg 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 -> рдкрд░рд┐рдирд┐рдпреЛрдЬрди-рдкрд░рд┐рдпреЛрдЬрдирд╛ -> рд╕реЗрдЯрд┐рдВрдЧреНрд╕ -> CI / CD -> рдзрд╛рд╡рдХреЛрдВ -> рд╡рд┐рд╢рд┐рд╖реНрдЯ рдзрд╛рд╡рдХреЛрдВ -> рдзрд╛рд╡рдХреЛрдВ рдХреЛ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд░рд┐рдп рдХрд┐рдпрд╛ рдЧрдпрд╛

рд╕реНрдХреНрд░реАрди


  • рдПрдХ рдЕрд▓рдЧ рд╕реЗрд╡рд╛ /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 рдкреНрд░рдореБрдЦ рдкреАрдврд╝реА


  • рдЙрд╕реА рдорд╢реАрди рд╕реЗ, рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ gitlab-deployer рддрд╣рдд ssh рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ (рдпрд╣ GPG рдХреБрдВрдЬреА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ)


     ssh gitlab-deployer@127.0.0.1 

  • рд╣рдо рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рджреЗрдХрд░ рдПрдХ рдХреБрдВрдЬреА рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдирд╛рдо рдФрд░ рдореЗрд▓ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред
    рдХреБрдВрдЬреА рдХреЗ рд▓рд┐рдП рдкрд╛рд╕рд╡рд░реНрдб рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред рдпрд╣ рдХреБрдВрдЬреА рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░реЗрдЧреАред


     gpg --gen-key 

  • рдЪреЗрдХ


     gpg --list-keys -a /home/gitlab-deployer/.gnupg/pubring.gpg ---------------------------------------- pub 4096R/00000000 2019-04-19 uid Petruha Petrov <pp@example.com> 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 - sonatype рдЦрд╛рддрд╛ рд▓реЙрдЧрд┐рди


рдпрд╣ рд░рдирд░ рд╕реЗрдЯрдЕрдк рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ, рдЖрдк GitLab CI рд╕реЗрдХреНрд╢рди рдореЗрдВ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ


рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП



рд╕рд╛рдЭрд╛ рдзрд╛рд╡рдХ



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 <temp@temp.temp> 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 рдореЗрдВ рдирд┐рдЬреА рдХреБрдВрдЬреА рдХреЛ 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 - sonatype рдЦрд╛рддрд╛ рд▓реЙрдЧрд┐рди


рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП



рдбреЙрдХрдЯрд░ рдЫрд╡рд┐ рдХреА рддреИрдирд╛рддреА рдХрд░реЗрдВ


  • рдЬрд╛рд╡рд╛ рдХреЗ рд╕рд╣реА рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рддреИрдирд╛рддреА рдкрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдкрд░реНрдпрд╛рдкреНрдд рдбреЙрдХрдлрд╛рдЗрд▓ рдмрдирд╛рдПрдВред рдиреАрдЪреЗ рдЕрд▓реНрдкрд╛рдЗрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред


     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 рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛, рдЬрд┐рд╕рдореЗрдВ рдореИрдВрдиреЗ common.yml рдЬрд╛рд╡рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП CI рдЯреЗрдореНрдкрд▓реЗрдЯ рд░рдЦрд╛ред


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-рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред



Maven: рд╕реНрдерд╛рдкрд┐рдд-рдкреНрд▓рдЧрдЗрди


рд╕реНрдерд╛рдиреАрдп рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдЕрдиреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЗ рд╕реНрдерд╛рдиреАрдп рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИ, рд╕рд╛рде рд╣реА рдПрдХ рдЪреЗрдХрд╕рдо рднреАред


 <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-рдЬрд╛рд╡рд╛рдбреЛрдХ-рдкреНрд▓рдЧрдЗрди


рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдЬреЗрд╡рд╛рдбреЙрдХ рдмрдирд╛рдирд╛ред


 <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 рдорджрдж 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> 

рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП



рдЧрдардЬреЛрдбрд╝-рдордЪрд╛рди-maven-рдкреНрд▓рдЧрдЗрди


рд╡рд┐рдиреНрдпрд╛рд╕:


 <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 рдореЗрдВ skipNexusStagingDeployMojo рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде nexus-staging-maven-plugin skipNexusStagingDeployMojo nexus-staging-maven-plugin рдЬреЛрдбрд╝реЗрдВред


 <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> 

рдЕрдзрд┐рдХ рд▓рд╛рдн


  • рдиреЗрдХреНрд╕рд╕ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА ( mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin ) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖реНрдпреЛрдВ рдХреА рдПрдХ рдмрд╣реБрдд рд╕рдореГрджреНрдз рд╕реВрдЪреАред
  • рдорд╛рд╡реЗрди рд╕реЗрдВрдЯреНрд░рд▓ рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд░рд┐рд▓реАрдЬ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ

рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП



рдкрд░рд┐рдгрд╛рдо



SNAPSHOT рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реЗрдВ


рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп, рдПрд╕рдПрдирдПрдкреАрдПрдЪрдПрд╕рдУрдЯреАрдЯреА рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдиреЗрдХреНрд╕рд╕ рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдп рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ



рдЬрдм рдпрд╣ рдХрд╛рд░реНрдп рдкреНрд░рд╛рд░рдВрдн рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рд░реНрдп рдЯреНрд░рд┐рдЧрд░ рд╣реЛрддрд╛ рд╣реИ ( рдЙрджрд╛рд╣рд░рдг )ред


рдЯреНрд░рд┐рдо рдХрд┐рдпрд╛ рд╣реБрдЖ рд▓реЙрдЧ
 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-SNAPSHOT рдиреЗрдХреНрд╕рд╕ рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


рд╕рднреА рд╕реНрдиреИрдкрд╢реЙрдЯ рд╕рдВрд╕реНрдХрд░рдг рдЖрдкрдХреЗ рдЦрд╛рддреЗ рдХреЗ рдЕрдВрддрд░реНрдЧрдд 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] ------------------------------------------------------------------------ 

. .



, Maven Central


, maven .
robots.txt, .


рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП



рдирд┐рд╖реНрдХрд░реНрд╖



  • deploy- CI .
  • Deploy- Owner Maintainer.
  • Specific Runner "" deploy .
  • snapshot/release .
  • release maven central.
  • "" maven central.
  • snapshot " ".
  • snapshot/release .
  • // java .

GitLab CI . CI " " , . GitLab . . ( :) ).


.


, GitLab CI ( docker-compose), shell .


рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП

Source: https://habr.com/ru/post/hi449664/


All Articles