{"id":305227,"date":"2020-06-11T15:01:03","date_gmt":"2020-06-11T15:01:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=305227"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=305227","title":{"rendered":"\u041a\u0440\u0443\u0433\u0438 \u0430\u0434\u0430 \u0441 GitHub Actions (\u0441\u0442\u0440\u043e\u0438\u043c CI\/CD pipeline \u0434\u043b\u044f Java-\u043f\u0440\u043e\u0435\u043a\u0442\u0430)"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/jugru\/blog\/505994\/\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/un\/6l\/1_\/un6l1_vcriwkzfwfrmcjm_jjihw.jpeg\"><\/p>\n<p>  \u041c\u043d\u0435 \u0447\u0430\u0441\u0442\u0435\u043d\u044c\u043a\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043d\u0430 Java. \u0418\u043d\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441, \u0438\u043d\u043e\u0433\u0434\u0430 \u043d\u0435\u0442. \u041d\u0435\u0434\u0430\u0432\u043d\u043e \u044f \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0447\u0430\u0441\u0442\u044c \u0441\u0432\u043e\u0438\u0445 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u0432 \u0441 Travis-CI \u0438 TeamCity \u043d\u0430 GitHub Actions, \u0438 \u0432\u043e\u0442 \u0447\u0442\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c.<a name=\"habracut\"><\/a><\/p>\n<h2>\u0427\u0442\u043e \u0431\u0443\u0434\u0435\u043c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c<\/h2>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u043f\u0440\u043e\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 Spring boot \/ Java 11 \/ Maven. \u0412 \u0440\u0430\u043c\u043a\u0430\u0445 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043b\u043e\u0433\u0438\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0432\u0441\u0435\u043c, \u043d\u0430\u043c \u0432\u0430\u0436\u043d\u0430 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0432\u043e\u043a\u0440\u0443\u0433 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0430\u043c \u0445\u0432\u0430\u0442\u0438\u0442 \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u043e\u0433\u043e REST API \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430.<\/p>\n<p>  \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0442\u0443\u0442: <a href=\"https:\/\/github.com\/antkorwin\/github-actions\">github.com\/antkorwin\/github-actions<\/a> \u0432\u0441\u0435 \u044d\u0442\u0430\u043f\u044b \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f pipeline-\u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430 \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u044b \u0432 \u043f\u0443\u043b\u043b-\u0440\u0435\u043a\u0432\u0435\u0441\u0442\u0430\u0445 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<h2>JIRA \u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/h2>\n<p>  \u0421\u0442\u043e\u0438\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043c\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c JIRA \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u0440\u0435\u043a\u0435\u0440\u0430 \u0437\u0430\u0434\u0430\u0447, \u0442\u0430\u043a \u0447\u0442\u043e \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0437\u0430\u0432\u0435\u0434\u0435\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0431\u043e\u0440\u0434\u0443 \u043f\u043e\u0434 \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u043d\u0430\u043a\u0438\u0434\u0430\u0435\u043c \u0442\u0443\u0434\u0430 \u043f\u0435\u0440\u0432\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/xz\/s-\/uy\/xzs-uy7iin7o2qqv-3g4_d52dtk.png\"><\/p>\n<p>  \u0427\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435 \u043c\u044b \u0435\u0449\u0435 \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e \u043c\u043e\u0433\u0443\u0442 \u0434\u0430\u0442\u044c \u0432 \u0441\u0432\u044f\u0437\u043a\u0435 JIRA \u0438 GitHub.<\/p>\n<h2>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0441\u0431\u043e\u0440\u043a\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/h2>\n<p>  \u041d\u0430\u0448 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 maven, \u0442\u0430\u043a \u0447\u0442\u043e \u0441\u0431\u043e\u0440\u043a\u0430 \u0435\u0433\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u044f, \u0432\u0441\u0435, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e, \u044d\u0442\u043e mvn clean package.<\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 Github Actions, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0444\u0430\u0439\u043b \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u043d\u0430\u0448\u0435\u0433\u043e workflow, \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u043c yml-\u0444\u0430\u0439\u043b\u043e\u043c, \u043d\u0435 \u043c\u043e\u0433\u0443 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0447\u0442\u043e \u043c\u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u00ab\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 yml\u00bb, \u043d\u043e \u0447\u0442\u043e \u043f\u043e\u0434\u0435\u043b\u0430\u0442\u044c \u2014 \u0434\u0435\u043b\u0430\u0435\u043c \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 .github\/workflow\/ \u0444\u0430\u0439\u043b build.yml \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0435\u043c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0435 \u043c\u0430\u0441\u0442\u0435\u0440 \u0432\u0435\u0442\u043a\u0438:<\/p>\n<pre><code class=\"plaintext\">name: Build  on:   pull_request:     branches:       - '*'   push:     branches:       - 'master'  jobs:   build:     runs-on: ubuntu-18.04     steps:       - uses: actions\/checkout@v1       - name: set up JDK 11         uses: actions\/setup-java@v1         with:           java-version: 1.11       - name: Maven Package         run: mvn -B clean package -DskipTests <\/code><\/pre>\n<p>  <b>on<\/b> \u2014 \u044d\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043d\u0430\u0448 \u0441\u043a\u0440\u0438\u043f\u0442.<\/p>\n<p>  <b>on: pull_request \/ push<\/b> \u2014 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 workflow \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0443\u0448\u0435 \u0432 \u043c\u0430\u0441\u0442\u0435\u0440 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043f\u0443\u043b\u043b-\u0440\u0435\u043a\u0432\u0435\u0441\u0442\u043e\u0432.<\/p>\n<p>  \u0414\u0430\u043b\u044c\u0448\u0435 \u0438\u0434\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0439 (<b>jobs<\/b>) \u0438 \u0448\u0430\u0433\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f (<b>steps<\/b>) \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438.<\/p>\n<p>  <b>runs-on<\/b> \u2014 \u0442\u0443\u0442 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u041e\u0421, \u043d\u0430 \u0443\u0434\u0438\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0434\u0430\u0436\u0435 Mac OS, \u043d\u043e \u043d\u0430 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0445 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f\u0445 \u044d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u043e\u0440\u043e\u0433\u043e\u0435 \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435 (\u0432 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u0441 linux).<\/p>\n<p>  <b>uses<\/b> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u044d\u043a\u0448\u0435\u043d\u044b, \u0442\u0430\u043a \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u044d\u043a\u0448\u0435\u043d\u0430 actions\/setup-java \u043c\u044b \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f Java 11.<\/p>\n<p>  \u041f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <b>with<\/b> \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435, \u043f\u043e \u0441\u0443\u0442\u0438 \u044d\u0442\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u044d\u043a\u0448\u0435\u043d.<\/p>\n<p>  \u041e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u0432\u0435\u043d\u043e\u043c \u0441\u0431\u043e\u0440\u043a\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430: <code>run: mvn -B clean package<\/code> \u0444\u043b\u0430\u0433 <b>-B<\/b> \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d non-interactive mode, \u0447\u0442\u043e\u0431\u044b \u043c\u0430\u0432\u0435\u043d \u0432\u0434\u0440\u0443\u0433 \u043d\u0435 \u0437\u0430\u0445\u043e\u0442\u0435\u043b \u0447\u0442\u043e-\u0442\u043e \u0443 \u043d\u0430\u0441 \u0441\u043f\u0440\u043e\u0441\u0438\u0442\u044c<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/xj\/7p\/9q\/xj7p9qsrrl33kzdr8_ohidkf8gg.png\"><\/p>\n<p>  \u041e\u0442\u043b\u0438\u0447\u043d\u043e! \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u043a\u043e\u043c\u043c\u0438\u0442\u0435 \u0432 \u043c\u0430\u0441\u0442\u0435\u0440, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0441\u0431\u043e\u0440\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<h2>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a \u0442\u0435\u0441\u0442\u043e\u0432<\/h2>\n<p>  \u0421\u0431\u043e\u0440\u043a\u0430 \u044d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e, \u043d\u043e \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u043c\u043e\u0436\u0435\u0442 \u0431\u043b\u0430\u0433\u043e\u043f\u043e\u043b\u0443\u0447\u043d\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f, \u043d\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0440\u043e\u0433\u043e\u043d\u0430 \u0442\u0435\u0441\u0442\u043e\u0432. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435, \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u0442\u0435\u0441\u0442\u043e\u0432, \u043a\u043e\u0433\u0434\u0430 \u0434\u0435\u043b\u0430\u0435\u0448\u044c \u0440\u0435\u0432\u044c\u044e PR \u2014 \u0442\u044b \u0442\u043e\u0447\u043d\u043e \u0437\u043d\u0430\u0435\u0448\u044c, \u0447\u0442\u043e \u0442\u0435\u0441\u0442\u044b \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u0438 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0437\u0430\u0431\u044b\u043b, \u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c \u043a\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c merge, \u043f\u0440\u043e\u0433\u043d\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0432\u0435\u0442\u043a\u0443.<\/p>\n<p>  \u0414\u0435\u043b\u0430\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a \u0442\u0435\u0441\u0442\u043e\u0432 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043f\u0443\u043b\u043b-\u0440\u0435\u043a\u0432\u0435\u0441\u0442\u0430 \u0438 merge \u0432 \u043c\u0430\u0441\u0442\u0435\u0440, \u0430 \u0437\u0430\u043e\u0434\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043e\u0442\u0447\u0435\u0442\u0430 \u043e code-coverage.<\/p>\n<pre><code class=\"plaintext\">name: Build  on:   pull_request:     branches:       - '*'   push:     branches:       - 'master'  jobs:   build:     runs-on: ubuntu-18.04     steps:       - uses: actions\/checkout@v1       - name: set up JDK 11         uses: actions\/setup-java@v1         with:           java-version: 1.11       - name: Maven Verify         run: mvn -B clean verify       - name: Test Coverage         uses: codecov\/codecov-action@v1         with:           token: ${{ secrets.CODECOV_TOKEN }} <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u043f\u043e\u043a\u0440\u044b\u0442\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e codecov \u0432 \u0441\u0432\u044f\u0437\u043a\u0435 \u0441 jacoco \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u043c. \u0423 codecov \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0439 \u044d\u043a\u0448\u0435\u043d, \u043d\u043e \u0435\u043c\u0443 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0430\u0448\u0438\u043c pull-request-\u043e\u043c \u043d\u0443\u0436\u0435\u043d \u0442\u043e\u043a\u0435\u043d:<\/p>\n<p>  <code>${{ secrets.CODECOV_TOKEN }}<\/code> \u2014 \u0442\u0430\u043a\u0443\u044e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0442\u044c \u0435\u0449\u0435 \u043d\u0435 \u043e\u0434\u0438\u043d \u0440\u0430\u0437, secrets \u044d\u0442\u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432 \u0432 \u0433\u0438\u0442\u0445\u0430\u0431\u0435, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0442\u0430\u043c \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u0438\/\u0442\u043e\u043a\u0435\u043d\u044b\/\u0445\u043e\u0441\u0442\u044b\/url-\u044b \u0438 \u043f\u0440\u043e\u0447\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u0441\u0432\u0435\u0442\u0438\u0442\u044c \u0432 \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f.<\/p>\n<p>  \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0432 secrets, \u043c\u043e\u0436\u043d\u043e \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u043d\u0430 GitHub:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/bg\/25\/iv\/bg25ivc_dw5hnfsbtq5xl2uaapw.png\"><\/p>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u043e\u043a\u0435\u043d \u043c\u043e\u0436\u043d\u043e \u043d\u0430 <a href=\"https:\/\/codecov.io\">codecov.io<\/a> \u043f\u043e\u0441\u043b\u0435 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 GitHub, \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f public \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0439\u0442\u0438 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 \u0432\u0438\u0434\u0430: <a href=\"https:\/\/codecov.io\/gh\/\">GitHub user name<\/a>\/[repo name]. \u041f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0434\u043e \u0434\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0430 codecov \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0432 \u0433\u0438\u0442\u0445\u0430\u0431\u0435.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/pb\/qo\/gn\/pbqognc8tkkii_evzpklgiposfq.png\"><\/p>\n<p>  \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c jacoco \u043f\u043b\u0430\u0433\u0438\u043d \u0432 POM-\u0444\u0430\u0439\u043b:<\/p>\n<pre><code class=\"xml\">&lt;plugin&gt; \t&lt;groupId&gt;org.jacoco&lt;\/groupId&gt; \t&lt;artifactId&gt;jacoco-maven-plugin&lt;\/artifactId&gt; \t&lt;version&gt;0.8.4&lt;\/version&gt; \t&lt;executions&gt; \t\t&lt;execution&gt; \t\t\t&lt;goals&gt; \t\t\t\t&lt;goal&gt;prepare-agent&lt;\/goal&gt; \t\t\t&lt;\/goals&gt; \t\t&lt;\/execution&gt; \t\t&lt;!-- attached to Maven test phase --&gt; \t\t&lt;execution&gt; \t\t\t&lt;id&gt;report&lt;\/id&gt; \t\t\t&lt;phase&gt;test&lt;\/phase&gt; \t\t\t&lt;goals&gt; \t\t\t\t&lt;goal&gt;report&lt;\/goal&gt; \t\t\t&lt;\/goals&gt; \t\t&lt;\/execution&gt; \t&lt;\/executions&gt; &lt;\/plugin&gt; &lt;plugin&gt; \t&lt;groupId&gt;org.apache.maven.plugins&lt;\/groupId&gt; \t&lt;artifactId&gt;maven-surefire-plugin&lt;\/artifactId&gt; \t&lt;version&gt;2.22.2&lt;\/version&gt; \t&lt;configuration&gt; \t\t&lt;reportFormat&gt;plain&lt;\/reportFormat&gt; \t\t&lt;includes&gt; \t\t\t&lt;include&gt;**\/*Test*.java&lt;\/include&gt; \t\t\t&lt;include&gt;**\/*IT*.java&lt;\/include&gt; \t\t&lt;\/includes&gt; \t&lt;\/configuration&gt; &lt;\/plugin&gt; <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0432 \u043a\u0430\u0436\u0434\u044b\u0439 \u043d\u0430\u0448 \u043f\u0443\u043b\u043b-\u0440\u0435\u043a\u0432\u0435\u0441\u0442 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0445\u043e\u0434\u0438\u0442\u044c codecov \u0431\u043e\u0442 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0433\u0440\u0430\u0444\u0438\u043a \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u043a\u0440\u044b\u0442\u0438\u044f:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/mw\/71\/np\/mw71npinurilxp7lqyivauh1et8.png\"><\/p>\n<h2>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440<\/h2>\n<p>  \u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u0432\u043e\u0438\u0445 o\u043f\u0435\u043d\u0441\u043e\u0440\u0441-\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e sonar cloud \u0434\u043b\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043a\u043e\u0434\u0430, \u0435\u0433\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043a travis-ci. \u0422\u0430\u043a \u0447\u0442\u043e \u044d\u0442\u043e \u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 \u0448\u0430\u0433 \u043f\u0440\u0438 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u043d\u0430 GitHub Actions, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435. \u041c\u0430\u0440\u043a\u0435\u0442 \u044d\u043a\u0448\u0435\u043d\u043e\u0432 \u2014 \u043a\u043b\u0435\u0432\u0430\u044f \u0448\u0442\u0443\u043a\u0430, \u043d\u043e \u0432 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043e\u043d \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0432\u0435\u043b, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044f \u043f\u043e \u043f\u0440\u0438\u0432\u044b\u0447\u043a\u0435 \u043d\u0430\u0448\u0435\u043b \u043d\u0443\u0436\u043d\u044b\u0439 \u044d\u043a\u0448\u0435\u043d \u0438 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043b \u0435\u0433\u043e \u0432 workflow. \u0410 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e sonar \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0447\u0435\u0440\u0435\u0437 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043d\u0430 maven \u0438\u043b\u0438 gradle. \u041e\u0431 \u044d\u0442\u043e\u043c \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u043d\u043e \u043a\u0442\u043e \u0436\u0435 \u0435\u0435 \u0447\u0438\u0442\u0430\u0435\u0442?!<\/p>\n<p>  \u0427\u0435\u0440\u0435\u0437 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043d\u0435\u043b\u044c\u0437\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 mvn \u043f\u043b\u0430\u0433\u0438\u043d:<\/p>\n<pre><code class=\"plaintext\">name: SonarCloud  on:   push:     branches:       - master   pull_request:     types: [opened, synchronize, reopened]  jobs:   sonarcloud:     runs-on: ubuntu-16.04     steps:       - uses: actions\/checkout@v1       - name: Set up JDK         uses: actions\/setup-java@v1         with:           java-version: 1.11       - name: Analyze with SonarCloud #       set environment variables:         env:           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}           SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} #       run sonar maven plugin:         run: mvn -B verify sonar:sonar -Dsonar.projectKey=antkorwin_github-actions -Dsonar.organization=antkorwin-github -Dsonar.host.url=https:\/\/sonarcloud.io -Dsonar.login=$SONAR_TOKEN -Dsonar.coverage.jacoco.xmlReportPaths=.\/target\/site\/jacoco\/jacoco.xml <\/code><\/pre>\n<p>  <b>SONAR_TOKEN<\/b> \u2014 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432 <a href=\"https:\/\/sonarcloud.io\/\">sonarcloud.io<\/a> \u0438 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0433\u043e \u0432 secrets. <b>GITHUB_TOKEN<\/b> \u2014 \u044d\u0442\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u0435\u043d\u0435\u0440\u0438\u0442 \u0433\u0438\u0442\u0445\u0430\u0431, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0435\u0433\u043e sonarcloud[bot] \u0441\u043c\u043e\u0436\u0435\u0442 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0433\u0438\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0430\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u043f\u0443\u043b\u043b-\u0440\u0435\u043a\u0432\u0435\u0441\u0442\u0430\u0445.<\/p>\n<p>  <b>Dsonar.projectKey<\/b> \u2014 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432 \u0441\u043e\u043d\u0430\u0440\u0435, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<p>  <b>Dsonar.organization<\/b> \u2014 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0437 GitHub.<\/p>\n<p>  \u0414\u0435\u043b\u0430\u0435\u043c \u043f\u0443\u043b\u043b-\u0440\u0435\u043a\u0432\u0435\u0441\u0442 \u0438 \u0436\u0434\u0435\u043c, \u043a\u043e\u0433\u0434\u0430 sonarcloud[bot] \u043f\u0440\u0438\u0434\u0435\u0442 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/4h\/oh\/h1\/4hohh12hbfyjr6o_7f_zvxbvmvy.png\"><\/p>\n<h2>Release management<\/h2>\n<p>  \u0411\u0438\u043b\u0434 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438, \u0442\u0435\u0441\u0442\u044b \u043f\u0440\u043e\u0433\u043d\u0430\u043b\u0438, \u043c\u043e\u0436\u043d\u043e \u0438 \u0440\u0435\u043b\u0438\u0437 \u0441\u0434\u0435\u043b\u0430\u0442\u044c. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a GitHub Actions \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c release manag\u0435ment.<\/p>\n<p>  \u041d\u0430 \u0440\u0430\u0431\u043e\u0442\u0435 \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u044b, \u043a\u043e\u0434\u043e\u0432\u0430\u044f \u0431\u0430\u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043b\u0435\u0436\u0438\u0442 \u0432 bitbucket(\u0432\u0441\u0435 \u043a\u0430\u043a \u0432 \u0442\u043e\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u00ab\u0434\u043d\u0435\u043c \u043f\u0438\u0448\u0443 \u0432 \u0431\u0438\u0442\u0431\u0430\u043a\u0435\u0442, \u043d\u043e\u0447\u044c\u044e \u043a\u043e\u043c\u043c\u0438\u0447\u0443 \u0432 GitHub\u00bb). \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0432 bitbucket \u043d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0440\u0435\u043b\u0438\u0437\u0430\u043c\u0438. \u042d\u0442\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u043e\u0434 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0435\u043b\u0438\u0437 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0440\u0443\u043a\u0430\u043c\u0438 \u0437\u0430\u0432\u043e\u0434\u0438\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0443 \u0432 confluence \u0438 \u0441\u043a\u0438\u0434\u044b\u0432\u0430\u0442\u044c \u0442\u0443\u0434\u0430 \u0432\u0441\u0435 \u0444\u0438\u0447\u0438 \u0432\u043e\u0448\u0435\u0434\u0448\u0438\u0435 \u0432 \u0440\u0435\u043b\u0438\u0437, \u0448\u0435\u0440\u0441\u0442\u0438\u0442\u044c \u0447\u0435\u0440\u0442\u043e\u0433\u0438 \u0440\u0430\u0437\u0443\u043c\u0430, \u0442\u0430\u0441\u043a\u0438 \u0432 jira, \u043a\u043e\u043c\u043c\u0438\u0442\u044b \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438. \u0428\u0430\u043d\u0441\u043e\u0432 \u043e\u0448\u0438\u0431\u0438\u0442\u044c\u0441\u044f \u043c\u043d\u043e\u0433\u043e, \u043c\u043e\u0436\u043d\u043e \u0447\u0442\u043e-\u0442\u043e \u0437\u0430\u0431\u044b\u0442\u044c \u0438\u043b\u0438 \u0432\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u0443\u0436\u0435 \u0440\u0435\u043b\u0438\u0437\u0438\u043b\u0438 \u0432 \u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u0440\u0430\u0437, \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043a \u0447\u0435\u043c\u0443 \u043e\u0442\u043d\u0435\u0441\u0442\u0438 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043f\u0443\u043b\u043b-\u0440\u0435\u043a\u0432\u0435\u0441\u0442 \u2014 \u044d\u0442\u043e \u0444\u0438\u0447\u0430 \u0438\u043b\u0438 \u0444\u0438\u043a\u0441 \u0431\u0430\u0433\u043e\u0432, \u0438\u043b\u0438 \u043f\u0440\u0430\u0432\u043a\u0430 \u0442\u0435\u0441\u0442\u043e\u0432, \u0438\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u043e\u0435.<\/p>\n<p>  \u041a\u0430\u043a \u043d\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043c\u043e\u0447\u044c GitHub actions? \u0415\u0441\u0442\u044c \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u044d\u043a\u0448\u0435\u043d \u2014 release drafter, \u043e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u0434\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d \u0444\u0430\u0439\u043b\u0430 release notes, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u043f\u0443\u043b\u043b-\u0440\u0435\u043a\u0432\u0435\u0441\u0442\u043e\u0432 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0432 release notes \u0444\u0430\u0439\u043b\u0435:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/fw\/rq\/fp\/fwrqfprnrcq3iiinqdyzuqufpay.png\"><\/p>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043e\u0442\u0447\u0435\u0442\u0430(.github\/release-drafter.yml):<\/p>\n<pre><code class=\"plaintext\">name-template: 'v$NEXT_PATCH_VERSION' tag-template: 'v$NEXT_PATCH_VERSION' categories:   - title: ' New Features'     labels:       - 'type:features' # \u0432 \u044d\u0442\u0443 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0441\u0435 PR \u0441 \u043c\u0435\u0442\u043a\u043e\u0439 type:features    - title: ' Bugs Fixes'     labels:       - 'type:fix' # \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0434\u043b\u044f \u043c\u0435\u0442\u043a\u0438 type:fix \u0438 \u0442.\u0434.    - title: ' Documentation'     labels:       - 'type:documentation'    - title: ' Configuration'     labels:       - 'type:config'  change-template: '- $TITLE @$AUTHOR (#$NUMBER)' template: |   ## Changes   $CHANGES <\/code><\/pre>\n<p>  \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a\u0430 \u0440\u0435\u043b\u0438\u0437\u0430 (.github\/workflows\/release-draft.yml):<\/p>\n<pre><code class=\"plaintext\">name: &quot;Create draft release&quot;  on:   push:     branches:       - master  jobs:   update_draft_release:     runs-on: ubuntu-18.04     steps:       - uses: release-drafter\/release-drafter@v5         env:           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} <\/code><\/pre>\n<p>  \u0412\u0441\u0435 \u043f\u0443\u043b\u043b-\u0440\u0435\u043a\u0432\u0435\u0441\u0442\u044b \u0441 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0432 release notes \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u2014 magic!<\/p>\n<p>  \u0422\u0443\u0442 \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441: \u0430 \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0437\u0430\u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043c\u0435\u0442\u043a\u0438 \u0432 PR? \u0422\u043e\u0433\u0434\u0430 \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0432 \u043a\u0430\u043a\u0443\u044e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e \u0435\u0433\u043e \u043e\u0442\u043d\u0435\u0441\u0442\u0438, \u0438 \u043e\u043f\u044f\u0442\u044c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u0441 \u043a\u0430\u0436\u0434\u044b\u043c PR-\u043e\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e. \u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0435\u0449\u0435 \u043e\u0434\u043d\u0438\u043c \u044d\u043a\u0448\u0435\u043d\u043e\u043c \u2014 label verifier \u2014 \u043e\u043d \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u044d\u0433\u043e\u0432 \u043d\u0430 \u043f\u0443\u043b\u043b-\u0440\u0435\u043a\u0432\u0435\u0441\u0442\u0435. \u0415\u0441\u043b\u0438 \u043d\u0435\u0442 \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0442\u044d\u0433\u0430, \u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0432\u0430\u043b\u0435\u043d\u0430 \u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0443\u043b\u043b-\u0440\u0435\u043a\u0432\u0435\u0441\u0442\u0435.<\/p>\n<pre><code class=\"plaintext\">name: &quot;Verify type labels&quot;  on:   pull_request:     types: [opened, labeled, unlabeled, synchronize]  jobs:   triage:     runs-on: ubuntu-18.04     steps:       - uses: zwaldowski\/match-label-action@v2         with:           allowed: 'type:fix, type:features, type:documentation, type:tests, type:config' <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043b\u044e\u0431\u043e\u0439 pull-request \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u0442\u0438\u0442\u044c \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u0442\u044d\u0433\u043e\u0432: type:fix, type:features, type:documentation, type:tests, type:config.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/kc\/5k\/6r\/kc5k6rk_-0chuslyrvwpnexptmg.png\"><\/p>\n<h2>\u0410\u0432\u0442\u043e-\u0430\u043d\u043d\u043e\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0443\u043b\u043b-\u0440\u0435\u043a\u0432\u0435\u0441\u0442\u043e\u0432<\/h2>\n<p>  \u0420\u0430\u0437 \u0443\u0436 \u043c\u044b \u043a\u043e\u0441\u043d\u0443\u043b\u0438\u0441\u044c \u0442\u0430\u043a\u043e\u0439 \u0442\u0435\u043c\u044b \u043a\u0430\u043a \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043f\u0443\u043b\u043b-\u0440\u0435\u043a\u0432\u0435\u0441\u0442\u0430\u043c\u0438, \u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0435\u0449\u0435 \u043e \u0442\u0430\u043a\u043e\u043c \u044d\u043a\u0448\u0435\u043d\u0435, \u043a\u0430\u043a labeler, \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043a\u0438 \u0432 PR \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u0438\u0435 \u0444\u0430\u0439\u043b\u044b \u0431\u044b\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043c\u0435\u0442\u0438\u0442\u044c \u043a\u0430\u043a [build] \u043b\u044e\u0431\u043e\u0439 \u043f\u0443\u043b-\u0440\u0435\u043a\u0432\u0435\u0441\u0442 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0435\u0441\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 <code>.github\/workflow<\/code>.<\/p>\n<p>  \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<pre><code class=\"plaintext\">name: &quot;Auto-assign themes to PR&quot;  on:   - pull_request  jobs:   triage:     runs-on: ubuntu-18.04     steps:       - uses: actions\/labeler@v2         with:           repo-token: ${{ secrets.GITHUB_TOKEN }} <\/code><\/pre>\n<p>  \u0415\u0449\u0435 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0444\u0430\u0439\u043b \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0441 \u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0430\u043c\u0438 \u043f\u0443\u043b\u043b-\u0440\u0435\u043a\u0432\u0435\u0441\u0442\u043e\u0432:<\/p>\n<pre><code class=\"plaintext\">theme:build:   - &quot;.github\/**&quot;   - &quot;pom.xml&quot;   - &quot;.travis.yml&quot;   - &quot;.gitignore&quot;   - &quot;Dockerfile&quot;  theme:code:   - &quot;src\/main\/*&quot;  theme:tests:   - &quot;src\/test\/*&quot;  theme:documentation:   - &quot;docs\/**&quot;  theme:TRASH:   - &quot;.idea\/**&quot;   - &quot;target\/**&quot; <\/code><\/pre>\n<p>  \u041f\u043e\u0434\u0440\u0443\u0436\u0438\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0435 \u043c\u0435\u0442\u043a\u0438 \u0432 \u043f\u0443\u043b\u043b-\u0440\u0435\u043a\u0432\u0435\u0441\u0442\u044b \u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0449\u0435\u0435 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u043a, \u0443 \u043c\u0435\u043d\u044f \u043d\u0435 \u0432\u044b\u0448\u043b\u043e, match-label \u043d\u0430 \u043e\u0442\u0440\u0435\u0437 \u043d\u0435 \u0445\u043e\u0447\u0435\u0442 \u0432\u0438\u0434\u0435\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0431\u043e\u0442\u043e\u043c \u043c\u0435\u0442\u043a\u0438. \u041f\u043e\u0445\u043e\u0436\u0435 \u043f\u0440\u043e\u0449\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435, \u0441\u043e\u0432\u043c\u0435\u0449\u0430\u044e\u0449\u0435\u0435 \u043e\u0431\u0430 \u044d\u0442\u0430\u043f\u0430. \u041d\u043e \u0434\u0430\u0436\u0435 \u0432 \u0442\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u043e, \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0442\u043a\u0443 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043f\u0443\u043b\u043b-\u0440\u0435\u043a\u0432\u0435\u0441\u0442\u0430.<\/p>\n<h2>\u041f\u043e\u0440\u0430 \u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c<\/h2>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/mk\/07\/mc\/mk07mc-cd0mtdobukpvuw2udi8c.png\"><\/p>\n<p>  \u042f \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0434\u0435\u043f\u043b\u043e\u044f \u0447\u0435\u0440\u0435\u0437 GitHub Actions (\u0447\u0435\u0440\u0435\u0437 ssh, \u0447\u0435\u0440\u0435\u0437 scp, \u0438 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 docker-hub), \u0438 \u043c\u043e\u0433\u0443 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0432\u044b \u043d\u0430\u0439\u0434\u0435\u0442\u0435 \u0441\u043f\u043e\u0441\u043e\u0431 \u0437\u0430\u043b\u0438\u0442\u044c \u0431\u0438\u043d\u0430\u0440\u043a\u0443 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440, \u043a\u0430\u043a\u0438\u043c \u0431\u044b \u0438\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u043d\u044b\u043c \u043d\u0435 \u0431\u044b\u043b \u0432\u0430\u0448 pipeline.<\/p>\n<p>  \u041c\u043d\u0435 \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u0441\u044f \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432\u0441\u044e \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0435\u043f\u043b\u043e\u0439 \u0432 GitHub Packages (\u044d\u0442\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0434\u043b\u044f \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430, npm, jar, docker).<\/p>\n<p>  C\u043a\u043f\u0440\u0438\u043f\u0442 \u0441\u0431\u043e\u0440\u043a\u0438 docker \u043e\u0431\u0440\u0430\u0437\u0430 \u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0435\u0433\u043e \u0432 GitHub Packages:<\/p>\n<pre><code class=\"plaintext\">name: Deploy docker image  on:   push:     branches:       - 'master'  jobs:    build_docker_image:     runs-on: ubuntu-18.04     steps:  #     Build JAR:       - uses: actions\/checkout@v1       - name: set up JDK 11         uses: actions\/setup-java@v1         with:           java-version: 1.11       - name: Maven Package         run: mvn -B clean compile package -DskipTests  #     Set global environment variables:       - name: set global env         id: global_env         run: |           echo &quot;::set-output name=IMAGE_NAME::${GITHUB_REPOSITORY#*\/}&quot;           echo &quot;::set-output name=DOCKERHUB_IMAGE_NAME::docker.pkg.github.com\/${GITHUB_REPOSITORY}\/${GITHUB_REPOSITORY#*\/}&quot;  #     Build Docker image:       - name: Build and tag image         run: |           docker build -t &quot;${{ steps.global_env.outputs.DOCKERHUB_IMAGE_NAME }}:latest&quot; -t &quot;${{ steps.global_env.outputs.DOCKERHUB_IMAGE_NAME }}:${GITHUB_SHA::8}&quot; .        - name: Docker login         run: docker login docker.pkg.github.com -u $GITHUB_ACTOR -p ${{secrets.GITHUB_TOKEN}}  #     Publish image to github package repository:       - name: Publish image         env:           IMAGE_NAME: $GITHUB_REPOSITORY         run: docker push &quot;docker.pkg.github.com\/$GITHUB_REPOSITORY\/${{ steps.global_env.outputs.IMAGE_NAME }}&quot; <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c JAR-\u0444\u0430\u0439\u043b \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043c\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u043f\u0443\u0442\u044c \u043a GitHub docker registry \u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u043e\u0431\u0440\u0430\u0437\u0430. \u0422\u0443\u0442 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0445\u0438\u0442\u0440\u043e\u0441\u0442\u0435\u0439, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u044b \u0435\u0449\u0435 \u043d\u0435 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0438\u0441\u044c:<\/p>\n<ul>\n<li>\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0432\u0438\u0434\u0430: echo &quot;::set-output name=NAME::VALUE&quot; \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u0434\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0448\u0430\u0433\u0435, \u0442\u0430\u043a \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432\u043e \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0448\u0430\u0433\u0430\u0445.  <\/li>\n<li>\u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e\u0439 \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0448\u0430\u0433\u0435 \u043c\u043e\u0436\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u044d\u0442\u043e\u0433\u043e \u0448\u0430\u0433\u0430: ${{ steps.global_env.outputs.DOCKERHUB_IMAGE_NAME }}  <\/li>\n<li>\u0412 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 GITHUB_REPOSITORY \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0438 \u0435\u0433\u043e \u0432\u043b\u0430\u0434\u0435\u043b\u0435\u0446 (\u00abowner\/repo-name\u00bb). \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0440\u0435\u0437\u0430\u0442\u044c \u0438\u0437 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432\u0441\u0435 \u043a\u0440\u043e\u043c\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f, \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f bash \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u043e\u043c: ${GITHUB_REPOSITORY#*\/}  <\/li>\n<\/ul>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437:<\/p>\n<p>  <code>docker build -t &quot;docker.pkg.github.com\/antkorwin\/github-actions\/github-actions:latest&quot;<\/code><\/p>\n<p>  \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 registry:<\/p>\n<p>  <code>docker login docker.pkg.github.com -u $GITHUB_ACTOR -p ${{secrets.GITHUB_TOKEN}}<\/code><\/p>\n<p>  \u0418 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0437 \u0432 GitHub Packages Repository:<\/p>\n<p>  <code>docker push &quot;docker.pkg.github.com\/antkorwin\/github-actions\/github-actions&quot;<\/code><\/p>\n<p>  \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u044e \u043e\u0431\u0440\u0430\u0437\u0430, \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043f\u0435\u0440\u0432\u044b\u0435 \u0446\u0438\u0444\u0440\u044b \u0438\u0437 SHA-\u0445\u044d\u0448\u0430 \u043a\u043e\u043c\u043c\u0438\u0442\u0430 \u2014 GITHUB_SHA \u0442\u0443\u0442 \u0442\u043e\u0436\u0435 \u0435\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441\u044b, \u0435\u0441\u043b\u0438 \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 merge \u0432 master, \u0430 \u0435\u0449\u0435 \u0438 \u043f\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0443\u043b\u043b-\u0440\u0435\u043a\u0432\u0435\u0441\u0442\u0430, \u0442\u043e SHA \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c \u0441 \u0445\u044d\u0448\u0435\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0433\u0438\u0442\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 actions\/checkout \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u0432\u043e\u0439 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0445\u044d\u0448, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0432\u0437\u0430\u0438\u043c\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0432 PR.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/jh\/pt\/fh\/jhptfhpfkbgnjjlnvtlnn2nhkng.png\"><\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0431\u043b\u0430\u0433\u043e\u043f\u043e\u043b\u0443\u0447\u043d\u043e, \u0442\u043e \u043e\u0442\u043a\u0440\u044b\u0432 \u0440\u0430\u0437\u0434\u0435\u043b packages (https:\/\/github.com\/antkorwin\/github-actions\/packages) \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438, \u0432\u044b \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u043d\u043e\u0432\u044b\u0439 \u0434\u043e\u043a\u0435\u0440 \u043e\u0431\u0440\u0430\u0437:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/te\/gs\/x5\/tegsx5tmshvo28a9t1wb5epq7ho.png\"><\/p>\n<p>  \u0422\u0430\u043c \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0440\u0441\u0438\u0439 \u0434\u043e\u043a\u0435\u0440-\u043e\u0431\u0440\u0430\u0437\u0430.<\/p>\n<p>  \u041e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043d\u0430\u0448 \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u044d\u0442\u0438\u043c registry \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0430. \u041e \u0442\u043e\u043c \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 systemd, \u044f, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0440\u0430\u0437.<\/p>\n<h2>\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433<\/h2>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u043a\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c health check \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 GitHub Actions. \u0412 \u043d\u0430\u0448\u0435\u043c \u0431\u0443\u0442\u043e\u0432\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0435\u0441\u0442\u044c actuator, \u0442\u0430\u043a \u0447\u0442\u043e API \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0434\u0430\u0436\u0435 \u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435 \u043d\u0430\u0434\u043e, \u0434\u043b\u044f \u043b\u0435\u043d\u0438\u0432\u044b\u0445 \u0443\u0436\u0435 \u0432\u0441\u0435 \u0441\u0434\u0435\u043b\u0430\u043b\u0438. \u041d\u0443\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0435\u0440\u043d\u0443\u0442\u044c \u0445\u043e\u0441\u0442: <code>SERVER-URL:PORT\/actuator\/health<\/code><\/p>\n<pre><code class=\"plaintext\">$ curl -v 127.0.0.1:8080\/actuator\/health  &gt; GET \/actuator\/health HTTP\/1.1 &gt; Host: 127.0.0.1:8080 &gt; User-Agent: curl\/7.61.1 &gt; Accept: *\/*  &lt; HTTP\/1.1 200 &lt; Content-Type: application\/vnd.spring-boot.actuator.v3+json &lt; Transfer-Encoding: chunked &lt; Date: Thu, 04 Jun 2020 12:33:37 GMT  {&quot;status&quot;:&quot;UP&quot;} <\/code><\/pre>\n<p>  \u0412\u0441\u0435, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u2014 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u0441\u043a \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u043e \u043a\u0440\u043e\u043d\u0443, \u043d\u0443 \u0430 \u0435\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433 \u043e\u043d \u043d\u0430\u043c \u043d\u0435 \u043e\u0442\u0432\u0435\u0442\u0438\u0442, \u0442\u043e \u0431\u0443\u0434\u0435\u043c \u0441\u043b\u0430\u0442\u044c \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u0432 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c.<\/p>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c\u0441\u044f, \u043a\u0430\u043a \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c workflow \u043f\u043e \u043a\u0440\u043e\u043d\u0443:<\/p>\n<pre><code class=\"plaintext\">on:   schedule:     - cron:  '*\/5 * * * *' <\/code><\/pre>\n<p>  \u0412\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e, \u0434\u0430\u0436\u0435 \u043d\u0435 \u0432\u0435\u0440\u0438\u0442\u0441\u044f \u0447\u0442\u043e \u0432 \u0433\u0438\u0442\u0445\u0430\u0431\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0438\u0432\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0443\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 webhook-\u0438. \u0414\u0435\u0442\u0430\u043b\u0438 \u0435\u0441\u0442\u044c \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438: <a href=\"https:\/\/help.github.com\/en\/actions\/reference\/events-that-trigger-workflows#scheduled-events-schedule\">help.github.com\/en\/actions\/reference\/events-that-trigger-workflows#scheduled-events-schedule<\/a><\/p>\n<p>  \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0440\u0443\u043a\u0430\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 curl:<\/p>\n<pre><code class=\"plaintext\">jobs:   ping:     runs-on: ubuntu-18.04     steps:        - name: curl actuator         id: ping         run: |           echo &quot;::set-output name=status::$(curl ${{secrets.SERVER_HOST}}\/api\/actuator\/health)&quot;        - name: health check         run: |           if [[ ${{ steps.ping.outputs.status }} != *&quot;UP&quot;* ]]; then             echo &quot;health check is failed&quot;             exit 1           fi           echo &quot;It's OK&quot; <\/code><\/pre>\n<p>  \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0442\u043e, \u0447\u0442\u043e \u043e\u0442\u0432\u0435\u0442\u0438\u043b \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441, \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0448\u0430\u0433\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0447\u0442\u043e \u0441\u0442\u0430\u0442\u0443\u0441 UP \u0438, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a, \u0442\u043e \u0432\u044b\u0445\u043e\u0434\u0438\u043c \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439. \u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u0440\u0443\u043a\u0430\u043c\u0438 \u00ab\u0437\u0430\u0432\u0430\u043b\u0438\u0442\u044c\u00bb \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435, \u0442\u043e <b>exit 1<\/b> \u2014 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u043e\u0440\u0443\u0436\u0438\u0435.<\/p>\n<pre><code class=\"plaintext\">  - name: send alert in telegram     if: ${{ failure() }}     uses: appleboy\/telegram-action@master     with:       to: ${{ secrets.TELEGRAM_TO }}       token: ${{ secrets.TELEGRAM_TOKEN }}       message: |         Health check of the:         ${{secrets.SERVER_HOST}}\/api\/actuator\/health         failed with the result:         ${{ steps.ping.outputs.status }} <\/code><\/pre>\n<p>  \u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u0432 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c \u0434\u0435\u043b\u0430\u0435\u043c, \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0437\u0430\u0432\u0430\u043b\u0438\u043b\u043e\u0441\u044c \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0448\u0430\u0433\u0435. \u0414\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c appleboy\/telegram-action, \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u043e\u043a\u0435\u043d \u0431\u043e\u0442\u0430 \u0438 id \u0447\u0430\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438: <a href=\"https:\/\/github.com\/appleboy\/telegram-action\">github.com\/appleboy\/telegram-action<\/a><\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/oh\/2n\/lf\/oh2nlfgbkid6yzrr1wkzasp-vj8.png\"><\/p>\n<p>  \u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u0445 \u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431\u0435: URL \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438 \u0442\u043e\u043a\u0435\u043d\u044b \u0434\u043b\u044f \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c \u0431\u043e\u0442\u0430.<\/p>\n<h2>\u0411\u043e\u043d\u0443\u0441 \u0442\u0440\u0435\u043a \u2014 JIRA \u0434\u043b\u044f \u043b\u0435\u043d\u0438\u0432\u044b\u0445<\/h2>\n<p>  \u042f \u043e\u0431\u0435\u0449\u0430\u043b \u0447\u0442\u043e \u043c\u044b \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a JIRA, \u0438 \u043c\u044b \u0432\u0435\u0440\u043d\u0443\u043b\u0438\u0441\u044c. \u0421\u043e\u0442\u043d\u0438 \u0440\u0430\u0437 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u043b \u043d\u0430 \u0441\u0442\u0435\u043d\u0434\u0430\u043f\u0430\u0445 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0444\u0438\u0447\u0443, \u0441\u043b\u0438\u043b\u0438 \u0432\u0435\u0442\u043a\u0443, \u043d\u043e \u0437\u0430\u0431\u044b\u043b\u0438 \u043f\u0435\u0440\u0435\u0442\u044f\u043d\u0443\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0432 JIRA. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0435\u0441\u043b\u0438 \u0431\u044b \u0432\u0441\u0435 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u043b\u043e\u0441\u044c \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u0442\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u0440\u043e\u0449\u0435, \u043d\u043e \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u044b \u043f\u0438\u0448\u0435\u043c \u043a\u043e\u0434 \u0432 IDE, \u0441\u043b\u0438\u0432\u0430\u0435\u043c \u0432\u0435\u0442\u043a\u0438 \u0432 bitbucket \u0438\u043b\u0438 GitHub, \u0430 \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e\u0442\u043e\u043c \u0442\u0430\u0441\u043a\u0430\u0435\u043c \u0432 Jira, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0434\u043e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u043e\u043a\u043d\u0430, \u0438\u043d\u043e\u0433\u0434\u0430 \u043b\u043e\u0433\u0438\u043d\u0438\u0442\u044c\u0441\u044f \u0435\u0449\u0435 \u0440\u0430\u0437 \u0438 \u0442.\u0434. \u041a\u043e\u0433\u0434\u0430 \u0442\u044b \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u043f\u043e\u043c\u043d\u0438\u0448\u044c, \u0447\u0442\u043e \u043d\u0430\u0434\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435, \u0442\u043e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0431\u043e\u0440\u0434\u0443 \u043b\u0438\u0448\u043d\u0438\u0439 \u0440\u0430\u0437 \u043d\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430. \u0412 \u0438\u0442\u043e\u0433\u0435, \u0443\u0442\u0440\u043e\u043c \u043d\u0430 \u0441\u0442\u0435\u043d\u0434\u0430\u043f\u0435 \u043d\u0430\u0434\u043e \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0430\u043a\u0442\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u043e\u0441\u043a\u0438 \u0437\u0430\u0434\u0430\u0447.<\/p>\n<p>  GitHub \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u043c \u0438 \u0432 \u044d\u0442\u043e\u043c \u0440\u0443\u0442\u0438\u043d\u043d\u043e\u043c \u0437\u0430\u043d\u044f\u0442\u0438\u0438, \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u0442\u044f\u0433\u0438\u0432\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u043e\u043c, \u0432 \u043a\u043e\u043b\u043e\u043d\u043a\u0443 code_review, \u043a\u043e\u0433\u0434\u0430 \u0437\u0430\u043a\u0438\u043d\u0443\u043b\u0438 \u043f\u0443\u043b\u043b-\u0440\u0435\u043a\u0432\u0435\u0441\u0442. \u0412\u0441\u0435, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u2014 \u044d\u0442\u043e \u043f\u0440\u0438\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043e\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u044f \u0432 \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0432\u0435\u0442\u043e\u043a:<\/p>\n<p>  <code>[\u0438\u043c\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430]-[\u043d\u043e\u043c\u0435\u0440 \u0442\u0430\u0441\u043a\u0430]-\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435<\/code> <\/p>\n<p>  \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043a\u043b\u044e\u0447 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u00abGitHub Actions\u00bb \u0431\u0443\u0434\u0435\u0442 GA, \u0442\u043e <code>GA-8-jira-bot<\/code> \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u0435\u0442\u043a\u043e\u0439 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 GA-8.<\/p>\n<p>  \u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 JIRA \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 \u044d\u043a\u0448\u0435\u043d\u044b \u043e\u0442 Atlassian, \u043e\u043d\u0438 \u043d\u0435 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b, \u043d\u0430\u0434\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437 \u043d\u0438\u0445 \u0443 \u043c\u0435\u043d\u044f \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438. \u041d\u043e \u043c\u044b \u043e\u0431\u0441\u0443\u0434\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435, \u0447\u0442\u043e \u0442\u043e\u0447\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f.<\/p>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0439\u0442\u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u0432 JIRA \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f: atlassian\/gajira-login<\/p>\n<pre><code class=\"plaintext\">jobs:   build:     runs-on: ubuntu-latest     name: Jira Workflow     steps:       - name: Login         uses: atlassian\/gajira-login@master         env:           JIRA_BASE_URL: ${{ secrets.JIRA_BASE_URL }}           JIRA_USER_EMAIL: ${{ secrets.JIRA_USER_EMAIL }}           JIRA_API_TOKEN: ${{ secrets.JIRA_API_TOKEN }} <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0434\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u043e\u043a\u0435\u043d \u0432 JIRA, \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u043e \u0442\u0443\u0442: <a href=\"https:\/\/confluence.atlassian.com\/cloud\/api-tokens-938839638.html\">confluence.atlassian.com\/cloud\/api-tokens-938839638.html<\/a><\/p>\n<p>  \u0412\u044b\u0447\u043b\u0435\u043d\u044f\u0435\u043c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0432\u0435\u0442\u043a\u0438:<\/p>\n<pre><code class=\"plaintext\">  - name: Find Issue     id: find_issue     shell: bash     run: |       echo &quot;::set-output name=ISSUE_ID::$(echo ${GITHUB_HEAD_REF} | egrep -o 'GA-[0-9]{1,4}')&quot;       echo brach name: $GITHUB_HEAD_REF       echo extracted issue: ${GITHUB_HEAD_REF} | egrep -o 'GA-[0-9]{1,4}'    - name: Check Issue     shell: bash     run: |       if [[ &quot;${{steps.find_issue.outputs.ISSUE_ID}}&quot; == &quot;&quot; ]]; then         echo &quot;Please name your branch according to the JIRA issue: [project_key]-[task_number]-branch_name&quot;         exit 1       fi       echo succcessfully found JIRA issue: ${{steps.find_issue.outputs.ISSUE_ID}} <\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u043f\u043e\u0438\u0441\u043a\u0430\u0442\u044c \u0432 GitHub marketplace, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438, \u043d\u043e \u043c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0447\u0435\u0440\u0435\u0437 grep \u043f\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044e \u0432\u0435\u0442\u043a\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043e\u0442 Atlassian \u043d\u0438 \u0432 \u043a\u0430\u043a\u0443\u044e \u043d\u0435 \u0437\u0430\u0445\u043e\u0442\u0435\u043b\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430 \u043c\u043e\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0436\u0435 \u0442\u0430\u043c \u043d\u0435 \u0442\u0430\u043a \u2014 \u0434\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0443\u043a\u0430\u043c\u0438 \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435.<\/p>\n<p>  \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0432 \u043a\u043e\u043b\u043e\u043d\u043a\u0443 \u00abCode review\u00bb \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043f\u0443\u043b\u043b-\u0440\u0435\u043a\u0432\u0435\u0441\u0442\u0430:<\/p>\n<pre><code class=\"plaintext\">  - name: Transition issue     if: ${{ success() }}     uses: atlassian\/gajira-transition@master     with:       issue: ${{ steps.find_issue.outputs.ISSUE_ID }}       transition: &quot;Code review&quot; <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043d\u0430 GitHub, \u0432\u0441\u0435, \u0447\u0442\u043e \u0435\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u2014 \u044d\u0442\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0437\u0430\u0434\u0430\u0447\u0438, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0448\u0430\u0433\u0435 \u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432 JIRA, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0434\u0435\u043b\u0430\u043b\u0438 \u0432\u044b\u0448\u0435.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/tm\/cu\/2l\/tmcu2ly_devknm-hwczz6lf4nno.gif\"><\/p>\n<p>  \u0422\u0430\u043a\u0438\u043c \u0436\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0442\u044f\u0433\u0438\u0432\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u0440\u0438 merge \u0432 \u043c\u0430\u0441\u0442\u0435\u0440, \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u0445 \u0438\u0437 GitHub workflow. \u0412 \u043e\u0431\u0449\u0435\u043c, \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0432\u0430\u0448\u0435\u0439 \u0444\u0430\u043d\u0442\u0430\u0437\u0438\u0438 \u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0443\u0442\u0438\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b.<\/p>\n<h2>\u0412\u044b\u0432\u043e\u0434\u044b<\/h2>\n<p>  \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0443 DEVOPS, \u0442\u043e \u043c\u044b \u043f\u043e\u043a\u0440\u044b\u043b\u0438 \u0432\u0441\u0435 \u044d\u0442\u0430\u043f\u044b, \u0440\u0430\u0437\u0432\u0435 \u0447\u0442\u043e \u043a\u0440\u043e\u043c\u0435 operate, \u0434\u0443\u043c\u0430\u044e, \u0435\u0441\u043b\u0438 \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0442\u044c\u0441\u044f, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u044d\u043a\u0448\u0435\u043d \u0432 \u043c\u0430\u0440\u043a\u0435\u0442\u0435 \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 help-desk \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439, \u0442\u0430\u043a \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0442\u043e pipeline \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0432\u043e\u0434\u044b.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/zp\/a-\/6l\/zpa-6ljmrj41slucmv1u-bon71o.jpeg\"><\/p>\n<p>  <b>\u041f\u043b\u044e\u0441\u044b:<\/b><\/p>\n<ul>\n<li> Marketplace \u0441 \u0433\u043e\u0442\u043e\u0432\u044b\u043c\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u043c\u0438 \u043d\u0430 \u0432\u0441\u0435 \u0441\u043b\u0443\u0447\u0430\u0438 \u0436\u0438\u0437\u043d\u0438, \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043a\u0440\u0443\u0442\u043e. \u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0438\u0437 \u043d\u0438\u0445 \u0435\u0449\u0435 \u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c \u043a\u0430\u043a \u0440\u0435\u0448\u0438\u0442\u044c \u043f\u043e\u0445\u043e\u0436\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u043b\u0438\u0431\u043e \u0437\u0430\u043f\u043e\u0441\u0442\u0438\u0442\u044c feature request \u0430\u0432\u0442\u043e\u0440\u0443 \u043f\u0440\u044f\u043c\u043e \u0432 \u0433\u0438\u0442\u0445\u0430\u0431 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438.  <\/li>\n<li>\u0412\u044b\u0431\u043e\u0440 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438: Linux, mac os, windows \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u0444\u0438\u0447\u0430.  <\/li>\n<li>Github Packages \u043e\u0442\u043b\u0438\u0447\u043d\u0430\u044f \u0432\u0435\u0449\u044c, \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432\u0441\u044e \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0443\u0434\u043e\u0431\u043d\u043e, \u043d\u0435 \u043d\u0430\u0434\u043e \u0441\u0435\u0440\u0444\u0438\u0442\u044c \u043f\u043e \u0440\u0430\u0437\u043d\u044b\u043c \u043e\u043a\u043e\u0448\u043a\u0430\u043c, \u0432\u0441\u0435 \u0432 \u0440\u0430\u0434\u0438\u0443\u0441\u0435 \u043e\u0434\u043d\u043e\u0433\u043e-\u0434\u0432\u0443\u0445 \u043a\u043b\u0438\u043a\u043e\u0432 \u043c\u044b\u0448\u0438 \u0438 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0441 GitHub Actions. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 docker registry \u0432 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u2014 \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u0445\u043e\u0440\u043e\u0448\u0435\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e.  <\/li>\n<li>GitHub \u043f\u0440\u044f\u0447\u0435\u0442 \u0441\u0435\u043a\u0440\u0435\u0442\u044b \u0432 \u043b\u043e\u0433\u0430\u0445 \u0441\u0431\u043e\u0440\u043a\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u043c \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u0435\u0439 \u0438 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u043d\u0435 \u0442\u0430\u043a \u0443\u0436 \u0438 \u0441\u0442\u0440\u0430\u0448\u043d\u043e. \u0417\u0430 \u0432\u0441\u0435 \u0432\u0440\u0435\u043c\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043d\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043d\u0438 \u0440\u0430\u0437\u0443 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0441\u0435\u043a\u0440\u0435\u0442 \u0432 \u0447\u0438\u0441\u0442\u043e\u043c \u0432\u0438\u0434\u0435 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438.  <\/li>\n<li>\u0411\u0435\u0441\u043f\u043b\u0430\u0442\u0435\u043d \u0434\u043b\u044f Open Source \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432  <\/li>\n<\/ul>\n<p>  <b>\u041c\u0438\u043d\u0443\u0441\u044b:<\/b><\/p>\n<ul>\n<li> YML, \u043d\u0443 \u043d\u0435 \u043b\u044e\u0431\u043b\u044e \u044f \u0435\u0433\u043e. \u041f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0442\u0430\u043a\u0438\u043c \u0444\u043b\u043e\u0443 \u0443 \u043c\u0435\u043d\u044f \u0441\u0430\u043c\u044b\u0439 \u0447\u0430\u0441\u0442\u044b\u0439 commit message \u044d\u0442\u043e \u00abfix yml format\u00bb, \u0442\u043e \u0437\u0430\u0431\u0443\u0434\u0435\u0448\u044c \u0433\u0434\u0435-\u0442\u043e \u0442\u0430\u0431 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c, \u0442\u043e \u043d\u0435 \u043d\u0430 \u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u043d\u0430\u043f\u0438\u0448\u0435\u0448\u044c. \u0412 \u043e\u0431\u0449\u0435\u043c, \u0441\u0438\u0434\u0435\u0442\u044c \u043f\u0435\u0440\u0435\u0434 \u044d\u043a\u0440\u0430\u043d\u043e\u043c \u0441 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u043c \u0438 \u043b\u0438\u043d\u0435\u0439\u043a\u043e\u0439 \u043d\u0435 \u0441\u0430\u043c\u043e\u0435 \u043f\u0440\u0438\u044f\u0442\u043d\u043e\u0435 \u0437\u0430\u043d\u044f\u0442\u0438\u0435.  <\/li>\n<li> DEBUG, \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c \u0444\u043b\u043e\u0443 \u043a\u043e\u043c\u043c\u0438\u0442\u0430\u043c\u0438, \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c \u043f\u0435\u0440\u0435\u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0432\u044b\u0432\u043e\u0434\u043e\u043c \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0443\u0434\u043e\u0431\u043d\u043e, \u043d\u043e \u044d\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u0437 \u0440\u0430\u0437\u0440\u044f\u0434\u0430 \u00ab\u0432\u044b \u0437\u0430\u0436\u0440\u0430\u043b\u0438\u0441\u044c\u00bb, \u043f\u0440\u0438\u0432\u044b\u043a\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0443\u0434\u043e\u0431\u043d\u044b\u043c\u0438 IDEA, \u043a\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c \u0432\u0441\u0435, \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e.  <\/li>\n<li> \u0421\u0432\u043e\u0439 \u044d\u043a\u0448\u0435\u043d \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 \u0447\u0435\u043c \u0443\u0433\u043e\u0434\u043d\u043e \u0435\u0441\u043b\u0438 \u0437\u0430\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0432 \u0434\u043e\u043a\u0435\u0440, \u043d\u043e \u043d\u0430\u0442\u0438\u0432\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e javascript, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u044d\u0442\u043e \u0434\u0435\u043b\u043e \u0432\u043a\u0443\u0441\u0430, \u043d\u043e \u044f \u0431\u044b \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0435\u043b \u0447\u0442\u043e-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0435 \u0437\u0430\u043c\u0435\u0441\u0442\u043e js.  <\/li>\n<\/ul>\n<p>  \u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u043c\u0438 \u0442\u0443\u0442: <a href=\"https:\/\/github.com\/antkorwin\/github-actions\">github.com\/antkorwin\/github-actions<\/a>  <\/p>\n<blockquote><p>\u041d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043d\u0435\u0434\u0435\u043b\u0435 \u044f \u0431\u0443\u0434\u0443 \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u0441 <a href=\"http:\/\/heisenbug-piter.ru\/2020\/spb\/talks\/7emflctrgqk9ayyxj7cmel\/?utm_source=habr&amp;utm_medium=505994\">\u0434\u043e\u043a\u043b\u0430\u0434\u043e\u043c<\/a> \u043d\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 Heisenbug 2020 Piter. \u0420\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e, \u043a\u0430\u043a \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043e\u043a \u043f\u0440\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u043e \u0438 \u043f\u043e\u0434\u0435\u043b\u044e\u0441\u044c \u0441\u0432\u043e\u0438\u043c\u0438 \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u043c\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0430\u0431\u043e\u0440\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 Java-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445!   <\/p><\/blockquote>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/jugru\/blog\/505994\/\"> https:\/\/habr.com\/ru\/company\/jugru\/blog\/505994\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/jugru\/blog\/505994\/\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/un\/6l\/1_\/un6l1_vcriwkzfwfrmcjm_jjihw.jpeg\"><\/p>\n<p>  \u041c\u043d\u0435 \u0447\u0430\u0441\u0442\u0435\u043d\u044c\u043a\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043d\u0430 Java. \u0418\u043d\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441, \u0438\u043d\u043e\u0433\u0434\u0430 \u043d\u0435\u0442. \u041d\u0435\u0434\u0430\u0432\u043d\u043e \u044f \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0447\u0430\u0441\u0442\u044c \u0441\u0432\u043e\u0438\u0445 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u0432 \u0441 Travis-CI \u0438 TeamCity \u043d\u0430 GitHub Actions, \u0438 \u0432\u043e\u0442 \u0447\u0442\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-305227","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/305227","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=305227"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/305227\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=305227"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=305227"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=305227"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}