рдпреЛ рд▓реЗрдЦ рдЬрд╛рднрд╛ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╣реЛ рдЬрд╕рд▓реЗ GitLab рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╕реЛрдирд╛рдЯрд╛рдЗрдк рд░/рд╡рд╛ рдорд╛рднреЗрди рдХреЗрдиреНрджреНрд░реАрдп рднрдгреНрдбрд╛рд░рд╣рд░реВрдорд╛ рдЖрдлреНрдирд╛ рдЙрддреНрдкрд╛рджрдирд╣рд░реВ рджреНрд░реБрдд рд░реВрдкрдорд╛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдпрд╕ рд▓реЗрдЦрдорд╛, рдо рдпреЛ рд╕рдорд╕реНрдпрд╛ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди gitlab-runner, gitlab-ci рд░ maven-plugin рд╕реЗрдЯрдЕрдк рдмрд╛рд░реЗ рдХреБрд░рд╛ рдЧрд░реНрдиреЗрдЫреБред
рдЖрд╡рд╢реНрдпрдХрддрд╛рд╣рд░реБ:
- mvn рд░ GPG рдХреБрдЮреНрдЬреАрд╣рд░реВрдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рднрдгреНрдбрд╛рд░рдгред
- рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ CI рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред
- рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рднрдгреНрдбрд╛рд░рд╣рд░реВрдорд╛ рдХрд▓рд╛рдХреГрддрд┐рд╣рд░реВ (рд░рд┐рд▓рд┐рдЬ/рд╕реНрдиреНрдпрд╛рдкрд╕рдЯ) рдЕрдкрд▓реЛрдб рдЧрд░реНрджреИред
- рдорд╛рднреЗрди рд╕реЗрдиреНрдЯреНрд░рд▓рдорд╛ рдкреНрд░рдХрд╛рд╢рдирдХреЛ рд▓рд╛рдЧрд┐ рд░рд┐рд▓реАрдЬ рд╕рдВрд╕реНрдХрд░рдгрд╣рд░реВрдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЬрд╛рдБрдЪред
- рдмрд╣реБ рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рднрдгреНрдбрд╛рд░рдорд╛ рдХрд▓рд╛рдХреГрддрд┐рд╣рд░реВ рдЕрдкрд▓реЛрдб рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рдиред
- рд╕рд░рд▓рддрд╛ рд░ рдкреНрд░рдпреЛрдЧрдХреЛ рд╕рдЬрд┐рд▓реЛред
рд╕рд╛рдордЧреНрд░реАрд╣рд░реВ
рд╕рд╛рдорд╛рдиреНрдп рдЬрд╛рдирдХрд╛рд░реА GitLab рдорд╛ рдПрдХ рдбрд┐рдкреНрд▓реЛрдп рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯрдЕрдк рдЧрд░реНрджреИ GitLab рдзрд╛рд╡рдХ GitLab рд╕реАрдЖрдИ pom.xml рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдкрд░рд┐рдгрд╛рдо рдирд┐рд╖реНрдХрд░реНрд╖рдорд╛
рд╕рд╛рдорд╛рдиреНрдп рдЬрд╛рдирдХрд╛рд░реА
- рд╕реЛрдирд╛рдЯрд╛рдЗрдк рдУрдПрд╕рдПрд╕ рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рд╕реЗрд╡рд╛ рдорд╛рд░реНрдлрдд рдорд╛рднреЗрди рд╕реЗрдиреНрдЯреНрд░рд▓рдорд╛ рдХрд▓рд╛рдХреГрддрд┐рд╣рд░реВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдЧрд░реНрдиреЗ рд╕рдВрдпрдиреНрддреНрд░рдХреЛ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдкрд╣рд┐рд▓реЗ рдиреИ рд╡рд░реНрдгрди рдЧрд░рд┐рдПрдХреЛ рдЫред
рдпреЛ рд▓реЗрдЦ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рдЧреБрдЧрд▓рдкреНрд▓реЗрдХреНрд╕ , рддреНрдпрд╕реИрд▓реЗ рдо рдпрд╕ рд▓реЗрдЦрд▓рд╛рдИ рд╕рд╣реА рдард╛рдЙрдБрд╣рд░реВрдорд╛ рд╕рдиреНрджрд░реНрдн рдЧрд░реНрдиреЗрдЫреБред - рдорд╛ рдкреВрд░реНрд╡ рджрд░реНрддрд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН
Sonatype JIRA рд░ рднрдгреНрдбрд╛рд░ рдЦреЛрд▓реНрди рдЯрд┐рдХрдЯ рд╕реБрд░реБ рдЧрд░реНрдиреБрд╣реЛрд╕реН (рдердк рд╡рд┐рд╡рд░рдгрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐, рдЦрдгреНрдб рдкрдвреНрдиреБрд╣реЛрд╕реНSonatype JIRA рдЯрд┐рдХрдЯ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН )ред рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рдЦреЛрд▓рд┐рд╕рдХреЗрдкрдЫрд┐, JIRA рд▓рдЧрдЗрди/рдкрд╛рд╕рд╡рд░реНрдб рдЬреЛрдбреА (рдпрд╕рдкрдЫрд┐ рд╕реЛрдирд╛рдЯрд╛рдЗрдк рдЦрд╛рддрд╛ рднрдирд┐рдиреНрдЫ) рд╕реЛрдирд╛рдЯрд╛рдЗрдк рдиреЗрдХреНрд╕рд╕рдорд╛ рдХрд▓рд╛рдХреГрддрд┐рд╣рд░реВ рдЕрдкрд▓реЛрдб рдЧрд░реНрди рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреЗрдЫред - рдердк, GPG рдХреБрдЮреНрдЬреА рдЙрддреНрдкрдиреНрди рдЧрд░реНрдиреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдзреЗрд░реИ рд╕реБрдХреНрдЦрд╛ рд░реВрдкрдорд╛ рд╡рд░реНрдгрди рдЧрд░рд┐рдПрдХреЛ рдЫред рдердк рд╡рд┐рд╡рд░рдгрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдЦрдгреНрдб рд╣реЗрд░реНрдиреБрд╣реЛрд╕реНред
рдХрд▓рд╛рдХреГрддрд┐рд╣рд░реВ рд╕рд╛рдЗрди рдЧрд░реНрди GnuPG рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрджреИ - рдпрджрд┐ рддрдкрд╛рдЗрдБ GPG рдХреБрдЮреНрдЬреА (gnupg/gnupg2) рдЙрддреНрдкрдиреНрди рдЧрд░реНрди рд▓рд┐рдирдХреНрд╕ рдХрдиреНрд╕реЛрд▓ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИ рд╣реБрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рддрдкрд╛рдЗрдБ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред
rng- рдЙрдкрдХрд░рдгрд╣рд░реВ рдПрдиреНрдЯреНрд░реЛрдкреА рдЙрддреНрдкрдиреНрди рдЧрд░реНрдиред рдЕрдиреНрдпрдерд╛, рдХреБрдЮреНрдЬреА рдкреБрд╕реНрддрд╛рд▓реЗ рдзреЗрд░реИ рд╕рдордп рд▓рд┐рди рд╕рдХреНрдЫред - рднрдгреНрдбрд╛рд░рдг рд╕реЗрд╡рд╛рд╣рд░реВ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ GPG рдХреБрдЮреНрдЬреАрд╣рд░реВ
http://keys.gnupg.net http://pool.sks-keyservers.net http://keyserver.ubuntu.com
GitLab рдорд╛ рдПрдХ рдбрд┐рдкреНрд▓реЛрдп рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯрдЕрдк рдЧрд░реНрджреИ
- рд╕рдмреИ рднрдиреНрджрд╛ рдкрд╣рд┐рд▓реЗ, рддрдкрд╛рдИрдВрд▓реЗ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рд┐рд░реНрдЬрдирд╛ рд░ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рдЬрд╕рдорд╛ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд▓рд╛рдХреГрддрд┐рд╣рд░реВрдХреЛ рддреИрдирд╛рддреАрдХреЛ рд▓рд╛рдЧрд┐ рднрдгреНрдбрд╛рд░рдг рдЧрд░рд┐рдиреЗрдЫред рдореИрд▓реЗ рдореЗрд░реЛ рдкрд░рд┐рдпреЛрдЬрдирд╛рд▓рд╛рдИ рд╕рд░рд▓ рд░ рдЬрдЯрд┐рд▓ рднрдирд┐рдпреЛ -
рддреИрдирд╛рдд рдЧрд░реНрдиреБрд╣реЛрд╕реН - рднрдгреНрдбрд╛рд░ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реЗрдкрдЫрд┐, рддрдкрд╛рдИрдВрд▓реЗ рднрдгреНрдбрд╛рд░ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрди рдкрд╣реБрдБрдЪ рдкреНрд░рддрд┐рдмрдиреНрдзрд┐рдд рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред
рдкрд░рд┐рдпреЛрдЬрдирд╛рдорд╛ тАЛтАЛрдЬрд╛рдиреБрд╣реЛрд╕реН -> рд╕реЗрдЯрд┐рдЩреНрд╣рд░реВ -> рднрдгреНрдбрд╛рд░ -> рд╕рдВрд░рдХреНрд╖рд┐рдд рд╢рд╛рдЦрд╛рд╣рд░реВред рд╣рд╛рдореА рд╕рдмреИ рдирд┐рдпрдорд╣рд░реВ рдореЗрдЯрд╛рдЙрдБрдЫреМрдВ рд░ рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб * рдХреЛ рд╕рд╛рде рдПрдХрд▓ рдирд┐рдпрдо рдердкреНрдЫреМрдВ рд░ рдорд░реНрдЬрд░рдХреЛ рднреВрдорд┐рдХрд╛ рднрдПрдХрд╛ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐ рдорд╛рддреНрд░ рдкреБрд╢ рд░ рдорд░реНрдЬ рдЧрд░реНрдиреЗ рдЕрдзрд┐рдХрд╛рд░ред рдпреЛ рдирд┐рдпрдорд▓реЗ рдпреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд░ рдпреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдореНрдмрдиреНрдзрд┐рдд рд╕рдореВрд╣ рджреБрд╡реИрдХрд╛ рд╕рдмреИ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐ рдХрд╛рдо рдЧрд░реНрдиреЗрдЫред
- рдпрджрд┐ рддреНрдпрд╣рд╛рдБ рдзреЗрд░реИ рд░рдЦрд░рдЦрд╛рд╡рдХрд░реНрддрд╛рд╣рд░реВ рдЫрдиреН рднрдиреЗ, рддреНрдпрд╕рдкрдЫрд┐ рдЙрддреНрддрдо рд╕рдорд╛рдзрд╛рди рд╕рд┐рджреНрдзрд╛рдиреНрддрдорд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдорд╛ тАЛтАЛрдкрд╣реБрдБрдЪ рдкреНрд░рддрд┐рдмрдиреНрдзрд┐рдд рд╣реБрдиреЗрдЫред
рдкрд░рд┐рдпреЛрдЬрдирд╛рдорд╛ тАЛтАЛрдЬрд╛рдиреБрд╣реЛрд╕реН -> рд╕реЗрдЯрд┐рдЩреНрд╣рд░реВ -> рд╕рд╛рдорд╛рдиреНрдп -> тАЛтАЛрджреГрд╢реНрдпрддрд╛, рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реБрд╡рд┐рдзрд╛рд╣рд░реВ, рдЕрдиреБрдорддрд┐рд╣рд░реВ рд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рджреГрд╢реНрдпрддрд╛ рд╕реЗрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдирд┐рдЬреА.
рдорд╕рдБрдЧ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдкрд╣реБрдБрдЪрдорд╛ рдПрдЙрдЯрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЫ, рдХрд┐рдирдХрд┐ рдо рдЖрдлреНрдиреИ 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-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 -> рдзрд╛рд╡рдХрд╣рд░реВ -> рд╡рд┐рд╢рд┐рд╖реНрдЯ рдзрд╛рд╡рдХрд╣рд░реВ -> рдпрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рд▓рд╛рдЧрд┐ рд╕рдХреНрд░рд┐рдп рдзрд╛рд╡рдХрд╣рд░реВ
рд╕реНрдХреНрд░рд┐рди
- рдердкреНрдиреБрд╣реЛрд╕реН рдЕрд▓рдЧ рд╕реЗрд╡рд╛
/etc/systemd/system/gitlab-deployer.service
[Unit] Description=GitLab Deploy Runner After=syslog.target network.target ConditionFileIsExecutable=/usr/local/bin/gitlab-runner [Service] StartLimitInterval=5 StartLimitBurst=10 ExecStart=/usr/local/bin/gitlab-runner "run" "--working-directory" "/home/gitlab-deployer" "--config" "/etc/gitlab-runner/gitlab-deployer-config.toml" "--service" "gitlab-deployer" "--syslog" "--user" "gitlab-deployer" Restart=always RestartSec=120 [Install] WantedBy=multi-user.target
- рд╣рд╛рдореА рд╕реЗрд╡рд╛ рд╕реБрд░реБ рдЧрд░реНрдЫреМрдВред
systemctl enable gitlab-deployer.service systemctl start gitlab-deployer.service systemctl status gitlab-deployer.service
- рдзрд╛рд╡рдХ рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рдЫ рднрдиреЗрд░ рдЬрд╛рдБрдЪ рдЧрд░реНрдиреБрд╣реЛрд╕реНред
рдЙрджрд╛рд╣рд░рдг:
GPG рдХреБрдЮреНрдЬреА рдкреБрд╕реНрддрд╛
- рдПрдЙрдЯреИ рдореЗрд╕рд┐рдирдмрд╛рдЯ рд╣рд╛рдореА рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреНрддрд░реНрдЧрдд ssh рдорд╛рд░реНрдлрдд рдЬрд╛рдиреНрдЫреМрдВ
gitlab-deployer
(рдпреЛ GPG рдХреБрдЮреНрдЬреА рдкреБрд╕реНрддрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдЫ)ssh [email protected]
- рд╣рд╛рдореА рдкреНрд░рд╢реНрдирд╣рд░реВрдХреЛ рдЬрд╡рд╛рдл рджрд┐рдПрд░ рдХреБрдЮреНрдЬреА рдЙрддреНрдкрдиреНрди рдЧрд░реНрдЫреМрдВред рдореИрд▓реЗ рдЖрдлреНрдиреИ рдирд╛рдо рд░ рдЗрдореЗрд▓ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрдВред
рдХреБрдЮреНрдЬреАрдХреЛ рд▓рд╛рдЧрд┐ рдкрд╛рд╕рд╡рд░реНрдб рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрди рдирд┐рд╢реНрдЪрд┐рдд рд╣реБрдиреБрд╣реЛрд╕реНред рдХрд▓рд╛рдХреГрддрд┐рд╣рд░реВ рдпреЛ рдХреБрдЮреНрдЬреАрд╕рдБрдЧ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЧрд░рд┐рдиреЗрдЫредgpg --gen-key
- рдЬрд╛рдБрдЪ рдЧрд░реНрджреИ
gpg --list-keys -a /home/gitlab-deployer/.gnupg/pubring.gpg ---------------------------------------- pub 4096R/00000000 2019-04-19 uid Petruha Petrov <[email protected]> sub 4096R/11111111 2019-04-19
- рдХрд┐рд╕рд░реНрднрд░рдорд╛ рд╣рд╛рдореНрд░реЛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдЮреНрдЬреА рдЕрдкрд▓реЛрдб рдЧрд░реНрджреИ
gpg --keyserver keys.gnupg.net --send-key 00000000 gpg: sending key 00000000 to hkp server keys.gnupg.net
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 рдЦрд╛рддрд╛ рд▓рдЧрдЗрди
рдпрд╕рд▓реЗ рдзрд╛рд╡рдХ рд╕реЗрдЯрдЕрдк рдкреВрд░рд╛ рдЧрд░реНрджрдЫ, рддрдкрд╛рдЗрдБ рдЦрдгреНрдбрдорд╛ рдЕрдЧрд╛рдбрд┐ рдмрдвреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ
рд╕рд╛рдЭрд╛ рдзрд╛рд╡рдХ
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
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 рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реЗрдВред
рдердк рд╡рд┐рд╡рд░рдгрд╣рд░реВ
рдореИрд▓реЗ рдЫреБрдЯреНрдЯреИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдПрдХреЛ рдЫреБ
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 рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди
рдпреЛ рд╡рд┐рд╖рдп рдареВрд▓реЛ рд╡рд┐рд╡рд░рдгрдорд╛ рд╡рд░реНрдгрди рдЧрд░рд┐рдПрдХреЛ рдЫред 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 рд╕рдВрд╕реНрдХрд░рдг рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реНрди рдореНрдпрд╛рдиреБрдЕрд▓ рд░реВрдкрдорд╛ рдХрд╛рд░реНрдп рд╕реБрд░реБ рдЧрд░реНрди рд╕рдореНрднрд╡ рдЫред
рдЬрдм рдпреЛ рдХрд╛рд░реНрдп рд╕реБрд░реБ рд╣реБрдиреНрдЫ, рдбрд┐рдкреНрд▓реЛрдп рдкреНрд░реЛрдЬреЗрдХреНрдЯрдорд╛ рд╕рдореНрдмрдиреНрдзрд┐рдд рдХрд╛рд░реНрдп рдЯреНрд░рд┐рдЧрд░ рд╣реБрдиреНрдЫ (
рдХрд╛рдЯрд┐рдПрдХреЛ рд▓рдЧ
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] ------------------------------------------------------------------------
рдлрд▓рд╕реНрд╡рд░реВрдк, рдиреЗрдХреНрд╕рд╕ рд╕рдВрд╕реНрдХрд░рдг рд▓реЛрдб рднрдПрдХреЛ рдЫ
рд╕рдмреИ рд╕реНрдиреНрдпрд╛рдкрд╕рдЯ рд╕рдВрд╕реНрдХрд░рдгрд╣рд░реВ рд╕рд╛рдЗрдЯрдорд╛ рднрдгреНрдбрд╛рд░рдмрд╛рдЯ рд╣рдЯрд╛рдЙрди рд╕рдХрд┐рдиреНрдЫ
рд╡рд┐рдореЛрдЪрди рд╕рдВрд╕реНрдХрд░рдгрдХреЛ рдкреНрд░рдХрд╛рд╢рди
рдЬрдм рдЯреНрдпрд╛рдЧ рд╕реЗрдЯ рд╣реБрдиреНрдЫ, рдбрд┐рдкреНрд▓реЛрдп рдкреНрд░реЛрдЬреЗрдХреНрдЯрдорд╛ рд╕рдореНрдмрдиреНрдзрд┐рдд рдХрд╛рд░реНрдп рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рдиреЗрдХреНрд╕рд╕рдорд╛ рд░рд┐рд▓реАрдЬ рд╕рдВрд╕реНрдХрд░рдг рдЕрдкрд▓реЛрдб рдЧрд░реНрди рдЯреНрд░рд┐рдЧрд░ рд╣реБрдиреНрдЫ (
рд╕рдмреИрднрдиреНрджрд╛ рд░рд╛рдореНрд░реЛ рдкрдХреНрд╖ рдпреЛ рд╣реЛ рдХрд┐ рдирд┐рдХрдЯ рд░рд┐рд▓реАрдЬ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рдиреЗрдХреНрд╕рд╕рдорд╛ рдЯреНрд░рд┐рдЧрд░ рд╣реБрдиреНрдЫред
[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 <a href=http://keys.gnupg.net:11371/>http://keys.gnupg.net:11371/</a>. Upload your public key and try the operation again.
...
[ERROR] Cleaning up local stage directory after a Rule failure during close of staging repositories: [orgtouchbit-1039]
[ERROR] * Deleting context 9043b43f77dcc9.properties
[ERROR] Cleaning up remote stage repositories after a Rule failure during close of staging repositories: [orgtouchbit-1039]
[ERROR] * Dropping failed staging repository with ID "orgtouchbit-1039" (Rule failure during close of staging repositories: [orgtouchbit-1039]).
[ERROR] Remote staging finished with a failure: Staging rules failure!
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] Shields4J 1.0.0 .................................... SUCCESS [ 4.073 s]
[INFO] test-core .......................................... SUCCESS [ 2.788 s]
[INFO] Shields4J client ................................... SUCCESS [ 3.962 s]
[INFO] TestNG listener 1.0.0 .............................. FAILURE [01:07 min]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
рдлрд▓рд╕реНрд╡рд░реВрдк, рд╣рд╛рдореАрд╕рдБрдЧ рдПрдЙрдЯреИ рд╡рд┐рдХрд▓реНрдк рдмрд╛рдБрдХреА рдЫред рд╡рд╛ рдпреЛ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдЯрд╛рдЙрдиреБрд╣реЛрд╕реН рд╡рд╛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдЧрд░реНрдиреБрд╣реЛрд╕реНред
рд░рд┐рд▓рд┐рдЬ рдкрдЫрд┐, рдХреЗрд╣рд┐ рд╕рдордп рдкрдЫрд┐, рдХрд▓рд╛рдХреГрддрд┐рд╣рд░реВ рднрд┐рддреНрд░ рд╣реБрдиреЗрдЫрдиреН
рдмрд┐рд╖рдп рдмрд╛рд╣рд┐рд░
рдпреЛ рдореЗрд░реЛ рд▓рд╛рдЧрд┐ рдПрдХ рдЦреБрд▓рд╛рд╕рд╛ рдерд┐рдпреЛ рдХрд┐ maven рдЕрдиреНрдп рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рднрдгреНрдбрд╛рд░ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ред
рдореИрд▓реЗ robots.txt рдЕрдкрд▓реЛрдб рдЧрд░реНрдиреБрдкрд░реНтАНрдпреЛ рдХрд┐рдирднрдиреЗ рдпрд╕рд▓реЗ рдореЗрд░реЛ рдкреБрд░рд╛рдиреЛ рднрдгреНрдбрд╛рд░рд▓рд╛рдИ рдЕрдиреБрдХреНрд░рдорд┐рдд рдЧрд░реЗрдХреЛ рдЫред
рдирд┐рд╖реНрдХрд░реНрд╖рдорд╛
рд╣рд╛рдореАрд╕рдБрдЧ рдХреЗ рдЫ
- рдПрдЙрдЯрд╛ рдЫреБрдЯреНрдЯреИ рдбрд┐рдкреНрд▓реЛрдп рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЬрд╕рдорд╛ рддрдкрд╛рдИрдВрд▓реЗ рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдХрд╛рд╕ рднрд╛рд╖рд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рднрдгреНрдбрд╛рд░рд╣рд░реВрдорд╛ рдХрд▓рд╛рдХреГрддрд┐рд╣рд░реВ рдЕрдкрд▓реЛрдб рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐ рдзреЗрд░реИ CI рдХрд╛рд░реНрдпрд╣рд░реВ рд▓рд╛рдЧреВ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред
- рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрд╛рд╣рд┐рд░реА рд╣рд╕реНрддрдХреНрд╖реЗрдкрдмрд╛рдЯ рдЕрд▓рдЧ рдЫ рд░ рдорд╛рд▓рд┐рдХ рд░ рдорд░реНрдорддрдХрд░реНрддрд╛ рднреВрдорд┐рдХрд╛ рднрдПрдХрд╛ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрджреНрд╡рд╛рд░рд╛ рдорд╛рддреНрд░ рдкрд░рд┐рдорд╛рд░реНрдЬрди рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред
- рдХреЗрд╡рд▓ рдбрд┐рдкреНрд▓реЛрдп рдХрд╛рд░реНрдпрд╣рд░реВ рдЪрд▓рд╛рдЙрдирдХреЛ рд▓рд╛рдЧрд┐ "рддрд╛рддреЛ" рдХреНрдпрд╛рд╕рдХреЛ рд╕рд╛рде рдЫреБрдЯреНрдЯреИ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдзрд╛рд╡рдХред
- рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рднрдгреНрдбрд╛рд░рдорд╛ рд╕реНрдиреНрдпрд╛рдкрд╕рдЯ/рд░рд┐рд▓рд┐рдЬ рд╕рдВрд╕реНрдХрд░рдгрд╣рд░реВрдХреЛ рдкреНрд░рдХрд╛рд╢рдиред
- рдорд╛рд╡реЗрди рдХреЗрдиреНрджреНрд░реАрдпрдорд╛ рдкреНрд░рдХрд╛рд╢рдирдХреЛ рд▓рд╛рдЧрд┐ рддрддреНрдкрд░рддрд╛рдХреЛ рд▓рд╛рдЧрд┐ рд░рд┐рд▓реАрдЬ рд╕рдВрд╕реНрдХрд░рдгрдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЬрд╛рдБрдЪред
- maven рдХреЗрдиреНрджреНрд░реАрдп рдорд╛ "рдХрдЪреНрдЪрд╛" рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкреНрд░рдХрд╛рд╢рди рд╡рд┐рд░реБрджреНрдз рд╕реБрд░рдХреНрд╖рд╛ред
- рдХреНрд▓рд┐рдХрдорд╛ рд╕реНрдиреНрдпрд╛рдкрд╕рдЯ рд╕рдВрд╕реНрдХрд░рдгрд╣рд░реВ рдирд┐рд░реНрдорд╛рдг рд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рдЧрд░реНрдиреБрд╣реЛрд╕реНред
- рд╕реНрдиреНрдпрд╛рдкрд╕рдЯ/рд░рд┐рд▓рд┐рдЬ рд╕рдВрд╕реНрдХрд░рдгрд╣рд░реВ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдПрдХрд▓ рднрдгреНрдбрд╛рд░ред
- рдЬрд╛рднрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрдорд╛рдг / рдкрд░реАрдХреНрд╖рдг / рдкреНрд░рдХрд╛рд╢рдирдХреЛ рд▓рд╛рдЧрд┐ рд╕рд╛рдорд╛рдиреНрдп рдкрд╛рдЗрдкрд▓рд╛рдЗрдиред
GitLab CI рд╕реЗрдЯ рдЕрдк рдЧрд░реНрдиреБ рддреНрдпрд╕реНрддреЛ рдЬрдЯрд┐рд▓ рд╡рд┐рд╖рдп рд╣реЛрдЗрди рдЬреБрди рдпреЛ рдкрд╣рд┐рд▓реЛ рдирдЬрд░рдорд╛ рджреЗрдЦрд┐рдиреНрдЫред рджреБрдИ рдкрдЯрдХ рдЯрд░реНрдирдХреА рдЖрдзрд╛рд░рдорд╛ CI рд╕реЗрдЯ рдЕрдк рдЧрд░реНрди рдкрд░реНрдпрд╛рдкреНрдд рдЫ, рд░ рдЕрдм, рддрдкрд╛рдИрдВ рдпрд╕ рдорд╛рдорд┐рд▓рд╛рдорд╛ рд╢реМрдХрд┐рдпрд╛ рд╣реБрдирдмрд╛рдЯ рдЯрд╛рдврд╛ рд╣реБрдиреБрд╣реБрдиреНрдЫред рдпрд╕рдмрд╛рд╣реЗрдХ, GitLab рдХрд╛рдЧрдЬрд╛рдд рдзреЗрд░реИ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЫред рдкрд╣рд┐рд▓реЛ рдХрджрдо рдЪрд╛рд▓реНрди рдирдбрд░рд╛рдЙрдиреБрд╣реЛрд╕реНред рдмрд╛рдЯреЛ рд╣рд┐рдБрдбреНрдиреЗрдХреЛ рдкрд╛рдЗрд▓рд╛рдореБрдирд┐ рджреЗрдЦрд┐рдиреНрдЫ (рдХрд╕рд▓реЗ рднрдиреНрдпреЛ рдорд▓рд╛рдИ рдпрд╛рдж рдЫреИрди ЁЯЩВ)ред
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджрд┐рди рдЦреБрд╕реА рд╣реБрдиреЗрдЫреБред
рдЕрд░реНрдХреЛ рд▓реЗрдЦрдорд╛, рдо рддрдкрд╛рдЗрдБрд▓рд╛рдИ рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрд╣рд░реВ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛рддреНрдордХ рд░реВрдкрдорд╛ рдЪрд▓рд╛рдЙрди GitLab CI рдХрд╕рд░реА рд╕реЗрдЯрдЕрдк рдЧрд░реНрдиреЗ рднрдиреЗрд░ рджреЗрдЦрд╛рдЙрдиреЗрдЫреБ (рдбрдХрд░-рдХрдореНрдкреЛрдЬрдХреЛ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рд╕реЗрд╡рд╛рд╣рд░реВ рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рдЫ) рдпрджрд┐ рддрдкрд╛рдЗрдБрд╕рдБрдЧ рдХреЗрд╡рд▓ рдПрдХ рд╢реЗрд▓ рдзрд╛рд╡рдХ рдЫ рднрдиреЗред
рд╕реНрд░реЛрдд: www.habr.com