рдорд╛рд╡реЗрди рд╕реЗрдиреНрдЯреНрд░рд▓рдорд╛ рдЬрд╛рднрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЕрдкрд▓реЛрдб рдЧрд░реНрди GitLab CI рд╕реЗрдЯрдЕрдк рдЧрд░реНрджреИ

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

рдЖрд╡рд╢реНрдпрдХрддрд╛рд╣рд░реБ:

  • mvn рд░ GPG рдХреБрдЮреНрдЬреАрд╣рд░реВрдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рднрдгреНрдбрд╛рд░рдгред
  • рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ CI рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред
  • рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рднрдгреНрдбрд╛рд░рд╣рд░реВрдорд╛ рдХрд▓рд╛рдХреГрддрд┐рд╣рд░реВ (рд░рд┐рд▓рд┐рдЬ/рд╕реНрдиреНрдпрд╛рдкрд╕рдЯ) рдЕрдкрд▓реЛрдб рдЧрд░реНрджреИред
  • рдорд╛рднреЗрди рд╕реЗрдиреНрдЯреНрд░рд▓рдорд╛ рдкреНрд░рдХрд╛рд╢рдирдХреЛ рд▓рд╛рдЧрд┐ рд░рд┐рд▓реАрдЬ рд╕рдВрд╕реНрдХрд░рдгрд╣рд░реВрдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЬрд╛рдБрдЪред
  • рдмрд╣реБ рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рднрдгреНрдбрд╛рд░рдорд╛ рдХрд▓рд╛рдХреГрддрд┐рд╣рд░реВ рдЕрдкрд▓реЛрдб рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рдиред
  • рд╕рд░рд▓рддрд╛ рд░ рдкреНрд░рдпреЛрдЧрдХреЛ рд╕рдЬрд┐рд▓реЛред

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

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

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

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

GitLab рдорд╛ рдПрдХ рдбрд┐рдкреНрд▓реЛрдп рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯрдЕрдк рдЧрд░реНрджреИ

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

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

GitLab рдзрд╛рд╡рдХ

рдпреЛ рдЦрдгреНрдбрд▓реЗ рдиреЗрдЯрд┐рдн (рд╡рд┐рд╢рд┐рд╖реНрдЯ) рд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ (рд╕рд╛рдЭреЗрджрд╛рд░) рдзрд╛рд╡рдХ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдбрд┐рдкреНрд▓реЛрдпрдорд╛ рдХрд╛рд░реНрдпрд╣рд░реВ рдЪрд▓рд╛рдЙрдирдХреЛ рд▓рд╛рдЧрд┐ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рд╡рд░реНрдгрди рдЧрд░реНрджрдЫред

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

рдо рдореЗрд░реЛ рдЖрдлреНрдиреИ рдзрд╛рд╡рдХрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреБ, рдХрд┐рдирднрдиреЗ рд╕рдмреИ рднрдиреНрджрд╛ рдкрд╣рд┐рд▓реЗ рдпреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ, рдЫрд┐рдЯреЛ, рд╕рд╕реНрддреЛ рдЫред
рдзрд╛рд╡рдХрдХреЛ рд▓рд╛рдЧрд┐ рдо 1 CPU, 2 GB RAM, 20 GB HDD рд╕рдВрдЧ Linux VDS рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░реНрдЫреБред рдЬрд╛рд░реА рдореВрд▓реНрдп ~ 3000тВ╜ рдкреНрд░рддрд┐ рд╡рд░реНрд╖ред

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

рдзрд╛рд╡рдХрдХреЛ рд▓рд╛рдЧрд┐ рдореИрд▓реЗ VDS 4 CPU, 4 GB RAM, 50 GB SSD рд▓рд┐рдПрдБред рдпрд╕рдХреЛ рд▓рд╛рдЧрдд ~11000тВ╜ рдЫ рд░ рдпрд╕рд▓рд╛рдИ рдХрд╣рд┐рд▓реНрдпреИ рдкрдЫреБрддрд╛рдЙрдиреБ рдкрд░реНрджреИрдиред
рдорд╕рдБрдЧ рдЬрдореНрдорд╛ рен рд╡рдЯрд╛ рдореЗрд╕рд┐рди рдЫрдиреН ред рдЕрд░реБрдмрд╛рдорд╛ рел рд░ рдЗрд╣реЛрд░рдорд╛ реиред

