рдореИрд▓реЗ рдкреНрд░рд╛рдп: рдЬрд╛рднрд╛рдорд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрдиреБрдкрд░реНрдЫред рдХрд╣рд┐рд▓реЗрдХрд╛рд╣реАрдБ рдпреЛ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рд╣реЛ, рдХрд╣рд┐рд▓реЗрдХрд╛рд╣реАрдВ рдпреЛ рд╣реЛрдЗрдиред рдореИрд▓реЗ рднрд░реНрдЦрд░реИ рдореЗрд░рд╛ рдХреЗрд╣реА рднрдгреНрдбрд╛рд░рд╣рд░реВ Travis-CI рд░ TeamCity рдмрд╛рдЯ GitHub рдХрд╛рд░реНрдпрд╣рд░реВрдорд╛ рд╕рд╛рд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реЗ, рд░ рдпреЛ рдпрд╕рдмрд╛рдЯ рдмрд╛рд╣рд┐рд░ рдЖрдПрдХреЛ рд╣реЛред
рд╣рд╛рдореА рдХреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╣реБрдиреЗрдЫ?
рдкрд╣рд┐рд▓реЗ, рд╣рд╛рдореАрд▓рд╛рдИ рдПрдЙрдЯрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЪрд╛рд╣рд┐рдиреНрдЫ рдЬреБрди рд╣рд╛рдореА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЧрд░реНрдиреЗрдЫреМрдВ, рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреБрдЯ / Java 11 / Maven рдорд╛ рдПрдЙрдЯрд╛ рд╕рд╛рдиреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдмрдирд╛рдЙрдиреБрд╣реЛрд╕реНред рдпрд╕ рд▓реЗрдЦрдХреЛ рдЙрджреНрджреЗрд╢реНрдпрдХрд╛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореА рдПрдкреНрд▓рд┐рдХреЗрд╕рди рддрд░реНрдХрдорд╛ рдХреБрдиреИ рдкрдирд┐ рдЪрд╛рд╕реЛ рд▓рд┐рдиреЗ рдЫреИрдиреМрдВ; рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд░рдкрд░рдХреЛ рдкреВрд░реНрд╡рд╛рдзрд╛рд░ рд╣рд╛рдореНрд░реЛ рд▓рд╛рдЧрд┐ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдЫ, рддреНрдпрд╕реИрд▓реЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг REST API рдирд┐рдпрдиреНрддреНрд░рдХ рд╣рд╛рдореНрд░реЛ рд▓рд╛рдЧрд┐ рдкрд░реНрдпрд╛рдкреНрдд рд╣реБрдиреЗрдЫред
рддрдкрд╛рдИрдВ рдпрд╣рд╛рдБ рд╕реНрд░реЛрддрд╣рд░реВ рд╣реЗрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ:
JIRA рд░ рдпреЛрдЬрдирд╛
рдпреЛ рднрдиреНрди рд▓рд╛рдпрдХ рдЫ рдХрд┐ рд╣рд╛рдореА рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ JIRA рд▓рд╛рдИ рдореБрджреНрджрд╛ рдЯреНрд░реНрдпрд╛рдХрд░рдХреЛ рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВ, рддреНрдпрд╕реИрд▓реЗ рдпреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рд▓рд╛рдЧрд┐ рдЫреБрдЯреНрдЯреИ рдмреЛрд░реНрдб рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реМрдВ рд░ рддреНрдпрд╣рд╛рдБ рдкрд╣рд┐рд▓реЛ рдореБрджреНрджрд╛рд╣рд░реВ рдердкреМрдВ:
рдХреЗрд╣рд┐ рд╕рдордп рдкрдЫрд┐ рд╣рд╛рдореА JIRA рд░ GitHub рд▓реЗ рд╕рдВрдпреЛрдЬрдирдорд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдЧрд░реНрди рд╕рдХреНрдиреЗ рд░реЛрдЪрдХ рдЪреАрдЬрд╣рд░реВрдорд╛ рдлрд░реНрдХрдиреЗрдЫреМрдВред
рд╣рд╛рдореА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд
рд╣рд╛рдореНрд░реЛ рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ maven рдорд╛рд░реНрдлрдд рдмрдирд╛рдЗрдПрдХреЛ рдЫ, рддреНрдпрд╕реИрд▓реЗ рдпрд╕рд▓рд╛рдИ рдирд┐рд░реНрдорд╛рдг рдПрдХрджрдо рд╕рд░рд▓ рдЫ, рд╣рд╛рдореАрд▓рд╛рдИ рдЪрд╛рд╣рд┐рдПрдХреЛ рдорд╛рддреНрд░ mvn рд╕рдлрд╛ рдкреНрдпрд╛рдХреЗрдЬ рд╣реЛред
Github рдХрд╛рд░реНрдпрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдпреЛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореАрд▓реЗ рд╣рд╛рдореНрд░реЛ рдХрд╛рд░реНрдпрдкреНрд░рд╡рд╛рд╣ рд╡рд░реНрдгрди рдЧрд░реНрдиреЗ рднрдгреНрдбрд╛рд░рдорд╛ рдПрдЙрдЯрд╛ рдлрд╛рдЗрд▓ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рдпреЛ рдирд┐рдпрдорд┐рдд yml рдлрд╛рдЗрд▓рд╕рдБрдЧ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ, рдо рднрдиреНрди рд╕рдХреНрджрд┐рди рдХрд┐ рдорд▓рд╛рдИ "yml рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ" рдорди рдкрд░реНрдЫ, рддрд░ рд╣рд╛рдореА рдХреЗ рдЧрд░реНрди рд╕рдХреНрдЫреМрдВ - рд╣рд╛рдореА рдпрд╕рд▓рд╛рдИ .github/ Directory workflow/ file build.yml рдорд╛ рдЧрд░реНрдЫреМрдВ рдЬрд╕рдорд╛ рд╣рд╛рдореА рдорд╛рд╕реНрдЯрд░ рд╢рд╛рдЦрд╛ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрджрд╛ рдХрд╛рд░реНрдпрд╣рд░реВ рд╡рд░реНрдгрди рдЧрд░реНрдиреЗрдЫреМрдВ:
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
on тАФ рдпреЛ рдШрдЯрдирд╛рдХреЛ рд╡рд┐рд╡рд░рдг рд╣реЛ рдЬрд╕рдорд╛ рд╣рд╛рдореНрд░реЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реБрд░реБ рд╣реБрдиреЗрдЫред
рдорд╛: рдкреБрд▓_рдЕрдиреБрд░реЛрдз/рдкреБрд╢ - рдпреЛ рдХрд╛рд░реНрдпрдкреНрд░рд╡рд╛рд╣ рдкреНрд░рддреНрдпреЗрдХ рдкрдЯрдХ рдорд╛рд╕реНрдЯрд░рдорд╛ рдкреБрд╢ рдЧрд░реНрджрд╛ рд░ рдкреБрд▓ рдЕрдиреБрд░реЛрдзрд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджрд╛ рд╕реБрд░реБ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рднрдиреЗрд░ рд╕рдВрдХреЗрдд рдЧрд░реНрджрдЫред
рдирд┐рдореНрди рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рд╡рд┐рд╡рд░рдг рдЫ (рдЬрдм) рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЪрд░рдгрд╣рд░реВ (рдХрджрдордкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдпрдХреЛ рд▓рд╛рдЧрд┐ред
рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рдЫ - рдпрд╣рд╛рдБ рд╣рд╛рдореА рд▓рдХреНрд╖рд┐рдд OS рдЪрдпрди рдЧрд░реНрди рд╕рдХреНрдЫреМрдВ, рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдкрдорд╛, рддрдкрд╛рдИрдВ рдкрдирд┐ Mac OS рдЪрдпрди рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рддрд░ рдирд┐рдЬреА рднрдгреНрдбрд╛рд░рд╣рд░реВрдорд╛ рдпреЛ рдзреЗрд░реИ рдорд╣рдБрдЧреЛ рдЫ (рд▓рд┐рдирдХреНрд╕рдХреЛ рддреБрд▓рдирд╛рдорд╛)ред
рдЙрдкрдпреЛрдЧрд╣рд░реБ рддрдкрд╛рдИрдБрд▓рд╛рдИ рдЕрдиреНрдп рдХрд╛рд░реНрдпрд╣рд░реВ рдкреБрди: рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореАрд▓реЗ Java 11 рдХреЛ рд▓рд╛рдЧрд┐ рд╡рд╛рддрд╛рд╡рд░рдг рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреЗ рдХрд╛рд░реНрдпрд╣рд░реВ/рд╕реЗрдЯрдЕрдк-рдЬрд╛рднрд╛ рдХрд╛рд░реНрдп рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ред
рд╕рд╣рдпреЛрдЧрдХреЛ рд╕рд╛рде рд╕рдВрдЧ рд╣рд╛рдореА рдорд╛рдкрджрдгреНрдбрд╣рд░реВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрди рд╕рдХреНрдЫреМрдВ рдЬрд╕рдХреЛ рд╕рд╛рде рд╣рд╛рдореАрд▓реЗ рдХрд╛рд░реНрдп рд╕реБрд░реБ рдЧрд░реНрдЫреМрдВ, рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдкрдорд╛ рдпреА рддрд░реНрдХрд╣рд░реВ рд╣реБрдиреН рдЬреБрди рдХрд╛рд░реНрдпрдорд╛ рдкрдард╛рдЗрдиреЗрдЫред
рдорд╛рднреЗрдирдорд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрдорд╛рдг рдЪрд▓рд╛рдЙрди рдмрд╛рдБрдХреА рд░рд╣реЗрдХреЛ рдЫ: run: mvn -B clean package
рдЭрдгреНрдбрд╛ -B рднрдиреНрдЫ рдХрд┐ рд╣рд╛рдореАрд▓рд╛рдИ рдПрдХ рдЧреИрд░-рдЕрдиреНрддрд░реНрдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореЛрдб рдЪрд╛рд╣рд┐рдиреНрдЫ рддрд╛рдХрд┐ maven рдЕрдЪрд╛рдирдХ рд╣рд╛рдореАрд▓рд╛рдИ рдХреЗрд╣рд┐ рд╕реЛрдзреНрди рдЪрд╛рд╣рдБрджреИрдиред
рдорд╣рд╛рди! рдЕрдм, рдкреНрд░рддреНрдпреЗрдХ рдкрдЯрдХ рдЬрдм рддрдкрд╛рдЗрдБ рдорд╛рд╕реНрдЯрд░рдорд╛ рдкреНрд░рддрд┐рдмрджреНрдз рд╣реБрдиреБрд╣реБрдиреНрдЫ, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрдорд╛рдг рд╕реБрд░реБ рд╣реБрдиреНрдЫред
рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд░реАрдХреНрд╖рдг рдкреНрд░рдХреНрд╖реЗрдкрдг
рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд░рд╛рдореНрд░реЛ рдЫ, рддрд░ рд╡рд╛рд╕реНрддрд╡рдорд╛, рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдкрдорд╛ рднреЗрд▓рд╛ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ, рддрд░ рдХрд╛рдо рдЫреИрдиред рддреНрдпрд╕рдХрд╛рд░рдг, рдЕрд░реНрдХреЛ рдЪрд░рдг рдкрд░реАрдХреНрд╖рдг рд░рдирд╣рд░реВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЧрд░реНрди рд╣реЛред рдердк рд░реВрдкрдорд╛, рддрдкрд╛рдИрдВрд▓реЗ PR рд╕рдореАрдХреНрд╖рд╛ рдЧрд░реНрджрд╛ рдкрд░реАрдХреНрд╖рдгрд╣рд░реВ рдкрд╛рд╕ рдЧрд░реНрдиреЗ рдирддрд┐рдЬрд╛рд╣рд░реВ рд╣реЗрд░реНрди рдпреЛ рдзреЗрд░реИ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЫ - рддрдкрд╛рдИрдВрд▓рд╛рдИ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдкрдорд╛ рдерд╛рд╣рд╛ рдЫ рдХрд┐ рдкрд░реАрдХреНрд╖рдгрд╣рд░реВ рдЙрддреНрддреАрд░реНрдг рд╣реБрдиреНрдЫрдиреН рд░ рдорд░реНрдЬ рдЧрд░реНрдиреБ рдЕрдШрд┐ рдХрд╕реИрд▓реЗ рдкрдирд┐ рдЖрдлреНрдиреЛ рд╢рд╛рдЦрд╛ рдЪрд▓рд╛рдЙрди рдмрд┐рд░реНрд╕реЗрдХрд╛ рдЫреИрдирдиреНред
рдкреБрд▓ рдЕрдиреБрд░реЛрдз рд░ рдорд╛рд╕реНрдЯрд░рдорд╛ рдорд░реНрдЬ рдЧрд░реНрджрд╛ рд╣рд╛рдореА рдкрд░реАрдХреНрд╖рдгрд╣рд░реВ рдЪрд▓рд╛рдЙрдиреЗрдЫреМрдВ, рд░ рдПрдХреИ рд╕рдордпрдорд╛ рд╣рд╛рдореА рдХреЛрдб-рдХрднрд░реЗрдЬрдорд╛ рд░рд┐рдкреЛрд░реНрдЯрдХреЛ рд╕рд┐рд░реНрдЬрдирд╛ рдердкреНрдиреЗрдЫреМрдВред
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 }}
рдкрд░реАрдХреНрд╖рдгрд╣рд░реВ рдХрднрд░ рдЧрд░реНрди, рдо jacoco рдкреНрд▓рдЧрдЗрдирдХреЛ рд╕рдВрдпреЛрдЬрдирдорд╛ codecov рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреБред codecov рдХреЛ рдЖрдлреНрдиреИ рдХрд╛рд░реНрдп рдЫ, рддрд░ рдпрд╕рд▓рд╛рдИ рд╣рд╛рдореНрд░реЛ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рд╕рдВрдЧ рдХрд╛рдо рдЧрд░реНрди рдЯреЛрдХрди рдЖрд╡рд╢реНрдпрдХ рдЫ:
${{ secrets.CODECOV_TOKEN }}
тАФ рд╣рд╛рдореА рдпреЛ рдирд┐рд░реНрдорд╛рдг рдПрдХ рдкрдЯрдХ рднрдиреНрджрд╛ рдмрдвреА рджреЗрдЦреНрдиреЗрдЫреМрдВ, рд░рд╣рд╕реНрдп GitHub рдорд╛ рдЧреЛрдкреНрдп рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрди рдХреЛ рд▓рд╛рдЧреА рдПрдХ рд╕рдВрдпрдиреНрддреНрд░ рд╣реЛ, рд╣рд╛рдореА рддреНрдпрд╣рд╛рдБ рдкрд╛рд╕рд╡рд░реНрдб/рдЯреЛрдХрди/рд╣реЛрд╕реНрдЯ/urls рд░ рдЕрдиреНрдп рдбрд╛рдЯрд╛ рд▓реЗрдЦреНрди рд╕рдХреНрдЫреМрдВ рдЬреБрди рднрдгреНрдбрд╛рд░ рдХреЛрдб рдЖрдзрд╛рд░рдорд╛ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрдиреБ рд╣реБрдБрджреИрдиред
рддрдкрд╛рдИрдВ GitHub рдорд╛ рднрдгреНрдбрд╛рд░ рд╕реЗрдЯрд┐рдЩрд╣рд░реВрдорд╛ рдЧреЛрдкреНрдп рдХреБрд░рд╛рд╣рд░реВ рдердкреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ:
рдорд╛ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ
POM рдлрд╛рдЗрд▓рдорд╛ jacoco рдкреНрд▓рдЧрдЗрди рдердкреНрдиреБрд╣реЛрд╕реН:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.4</version>
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<!-- attached to Maven test phase -->
<execution>
<id>report</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<reportFormat>plain</reportFormat>
<includes>
<include>**/*Test*.java</include>
<include>**/*IT*.java</include>
</includes>
</configuration>
</plugin>
рдЕрдм рдХреЛрдбрдХреЛрдн рдмреЛрдЯрд▓реЗ рд╣рд╛рдореНрд░рд╛ рдкреНрд░рддреНрдпреЗрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдзрд╣рд░реВ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдЧрд░реНрдиреЗрдЫ рд░ рдХрднрд░реЗрдЬ рдкрд░рд┐рд╡рд░реНрддрди рдЧреНрд░рд╛рдл рдердкреНрдиреЗрдЫ:
рдПрдХ рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдердкреМрдВ
рдореЗрд░рд╛ рдзреЗрд░реИ рдЬрд╕реЛ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВрдорд╛ рдо рд╕реНрдерд┐рд░ рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдХреЛ рд▓рд╛рдЧрд┐ рд╕реЛрдирд╛рд░ рдХреНрд▓рд╛рдЙрдб рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫреБ, рдпреЛ рдЯреНрд░реНрдпрд╛рднрд┐рд╕-рд╕реАрдорд╛ рдЬрдбрд╛рди рдЧрд░реНрди рдПрдХрджрдо рд╕рдЬрд┐рд▓реЛ рдЫред рддреНрдпрд╕реЛрднрдП рдпреЛ рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рдХрджрдо рд╣реЛ рдЬрдм GitHub рдХрд╛рд░реНрдпрд╣рд░реВрдорд╛ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдЧрд░реНрджрд╛ рддреНрдпрд╕реИ рдЧрд░реНрдиред рдПрдХреНрд╢рди рдорд╛рд░реНрдХреЗрдЯ рдПрдХ рд░рд╛рдореНрд░реЛ рдЪреАрдЬ рд╣реЛ, рддрд░ рдпрд╕ рдкрдЯрдХ рдпрд╕рд▓реЗ рдорд▓рд╛рдИ рдЕрд▓рд┐рдХрддрд┐ рдирд┐рд░рд╛рд╢ рдмрдирд╛рдпреЛ, рдХрд┐рдирдХрд┐ рдмрд╛рдиреАрдХреЛ рдХрд╛рд░рдгрд▓реЗ рдореИрд▓реЗ рдорд▓рд╛рдИ рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрдиреЗ рдХрд╛рд░реНрдп рдлреЗрд▓рд╛ рдкрд╛рд░реЗ рд░ рдпрд╕рд▓рд╛рдИ рдХрд╛рд░реНрдпрдкреНрд░рд╡рд╛рд╣рдорд╛ рдердкреЗред рддрд░ рдпреЛ рдмрд╛рд╣рд┐рд░рд┐рдпреЛ рдХрд┐ рд╕реЛрдирд╛рд░рд▓реЗ maven рд╡рд╛ gradle рдорд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВрдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдХреЛ рд▓рд╛рдЧрд┐ рдХрд╛рд░реНрдп рдорд╛рд░реНрдлрдд рдХрд╛рдо рдЧрд░реНрди рд╕рдорд░реНрдерди рдЧрд░реНрджреИрдиред рдЕрд╡рд╢реНрдп рдкрдирд┐, рдпреЛ рдХрд╛рдЧрдЬрд╛рддрдорд╛ рд▓реЗрдЦрд┐рдПрдХреЛ рдЫ, рддрд░ рдХрд╕рд▓реЗ рдпрд╕рд▓рд╛рдИ рдкрдвреНрдЫ?!
рдпреЛ рдХрд╛рд░реНрдп рдорд╛рд░реНрдлрдд рд╕рдореНрднрд╡ рдЫреИрди, рддреНрдпрд╕реИрд▓реЗ рд╣рд╛рдореА рдпрд╕рд▓рд╛рдИ mvn рдкреНрд▓рдЧрдЗрди рдорд╛рд░реНрдлрдд рдЧрд░реНрдиреЗрдЫреМрдВ:
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
SONAR_TOKEN - рдорд╛ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ
Dsonar.projectKey - рд╕реЛрдирд╛рд░рдорд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рдирд╛рдо, рддрдкрд╛рдЗрдБ рдпрд╕рд▓рд╛рдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗрдЯрд┐рдЩрд╣рд░реВрдорд╛ рджреЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред
Dsonar.organization - GitHub рдмрд╛рдЯ рд╕рдВрдЧрдардирдХреЛ рдирд╛рдоред
рд╣рд╛рдореА рдПрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдЧрд░реНрдЫреМрдВ рд░ рд╕реЛрдирд╛рд░рдХреНрд▓рд╛рдЙрдб [рдмреЛрдЯ] рдЯрд┐рдкреНрдкрдгреАрд╣рд░реВрдорд╛ рдЖрдЙрдирдХреЛ рд▓рд╛рдЧрд┐ рдкрд░реНрдЦрдиреНрдЫреМрдВ:
рд░рд┐рд▓реАрдЬ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди
рдирд┐рд░реНрдорд╛рдг рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░рд┐рдПрдХреЛ рдЫ, рдкрд░реАрдХреНрд╖рдгрд╣рд░реВ рдЪрд▓рд╛рдЗрдПрдХреЛ рдЫ, рд░ рд╣рд╛рдореА рд░рд┐рд▓реАрдЬ рдЧрд░реНрди рд╕рдХреНрдЫреМрдВред GitHub рдХрд╛рд░реНрдпрд╣рд░реВрд▓реЗ рдХрд╕рд░реА рд░рд┐рд▓реАрдЬ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рдзреЗрд░реИ рд╕рдЬрд┐рд▓реЛ рдмрдирд╛рдЙрди рд╕рдХреНрдЫ рд╣реЗрд░реМрдВред
рдХрд╛рдордорд╛, рдорд╕рдБрдЧ рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВ рдЫрдиреН рдЬрд╕рдХреЛ рдХреЛрдб рдЖрдзрд╛рд░ рдмрд┐рдЯрдмрдХреЗрдЯрдорд╛ рдЫ (рд╕рдмреИ рдХреБрд░рд╛ рддреНрдпреЛ рдХрдерд╛рдорд╛ рдЬрд╕реНрддреИ рдЫ "рдо рджрд┐рдирдХреЛ рд╕рдордпрдорд╛ рдмрд┐рдЯрдмрдХреЗрдЯрдорд╛ рд▓реЗрдЦреНрдЫреБ, рд░рд╛рддреА рдЧрд┐рдЯрд╣рдмрдорд╛ рдкреНрд░рддрд┐рдмрджреНрдз рдЫреБ")ред рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢, рдмрд┐рдЯрдмрдХреЗрдЯрдорд╛ рдирд┐рд░реНрдорд┐рдд рд░рд┐рд▓реАрдЬ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рдЙрдкрдХрд░рдгрд╣рд░реВ рдЫреИрдирдиреНред рдпреЛ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реЛ, рдХрд┐рдирдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд░рд┐рд▓реАрдЬрдХреЛ рд▓рд╛рдЧрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдореНрдпрд╛рдиреБрдЕрд▓ рд░реВрдкрдорд╛ рд╕рдВрдЧрдордорд╛ рдкреГрд╖реНрда рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБ рдкрд░реНрдЫ рд░ рддреНрдпрд╣рд╛рдБ рд░рд┐рд▓реАрдЬрдорд╛ рд╕рдорд╛рд╡реЗрд╢ рд╕рдмреИ рд╕реБрд╡рд┐рдзрд╛рд╣рд░реВ рдлреНрдпрд╛рдБрдХреНрдиреБ рдкрд░реНрдЫ, рджрд┐рдорд╛рдЧрдХрд╛ рджрд░рдмрд╛рд░рд╣рд░реВ рдЦреЛрдЬреНрдиреБрд╣реЛрд╕реН, рдЬрд┐рд░рд╛рдорд╛ рдХрд╛рд░реНрдпрд╣рд░реВ, рднрдгреНрдбрд╛рд░рдорд╛ рдХрдорд┐рдЯрд╣рд░реВред рддреНрдпрд╣рд╛рдБ рдЧрд▓реНрддреА рдЧрд░реНрдиреЗ рдзреЗрд░реИ рд╕рдореНрднрд╛рд╡рдирд╛рд╣рд░реВ рдЫрдиреН, рддрдкрд╛рдЗрдБ рдХреЗрд╣рд┐ рдмрд┐рд░реНрд╕рди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рд╡рд╛ рдХреЗрд╣рд┐ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдЬреБрди рдкрд╣рд┐рд▓реЗ рдиреИ рдкрдЫрд┐рд▓реНрд▓реЛ рдкрдЯрдХ рдЬрд╛рд░реА рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛ, рдХрд╣рд┐рд▓реЗрдХрд╛рд╣реАрдБ рдпреЛ рдХреЗрд╡рд▓ рд╕реНрдкрд╖реНрдЯ рдЫреИрди рдХрд┐ рдкреБрд▓ рдЕрдиреБрд░реЛрдзрд▓рд╛рдИ рдХреЗ рд░реВрдкрдорд╛ рд╡рд░реНрдЧреАрдХреГрдд рдЧрд░реНрдиреЗ - рдпреЛ рд╕реБрд╡рд┐рдзрд╛ рд╡рд╛ рдмрдЧ рд╕рдорд╛рдзрд╛рди, рд╡рд╛ рд╕рдореНрдкрд╛рджрди рдкрд░реАрдХреНрд╖рдгрд╣рд░реВ, рд╡рд╛ рдХреЗрд╣реА рдкреВрд░реНрд╡рд╛рдзрд╛рд░ред
GitHub рдХрд╛рд░реНрдпрд╣рд░реВрд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ рдХрд╕рд░реА рдорджреНрджрдд рдЧрд░реНрди рд╕рдХреНрдЫ? рддреНрдпрд╣рд╛рдБ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдХрд╛рд░реНрдп рдЫ - рд░рд┐рд▓рд┐рдЬ рдбреНрд░рд╛рдлреНрдЯрд░, рдпрд╕рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдкреБрд▓ рдЕрдиреБрд░реЛрдзрд╣рд░реВрдХреЛ рдХреЛрдЯреАрд╣рд░реВ рд╕реЗрдЯ рдЕрдк рдЧрд░реНрди рд░ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рд░рд┐рд▓реАрдЬ рдиреЛрдЯ рдлрд╛рдЗрд▓рдорд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рд╕рдореВрд╣рдмрджреНрдз рдЧрд░реНрди рд░рд┐рд▓реАрдЬ рдиреЛрдЯ рдлрд╛рдЗрд▓ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╕реЗрдЯ рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫ:
рд░рд┐рдкреЛрд░реНрдЯ рд╕реЗрдЯрдЕрдк рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдЙрджрд╛рд╣рд░рдг рдЯреЗрдореНрдкреНрд▓реЗрдЯ (.github/release-drafter.yml):
name-template: 'v$NEXT_PATCH_VERSION'
tag-template: 'v$NEXT_PATCH_VERSION'
categories:
- title: ' New Features'
labels:
- 'type:features'
# ╨▓ ╤Н╤В╤Г ╨║╨░╤В╨╡╨│╨╛╤А╨╕╤О ╤Б╨╛╨▒╨╕╤А╨░╨╡╨╝ ╨▓╤Б╨╡ PR ╤Б ╨╝╨╡╤В╨║╨╛╨╣ type:features
- title: ' Bugs Fixes'
labels:
- 'type:fix'
# ╨░╨╜╨░╨╗╨╛╨│╨╕╤З╨╜╨╛ ╨┤╨╗╤П ╨╝╨╡╤В╨║╨╕ type:fix ╨╕ ╤В.╨┤.
- title: ' Documentation'
labels:
- 'type:documentation'
- title: ' Configuration'
labels:
- 'type:config'
change-template: '- $TITLE @$AUTHOR (#$NUMBER)'
template: |
## Changes
$CHANGES
рдорд╕реНрдпреМрджрд╛ рд░рд┐рд▓реАрдЬ (.github/workflows/release-draft.yml) рдЙрддреНрдкрдиреНрди рдЧрд░реНрди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдердкреНрдиреБрд╣реЛрд╕реН:
name: "Create draft release"
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 }}
рдЕрдм рджреЗрдЦрд┐ рд╕рдмреИ рдкреБрд▓ рдЕрдиреБрд░реЛрдзрд╣рд░реВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рд░рд┐рд▓реАрдЬ рдиреЛрдЯрд╣рд░реВрдорд╛ рд╕рдЩреНрдХрд▓рди рдЧрд░рд┐рдиреЗрдЫ - рдЬрд╛рджреВ!
рдпрд╣рд╛рдБ рдкреНрд░рд╢реНрди рдЙрдареНрди рд╕рдХреНрдЫ: рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд╣рд░реВрд▓реЗ PR рдорд╛ рдЯреНрдпрд╛рдЧрд╣рд░реВ рд░рд╛рдЦреНрди рдмрд┐рд░реНрд╕реЗ рднрдиреЗ рдХреЗ рд╣реБрдиреНрдЫ? рддреНрдпрд╕реЛрднрдП рдХреБрди рд╢реНрд░реЗрдгреАрдорд╛ рд░рд╛рдЦреНрдиреЗ рднрдиреНрдиреЗ рд╕реНрдкрд╖реНрдЯ рдЫреИрди, рд░ рдлреЗрд░рд┐ рддрдкрд╛рдИрд▓реЗ рдпрд╕рд▓рд╛рдИ рдореНрдпрд╛рдиреБрдЕрд▓ рд░реВрдкрдорд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЧрд░реНрдиреБрдкрд░реНрдиреЗрдЫ, рдкреНрд░рддреНрдпреЗрдХ рдкреАрдЖрд░рдХреЛ рд╕рд╛рде рдЫреБрдЯреНрдЯреИред рдпреЛ рд╕рдорд╕реНрдпрд╛ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди, рд╣рд╛рдореА рдЕрд░реНрдХреЛ рдХрд╛рд░реНрдп рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдЫреМрдВ - рд▓реЗрдмрд▓ рдкреНрд░рдорд╛рдгрд┐рдХрд░рдг - рдпрд╕рд▓реЗ рдкреБрд▓ рдЕрдиреБрд░реЛрдзрдорд╛ рдЯреНрдпрд╛рдЧрд╣рд░реВрдХреЛ рдЙрдкрд╕реНрдерд┐рддрд┐рдХреЛ рд▓рд╛рдЧрд┐ рдЬрд╛рдБрдЪ рдЧрд░реНрджрдЫред рдпрджрд┐ рддреНрдпрд╣рд╛рдБ рдХреБрдиреИ рдЖрд╡рд╢реНрдпрдХ рдЯреНрдпрд╛рдЧрд╣рд░реВ рдЫреИрдирдиреН рднрдиреЗ, рддреНрдпрд╕рдкрдЫрд┐ рдЬрд╛рдБрдЪ рдЕрд╕рдлрд▓ рд╣реБрдиреЗрдЫ рд░ рд╣рд╛рдореА рд╣рд╛рдореНрд░реЛ рдкреБрд▓ рдЕрдиреБрд░реЛрдзрдорд╛ рдпрд╕ рдмрд╛рд░реЗ рд╕рдиреНрджреЗрд╢ рджреЗрдЦреНрдиреЗрдЫреМрдВред
name: "Verify type labels"
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'
рдЕрдм рдХреБрдиреИ рдкрдирд┐ рдкреБрд▓-рдЕрдиреБрд░реЛрдзрд▓рд╛рдИ рдЯреНрдпрд╛рдЧрд╣рд░реВ рдордзреНрдпреЗ рдПрдХрдХреЛ рд╕рд╛рде рдЪрд┐рдиреНрд╣ рд▓рдЧрд╛рдЗрдиреБрдкрд░реНрдЫ: type:fix, type:features, type:documentation, type:tests, type:configред
рдкреБрд▓ рдЕрдиреБрд░реЛрдзрд╣рд░реВрдХреЛ рд╕реНрд╡рдд: рдПрдиреЛрдЯреЗрд╕рди
рд╣рд╛рдореАрд▓реЗ рдкреБрд▓ рдЕрдиреБрд░реЛрдзрд╣рд░реВрдХреЛ рд╕рд╛рде рдкреНрд░рднрд╛рд╡рдХрд╛рд░реА рдХрд╛рдордХреЛ рд░реВрдкрдорд╛ рдпрд╕реНрддреЛ рд╡рд┐рд╖рдпрд▓рд╛рдИ рдЫреЛрдПрдХрд╛рд▓реЗ, рдпреЛ рд▓реЗрдмрд▓рд░рдХреЛ рд░реВрдкрдорд╛ рдпрд╕реНрддреЛ рдХрд╛рд░реНрдпрдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреБрд░рд╛ рдЧрд░реНрди рд▓рд╛рдпрдХ рдЫ, рдпрд╕рд▓реЗ PR рдорд╛ рдЯреНрдпрд╛рдЧрд╣рд░реВ рд░рд╛рдЦреНрдЫ рдЬрд╕рдХреЛ рдЖрдзрд╛рд░рдорд╛ рдлрд╛рдЗрд▓рд╣рд░реВ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░рд┐рдПрдХрд╛ рдЫрдиреНред рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореА рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реАрдорд╛ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрдиреЗ рдХреБрдиреИ рдкрдирд┐ рдкреБрд▓ рдЕрдиреБрд░реЛрдзрд▓рд╛рдИ [build] рдХреЛ рд░реВрдкрдорд╛ рдЪрд┐рдиреНрд╣ рд▓рдЧрд╛рдЙрди рд╕рдХреНрдЫреМрдВ .github/workflow
.
рдпреЛ рдЬрдбрд╛рди рдПрдХрджрдо рд╕рд░рд▓ рдЫ:
name: "Auto-assign themes to PR"
on:
- pull_request
jobs:
triage:
runs-on: ubuntu-18.04
steps:
- uses: actions/labeler@v2
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
рд╣рд╛рдореАрд▓рд╛рдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рд╣рд░реВ рд░ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рд╡рд┐рд╖рдпрд╣рд░реВ рдмреАрдЪрдХреЛ рдкрддреНрд░рд╛рдЪрд╛рд░ рд╡рд░реНрдгрди рдЧрд░реНрдиреЗ рдлрд╛рдЗрд▓ рдкрдирд┐ рдЪрд╛рд╣рд┐рдиреНрдЫ:
theme:build:
- ".github/**"
- "pom.xml"
- ".travis.yml"
- ".gitignore"
- "Dockerfile"
theme:code:
- "src/main/*"
theme:tests:
- "src/test/*"
theme:documentation:
- "docs/**"
theme:TRASH:
- ".idea/**"
- "target/**"
рдЖрд╡рд╢реНрдпрдХ рд▓реЗрдмрд▓рд╣рд░реВрдХреЛ рдЙрдкрд╕реНрдерд┐рддрд┐рдХреЛ рд▓рд╛рдЧрд┐ рдЬрд╛рдБрдЪ рдЧрд░реНрдиреЗ рдХрд╛рд░реНрдпрд╕рдБрдЧ рдкреБрд▓ рдЕрдиреБрд░реЛрдзрд╣рд░реВрдорд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рд▓реЗрдмрд▓рд╣рд░реВ рд░рд╛рдЦреНрдиреЗ рдХрд╛рд░реНрдпрд▓рд╛рдИ рдЬреЛрдбрд╛ рдмрдирд╛рдЙрди рдо рд╕рдлрд▓ рднрдПрди; рдорд┐рд▓рд╛рди-рд▓реЗрдмрд▓рд▓реЗ рдмреЛрдЯрджреНрд╡рд╛рд░рд╛ рдердкрд┐рдПрдХрд╛ рд▓реЗрдмрд▓рд╣рд░реВ рд╣реЗрд░реНрди рдЪрд╛рд╣рдБрджреИрдиред рджреБрдмреИ рдЪрд░рдгрд╣рд░реВ рд╕рдВрдпреЛрдЬрди рдЧрд░реНрдиреЗ рддрдкрд╛рдИрдВрдХреЛ рдЖрдлреНрдиреИ рдХрд╛рд░реНрдп рд▓реЗрдЦреНрди рд╕рдЬрд┐рд▓реЛ рджреЗрдЦрд┐рдиреНрдЫред рддрд░ рдпрд╕ рдлрд╛рд░рдордорд╛ рдкрдирд┐ рдпреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдзреЗрд░реИ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЫ; рддрдкрд╛рдИрдВрд▓реЗ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджрд╛ рд╕реВрдЪреАрдмрд╛рдЯ рд▓реЗрдмрд▓ рдЪрдпрди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред
рдпреЛ рддреИрдирд╛рде рдЧрд░реНрдиреЗ рд╕рдордп рд╣реЛ
рдореИрд▓реЗ GitHub рдХрд╛рд░реНрдпрд╣рд░реВ (ssh рдорд╛рд░реНрдлрдд, scp рдорд╛рд░реНрдлрдд, рд░ docker-hub рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░) рдорд╛рд░реНрдлрдд рдзреЗрд░реИ рдбрд┐рдкреНрд▓реЛрдпрдореЗрдиреНрдЯ рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рдкреНрд░рдпрд╛рд╕ рдЧрд░реЗрдВ, рд░ рдо рднрдиреНрди рд╕рдХреНрдЫреБ рдХрд┐, рд╕рдореНрднрд╡рддрдГ, рддрдкрд╛рдИрд▓реЗ рд╕рд░реНрднрд░рдорд╛ рдмрд╛рдЗрдирд░реА рдЕрдкрд▓реЛрдб рдЧрд░реНрдиреЗ рддрд░рд┐рдХрд╛ рдкрд╛рдЙрдиреБрд╣реБрдиреЗрдЫ, рддрдкрд╛рдИрдХреЛ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдЬрддрд┐рд╕реБрдХреИ рдмрд╛рдЩреНрдЧреЛ рднрдП рдкрдирд┐ред рдЫред
рдорд▓рд╛рдИ рд╕рдореНрдкреВрд░реНрдг рдкреВрд░реНрд╡рд╛рдзрд╛рд░ рдПрдХреИ рдард╛рдЙрдБрдорд╛ рд░рд╛рдЦреНрдиреЗ рд╡рд┐рдХрд▓реНрдк рдорди рдкрд░реНрдпреЛ, рддреНрдпрд╕реИрд▓реЗ GitHub рдкреНрдпрд╛рдХреЗрдЬрд╣рд░реВрдорд╛ рдХрд╕рд░реА рдбрд┐рдкреНрд▓реЛрдп рдЧрд░реНрдиреЗ рднрдиреЗрд░ рд╣реЗрд░реМрдВ (рдпреЛ рдмрд╛рдЗрдирд░реА рд╕рд╛рдордЧреНрд░реА, рдПрдирдкреАрдПрдо, рдЬрд╛рд░, рдбрдХрд░рдХреЛ рд▓рд╛рдЧрд┐ рднрдгреНрдбрд╛рд░ рд╣реЛ)ред
рдбрдХрд░ рдЫрд╡рд┐ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рд░ GitHub рдкреНрдпрд╛рдХреЗрдЬрд╣рд░реВрдорд╛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдЧрд░реНрдиреЗ рд▓рд┐рдкрд┐:
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 "::set-output name=IMAGE_NAME::${GITHUB_REPOSITORY#*/}"
echo "::set-output name=DOCKERHUB_IMAGE_NAME::docker.pkg.github.com/${GITHUB_REPOSITORY}/${GITHUB_REPOSITORY#*/}"
# Build Docker image:
- name: Build and tag image
run: |
docker build -t "${{ steps.global_env.outputs.DOCKERHUB_IMAGE_NAME }}:latest" -t "${{ steps.global_env.outputs.DOCKERHUB_IMAGE_NAME }}:${GITHUB_SHA::8}" .
- 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 "docker.pkg.github.com/$GITHUB_REPOSITORY/${{ steps.global_env.outputs.IMAGE_NAME }}"
рдкрд╣рд┐рд▓реЗ, рд╣рд╛рдореАрд▓реЗ рд╣рд╛рдореНрд░реЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрдХреЛ JAR рдлрд╛рдЗрд▓ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рддреНрдпрд╕рдкрдЫрд┐ рд╣рд╛рдореА GitHub рдбрдХрд░ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рд░ рд╣рд╛рдореНрд░реЛ рдЫрд╡рд┐рдХреЛ рдирд╛рдордХреЛ рдорд╛рд░реНрдЧ рдЧрдгрдирд╛ рдЧрд░реНрдЫреМрдВред рдпрд╣рд╛рдБ рдХреЗрд╣рд┐ рдЪрд╛рд▓рд╣рд░реВ рдЫрдиреН рдЬреБрди рд╣рд╛рдореАрд▓реЗ рдЕрд╣рд┐рд▓реЗрд╕рдореНрдо рднреЗрдЯреНрдЯрд╛рдПрдХрд╛ рдЫреИрдиреМрдВ:
- рдПрдЙрдЯрд╛ рдирд┐рд░реНрдорд╛рдг рдЬрд╕реНрддреИ: echo "::set-output name=NAME::VALUE" рд▓реЗ рддрдкрд╛рдЗрдБрд▓рд╛рдИ рд╣рд╛рд▓рдХреЛ рдЪрд░рдгрдорд╛ рдЪрд▓рдХреЛ рдорд╛рди рд╕реЗрдЯ рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫ, рддрд╛рдХрд┐ рдпрд╕рд▓рд╛рдИ рддреНрдпрд╕рдкрдЫрд┐ рдЕрдиреНрдп рд╕рдмреИ рдЪрд░рдгрд╣рд░реВрдорд╛ рдкрдвреНрди рд╕рдХрд┐рдиреНрдЫред
- рддрдкрд╛рдИрдВрд▓реЗ рдпрд╕ рдЪрд░рдгрдХреЛ рдкрд╣рд┐рдЪрд╛рдирдХрд░реНрддрд╛ рдорд╛рд░реНрдлрдд рдЕрдШрд┐рд▓реНрд▓реЛ рдЪрд░рдгрдорд╛ рд╕реЗрдЯ рдЧрд░рд┐рдПрдХреЛ рдЪрд░рдХреЛ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ: ${{ steps.global_env.outputs.DOCKERHUB_IMAGE_NAME }}
- рдорд╛рдирдХ GITHUB_REPOSITORY рдЪрд░рд▓реЗ рднрдгреНрдбрд╛рд░рдХреЛ рдирд╛рдо рд░ рдпрд╕рдХреЛ рдорд╛рд▓рд┐рдХ ("рдорд╛рд▓рд┐рдХ/рд░реЗрдкреЛ-рдирд╛рдо") рднрдгреНрдбрд╛рд░ рдЧрд░реНрджрдЫред рднрдгреНрдбрд╛рд░рдХреЛ рдирд╛рдо рдмрд╛рд╣реЗрдХ рдпрд╕ рд░реЗрдЦрд╛рдмрд╛рдЯ рд╕рдмреИ рдХреБрд░рд╛ рдХрд╛рдЯреНрдирдХреЛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореА рдмреНрдпрд╛рд╕ рд╕рд┐рдиреНрдЯреНрдпрд╛рдХреНрд╕ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВ: ${GITHUB_REPOSITORY#*/}
рдЕрд░реНрдХреЛ рд╣рд╛рдореАрд▓реЗ рдбрдХрд░ рдЫрд╡рд┐ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ:
docker build -t "docker.pkg.github.com/antkorwin/github-actions/github-actions:latest"
рд░рдЬрд┐рд╕реНрдЯреНрд░реАрдорд╛ рд▓рдЧ рдЗрди рдЧрд░реНрдиреБрд╣реЛрд╕реН:
docker login docker.pkg.github.com -u $GITHUB_ACTOR -p ${{secrets.GITHUB_TOKEN}}
рд░ рдЫрд╡рд┐рд▓рд╛рдИ GitHub рдкреНрдпрд╛рдХреЗрдЬ рд░рд┐рдкреЛрдЬрд┐рдЯрд░реАрдорд╛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдЧрд░реНрдиреБрд╣реЛрд╕реН:
docker push "docker.pkg.github.com/antkorwin/github-actions/github-actions"
рдЫрд╡рд┐рдХреЛ рд╕рдВрд╕реНрдХрд░рдгрд▓рд╛рдИ рд╕рдВрдХреЗрдд рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореА рдХрдорд┐рдЯрдХреЛ SHA рд╣реНрдпрд╛рд╕рдмрд╛рдЯ рдкрд╣рд┐рд▓реЛ рдЕрдВрдХрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВ - GITHUB_SHA рддреНрдпрд╣рд╛рдБ рдкрдирд┐ рдпрд╣рд╛рдБ рд╕реВрдХреНрд╖реНрдорддрд╛рд╣рд░реВ рдЫрдиреН, рдпрджрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдорд╛рд╕реНрдЯрд░рдорд╛ рдорд░реНрдЬ рдЧрд░реНрджрд╛ рдорд╛рддреНрд░ рд╣реЛрдЗрди, рддрд░ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рд╕рд┐рд░реНрдЬрдирд╛ рдЕрдиреБрд╕рд╛рд░ рдкрдирд┐ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ рднрдиреЗред рдШрдЯрдирд╛, рддрдм SHA рд▓реЗ рд╣рд╛рдореАрд▓реЗ git рдЗрддрд┐рд╣рд╛рд╕рдорд╛ рджреЗрдЦреЗрдХреЛ рд╣реНрдпрд╛рд╕рд╕рдБрдЧ рдореЗрд▓ рдЦрд╛рдБрджреИрди, рдХрд┐рдирднрдиреЗ рдХрд╛рд░реНрдп/рдЪреЗрдХрдЖрдЙрдЯ рдХрд╛рд░реНрдпрд▓реЗ PR рдорд╛ рдбреЗрдбрд▓рдХ рдЧрд░реНрдиреЗ рдХрд╛рд░реНрдпрд╣рд░реВрдмрд╛рдЯ рдмрдЪреНрдирдХреЛ рд▓рд╛рдЧрд┐ рдЖрдлреНрдиреИ рдЕрджреНрд╡рд┐рддреАрдп рд╣реНрдпрд╛рд╕ рдмрдирд╛рдЙрдБрдЫред
рдпрджрд┐ рд╕рдмреИ рдХреБрд░рд╛ рд░рд╛рдореНрд░реЛрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдпреЛ рднрдиреЗ, рддреНрдпрд╕рдкрдЫрд┐ рдкреНрдпрд╛рдХреЗрдЬ рдЦрдгреНрдб рдЦреЛрд▓реНрджрд╛ (https://github.com/antkorwin/github-actions/packages) рднрдгреНрдбрд╛рд░рдорд╛, рддрдкрд╛рдИрдВрд▓реЗ рдирдпрд╛рдБ рдбрдХрд░ рдЫрд╡рд┐ рджреЗрдЦреНрдиреБрд╣реБрдиреЗрдЫ:
рддреНрдпрд╣рд╛рдБ рддрдкрд╛рдЗрдБ рдбрдХрд░ рдЫрд╡рд┐рдХреЛ рд╕рдВрд╕реНрдХрд░рдгрд╣рд░реВрдХреЛ рд╕реВрдЪреА рдкрдирд┐ рд╣реЗрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред
рдпреЛ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рд╕рдВрдЧ рдХрд╛рдо рдЧрд░реНрди рд░ рд╕реЗрд╡рд╛ рдкреБрди: рд╕реБрд░реБ рдЧрд░реНрди рд╣рд╛рдореНрд░реЛ рд╕рд░реНрднрд░ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрди рдмрд╛рдБрдХреА рдЫред рдо рд╕рд╛рдпрдж рдЕрд░реНрдХреЛ рдкрдЯрдХ systemd рдорд╛рд░реНрдлрдд рдпреЛ рдХрд╕рд░реА рдЧрд░реНрдиреЗ рдмрд╛рд░реЗ рдХреБрд░рд╛ рдЧрд░реНрдиреЗрдЫреБред
рдирд┐рдЧрд░рд╛рдиреА рдЧрд░реНрджреИ
GitHub рдХрд╛рд░реНрдпрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╣рд╛рдореНрд░реЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрдХреЛ рд▓рд╛рдЧрд┐ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдЬрд╛рдБрдЪ рдХрд╕рд░реА рдЧрд░реНрдиреЗ рднрдиреНрдиреЗ рдмрд╛рд░реЗ рдПрдЙрдЯрд╛ рд╕рд░рд▓ рд╡рд┐рдХрд▓реНрдк рд╣реЗрд░реМрдВред рд╣рд╛рдореНрд░реЛ рдмреБрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╕рдирдорд╛ рдПрдХреНрдЪреБрдПрдЯрд░ рдЫ, рддреНрдпрд╕реИрд▓реЗ рд╣рд╛рдореАрд▓реЗ рдпрд╕рдХреЛ рд╕реНрдерд┐рддрд┐ рдЬрд╛рдБрдЪ рдЧрд░реНрди API рд▓реЗрдЦреНрди рдкрдирд┐ рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрджреИрди; рд╣рд╛рдореАрд▓реЗ рдЕрд▓реНрдЫреАрдХрд╛ рд▓рд╛рдЧрд┐ рд╕рдмреИ рдХреБрд░рд╛ рдЧрд░рд┐рд╕рдХреЗрдХрд╛ рдЫреМрдВред рддрдкрд╛рдИрдВрд▓реЗ рдорд╛рддреНрд░ рд╣реЛрд╕реНрдЯ рддрд╛рдиреНрди рдЖрд╡рд╢реНрдпрдХ рдЫ: SERVER-URL:PORT/actuator/health
$ curl -v 127.0.0.1:8080/actuator/health
> GET /actuator/health HTTP/1.1
> Host: 127.0.0.1:8080
> User-Agent: curl/7.61.1
> Accept: */*
< HTTP/1.1 200
< Content-Type: application/vnd.spring-boot.actuator.v3+json
< Transfer-Encoding: chunked
< Date: Thu, 04 Jun 2020 12:33:37 GMT
{"status":"UP"}
рд╣рд╛рдореАрд▓рд╛рдИ рдХреНрд░реЛрди рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╕рд░реНрднрд░ рдЬрд╛рдБрдЪ рдЧрд░реНрди рдПрдЙрдЯрд╛ рдХрд╛рд░реНрдп рд▓реЗрдЦреНрдиреБ рдЖрд╡рд╢реНрдпрдХ рдЫ, рд░ рдпрджрд┐ рдЕрдЪрд╛рдирдХ рдпрд╕рд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ рдЬрд╡рд╛рдл рджрд┐рдБрджреИрди рднрдиреЗ, рд╣рд╛рдореА рдЯреЗрд▓рд┐рдЧреНрд░рд╛рдо рдорд╛рд░реНрдлрдд рд╕реВрдЪрдирд╛ рдкрдард╛рдЙрдиреЗрдЫреМрдВред
рдкрд╣рд┐рд▓реЗ, рдХреНрд░реЛрди рдХрд╛рд░реНрдпрдкреНрд░рд╡рд╛рд╣ рдХрд╕рд░реА рдЪрд▓рд╛рдЙрдиреЗ рднрдиреЗрд░ рдкрддреНрддрд╛ рд▓рдЧрд╛рдЙрдиреБрд╣реЛрд╕реН:
on:
schedule:
- cron: '*/5 * * * *'
рдпреЛ рд╕рд░рд▓ рдЫ, рдо рд╡рд┐рд╢реНрд╡рд╛рд╕ рдЧрд░реНрди рд╕рдХреНрджрд┐рди рдХрд┐ Github рдорд╛ рддрдкрд╛рдЗрдБ рдШрдЯрдирд╛рд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдЬреБрди рд╡реЗрдмрд╣реБрдХрд╣рд░реВрдорд╛ рдлрд┐рдЯ рд╣реБрдБрджреИрдиред рд╡рд┐рд╡рд░рдгрд╣рд░реВ рдХрд╛рдЧрдЬрд╛рддрдорд╛ рдЫрдиреН:
рдХрд░реНрд▓ рдорд╛рд░реНрдлрдд рдореНрдпрд╛рдиреБрдЕрд▓ рд░реВрдкрдорд╛ рд╕рд░реНрднрд░ рд╕реНрдерд┐рддрд┐ рдЬрд╛рдБрдЪ рдЧрд░реМрдВ:
jobs:
ping:
runs-on: ubuntu-18.04
steps:
- name: curl actuator
id: ping
run: |
echo "::set-output name=status::$(curl ${{secrets.SERVER_HOST}}/api/actuator/health)"
- name: health check
run: |
if [[ ${{ steps.ping.outputs.status }} != *"UP"* ]]; then
echo "health check is failed"
exit 1
fi
echo "It's OK"
рдкрд╣рд┐рд▓реЗ, рд╣рд╛рдореА рд╕рд░реНрднрд░рд▓реЗ рдЕрдиреБрд░реЛрдзрдорд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджрд┐рдПрдХреЛ рднреНрдпрд╛рд░реАрдПрдмрд▓рдорд╛ рдмрдЪрдд рдЧрд░реНрдЫреМрдВ, рдЕрд░реНрдХреЛ рдЪрд░рдгрдорд╛ рд╣рд╛рдореА рд╕реНрдерд┐рддрд┐ UP рд╣реЛ рднрдиреЗрд░ рдЬрд╛рдБрдЪ рдЧрд░реНрдЫреМрдВ рд░, рдпрджрд┐ рдпреЛ рдорд╛рдорд▓рд╛ рд╣реЛрдЗрди рднрдиреЗ, рд╣рд╛рдореА рддреНрд░реБрдЯрд┐рдХреЛ рд╕рд╛рде рдмрд╛рд╣рд┐рд░ рдирд┐рд╕реНрдХрдиреНрдЫреМрдВред рдпрджрд┐ рддрдкрд╛рдЗрдБ рддрдкрд╛рдЗрдБрдХреЛ рд╣рд╛рддрд╣рд░реБ рд╕рдВрдЧ рдПрдХ рдХрд╛рд░реНрдп "рдЕрдзрд┐рдкрддреНрдп" рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рднрдиреЗ, рддреНрдпрд╕рдкрдЫрд┐ рдирд┐рдХрд╛рд╕ 1рез - рдЙрдкрдпреБрдХреНрдд рд╣рддрд┐рдпрд╛рд░ред
- 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 }}
рдЕрдШрд┐рд▓реНрд▓реЛ рдЪрд░рдгрдорд╛ рдХрд╛рд░реНрдп рдЕрд╕рдлрд▓ рднрдПрдорд╛ рдорд╛рддреНрд░ рд╣рд╛рдореА рдЯреЗрд▓рд┐рдЧреНрд░рд╛рдордорд╛ рдкрдард╛рдЙрдБрдЫреМрдВред рд╕рдиреНрджреЗрд╢ рдкрдард╛рдЙрдирдХреЛ рд▓рд╛рдЧрд┐ рд╣рд╛рдореАрд▓реЗ Appleboy/telegram-action рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВ; рддрдкрд╛рдЗрдБ рдХрд╛рдЧрдЬрд╛рддрдорд╛ рдмреЛрдЯ рдЯреЛрдХрди рд░ рдЪреНрдпрд╛рдЯ рдЖрдИрдбреА рдХрд╕рд░реА рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреЗ рдмрд╛рд░реЗ рдкрдвреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ:
Github рдорд╛ рдЧреЛрдкреНрдп рд▓реЗрдЦреНрди рдирдмрд┐рд░реНрд╕рдиреБрд╣реЛрд╕реН: рд╕рд░реНрднрд░рдХреЛ рд▓рд╛рдЧрд┐ URL рд░ рдЯреЗрд▓рд┐рдЧреНрд░рд╛рдо рдмреЛрдЯрдХреЛ рд▓рд╛рдЧрд┐ рдЯреЛрдХрдиред
рдмреЛрдирд╕ рдЯреНрд░реНрдпрд╛рдХ - рдЕрд▓реНрдЫреА рд▓рд╛рдЧрд┐ JIRA
рдореИрд▓реЗ рдЬрд┐рд░рд╛рдорд╛ рдлрд░реНрдХрдиреЗ рд╡рд╛рдЪрд╛ рдЧрд░реЗрдБ, рд░ рд╣рд╛рдореА рдлрд░реНрдХреЗрдХрд╛ рдЫреМрдВред рд╕рдпреМрдВ рдкрдЯрдХ рдореИрд▓реЗ рд╕реНрдЯреНрдпрд╛рдиреНрдб-рдЕрдкрдорд╛ рдЕрд╡рд╕реНрдерд╛ рджреЗрдЦреЗрдХреЛ рдЫреБ рдЬрдм рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд╣рд░реВрд▓реЗ рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рдмрдирд╛рдП, рд╢рд╛рдЦрд╛ рдорд░реНрдЬ рдЧрд░реЗ, рддрд░ рдореБрджреНрджрд╛рд▓рд╛рдИ JIRA рдорд╛ рддрд╛рдиреНрди рдмрд┐рд░реНрд╕рдиреБрднрдпреЛред рдЕрд╡рд╢реНрдп рдкрдирд┐, рдпрджрд┐ рдпреЛ рд╕рдмреИ рдПрдХреИ рдард╛рдЙрдБрдорд╛ рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛ рднрдиреЗ, рдпреЛ рд╕рдЬрд┐рд▓реЛ рд╣реБрдиреЗрдЫ, рддрд░ рд╡рд╛рд╕реНрддрд╡рдорд╛ рд╣рд╛рдореА IDE рдорд╛ рдХреЛрдб рд▓реЗрдЦреНрдЫреМрдВ, рд╢рд╛рдЦрд╛рд╣рд░реВрд▓рд╛рдИ рдмрд┐рдЯрдмрдХреЗрдЯ рд╡рд╛ GitHub рдорд╛ рдорд░реНрдЬ рдЧрд░реНрдЫреМрдВ, рд░ рддреНрдпрд╕рдкрдЫрд┐ рдХрд╛рд░реНрдпрд╣рд░реВрд▓рд╛рдИ рдЬрд┐рд░рд╛рдорд╛ рддрд╛рдиреНрджрдЫреМрдВ, рдпрд╕рдХрд╛ рд▓рд╛рдЧрд┐ рд╣рд╛рдореАрд▓реЗ рдирдпрд╛рдБ рд╡рд┐рдиреНрдбреЛрд╣рд░реВ рдЦреЛрд▓реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред , рдХрд╣рд┐рд▓реЗрдХрд╛рд╣реАрдБ рдлреЗрд░рд┐ рд▓рдЧ рдЗрди рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рдЖрджрд┐ред рдЬрдм рддрдкрд╛рдЗрдБ рдкреВрд░реНрдг рд░реВрдкрдорд╛ рд╕рдореНрдЭрдиреБрд╣реБрдиреНрдЫ рдХрд┐ рддрдкрд╛рдЗрдБ рдЕрд░реНрдХреЛ рдХреЗ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рддреНрдпрд╕рдкрдЫрд┐ рдлреЗрд░рд┐ рдмреЛрд░реНрдб рдЦреЛрд▓реНрдиреЗ рдХреБрдиреИ рдорддрд▓рдм рдЫреИрдиред рдирддрд┐рдЬрд╛рдХреЛ рд░реВрдкрдорд╛, рдмрд┐рд╣рд╛рди рд╕реНрдЯреНрдпрд╛рдиреНрдбрдЕрдкрдорд╛ рддрдкрд╛рдИрдВрд▓реЗ рдЯрд╛рд╕реНрдХ рдмреЛрд░реНрдб рдЕрдкрдбреЗрдЯ рдЧрд░реНрди рд╕рдордп рдЦрд░реНрдЪ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред
GitHub рд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ рдпреЛ рджрд┐рдирдЪрд░реНрдпрд╛ рдХрд╛рд░реНрдпрдорд╛ рдкрдирд┐ рдорджреНрджрдд рдЧрд░реНрдиреЗрдЫ; рд╢реБрд░реБрд╡рд╛рддрдХрд░реНрддрд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореАрд▓реЗ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдкреЗрд╢ рдЧрд░реНрджрд╛ рд╣рд╛рдореА рд╕рдорд╕реНрдпрд╛рд╣рд░реВрд▓рд╛рдИ рд╕реНрд╡рддрдГ code_review рд╕реНрддрдореНрднрдорд╛ рдбреНрд░реНрдпрд╛рдЧ рдЧрд░реНрди рд╕рдХреНрдЫреМрдВред рддрдкрд╛рдИрд▓реЗ рдЧрд░реНрдиреБ рдкрд░реНрдиреЗ рднрдиреЗрдХреЛ рд╢рд╛рдЦрд╛ рдирд╛рдордХрд░рдг рдХрдиреНрднреЗрдиреНрд╕рди рдкрд╛рд▓рдирд╛ рдЧрд░реНрдиреБ рд╣реЛ:
[╨╕╨╝╤П ╨┐╤А╨╛╨╡╨║╤В╨░]-[╨╜╨╛╨╝╨╡╤А ╤В╨░╤Б╨║╨░]-╨╜╨░╨╖╨▓╨░╨╜╨╕╨╡
рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдпрджрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреБрдЮреНрдЬреА "GitHub рдХрд╛рд░реНрдпрд╣рд░реВ" GA рд╣реЛ, рддреНрдпрд╕рдкрдЫрд┐ GA-8-jira-bot
GA-8 рдХрд╛рд░реНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХреЛ рд▓рд╛рдЧрд┐ рд╢рд╛рдЦрд╛ рд╣реБрди рд╕рдХреНрдЫред
JIRA рд╕рдБрдЧ рдПрдХреАрдХрд░рдг рдПрдЯрд▓рд╛рд╕рд┐рдпрдирдмрд╛рдЯ рдХрд╛рд░реНрдпрд╣рд░реВ рдорд╛рд░реНрдлрдд рдХрд╛рдо рдЧрд░реНрджрдЫ, рддрд┐рдиреАрд╣рд░реВ рдкреВрд░реНрдг рдЫреИрдирдиреН, рдореИрд▓реЗ рднрдиреНрдиреИ рдкрд░реНрдЫ рдХрд┐ рддрд┐рдиреАрд╣рд░реВрдордзреНрдпреЗ рдХреЗрд╣реАрд▓реЗ рдореЗрд░реЛ рд▓рд╛рдЧрд┐ рдХрд╛рдо рдЧрд░реЗрдирдиреНред рддрд░ рд╣рд╛рдореА рдХреЗрд╡рд▓ рддреА рдХреБрд░рд╛рд╣рд░реВ рдЫрд▓рдлрд▓ рдЧрд░реНрдиреЗрдЫреМрдВ рдЬреБрди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдкрдорд╛ рдХрд╛рдо рдЧрд░реНрджрдЫ рд░ рд╕рдХреНрд░рд┐рдп рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫред
рдкрд╣рд┐рд▓реЗ рддрдкрд╛рдИрдВрд▓реЗ рдХрд╛рд░реНрдп рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ JIRA рдорд╛ рд▓рдЧ рдЗрди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ: atlassian/gajira-login
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 }}
рдпреЛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рддрдкрд╛рдИрдВрд▓реЗ JIRA рдорд╛ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рдпреЛ рдХрд╕рд░реА рдЧрд░реНрдиреЗ рдпрд╣рд╛рдБ рд╡рд░реНрдгрди рдЧрд░рд┐рдПрдХреЛ рдЫ:
рд╣рд╛рдореА рд╢рд╛рдЦрд╛рдХреЛ рдирд╛рдордмрд╛рдЯ рдХрд╛рд░реНрдп рдкрд╣рд┐рдЪрд╛рдирдХрд░реНрддрд╛ рдирд┐рдХрд╛рд▓реНрдЫреМрдВ:
- name: Find Issue
id: find_issue
shell: bash
run: |
echo "::set-output name=ISSUE_ID::$(echo ${GITHUB_HEAD_REF} | egrep -o 'GA-[0-9]{1,4}')"
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 [[ "${{steps.find_issue.outputs.ISSUE_ID}}" == "" ]]; then
echo "Please name your branch according to the JIRA issue: [project_key]-[task_number]-branch_name"
exit 1
fi
echo succcessfully found JIRA issue: ${{steps.find_issue.outputs.ISSUE_ID}}
рдпрджрд┐ рддрдкрд╛рдЗрдБ GitHub рдмрдЬрд╛рд░рдорд╛ рдЦреЛрдЬреНрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рддрдкрд╛рдЗрдБ рдпрд╕ рдХрд╛рд░реНрдпрдХреЛ рд▓рд╛рдЧрд┐ рдХрд╛рд░реНрдп рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рддрд░ рдореИрд▓реЗ рд╢рд╛рдЦрд╛рдХреЛ рдирд╛рдо рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ grep рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдЙрд╣реА рдХреБрд░рд╛ рд▓реЗрдЦреНрдиреБ рдкрд░реЗрдХреЛ рдерд┐рдпреЛ, рдХрд┐рдирднрдиреЗ Atlassian рдХреЛ рдпреЛ рдХрд╛рд░реНрдп рдХреБрдиреИ рдкрдирд┐ рд╣рд┐рд╕рд╛рдмрд▓реЗ рдореЗрд░реЛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдорд╛ тАЛтАЛрдХрд╛рдо рдЧрд░реНрди рдЪрд╛рд╣рдБрджреИрди рдерд┐рдпреЛред , рддреНрдпрд╣рд╛рдБ рдХреЗ рдЧрд▓реНрддреА рдерд┐рдпреЛ рдкрддреНрддрд╛ рд▓рдЧрд╛рдЙрди - рдЖрдлреНрдиреЛ рд╣рд╛рддрд▓реЗ рдПрдЙрдЯреИ рдХреБрд░рд╛ рдЧрд░реНрдиреБ рднрдиреНрджрд╛ рд▓рд╛рдореЛред
рдкреБрд▓ рдЕрдиреБрд░реЛрдз рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджрд╛ рдХрд╛рд░реНрдпрд▓рд╛рдИ "рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛" рд╕реНрддрдореНрднрдорд╛ рд╕рд╛рд░реНрди рдмрд╛рдБрдХреА рд░рд╣реЗрдХреЛ рдЫ:
- name: Transition issue
if: ${{ success() }}
uses: atlassian/gajira-transition@master
with:
issue: ${{ steps.find_issue.outputs.ISSUE_ID }}
transition: "Code review"
GitHub рдорд╛ рдпрд╕рдХреЛ рд▓рд╛рдЧрд┐ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдп рдЫ, рдпрд╕рд▓рд╛рдИ рдЕрдШрд┐рд▓реНрд▓реЛ рдЪрд░рдгрдорд╛ рдкреНрд░рд╛рдкреНрдд рдореБрджреНрджрд╛ ID рд░ рд╣рд╛рдореАрд▓реЗ рдорд╛рдерд┐ рдЧрд░реЗрдХреЛ JIRA рдорд╛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдЪрд╛рд╣рд┐рдиреНрдЫред
рддреНрдпрд╕реИ рдЧрд░реА, рддрдкрд╛рдИрдВ рдорд╛рд╕реНрдЯрд░рдорд╛ рдорд░реНрдЬ рдЧрд░реНрджрд╛ рдХрд╛рд░реНрдпрд╣рд░реВ рдбреНрд░реНрдпрд╛рдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рд░ GitHub рдХрд╛рд░реНрдпрдкреНрд░рд╡рд╛рд╣рдмрд╛рдЯ рдЕрдиреНрдп рдШрдЯрдирд╛рд╣рд░реВред рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рдпреЛ рд╕рдмреИ рддрдкрд╛рдЗрдБрдХреЛ рдХрд▓реНрдкрдирд╛ рд░ рджрд┐рдирдЪрд░реНрдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реБ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЧрд░реНрди рдЗрдЪреНрдЫрд╛ рдорд╛ рдирд┐рд░реНрднрд░ рдЧрд░реНрджрдЫред
рдирд┐рд╖реНрдХрд░реНрд╖
рдпрджрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдХреНрд▓рд╛рд╕рд┐рдХ DEVOPS рд░реЗрдЦрд╛рдЪрд┐рддреНрд░ рд╣реЗрд░реНрдиреБрднрдпреЛ рднрдиреЗ, рд╣рд╛рдореАрд▓реЗ рд╕рдмреИ рдЪрд░рдгрд╣рд░реВ рдХрднрд░ рдЧрд░реЗрдХрд╛ рдЫреМрдВ, рд╕рдореНрднрд╡рддрдГ рд╕рдЮреНрдЪрд╛рд▓рди рдмрд╛рд╣реЗрдХ, рдорд▓рд╛рдИ рд▓рд╛рдЧреНрдЫ рдпрджрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдиреБрднрдпреЛ рднрдиреЗ, рддрдкрд╛рдИрдВрд▓реЗ рд╣реЗрд▓реНрдк-рдбреЗрд╕реНрдХ рдкреНрд░рдгрд╛рд▓реАрд╕рдБрдЧ рдПрдХреАрдХрд░рдгрдХреЛ рд▓рд╛рдЧрд┐ рдмрдЬрд╛рд░рдорд╛ рдХреЗрд╣реА рдХрд╛рд░реНрдпрд╣рд░реВ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рддреНрдпрд╕реИрд▓реЗ рд╣рд╛рдореА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЛрдбрд┐рдпреЛ рднрдиреЗрд░ рдЕрдиреБрдорд╛рди рдЧрд░реНрдиреЗрдЫреМрдВред рдпрд╕рдХреЛ рдкреНрд░рдпреЛрдЧрдХреЛ рдЖрдзрд╛рд░рдорд╛ рд╡рд┐рд╕реНрддреГрдд рд░ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓реНрди рд╕рдХрд┐рдиреНрдЫред
рдкреНрд░реЛ:
- рд╕рдмреИ рдЕрд╡рд╕рд░рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рддрдпрд╛рд░ рдХрд╛рд░реНрдпрд╣рд░реВ рднрдПрдХреЛ рдмрдЬрд╛рд░, рдпреЛ рдзреЗрд░реИ рд░рд╛рдореНрд░реЛ рдЫред рддреА рдордзреНрдпреЗ рдзреЗрд░реИрдорд╛, рддрдкрд╛рдИрд▓реЗ рд╕реНрд░реЛрдд рдХреЛрдбрд▓рд╛рдИ рдХрд╕рд░реА рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрдиреЗ рднрдиреЗрд░ рдмреБрдЭреНрди рд╡рд╛ рд▓реЗрдЦрдХрд▓рд╛рдИ рд╕рд┐рдзреИ GitHub рднрдгреНрдбрд╛рд░рдорд╛ рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рдЕрдиреБрд░реЛрдз рдкреЛрд╕реНрдЯ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред
- рдПрд╕реЗрдореНрдмрд▓реАрдХрд╛ рд▓рд╛рдЧрд┐ рд▓рдХреНрд╖рд┐рдд рдкреНрд▓реЗрдЯрдлрд░реНрдо рдЪрдпрди рдЧрд░реНрджреИ: рд▓рд┐рдирдХреНрд╕, рдореНрдпрд╛рдХ рдУрдПрд╕, рд╡рд┐рдиреНрдбреЛрдЬ рдПрдХрджрдореИ рд░реЛрдЪрдХ рд╕реБрд╡рд┐рдзрд╛ рд╣реЛред
- Github рдкреНрдпрд╛рдХреЗрдЬрд╣рд░реВ рдПрдХ рдорд╣рд╛рди рдХреБрд░рд╛ рд╣реЛ, рд╕рдореНрдкреВрд░реНрдг рдкреВрд░реНрд╡рд╛рдзрд╛рд░ рдПрдХреИ рдард╛рдЙрдБрдорд╛ рд░рд╛рдЦреНрди рдпреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЫ, рддрдкрд╛рдИрдВрд▓реЗ рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдиреНрдбреЛрдЬрд╣рд░реВ рдорд╛рд░реНрдлрдд рд╕рд░реНрдл рдЧрд░реНрдиреБрдкрд░реНрджреИрди, рд╕рдмреИ рдХреБрд░рд╛ рдПрдХ рд╡рд╛ рджреБрдИ рдорд╛рдЙрд╕ рдХреНрд▓рд┐рдХрдХреЛ рджрд╛рдпрд░рд╛ рднрд┐рддреНрд░ рдЫ рд░ GitHub рдХрд╛рд░реНрдпрд╣рд░реВрд╕рдБрдЧ рдкреВрд░реНрдг рд░реВрдкрдорд╛ рдПрдХреАрдХреГрдд рдЫред рдирд┐: рд╢реБрд▓реНрдХ рд╕рдВрд╕реНрдХрд░рдгрдорд╛ рдбрдХрд░ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рд╕рдорд░реНрдерди рдкрдирд┐ рд░рд╛рдореНрд░реЛ рдлрд╛рдЗрджрд╛ рд╣реЛред
- GitHub рд▓реЗ рдмрд┐рд▓реНрдб рд▓рдЧрд╣рд░реВрдорд╛ рдЧреЛрдкреНрдп рдХреБрд░рд╛рд╣рд░реВ рд▓реБрдХрд╛рдЙрдБрдЫ, рддреНрдпрд╕реИрд▓реЗ рдпрд╕рд▓рд╛рдИ рдкрд╛рд╕рд╡рд░реНрдб рд░ рдЯреЛрдХрдирд╣рд░реВ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрди рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБ рдбрд░рд▓рд╛рдЧреНрджреЛ рдЫреИрдиред рдореЗрд░рд╛ рд╕рдмреИ рдкреНрд░рдпреЛрдЧрд╣рд░реВрдХреЛ рдмрдЦрдд, рдореИрд▓реЗ рдХрдиреНрд╕реЛрд▓рдорд╛ рдпрд╕рдХреЛ рд╢реБрджреНрдз рд░реВрдкрдорд╛ рдЧреЛрдкреНрдп рджреЗрдЦреНрди рд╕рдХрд┐рдиред
- рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдирд┐рдГрд╢реБрд▓реНрдХ
Cons:
- YML, рдареАрдХ рдЫ, рдо рдЙрд╕рд▓рд╛рдИ рдорди рдкрд░рд╛рдЙрдБрджреИрдиред рдпрд╕реНрддреЛ рдкреНрд░рд╡рд╛рд╣рдХреЛ рд╕рд╛рде рдХрд╛рдо рдЧрд░реНрджрд╛, рдорд╕рдБрдЧ рд╕рдмреИрднрдиреНрджрд╛ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рддрд┐рдмрджреНрдз рд╕рдиреНрджреЗрд╢ "рдлрд┐рдХреНрд╕ yml рдврд╛рдБрдЪрд╛" рд╣реЛ, рддреНрдпрд╕рдкрдЫрд┐ рддрдкрд╛рдЗрдБ рдХрддреИ рдЯреНрдпрд╛рдм рд░рд╛рдЦреНрди рдмрд┐рд░реНрд╕рдиреБрднрдпреЛ, рд╡рд╛ рддрдкрд╛рдЗрдБ рдпрд╕рд▓рд╛рдИ рдЧрд▓рдд рд▓рд╛рдЗрдирдорд╛ рд▓реЗрдЦреНрдиреБрд╣реБрдиреНрдЫред рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рдПрдХ рдкреНрд░реЛрдЯреНрд░реЗрдХреНрдЯрд░ рд░ рд╢рд╛рд╕рдХ рд╕рдВрдЧ рд╕реНрдХреНрд░рд┐рдирдХреЛ рдЕрдЧрд╛рдбрд┐ рдмрд╕реНрдиреБ рд╕рдмреИрднрдиреНрджрд╛ рд╕реБрдЦрдж рдЕрдиреБрднрд╡ рд╣реЛрдЗрдиред
- DEBUG, рдХрдорд┐рдЯрд╣рд░реВрдХреЛ рд╕рд╛рде рдкреНрд░рд╡рд╛рд╣ рдбрд┐рдмрдЧ рдЧрд░реНрдиреЗ, рдкреБрди: рдирд┐рд░реНрдорд╛рдг рдЪрд▓рд╛рдЙрдиреЗ, рд░ рдХрдиреНрд╕реЛрд▓рдорд╛ рдЖрдЙрдЯрдкреБрдЯ рдЧрд░реНрдиреЗ рд╕рдзреИрдВ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реБрдБрджреИрди, рддрд░ рдпреЛ "рддрдкрд╛рдИрд▓реЗ рдУрднрд░рдбрди" рд╢реНрд░реЗрдгреАрдХреЛ рдЕрдзрд┐рдХ рд╣реЛ; рддрдкрд╛рдЗрдБ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ IDEA рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрди рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ, рдЬрдм рддрдкрд╛рдЗрдБ рдХреЗрд╣рд┐ рдкрдирд┐ рдбрд┐рдмрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред ред
- рддрдкрд╛рдИрдВрд▓реЗ рдЖрдлреНрдиреЛ рдХрд╛рд░реНрдпрд▓рд╛рдИ рдХреБрдиреИ рдкрдирд┐ рдХреБрд░рд╛рдорд╛ рд▓реЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдпрджрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдпрд╕рд▓рд╛рдИ рдбрдХрд░рдорд╛ рд░реНтАНрдпрд╛рдк рдЧрд░реНрдиреБрднрдпреЛ рднрдиреЗ, рддрд░ рдЬрд╛рднрд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдорд╛рддреНрд░ рдиреЗрдЯрд┐рдн рд░реВрдкрдорд╛ рд╕рдорд░реНрдерд┐рдд рдЫ, рдирд┐рд╕реНрд╕рдиреНрджреЗрд╣ рдпреЛ рд╕реНрд╡рд╛рджрдХреЛ рдХреБрд░рд╛ рд╣реЛ, рддрд░ рдо js рдХреЛ рд╕рдЯреНрдЯрд╛ рдЕрд░реВ рдХреЗрд╣рд┐ рд░реБрдЪрд╛рдЙрдБрдЫреБред
рдорд▓рд╛рдИ рд╕рдореНрдЭрд╛рдЙрди рджрд┐рдиреБрд╣реЛрд╕реН рдХрд┐ рд╕рдмреИ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд╣рд░реВрдХреЛ рднрдгреНрдбрд╛рд░ рдпрд╣рд╛рдБ рдЫ:
рдЕрд░реНрдХреЛ рд╣рдкреНрддрд╛ рдо рд╕рдВрдЧ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрдиреЗрдЫреБ
рд░рд┐рдкреЛрд░реНрдЯ Heisenbug 2020 Piter рд╕рдореНрдореЗрд▓рдирдорд╛ред рдо рддрдкрд╛рдИрд▓рд╛рдИ рдкрд░реАрдХреНрд╖рдг рдбрд╛рдЯрд╛ рддрдпрд╛рд░ рдЧрд░реНрджрд╛ рдЧрд▓реНрддреАрд╣рд░реВрдмрд╛рдЯ рдмрдЪреНрдиреЗ рдорд╛рддреНрд░ рд╣реЛрдЗрди, рдЬрд╛рднрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВрдорд╛ рдбрд╛рдЯрд╛ рд╕реЗрдЯрд╣рд░реВрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреЗ рдореЗрд░реЛ рд░рд╣рд╕реНрдпрд╣рд░реВ рдкрдирд┐ рд╕рд╛рдЭрд╛ рдЧрд░реНрдиреЗ рдЫреБ!
рд╕реНрд░реЛрдд: www.habr.com