рдореЗрд╡реЗрди рд╕реЗрдВрдЯреНрд░рд▓ рдкрд░ рдЬрд╛рд╡рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП GitLab CI рдХреА рд╕реНрдерд╛рдкрдирд╛

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

рдкреВрд░реНрд╡рд╛рдкреЗрдХреНрд╖рд╛рдПрдБ:

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

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

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

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

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

GitLab рдореЗрдВ рдПрдХ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛

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

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

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

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

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

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

рдореЗрд░рд╛ рдзрд╛рд╡рдХ

рд░рдирд░ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рд╡реАрдбреАрдПрд╕ 4 рд╕реАрдкреАрдпреВ, 4 рдЬреАрдмреА рд░реИрдо, 50 рдЬреАрдмреА рдПрд╕рдПрд╕рдбреА рд▓рд┐рдпрд╛ред рд▓рд╛рдЧрдд ~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
  • 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 -> Deploy-project -> рд╕реЗрдЯрд┐рдВрдЧреНрд╕ -> CI/CD -> рд░рдирд░реНрд╕ -> рд╕реНрдкреЗрд╕рд┐рдлрд┐рдХ рд░рдирд░реНрд╕ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рд░рдЬрд┐рд╕реНрдЯреНрд░реЗрд╢рди рдЯреЛрдХрди рдХреЙрдкреА рдХрд░реЗрдВред

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

рдореЗрд╡реЗрди рд╕реЗрдВрдЯреНрд░рд▓ рдкрд░ рдЬрд╛рд╡рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП GitLab CI рдХреА рд╕реНрдерд╛рдкрдирд╛

  • рдПрдХ рдзрд╛рд╡рдХ рдХрд╛ рдкрдВрдЬреАрдХрд░рдг
    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 рдкрд░ рдЬрд╛рдПрдВ -> рдкрд░рд┐рдирд┐рдпреЛрдЬрди-рдкрд░рд┐рдпреЛрдЬрдирд╛ -> рд╕реЗрдЯрд┐рдВрдЧреНрд╕ -> рд╕реАрдЖрдИ/рд╕реАрдбреА -> рдзрд╛рд╡рдХ -> рд╡рд┐рд╢рд┐рд╖реНрдЯ рдзрд╛рд╡рдХ -> рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд░рд┐рдп рдзрд╛рд╡рдХ

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

рдореЗрд╡реЗрди рд╕реЗрдВрдЯреНрд░рд▓ рдкрд░ рдЬрд╛рд╡рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП GitLab CI рдХреА рд╕реНрдерд╛рдкрдирд╛

  • рдЬреЛрдбрд╝рдирд╛ рдЕрд▓рдЧ рд╕реЗрд╡рд╛ /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
  • рд╣рдо рдЬрд╛рдБрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдзрд╛рд╡рдХ рджреМрдбрд╝ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдЙрджрд╛рд╣рд░рдг

рдореЗрд╡реЗрди рд╕реЗрдВрдЯреНрд░рд▓ рдкрд░ рдЬрд╛рд╡рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП GitLab CI рдХреА рд╕реНрдерд╛рдкрдирд╛

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

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

  • рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ -> рд╕реЗрдЯрд┐рдВрдЧреНрд╕ -> рд╕реАрдЖрдИ / рд╕реАрдбреА -> рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдирд┐рдЬреА рдХреБрдВрдЬреА рдХреЛ рдПрдХ рд╡реЗрд░рд┐рдПрдмрд▓ рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВ GPG_SECRET_KEY
    рдореЗрд╡реЗрди рд╕реЗрдВрдЯреНрд░рд▓ рдкрд░ рдЬрд╛рд╡рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП GitLab CI рдХреА рд╕реНрдерд╛рдкрдирд╛

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

рдорд╛рд╡реЗрди рдХреА рд╕реНрдерд╛рдкрдирд╛

  • рдПрдХ рдорд╛рд╕реНрдЯрд░ рдХреБрдВрдЬреА рдмрдирд╛рдПрдВ
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ -> рд╕реЗрдЯрд┐рдВрдЧреНрд╕ -> рд╕реАрдЖрдИ / рд╕реАрдбреА -> рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдПрдХ рд╡реЗрд░рд┐рдПрдмрд▓ рдореЗрдВ рд╕реЗрд╡ рдХрд░реЗрдВ SETTINGS_SECURITY_XML рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐рдпрд╛рдБ:
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • рд╕реЛрдирд╛рдЯрд╛рдЗрдк рдЦрд╛рддреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд╕рд╡рд░реНрдб рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рдирд╛
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ -> рд╕реЗрдЯрд┐рдВрдЧреНрд╕ -> рд╕реАрдЖрдИ / рд╕реАрдбреА -> рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдПрдХ рд╡реЗрд░рд┐рдПрдмрд▓ рдореЗрдВ рд╕реЗрд╡ рдХрд░реЗрдВ 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 рдЬрд┐рд╕рдореЗрдВ рдореИрдВрдиреЗ рдЬрд╛рд╡рд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реАрдЖрдИ рдЯреЗрдореНрдкрд▓реЗрдЯ рд░рдЦрд╛ рдерд╛ рд╕рд╛рдорд╛рдиреНрдп.yml.

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

рдореЗрд╡реЗрди-рдЗрдВрд╕реНрдЯреЙрд▓-рдкреНрд▓рдЧрдЗрди

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

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

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