рддреНрдпрд╕реЛрднрдП, рд╣рд╛рдореАрд╕рдБрдЧ рдПрдХ рдзрд╛рд╡рдХ рдЫред рдЕрдм рд╣рд╛рдореА рдпрд╕рд▓рд╛рдИ рд╕реЗрдЯ рдЕрдк рдЧрд░реНрдиреЗрдЫреМрдВред
рд╣рд╛рдореА SSH рдорд╛рд░реНрдлрдд рдореЗрд╕рд┐рдирдорд╛ рдЬрд╛рдиреНрдЫреМрдВ рд░ java, git, maven, gnupg2 рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдЫреМрдВред

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

Gitlab рдзрд╛рд╡рдХ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрджреИ

  • рдирдпрд╛рдБ рд╕рдореВрд╣ рдмрдирд╛рдЙрдиреБрд╣реЛрд╕реН runner
    sudo groupadd runner
  • maven рдХреНрдпрд╛рд╕рдХреЛ рд▓рд╛рдЧрд┐ рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реА рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рд╕рдореВрд╣ рдЕрдзрд┐рдХрд╛рд░рд╣рд░реВ рдЕрд╕рд╛рдЗрди рдЧрд░реНрдиреБрд╣реЛрд╕реН 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 рд░рдирд░ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН (Linux x86-64)
    sudo wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
    sudo chmod +x /usr/local/bin/gitlab-runner
    ln -s /usr/local/bin/gitlab-runner /etc/alternatives/gitlab-runner
    ln -s /etc/alternatives/gitlab-runner /usr/bin/gitlab-runner
  • gitlab.com рдорд╛ рдЬрд╛рдиреБрд╣реЛрд╕реН -> deploy-project -> Settings -> CI/CD -> рдзрд╛рд╡рдХ -> рд╡рд┐рд╢рд┐рд╖реНрдЯ рдзрд╛рд╡рдХрд╣рд░реВ рд░ рджрд░реНрддрд╛ рдЯреЛрдХрди рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЧрд░реНрдиреБрд╣реЛрд╕реНред

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

рдорд╛рд╡реЗрди рд╕реЗрдиреНрдЯреНрд░рд▓рдорд╛ рдЬрд╛рднрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЕрдкрд▓реЛрдб рдЧрд░реНрди 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 рдорд╛ рдЬрд╛рдиреБрд╣реЛрд╕реН -> рдбрд┐рдкреНрд▓реЛрдп-рдкреНрд░реЛрдЬреЗрдХреНрдЯ -> рд╕реЗрдЯрд┐рдЩреНрд╣рд░реВ -> CI/CD -> рдзрд╛рд╡рдХрд╣рд░реВ -> рд╡рд┐рд╢рд┐рд╖реНрдЯ рдзрд╛рд╡рдХрд╣рд░реВ -> рдпрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рд▓рд╛рдЧрд┐ рд╕рдХреНрд░рд┐рдп рдзрд╛рд╡рдХрд╣рд░реВ

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

рдорд╛рд╡реЗрди рд╕реЗрдиреНрдЯреНрд░рд▓рдорд╛ рдЬрд╛рднрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЕрдкрд▓реЛрдб рдЧрд░реНрди 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

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

Maven рд╕реЗрдЯрдЕрдк

  • рд╣рд╛рдореА рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреНрддрд░реНрдЧрдд рдЬрд╛рдиреНрдЫреМрдВ gitlab-deployer
    su gitlab-deployer 
  • рдПрдХ maven рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН рднрдгреНрдбрд╛рд░ рд░ рдХреНрдпрд╛рд╕рд╕рдБрдЧ рд▓рд┐рдЩреНрдХ рдЧрд░реНрдиреБрд╣реЛрд╕реН (рдХреБрдиреИ рдЧрд▓реНрддреА рдирдЧрд░реНрдиреБрд╣реЛрд╕реН)
    рдпрджрд┐ рддрдкрд╛рдЗрдБ рдПрдЙрдЯреИ рдореЗрд╕рд┐рдирдорд╛ рдзреЗрд░реИ рдзрд╛рд╡рдХрд╣рд░реВ рдЪрд▓рд╛рдЙрдиреЗ рдпреЛрдЬрдирд╛ рдмрдирд╛рдЙрдиреБрд╣реБрдиреНрди рднрдиреЗ рдпреЛ рдЪрд░рдг рдЫреЛрдбреНрди рд╕рдХрд┐рдиреНрдЫред

    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>
  • Sonatype рдЦрд╛рддрд╛рдмрд╛рдЯ рдкрд╛рд╕рд╡рд░реНрдб рдЗрдиреНрдХреНрд░рд┐рдкреНрдЯ рдЧрд░реНрджреИ
    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 рд╕реАрдЖрдИ

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

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

GPG рдХреБрдЮреНрдЬреА рдкреБрд╕реНрддрд╛

  • рд╕рдмреИ рднрдиреНрджрд╛ рдкрд╣рд┐рд▓реЗ, рддрдкрд╛рдИрдВрд▓реЗ GPG рдХреБрдЮреНрдЬреА рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдпреЛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, gnupg рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реНред
    yum install -y gnupg
  • рд╣рд╛рдореА рдкреНрд░рд╢реНрдирд╣рд░реВрдХреЛ рдЬрд╡рд╛рдл рджрд┐рдПрд░ рдХреБрдЮреНрдЬреА рдЙрддреНрдкрдиреНрди рдЧрд░реНрдЫреМрдВред рдореИрд▓реЗ рдЖрдлреНрдиреИ рдирд╛рдо рд░ рдЗрдореЗрд▓ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрдВред рдХреБрдЮреНрдЬреАрдХреЛ рд▓рд╛рдЧрд┐ рдкрд╛рд╕рд╡рд░реНрдб рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрди рдирд┐рд╢реНрдЪрд┐рдд рд╣реБрдиреБрд╣реЛрд╕реНред
    gpg --gen-key 
  • рдореБрдЦреНрдп рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБрд╣реЛрд╕реН
    gpg --list-keys -a
    pub   rsa3072 2019-04-24 [SC] [expires: 2021-04-23]
      2D0D1706366FC4AEF79669E24D09C55BBA3FD728
    uid           [ultimate] tttemp <[email protected]>
    sub   rsa3072 2019-04-24 [E] [expires: none]
  • рдХрд┐рд╕рд░реНрднрд░рдорд╛ рд╣рд╛рдореНрд░реЛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдЮреНрдЬреА рдЕрдкрд▓реЛрдб рдЧрд░реНрджреИ
    gpg --keyserver keys.gnupg.net --send-key 2D0D1706366FC4AEF79669E24D09C55BBA3FD728
    gpg: sending key 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 to hkp server keys.gnupg.net
  • рдирд┐рдЬреА рдХреБрдЮреНрдЬреА рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрджреИ
    gpg --export-secret-keys --armor 2D0D1706366FC4AEF79669E24D09C55BBA3FD728
    -----BEGIN PGP PRIVATE KEY BLOCK-----
    lQWGBFzAqp8BDADN41CPwJ/gQwiKEbyA902DKw/WSB1AvZQvV/ZFV77xGeG4K7k5
    ...
    =2Wd2
    -----END PGP PRIVATE KEY BLOCK-----
  • рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗрдЯрд┐рдЩрд╣рд░реВрдорд╛ рдЬрд╛рдиреБрд╣реЛрд╕реН -> рд╕реЗрдЯрд┐рдЩреНрд╣рд░реВ -> CI / CD -> рднреЗрд░рд┐рдПрдмрд▓рд╣рд░реВ рд░ рдирд┐рдЬреА рдХреБрдЮреНрдЬреАрд▓рд╛рдИ рдЪрд░рдорд╛ рдмрдЪрдд рдЧрд░реНрдиреБрд╣реЛрд╕реНред GPG_SECRET_KEY
    рдорд╛рд╡реЗрди рд╕реЗрдиреНрдЯреНрд░рд▓рдорд╛ рдЬрд╛рднрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЕрдкрд▓реЛрдб рдЧрд░реНрди GitLab CI рд╕реЗрдЯрдЕрдк рдЧрд░реНрджреИ

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