рдореЗрд╡реЗрди-рдЬрд╛рд╡рд╛рдбреЛрдХ-рдкреНрд▓рдЧрдЗрди

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

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

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдореЙрдбреНрдпреВрд▓ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЬрд╛рд╡рд╛ рдирд╣реАрдВ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рд╕рдВрд╕рд╛рдзрди)
рдпрд╛ рдЖрдк рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рдЬрд╛рд╡рд╛рдбреЛрдХ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдорджрдж рдХрд░реЗрдВ 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>

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

рдореЗрд╡реЗрди-рдЬреАрдкреАрдЬреА-рдкреНрд▓рдЧрдЗрди

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

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдорд▓реНрдЯреА-рдореЙрдбреНрдпреВрд▓ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореЙрдбреНрдпреВрд▓ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ 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>

рдЕрдзрд┐рдХ рдкреНрд▓рд╕рд╕

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

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

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

рд╕реНрдиреИрдкрд╢реЙрдЯ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдкреНрд░рдХрд╛рд╢рди

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

рдореЗрд╡реЗрди рд╕реЗрдВрдЯреНрд░рд▓ рдкрд░ рдЬрд╛рд╡рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП GitLab CI рдХреА рд╕реНрдерд╛рдкрдирд╛

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

рдЫрдБрдЯрд╛ рд╣реБрдЖ рд▓реЙрдЧ

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 рдЖрдкрдХреЗ рдЦрд╛рддреЗ рдХреЗ рдЕрдВрддрд░реНрдЧрдд.

рдореЗрд╡реЗрди рд╕реЗрдВрдЯреНрд░рд▓ рдкрд░ рдЬрд╛рд╡рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП GitLab CI рдХреА рд╕реНрдерд╛рдкрдирд╛

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

рд░рд┐рд▓реАрдЬрд╝ рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдирд╛

рдЬрдм рдХреЛрдИ рдЯреИрдЧ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд░рд┐рд▓реАрдЬрд╝ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдиреЗрдХреНрд╕рд╕ рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рд░реНрдп рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЯреНрд░рд┐рдЧрд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг).

рдореЗрд╡реЗрди рд╕реЗрдВрдЯреНрд░рд▓ рдкрд░ рдЬрд╛рд╡рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП GitLab CI рдХреА рд╕реНрдерд╛рдкрдирд╛

рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдиреЗрдХреНрд╕рд╕ рдореЗрдВ рдХреНрд▓реЛрдЬ рд░рд┐рд▓реАрдЬрд╝ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЪрд╛рд▓реВ рд╣реЛ рдЬрд╛рддреА рд╣реИред

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

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╡рд┐рдХрд▓реНрдк рдмрдЪрддрд╛ рд╣реИред рдпрд╛ рддреЛ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╣рдЯрд╛ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реЗрдВред

рдореЗрд╡реЗрди рд╕реЗрдВрдЯреНрд░рд▓ рдкрд░ рдЬрд╛рд╡рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП GitLab CI рдХреА рд╕реНрдерд╛рдкрдирд╛

рд░рд┐рд▓реАрдЬ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдХреБрдЫ рд╕рдордп рдмрд╛рдж рдХрд▓рд╛рдХреГрддрд┐рдпрд╛рдВ рд╕рд╛рдордиреЗ рдЖ рдЬрд╛рдПрдВрдЧреА рдореЗрд╡реЗрди рд╕реЗрдВрдЯреНрд░рд▓ рдкрд░ рдЬрд╛рд╡рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП GitLab CI рдХреА рд╕реНрдерд╛рдкрдирд╛

рд╡рд┐рд╖рдп рд╕реЗ рдкрд░реЗ

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдЦреЛрдЬ рдереА рдХрд┐ рдорд╛рд╡реЗрди рдЕрдиреНрдп рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реИред
рдореБрдЭреЗ robots.txt рдЬреЛрдбрд╝рдирд╛ рдкрдбрд╝рд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореЗрд░реА рдкреБрд░рд╛рдиреА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рддрд╛ рдерд╛ред

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

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

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ

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

GitLab CI рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЙрддрдирд╛ рдЬрдЯрд┐рд▓ рд╡рд┐рд╖рдп рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИред рдХреБрдЫ рдмрд╛рд░ рдЯрд░реНрдирдХреА рдЖрдзрд╛рд░ рдкрд░ рд╕реАрдЖрдИ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдФрд░ рдЕрдм рдЖрдк рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдиреМрд╕рд┐рдЦрд┐рдпрд╛ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, GitLab рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдмрд╣реБрдд рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИред рдкрд╣рд▓рд╛ рдХрджрдо рдЙрдард╛рдиреЗ рд╕реЗ рди рдбрд░реЗрдВ. рдЪрд▓рддреЗ рд╣реБрдП рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдХрджрдореЛрдВ рдХреЗ рдиреАрдЪреЗ рд╕рдбрд╝рдХ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ (рдореБрдЭреЗ рдпрд╛рдж рдирд╣реАрдВ рдХрд┐ рдпрд╣ рдХрд┐рд╕рдиреЗ рдХрд╣рд╛ рдерд╛ :)

рдореБрдЭреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкрд╛рдХрд░ рдЦрд╝реБрд╢реА рд╣реЛрдЧреА.

рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рд╢реЗрд▓ рд░рдирд░ рд╣реИ рддреЛ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рд░реВрдк рд╕реЗ рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП GitLab CI рдХреЛ рдХреИрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рдП (docker-compose рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рддрд╣рдд рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдЪрд▓рд╛рдирд╛)ред

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

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