Maven рд╕реЗрдЯрдЕрдк

  • рдорд╛рд╕реНрдЯрд░ рдХреБрдЮреНрдЬреА рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯрд┐рдЩреНрд╣рд░реВрдорд╛ рдЬрд╛рдиреБрд╣реЛрд╕реН -> рд╕реЗрдЯрд┐рдЩреНрд╣рд░реВ -> CI / CD -> рдЪрд░рд╣рд░реВ рд░ рдЪрд░рдорд╛ рдмрдЪрдд рдЧрд░реНрдиреБрд╣реЛрд╕реН SETTINGS_SECURITY_XML рдирд┐рдореНрди рд▓рд╛рдЗрдирд╣рд░реБ:
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • Sonatype рдЦрд╛рддрд╛рдмрд╛рдЯ рдкрд╛рд╕рд╡рд░реНрдб рдЗрдиреНрдХреНрд░рд┐рдкреНрдЯ рдЧрд░реНрджреИ
    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 рд╕реАрдЖрдИ

рдкрд░рд┐рдпреЛрдЬрдирд╛ рд▓рд╛рдЧреВ рдЧрд░реНрдиреБрд╣реЛрд╕реН

рдбрд┐рдкреНрд▓реЛрдп рдкреНрд░реЛрдЬреЗрдХреНрдЯрдХреЛ рд░реВрдЯрдорд╛ рдлрд╛рдЗрд▓ .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

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

рдЬрд╛рднрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛

рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рднрдгреНрдбрд╛рд░рд╣рд░реВрдорд╛ рдЕрдкрд▓реЛрдб рдЧрд░рд┐рдиреБ рдкрд░реНрдиреЗ Java рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВрдорд╛, рддрдкрд╛рдИрдВрд▓реЗ рд░рд┐рд▓реАрдЬ рд░ рд╕реНрдиреНрдпрд╛рдкрд╕рдЯ рд╕рдВрд╕реНрдХрд░рдгрд╣рд░реВ рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реНрди 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}

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

рдердк рд╡рд┐рд╡рд░рдгрд╣рд░реВ

рдореИрд▓реЗ рдЫреБрдЯреНрдЯреИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдПрдХреЛ рдЫреБ gitlab-ci рдЬрд╕рдорд╛ рдЙрдирд▓реЗ рдЬрд╛рднрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ CI рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд░рд╛рдЦреЗ common.yml.

common.yml

stages:
  - build
  - test
  - verify
  - deploy

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

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

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

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

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

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

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

.trigger_release_deploy:
  extends: .trigger_deploy
  only:
    - tags

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

рдирддрд┐рдЬрд╛рдХреЛ рд░реВрдкрдорд╛, рдЬрд╛рднрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВрдорд╛ рдЖрдлреИрдВрдорд╛, .gitlab-ci.yml рдзреЗрд░реИ рдХрдореНрдкреНрдпрд╛рдХреНрдЯ рджреЗрдЦрд┐рдиреНрдЫ рд░ рд╡рд░реНрдмреЛрдЬ рд╣реЛрдЗрдиред

gitlab-ci.yml

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

Shields4J:
  extends: .build_java_project

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

Sonar review:
  extends: .sonar_review
  dependencies:
    - Shields4J

Release:
  extends: .trigger_release_deploy

Snapshot:
  extends: .trigger_snapshot_deploy

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

pom.xml рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди

рдпреЛ рд╡рд┐рд╖рдп рдареВрд▓реЛ рд╡рд┐рд╡рд░рдгрдорд╛ рд╡рд░реНрдгрди рдЧрд░рд┐рдПрдХреЛ рдЫред рдЧреБрдЧрд▓рдкреНрд▓реЗрдХреНрд╕ ╨▓ рд╕реНрдиреНрдпрд╛рдкрд╕рдЯ рд░ рд╕реНрдЯреЗрдЬрд┐рдЩ рд░рд┐рдкреЛрдЬрд┐рдЯрд░реАрд╣рд░реВрдорд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рд╕рд╛рдЗрди рдЗрди рдЧрд░реНрди рд░ рдХрд▓рд╛рдХреГрддрд┐рд╣рд░реВ рдЕрдкрд▓реЛрдб рдЧрд░реНрди maven рд╕реЗрдЯ рдЕрдк рдЧрд░реНрджреИ, рддреНрдпрд╕реИрд▓реЗ рдо рдкреНрд▓рдЧрдЗрдирд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдХреЗрд╣реА рд╕реВрдХреНрд╖реНрдорддрд╛рд╣рд░реВ рд╡рд░реНрдгрди рдЧрд░реНрдиреЗрдЫреБред рдо рддрдкрд╛рдЗрдБ рдХрддрд┐ рд╕рдЬрд┐рд▓реИ рд░ рдкреНрд░рд╛рдХреГрддрд┐рдХ рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рднрдиреЗрд░ рдкрдирд┐ рд╡рд░реНрдгрди рдЧрд░реНрдиреЗрдЫреБ nexus-staging-maven-pluginрдпрджрд┐ рддрдкрд╛рдЗрдБ рддрдкрд╛рдЗрдБрдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рд▓рд╛рдЧрд┐ рдЕрднрд┐рднрд╛рд╡рдХрдХреЛ рд░реВрдкрдорд╛ org.sonatype.oss:oss-parent рдЪрд╛рд╣рдиреБрд╣реБрдиреНрди рд╡рд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрди рднрдиреЗред

maven-install-plugin

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

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-install-plugin</artifactId>
  <executions>
    <execution>
      <id>install-project</id>
      <!-- ╨Х╤Б╨╗╨╕ ╤Г ╨▓╨░╤Б ╨╝╨╜╨╛╨│╨╛╨╝╨╛╨┤╤Г╨╗╤М╨╜╤Л╨╣ ╨┐╤А╨╛╨╡╨║╤В ╤Б ╨┤╨╡╨┐╨╗╨╛╨╡╨╝ ╤А╨╛╨┤╨╕╤В╨╡╨╗╤М╤Б╨║╨╛╨│╨╛ ╨┐╨╛╨╝╨╕╨║╨░ -->
      <phase>install</phase>
      <!-- ╨п╨▓╨╜╨╛ ╤Г╨║╨░╨╖╤Л╨▓╨░╨╡╨╝ ╤Д╨░╨╣╨╗╤Л ╨┤╨╗╤П ╨╗╨╛╨║╨░╨╗╤М╨╜╨╛╨╣ ╤Г╤Б╤В╨░╨╜╨╛╨▓╨║╨╕ -->
      <configuration>
        <file>target/${project.artifactId}-${project.version}.jar</file>
```target/${project.artifactId}-${project.version}-sources.jar</sources>
        <pomFile>dependency-reduced-pom.xml</pomFile>
        <!-- ╨Я╤А╨╕╨╜╤Г╨┤╨╕╤В╨╡╨╗╤М╨╜╨╛╨╡ ╨╛╨▒╨╜╨╛╨▓╨╗╨╡╨╜╨╕╨╡ ╨╝╨╡╤В╨░╨┤╨░╨╜╨╜╤Л╤Е ╨┐╤А╨╛╨╡╨║╤В╨░ -->
        <updateReleaseInfo>true</updateReleaseInfo>
        <!-- ╨Ъ╨╛╨╜╤В╤А╨╛╨╗╤М╨╜╤Л╨╡ ╤Б╤Г╨╝╨╝╤Л ╨┤╨╗╤П ╨┐╤А╨╛╨▓╨╡╤А╨║╨╕ ╤Ж╨╡╨╗╨╛╤Б╤В╨╜╨╛╤Б╤В╨╕ -->
        <createChecksum>true</createChecksum>
      </configuration>
    </execution>
  </executions>
</plugin>

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

maven-javadoc-plugin

рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рд▓рд╛рдЧрд┐ javadoc рдЙрддреНрдкрдиреНрди рдЧрд░реНрджреИред

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-javadoc-plugin</artifactId>
  <executions>
    <execution>
      <goals>
        <goal>jar</goal>
      </goals>
      <!-- ╨У╨╡╨╜╨╡╤А╨░╤Ж╨╕╤П javadoc ╨┤╨╛╨╗╨╢╨╜╨░ ╨▒╤Л╤В╤М ╨┐╨╛╤Б╨╗╨╡ ╤Д╨░╨╖╤Л ╨│╨╡╨╜╨╡╤А╨░╤Ж╨╕╨╕ ╤А╨╡╤Б╤Г╤А╤Б╨╛╨▓ -->
      <phase>prepare-package</phase>
      <configuration>
        <!-- ╨Ю╤З╨╡╨╜╤М ╨┐╨╛╨╝╨╛╨│╨░╨╡╤В ╨▓ ╨┐╤Г╨▒╨╗╨╕╤З╨╜╤Л╤Е ╨┐╤А╨╛╨╡╨║╤В╨░╤Е -->
        <failOnError>true</failOnError>
        <failOnWarnings>true</failOnWarnings>
        <!-- ╨г╨▒╨╕╤А╨░╨╡╤В ╨╛╤И╨╕╨▒╨║╤Г ╨┐╨╛╨╕╤Б╨║╨░ ╨┤╨╛╨║╤Г╨╝╨╡╨╜╤В╨░╤Ж╨╕╨╕ ╨▓ target ╨┤╨╕╤А╨╡╨║╤В╨╛╤А╨╕╨╕ -->
        <detectOfflineLinks>false</detectOfflineLinks>
      </configuration>
    </execution>
  </executions>
</plugin>

рдпрджрд┐ рддрдкрд╛рдЗрдБрд╕рдБрдЧ рдЬрд╛рднрд╛ рд╕рдорд╛рд╡реЗрд╢ рдирднрдПрдХреЛ рдореЛрдбреНрдпреБрд▓ рдЫ (рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐ рдорд╛рддреНрд░ рд╕реНрд░реЛрддрд╣рд░реВ)
рд╡рд╛ рддрдкрд╛рдЗрдБ рд╕рд┐рджреНрдзрд╛рдиреНрддрдорд╛ javadoc рдЙрддреНрдкрдиреНрди рдЧрд░реНрди рдЪрд╛рд╣рдиреБрд╣реБрдиреНрди, рддреНрдпрд╕рдкрдЫрд┐ рдорджреНрджрдд рдЧрд░реНрди maven-jar-plugin

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

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

maven-gpg-рдкреНрд▓рдЧрдЗрди

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-gpg-plugin</artifactId>
  <executions>
    <execution>
      <id>sign-artifacts</id>
      <!-- ╨б╨▒╨╛╤А╨║╨░ ╨▒╤Г╨┤╨╡╤В ╨┐╨░╨┤╨░╤В╤М, ╨╡╤Б╨╗╨╕ ╨╛╤В╤Б╤Г╤В╤Б╤В╨▓╤Г╨╡╤В GPG ╨║╨╗╤О╤З -->
      <!-- ╨Я╨╛╨┤╨┐╨╕╤Б╤Л╨▓╨░╨╡╨╝ ╨░╤А╤В╨╡╤Д╨░╨║╤В╤Л ╤В╨╛╨╗╤М╨║╨╛ ╨╜╨░ ╤Д╨░╨╖╨╡ deploy -->
      <phase>deploy</phase>
      <goals>
        <goal>sign</goal>
      </goals>
    </execution>
  </executions>
</plugin>

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

nexus-staging-maven-plugin

рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди:

<project>
  <!-- ... -->
  <build>
    <plugins>
      <!-- ... -->
      <plugin>
        <groupId>org.sonatype.plugins</groupId>
        <artifactId>nexus-staging-maven-plugin</artifactId>
      </plugin>
    </plugins>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.sonatype.plugins</groupId>
          <artifactId>nexus-staging-maven-plugin</artifactId>
          <extensions>true</extensions>
          <configuration>
            <serverId>sonatype</serverId>
            <nexusUrl>https://oss.sonatype.org/</nexusUrl>
            <!-- ╨Ю╨▒╨╜╨╛╨▓╨╗╤П╨╡╨╝ ╨╝╨╡╤В╨░╨┤╨░╨╜╨╜╤Л╨╡, ╤З╤В╨╛╨▒╤Л ╨┐╨╛╨╝╨╡╤В╨╕╤В╤М ╨░╤А╤В╨╡╤Д╨░╨║╤В ╨║╨░╨║ release -->
            <!-- ╨Э╨╡ ╨▓╨╗╨╕╤П╨╡╤В ╨╜╨░ snapshot ╨▓╨╡╤А╤Б╨╕╨╕ -->
            <updateReleaseInfo>true</updateReleaseInfo>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-deploy-plugin</artifactId>
          <configuration>
            <!-- ╨Ю╤В╨║╨╗╤О╤З╨░╨╡╨╝ ╨┐╨╗╨░╨│╨╕╨╜ -->
            <skip>true</skip>
          </configuration>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
  <distributionManagement>
    <snapshotRepository>
      <id>sonatype</id>
      <name>Nexus Snapshot Repository</name>
      <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
    </snapshotRepository>
    <repository>
      <id>sonatype</id>
      <name>Nexus Release Repository</name>
      <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
    </repository>
  </distributionManagement>
</project>

рдпрджрд┐ рддрдкрд╛рдЗрдБрд╕рдБрдЧ рдмрд╣реБ-рдореЛрдбреНрдпреБрд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЫ, рд░ рддрдкрд╛рдЗрдБрд▓реЗ рднрдгреНрдбрд╛рд░рдорд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдореЛрдбреНрдпреБрд▓ рдЕрдкрд▓реЛрдб рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫреИрди рднрдиреЗ, рддрдкрд╛рдЗрдБрд▓реЗ рдпреЛ рдореЛрдбреНрдпреБрд▓рдХреЛ pom.xml рдорд╛ рдердкреНрди рдЖрд╡рд╢реНрдпрдХ рдЫред nexus-staging-maven-plugin рдЭрдгреНрдбрд╛ рд╕рдВрдЧ skipNexusStagingDeployMojo

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

рд╕реНрдиреНрдпрд╛рдкрд╕рдЯ/рд░рд┐рд▓рд┐рдЬ рд╕рдВрд╕реНрдХрд░рдгрд╣рд░реВ рдЕрдкрд▓реЛрдб рдкрдЫрд┐ рдЙрдкрд▓рдмреНрдз рдЫрдиреН рд╕реНрдЯреЗрдЬрд┐рдЩ рднрдгреНрдбрд╛рд░рд╣рд░реВ

<repositories>
  <repository>
    <id>SonatypeNexus</id>
    <url>https://oss.sonatype.org/content/groups/staging/</url>
    <!-- ╨Э╨╡ ╨╜╨░╨┤╨╛ ╤Г╨║╨░╨╖╤Л╨▓╨░╤В╤М ╤Д╨╗╨░╨│╨╕ snapshot/release ╨┤╨╗╤П ╤А╨╡╨┐╨╛╨╖╨╕╤В╨╛╤А╨╕╤П -->
  </repository>
</repositories>

рдердк рдкреНрд▓рд╕рд╣рд░реВ

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

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

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

рд╕реНрдиреНрдпрд╛рдкрд╢рдЯ рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рдХрд╛рд╢рд┐рдд рдЧрд░реНрджреИ

рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрджрд╛, рдиреЗрдХреНрд╕рд╕рдорд╛ SNAPSHOT рд╕рдВрд╕реНрдХрд░рдг рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реНрди рдореНрдпрд╛рдиреБрдЕрд▓ рд░реВрдкрдорд╛ рдХрд╛рд░реНрдп рд╕реБрд░реБ рдЧрд░реНрди рд╕рдореНрднрд╡ рдЫред

рдорд╛рд╡реЗрди рд╕реЗрдиреНрдЯреНрд░рд▓рдорд╛ рдЬрд╛рднрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЕрдкрд▓реЛрдб рдЧрд░реНрди 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] ------------------------------------------------------------------------

рдлрд▓рд╕реНрд╡рд░реВрдк, рдиреЗрдХреНрд╕рд╕ рд╕рдВрд╕реНрдХрд░рдг рд▓реЛрдб рднрдПрдХреЛ рдЫ реи.резреж.реж - SNAPSHOT.

рд╕рдмреИ рд╕реНрдиреНрдпрд╛рдкрд╕рдЯ рд╕рдВрд╕реНрдХрд░рдгрд╣рд░реВ рд╕рд╛рдЗрдЯрдорд╛ рднрдгреНрдбрд╛рд░рдмрд╛рдЯ рд╣рдЯрд╛рдЙрди рд╕рдХрд┐рдиреНрдЫ 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 рд╕реЗрдЯрдЕрдк рдЧрд░реНрджреИ

рдмрд┐рд╖рдп рдмрд╛рд╣рд┐рд░

рдпреЛ рдореЗрд░реЛ рд▓рд╛рдЧрд┐ рдПрдХ рдЦреБрд▓рд╛рд╕рд╛ рдерд┐рдпреЛ рдХрд┐ maven рдЕрдиреНрдп рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рднрдгреНрдбрд╛рд░ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ред
рдореИрд▓реЗ robots.txt рдЕрдкрд▓реЛрдб рдЧрд░реНрдиреБрдкрд░реНтАНрдпреЛ рдХрд┐рдирднрдиреЗ рдпрд╕рд▓реЗ рдореЗрд░реЛ рдкреБрд░рд╛рдиреЛ рднрдгреНрдбрд╛рд░рд▓рд╛рдИ рдЕрдиреБрдХреНрд░рдорд┐рдд рдЧрд░реЗрдХреЛ рдЫред

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

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

рд╣рд╛рдореАрд╕рдБрдЧ рдХреЗ рдЫ

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

GitLab CI рд╕реЗрдЯ рдЕрдк рдЧрд░реНрдиреБ рддреНрдпрд╕реНрддреЛ рдЬрдЯрд┐рд▓ рд╡рд┐рд╖рдп рд╣реЛрдЗрди рдЬреБрди рдпреЛ рдкрд╣рд┐рд▓реЛ рдирдЬрд░рдорд╛ рджреЗрдЦрд┐рдиреНрдЫред рджреБрдИ рдкрдЯрдХ рдЯрд░реНрдирдХреА рдЖрдзрд╛рд░рдорд╛ CI рд╕реЗрдЯ рдЕрдк рдЧрд░реНрди рдкрд░реНрдпрд╛рдкреНрдд рдЫ, рд░ рдЕрдм, рддрдкрд╛рдИрдВ рдпрд╕ рдорд╛рдорд┐рд▓рд╛рдорд╛ рд╢реМрдХрд┐рдпрд╛ рд╣реБрдирдмрд╛рдЯ рдЯрд╛рдврд╛ рд╣реБрдиреБрд╣реБрдиреНрдЫред рдпрд╕рдмрд╛рд╣реЗрдХ, GitLab рдХрд╛рдЧрдЬрд╛рдд рдзреЗрд░реИ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЫред рдкрд╣рд┐рд▓реЛ рдХрджрдо рдЪрд╛рд▓реНрди рдирдбрд░рд╛рдЙрдиреБрд╣реЛрд╕реНред рдмрд╛рдЯреЛ рд╣рд┐рдБрдбреНрдиреЗрдХреЛ рдкрд╛рдЗрд▓рд╛рдореБрдирд┐ рджреЗрдЦрд┐рдиреНрдЫ (рдХрд╕рд▓реЗ рднрдиреНрдпреЛ рдорд▓рд╛рдИ рдпрд╛рдж рдЫреИрди ЁЯЩВ)ред

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджрд┐рди рдЦреБрд╕реА рд╣реБрдиреЗрдЫреБред

рдЕрд░реНрдХреЛ рд▓реЗрдЦрдорд╛, рдо рддрдкрд╛рдЗрдБрд▓рд╛рдИ рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрд╣рд░реВ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛рддреНрдордХ рд░реВрдкрдорд╛ рдЪрд▓рд╛рдЙрди GitLab CI рдХрд╕рд░реА рд╕реЗрдЯрдЕрдк рдЧрд░реНрдиреЗ рднрдиреЗрд░ рджреЗрдЦрд╛рдЙрдиреЗрдЫреБ (рдбрдХрд░-рдХрдореНрдкреЛрдЬрдХреЛ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рд╕реЗрд╡рд╛рд╣рд░реВ рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рдЫ) рдпрджрд┐ рддрдкрд╛рдЗрдБрд╕рдБрдЧ рдХреЗрд╡рд▓ рдПрдХ рд╢реЗрд▓ рдзрд╛рд╡рдХ рдЫ рднрдиреЗред

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

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