ΠΠ½Π΅ ΡΠ°ΡΡΠ΅Π½ΡΠΊΠΎ ΠΏΡΠΈΡ
ΠΎΠ΄ΠΈΡΡΡ ΡΡΡΠΎΠΈΡΡ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ² Π½Π° Java. ΠΠ½ΠΎΠ³Π΄Π° ΡΡΠΎ ΠΎΠΏΠ΅Π½ΡΠΎΡΡ, ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π΅Ρ. ΠΠ΅Π΄Π°Π²Π½ΠΎ Ρ ΡΠ΅ΡΠΈΠ» ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ ΠΏΠ΅ΡΠ΅Π½Π΅ΡΡΠΈ ΡΠ°ΡΡΡ ΡΠ²ΠΎΠΈΡ
ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠ΅Π² Ρ Travis-CI ΠΈ TeamCity Π½Π° GitHub Actions, ΠΈ Π²ΠΎΡ ΡΡΠΎ ΠΈΠ· ΡΡΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ.
Π§ΡΠΎ Π±ΡΠ΄Π΅ΠΌ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ
ΠΠ»Ρ Π½Π°ΡΠ°Π»Π° Π½Π°ΠΌ Π½ΡΠΆΠ΅Π½ ΠΏΡΠΎΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ, Π΄Π°Π²Π°ΠΉΡΠ΅ ΡΠ΄Π΅Π»Π°Π΅ΠΌ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Spring boot / Java 11 / Maven. Π ΡΠ°ΠΌΠΊΠ°Ρ ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠΈ Π»ΠΎΠ³ΠΈΠΊΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π°Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠΎΠ²Π°ΡΡ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ²ΡΠ΅ΠΌ, Π½Π°ΠΌ Π²Π°ΠΆΠ½Π° ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ° Π²ΠΎΠΊΡΡΠ³ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΡΠ°ΠΊ ΡΡΠΎ Π½Π°ΠΌ Ρ Π²Π°ΡΠΈΡ ΠΏΡΠΎΡΡΠ΅Π½ΡΠΊΠΎΠ³ΠΎ REST API ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ°.
ΠΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΠΈΡΡ
ΠΎΠ΄Π½ΠΈΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΡ:
JIRA ΠΈ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
Π‘ΡΠΎΠΈΡ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ ΠΌΡ ΠΎΠ±ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ JIRA Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΡΠ΅ΠΊΠ΅ΡΠ° Π·Π°Π΄Π°Ρ, ΡΠ°ΠΊ ΡΡΠΎ Π΄Π°Π²Π°ΠΉΡΠ΅ Π·Π°Π²Π΅Π΄Π΅ΠΌ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ Π±ΠΎΡΠ΄Ρ ΠΏΠΎΠ΄ ΡΡΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡ ΠΈ Π½Π°ΠΊΠΈΠ΄Π°Π΅ΠΌ ΡΡΠ΄Π° ΠΏΠ΅ΡΠ²ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ:
Π§ΡΡΡ ΠΏΠΎΠ·ΠΆΠ΅ ΠΌΡ Π΅ΡΠ΅ Π²Π΅ΡΠ½Π΅ΠΌΡΡ ΠΊ ΡΠΎΠΌΡ, ΡΡΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΌΠΎΠ³ΡΡ Π΄Π°ΡΡ Π² ΡΠ²ΡΠ·ΠΊΠ΅ JIRA ΠΈ GitHub.
ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΡΠ΅ΠΌ ΡΠ±ΠΎΡΠΊΡ ΠΏΡΠΎΠ΅ΠΊΡΠ°
ΠΠ°Ρ ΡΠ΅ΡΡΠΎΠ²ΡΠΉ ΠΏΡΠΎΠ΅ΠΊΡ ΡΠΎΠ±ΠΈΡΠ°Π΅ΡΡΡ ΡΠ΅ΡΠ΅Π· maven, ΡΠ°ΠΊ ΡΡΠΎ ΡΠ±ΠΎΡΠΊΠ° Π΅Π³ΠΎ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΏΡΠΎΡΡΠ°Ρ, Π²ΡΠ΅, ΡΡΠΎ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ, ΡΡΠΎ mvn clean package.
Π§ΡΠΎΠ±Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ Github Actions, Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ·Π΄Π°ΡΡ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ ΡΠ°ΠΉΠ» Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠΌ Π½Π°ΡΠ΅Π³ΠΎ workflow, ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΠΎΠ±ΡΡΠ½ΡΠΌ yml-ΡΠ°ΠΉΠ»ΠΎΠΌ, Π½Π΅ ΠΌΠΎΠ³Ρ ΡΠΊΠ°Π·Π°ΡΡ ΡΡΠΎ ΠΌΠ½Π΅ Π½ΡΠ°Π²ΠΈΡΡΡ Β«ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° ymlΒ», Π½ΠΎ ΡΡΠΎ ΠΏΠΎΠ΄Π΅Π»Π°ΡΡ β Π΄Π΅Π»Π°Π΅ΠΌ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ .github/workflow/ ΡΠ°ΠΉΠ» 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 β ΡΡΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΠΎΠ±ΡΡΠΈΡ, ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΌΡ Π±ΡΠ΄Π΅Ρ Π·Π°ΠΏΡΡΠΊΠ°ΡΡΡΡ Π½Π°Ρ ΡΠΊΡΠΈΠΏΡ.
on: pull_request / push β Π³ΠΎΠ²ΠΎΡΠΈΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΡΡΠΎΡ workflow Π½ΡΠΆΠ½ΠΎ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΡΡΠ΅ Π² ΠΌΠ°ΡΡΠ΅Ρ ΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΏΡΠ»Π»-ΡΠ΅ΠΊΠ²Π΅ΡΡΠΎΠ².
ΠΠ°Π»ΡΡΠ΅ ΠΈΠ΄Π΅Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π·Π°Π΄Π°Π½ΠΈΠΉ (jobs) ΠΈ ΡΠ°Π³ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ (steps) Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π·Π°Π΄Π°ΡΠΈ.
runs-on β ΡΡΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΡΠ±ΡΠ°ΡΡ ΡΠ΅Π»Π΅Π²ΡΡ ΠΠ‘, Π½Π° ΡΠ΄ΠΈΠ²Π»Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ±ΡΠ°ΡΡ Π΄Π°ΠΆΠ΅ Mac OS, Π½ΠΎ Π½Π° ΠΏΡΠΈΠ²Π°ΡΠ½ΡΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡΡ ΡΡΠΎ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ Π΄ΠΎΡΠΎΠ³ΠΎΠ΅ ΡΠ΄ΠΎΠ²ΠΎΠ»ΡΡΡΠ²ΠΈΠ΅ (Π² ΡΡΠ°Π²Π½Π΅Π½ΠΈΠΈ Ρ linux).
uses ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠΊΡΠ΅Π½Ρ, ΡΠ°ΠΊ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΡΠΊΡΠ΅Π½Π° actions/setup-java ΠΌΡ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ Java 11.
ΠΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ with ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΊΠ°Π·Π°ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Ρ ΠΊΠΎΡΠΎΡΡΠΌΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅, ΠΏΠΎ ΡΡΡΠΈ ΡΡΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡΡΡ Π² ΡΠΊΡΠ΅Π½.
ΠΡΡΠ°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π·Π°ΠΏΡΡΡΠΈΡΡ ΠΌΠ°Π²Π΅Π½ΠΎΠΌ ΡΠ±ΠΎΡΠΊΡ ΠΏΡΠΎΠ΅ΠΊΡΠ°: run: mvn -B clean package
ΡΠ»Π°Π³ -B Π³ΠΎΠ²ΠΎΡΠΈΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ Π½Π°ΠΌ Π½ΡΠΆΠ΅Π½ non-interactive mode, ΡΡΠΎΠ±Ρ ΠΌΠ°Π²Π΅Π½ Π²Π΄ΡΡΠ³ Π½Π΅ Π·Π°Ρ
ΠΎΡΠ΅Π» ΡΡΠΎ-ΡΠΎ Ρ Π½Π°Ρ ΡΠΏΡΠΎΡΠΈΡΡ
ΠΡΠ»ΠΈΡΠ½ΠΎ! Π’Π΅ΠΏΠ΅ΡΡ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΊΠΎΠΌΠΌΠΈΡΠ΅ Π² ΠΌΠ°ΡΡΠ΅Ρ, Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΡΠ±ΠΎΡΠΊΠ° ΠΏΡΠΎΠ΅ΠΊΡΠ°.
ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΡΠ΅ΠΌ Π·Π°ΠΏΡΡΠΊ ΡΠ΅ΡΡΠΎΠ²
Π‘Π±ΠΎΡΠΊΠ° ΡΡΠΎ Ρ ΠΎΡΠΎΡΠΎ, Π½ΠΎ Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΡΡΠΈ ΠΏΡΠΎΠ΅ΠΊΡ ΠΌΠΎΠΆΠ΅Ρ Π±Π»Π°Π³ΠΎΠΏΠΎΠ»ΡΡΠ½ΠΎ ΡΠΎΠ±ΠΈΡΠ°ΡΡΡΡ, Π½ΠΎ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°ΡΡ. ΠΠΎΡΡΠΎΠΌΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΡΠ°Π³ΠΎΠΌ Π½ΡΠΆΠ½ΠΎ Π·Π°Π½ΡΡΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΠ΅ΠΉ ΠΏΡΠΎΠ³ΠΎΠ½Π° ΡΠ΅ΡΡΠΎΠ². Π ΡΠΎΠΌΡ ΠΆΠ΅, Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΡΠ΄ΠΎΠ±Π½ΠΎ ΡΠΌΠΎΡΡΠ΅ΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΏΡΠΎΡ ΠΎΠ΄Π° ΡΠ΅ΡΡΠΎΠ², ΠΊΠΎΠ³Π΄Π° Π΄Π΅Π»Π°Π΅ΡΡ ΡΠ΅Π²ΡΡ PR β ΡΡ ΡΠΎΡΠ½ΠΎ Π·Π½Π°Π΅ΡΡ, ΡΡΠΎ ΡΠ΅ΡΡΡ ΠΏΡΠΎΡ ΠΎΠ΄ΡΡ ΠΈ Π½ΠΈΠΊΡΠΎ Π½Π΅ Π·Π°Π±ΡΠ», ΠΏΠ΅ΡΠ΅Π΄ ΡΠ΅ΠΌ ΠΊΠ°ΠΊ Π΄Π΅Π»Π°ΡΡ merge, ΠΏΡΠΎΠ³Π½Π°ΡΡ ΡΠ²ΠΎΡ Π²Π΅ΡΠΊΡ.
ΠΠ΅Π»Π°Π΅ΠΌ Π·Π°ΠΏΡΡΠΊ ΡΠ΅ΡΡΠΎΠ² ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΏΡΠ»Π»-ΡΠ΅ΠΊΠ²Π΅ΡΡΠ° ΠΈ merge Π² ΠΌΠ°ΡΡΠ΅Ρ, Π° Π·Π°ΠΎΠ΄Π½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΠ΅ ΠΎΡΡΠ΅ΡΠ° ΠΎ code-coverage.
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 }}
ΠΠ»Ρ ΠΏΠΎΠΊΡΡΡΠΈΡ ΡΠ΅ΡΡΠΎΠ² Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ codecov Π² ΡΠ²ΡΠ·ΠΊΠ΅ Ρ jacoco ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠΌ. Π£ codecov Π΅ΡΡΡ ΡΠ²ΠΎΠΉ ΡΠΊΡΠ΅Π½, Π½ΠΎ Π΅ΠΌΡ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π½Π°ΡΠΈΠΌ pull-request-ΠΎΠΌ Π½ΡΠΆΠ΅Π½ ΡΠΎΠΊΠ΅Π½:
${{ secrets.CODECOV_TOKEN }}
β ΡΠ°ΠΊΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ Π²ΡΡΡΠ΅ΡΠ°ΡΡ Π΅ΡΠ΅ Π½Π΅ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·, secrets ΡΡΠΎ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ ΡΠ΅ΠΊΡΠ΅ΡΠΎΠ² Π² Π³ΠΈΡΡ
Π°Π±Π΅, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ°ΠΌ ΠΏΡΠΎΠΏΠΈΡΠ°ΡΡ ΠΏΠ°ΡΠΎΠ»ΠΈ/ΡΠΎΠΊΠ΅Π½Ρ/Ρ
ΠΎΡΡΡ/url-Ρ ΠΈ ΠΏΡΠΎΡΠΈΠ΅ Π΄Π°Π½Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠΌΠΈ Π½Π΅ ΡΡΠΎΠΈΡ ΡΠ²Π΅ΡΠΈΡΡ Π² ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ Π±Π°Π·Π΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ.
ΠΠΎΠ±Π°Π²ΠΈΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π² secrets, ΠΌΠΎΠΆΠ½ΠΎ Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠ°Ρ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ Π½Π° GitHub:
ΠΠΎΠ»ΡΡΠΈΡΡ ΡΠΎΠΊΠ΅Π½ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°
ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ jacoco ΠΏΠ»Π°Π³ΠΈΠ½ Π² POM-ΡΠ°ΠΉΠ»:
<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>
Π’Π΅ΠΏΠ΅ΡΡ Π² ΠΊΠ°ΠΆΠ΄ΡΠΉ Π½Π°Ρ ΠΏΡΠ»Π»-ΡΠ΅ΠΊΠ²Π΅ΡΡ Π±ΡΠ΄Π΅Ρ Π·Π°Ρ ΠΎΠ΄ΠΈΡΡ codecov Π±ΠΎΡ ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ Π³ΡΠ°ΡΠΈΠΊ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΏΠΎΠΊΡΡΡΠΈΡ:
ΠΠΎΠ±Π°Π²ΠΈΠΌ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡ
Π Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΡΠ²ΠΎΠΈΡ oΠΏΠ΅Π½ΡΠΎΡΡ-ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ² Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ sonar cloud Π΄Π»Ρ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° ΠΊΠΎΠ΄Π°, Π΅Π³ΠΎ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ ΠΊ travis-ci. Π’Π°ΠΊ ΡΡΠΎ ΡΡΠΎ Π»ΠΎΠ³ΠΈΡΠ½ΡΠΉ ΡΠ°Π³ ΠΏΡΠΈ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΈ Π½Π° GitHub Actions, ΡΠ΄Π΅Π»Π°ΡΡ ΡΠΎΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅. ΠΠ°ΡΠΊΠ΅Ρ ΡΠΊΡΠ΅Π½ΠΎΠ² β ΠΊΠ»Π΅Π²Π°Ρ ΡΡΡΠΊΠ°, Π½ΠΎ Π² ΡΡΠΎΡ ΡΠ°Π· ΠΎΠ½ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Π²Π΅Π», ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Ρ ΠΏΠΎ ΠΏΡΠΈΠ²ΡΡΠΊΠ΅ Π½Π°ΡΠ΅Π» Π½ΡΠΆΠ½ΡΠΉ ΡΠΊΡΠ΅Π½ ΠΈ ΠΏΡΠΎΠΏΠΈΡΠ°Π» Π΅Π³ΠΎ Π² workflow. Π ΠΎΠΊΠ°Π·Π°Π»ΠΎΡΡ, ΡΡΠΎ sonar Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠ°Π±ΠΎΡΡ ΡΠ΅ΡΠ΅Π· Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π΄Π»Ρ Π°Π½Π°Π»ΠΈΠ·Π° ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ² Π½Π° 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.
ΠΠ΅Π»Π°Π΅ΠΌ ΠΏΡΠ»Π»-ΡΠ΅ΠΊΠ²Π΅ΡΡ ΠΈ ΠΆΠ΄Π΅ΠΌ, ΠΊΠΎΠ³Π΄Π° sonarcloud[bot] ΠΏΡΠΈΠ΄Π΅Ρ Π² ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ:
Release management
ΠΠΈΠ»Π΄ Π½Π°ΡΡΡΠΎΠΈΠ»ΠΈ, ΡΠ΅ΡΡΡ ΠΏΡΠΎΠ³Π½Π°Π»ΠΈ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈ ΡΠ΅Π»ΠΈΠ· ΡΠ΄Π΅Π»Π°ΡΡ. ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΠΊΠ°ΠΊ GitHub Actions ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ ΡΠΏΡΠΎΡΡΠΈΡΡ release managΠ΅ment.
ΠΠ° ΡΠ°Π±ΠΎΡΠ΅ Ρ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ ΠΏΡΠΎΠ΅ΠΊΡΡ, ΠΊΠΎΠ΄ΠΎΠ²Π°Ρ Π±Π°Π·Π° ΠΊΠΎΡΠΎΡΡΡ Π»Π΅ΠΆΠΈΡ Π² bitbucket(Π²ΡΠ΅ ΠΊΠ°ΠΊ Π² ΡΠΎΠΉ ΠΈΡΡΠΎΡΠΈΠΈ Β«Π΄Π½Π΅ΠΌ ΠΏΠΈΡΡ Π² Π±ΠΈΡΠ±Π°ΠΊΠ΅Ρ, Π½ΠΎΡΡΡ ΠΊΠΎΠΌΠΌΠΈΡΡ Π² GitHubΒ»). Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, Π² bitbucket Π½Π΅Ρ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΡ ΡΡΠ΅Π΄ΡΡΠ² Π΄Π»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠ΅Π»ΠΈΠ·Π°ΠΌΠΈ. ΠΡΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΏΠΎΠ΄ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ΅Π»ΠΈΠ· ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΡΡΠΊΠ°ΠΌΠΈ Π·Π°Π²ΠΎΠ΄ΠΈΡΡ ΡΡΡΠ°Π½ΠΈΡΠΊΡ Π² confluence ΠΈ ΡΠΊΠΈΠ΄ΡΠ²Π°ΡΡ ΡΡΠ΄Π° Π²ΡΠ΅ ΡΠΈΡΠΈ Π²ΠΎΡΠ΅Π΄ΡΠΈΠ΅ Π² ΡΠ΅Π»ΠΈΠ·, ΡΠ΅ΡΡΡΠΈΡΡ ΡΠ΅ΡΡΠΎΠ³ΠΈ ΡΠ°Π·ΡΠΌΠ°, ΡΠ°ΡΠΊΠΈ Π² jira, ΠΊΠΎΠΌΠΌΠΈΡΡ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ. Π¨Π°Π½ΡΠΎΠ² ΠΎΡΠΈΠ±ΠΈΡΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠΎ-ΡΠΎ Π·Π°Π±ΡΡΡ ΠΈΠ»ΠΈ Π²ΠΏΠΈΡΠ°ΡΡ ΡΠΎ, ΡΡΠΎ ΡΠΆΠ΅ ΡΠ΅Π»ΠΈΠ·ΠΈΠ»ΠΈ Π² ΠΏΡΠΎΡΠ»ΡΠΉ ΡΠ°Π·, ΠΈΠ½ΠΎΠ³Π΄Π° ΠΏΡΠΎΡΡΠΎ Π½Π΅ ΠΏΠΎΠ½ΡΡΠ½ΠΎ, ΠΊ ΡΠ΅ΠΌΡ ΠΎΡΠ½Π΅ΡΡΠΈ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΏΡΠ»Π»-ΡΠ΅ΠΊΠ²Π΅ΡΡ β ΡΡΠΎ ΡΠΈΡΠ° ΠΈΠ»ΠΈ ΡΠΈΠΊΡ Π±Π°Π³ΠΎΠ², ΠΈΠ»ΠΈ ΠΏΡΠ°Π²ΠΊΠ° ΡΠ΅ΡΡΠΎΠ², ΠΈΠ»ΠΈ ΡΡΠΎ-ΡΠΎ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ½ΠΎΠ΅.
ΠΠ°ΠΊ Π½Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΌΠΎΡΡ GitHub actions? ΠΡΡΡ ΠΎΡΠ»ΠΈΡΠ½ΡΠΉ ΡΠΊΡΠ΅Π½ β release drafter, ΠΎΠ½ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π·Π°Π΄Π°ΡΡ ΡΠ°Π±Π»ΠΎΠ½ ΡΠ°ΠΉΠ»Π° release notes, ΡΡΠΎΠ±Ρ Π½Π°ΡΡΡΠΎΠΈΡΡ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΈ ΠΏΡΠ»Π»-ΡΠ΅ΠΊΠ²Π΅ΡΡΠΎΠ² ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π³ΡΡΠΏΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΈΡ Π² release notes ΡΠ°ΠΉΠ»Π΅:
ΠΡΠΈΠΌΠ΅Ρ ΡΠ°Π±Π»ΠΎΠ½Π° Π΄Π»Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΎΡΡΠ΅ΡΠ°(.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 }}
ΠΡΠ΅ ΠΏΡΠ»Π»-ΡΠ΅ΠΊΠ²Π΅ΡΡΡ Ρ ΡΡΠΎΠ³ΠΎ ΠΌΠΎΠΌΠ΅Π½ΡΠ° Π±ΡΠ΄ΡΡ ΡΠΎΠ±ΠΈΡΠ°ΡΡΡΡ Π² release notes Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ β magic!
Π’ΡΡ ΠΌΠΎΠΆΠ΅Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡΡ Π²ΠΎΠΏΡΠΎΡ: Π° ΡΡΠΎ Π΅ΡΠ»ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Π·Π°Π±ΡΠ΄ΡΡ ΠΏΡΠΎΡΡΠ°Π²ΠΈΡΡ ΠΌΠ΅ΡΠΊΠΈ Π² PR? Π’ΠΎΠ³Π΄Π° Π½Π΅ΠΏΠΎΠ½ΡΡΠ½ΠΎ, Π² ΠΊΠ°ΠΊΡΡ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡ Π΅Π³ΠΎ ΠΎΡΠ½Π΅ΡΡΠΈ, ΠΈ ΠΎΠΏΡΡΡ ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΡΠ°Π·Π±ΠΈΡΠ°ΡΡΡΡ Π²ΡΡΡΠ½ΡΡ, Ρ ΠΊΠ°ΠΆΠ΄ΡΠΌ PR-ΠΎΠΌ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ. Π§ΡΠΎΠ±Ρ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΅ΡΠ΅ ΠΎΠ΄Π½ΠΈΠΌ ΡΠΊΡΠ΅Π½ΠΎΠΌ β label verifier β ΠΎΠ½ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ Π½Π°Π»ΠΈΡΠΈΠ΅ ΡΡΠ³ΠΎΠ² Π½Π° ΠΏΡΠ»Π»-ΡΠ΅ΠΊΠ²Π΅ΡΡΠ΅. ΠΡΠ»ΠΈ Π½Π΅Ρ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΡΡΠ³Π°, ΡΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π±ΡΠ΄Π΅Ρ Π·Π°Π²Π°Π»Π΅Π½Π° ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΡΡΠΎΠΌ ΠΌΡ ΡΠ²ΠΈΠ΄ΠΈΠΌ Π² Π½Π°ΡΠ΅ΠΌ ΠΏΡΠ»Π»-ΡΠ΅ΠΊΠ²Π΅ΡΡΠ΅.
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'
Π’Π΅ΠΏΠ΅ΡΡ Π»ΡΠ±ΠΎΠΉ pull-request Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅ΡΠΈΡΡ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΡΡΠ³ΠΎΠ²: type:fix, type:features, type:documentation, type:tests, type:config.
ΠΠ²ΡΠΎ-Π°Π½Π½ΠΎΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠ»Π»-ΡΠ΅ΠΊΠ²Π΅ΡΡΠΎΠ²
Π Π°Π· ΡΠΆ ΠΌΡ ΠΊΠΎΡΠ½ΡΠ»ΠΈΡΡ ΡΠ°ΠΊΠΎΠΉ ΡΠ΅ΠΌΡ ΠΊΠ°ΠΊ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½Π°Ρ ΡΠ°Π±ΠΎΡΠ° Ρ ΠΏΡΠ»Π»-ΡΠ΅ΠΊΠ²Π΅ΡΡΠ°ΠΌΠΈ, ΡΠΎ ΡΡΠΎΠΈΡ ΡΠΊΠ°Π·Π°ΡΡ Π΅ΡΠ΅ ΠΎ ΡΠ°ΠΊΠΎΠΌ ΡΠΊΡΠ΅Π½Π΅, ΠΊΠ°ΠΊ labeler, ΠΎΠ½ ΠΏΡΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΌΠ΅ΡΠΊΠΈ Π² 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/**"
ΠΠΎΠ΄ΡΡΠΆΠΈΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠΎΡΡΠ°Π²Π»ΡΡΡΠ΅Π΅ ΠΌΠ΅ΡΠΊΠΈ Π² ΠΏΡΠ»Π»-ΡΠ΅ΠΊΠ²Π΅ΡΡΡ ΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅, ΠΏΡΠΎΠ²Π΅ΡΡΡΡΠ΅Π΅ Π½Π°Π»ΠΈΡΠΈΠ΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΡ ΠΌΠ΅ΡΠΎΠΊ, Ρ ΠΌΠ΅Π½Ρ Π½Π΅ Π²ΡΡΠ»ΠΎ, match-label Π½Π° ΠΎΡΡΠ΅Π· Π½Π΅ Ρ ΠΎΡΠ΅Ρ Π²ΠΈΠ΄Π΅ΡΡ ΠΏΡΠΎΡΡΠ°Π²Π»Π΅Π½Π½ΡΠ΅ Π±ΠΎΡΠΎΠΌ ΠΌΠ΅ΡΠΊΠΈ. ΠΠΎΡ ΠΎΠΆΠ΅ ΠΏΡΠΎΡΠ΅ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΠ²ΠΎΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅, ΡΠΎΠ²ΠΌΠ΅ΡΠ°ΡΡΠ΅Π΅ ΠΎΠ±Π° ΡΡΠ°ΠΏΠ°. ΠΠΎ Π΄Π°ΠΆΠ΅ Π² ΡΠ°ΠΊΠΎΠΌ Π²ΠΈΠ΄Π΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΡΠ΄ΠΎΠ±Π½ΠΎ, Π½ΡΠΆΠ½ΠΎ Π²ΡΠ±ΡΠ°ΡΡ ΠΌΠ΅ΡΠΊΡ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ° ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΏΡΠ»Π»-ΡΠ΅ΠΊΠ²Π΅ΡΡΠ°.
ΠΠΎΡΠ° Π΄Π΅ΠΏΠ»ΠΎΠΈΡΡ
Π― ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°Π» Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ² Π΄Π΅ΠΏΠ»ΠΎΡ ΡΠ΅ΡΠ΅Π· GitHub Actions (ΡΠ΅ΡΠ΅Π· ssh, ΡΠ΅ΡΠ΅Π· scp, ΠΈ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ docker-hub), ΠΈ ΠΌΠΎΠ³Ρ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ, ΡΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ, Π²Ρ Π½Π°ΠΉΠ΄Π΅ΡΠ΅ ΡΠΏΠΎΡΠΎΠ± Π·Π°Π»ΠΈΡΡ Π±ΠΈΠ½Π°ΡΠΊΡ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ, ΠΊΠ°ΠΊΠΈΠΌ Π±Ρ ΠΈΠ·Π²ΡΠ°ΡΠ΅Π½Π½ΡΠΌ Π½Π΅ Π±ΡΠ» Π²Π°Ρ pipeline.
ΠΠ½Π΅ ΠΏΠΎΠ½ΡΠ°Π²ΠΈΠ»ΡΡ Π²Π°ΡΠΈΠ°Π½Ρ Π΄Π΅ΡΠΆΠ°ΡΡ Π²ΡΡ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΡ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅, ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ, ΠΊΠ°ΠΊ ΡΠ΄Π΅Π»Π°ΡΡ Π΄Π΅ΠΏΠ»ΠΎΠΉ Π² GitHub Packages (ΡΡΠΎ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Π΄Π»Ρ Π±ΠΈΠ½Π°ΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ°, npm, jar, docker).
CΠΊΠΏΡΠΈΠΏΡ ΡΠ±ΠΎΡΠΊΠΈ docker ΠΎΠ±ΡΠ°Π·Π° ΠΈ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ Π΅Π³ΠΎ Π² GitHub Packages:
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 docker registry ΠΈ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Π½Π°ΡΠ΅Π³ΠΎ ΠΎΠ±ΡΠ°Π·Π°. Π’ΡΡ Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Ρ ΠΈΡΡΠΎΡΡΠ΅ΠΉ, Ρ ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΠΌΡ Π΅ΡΠ΅ Π½Π΅ ΡΡΠ°Π»ΠΊΠΈΠ²Π°Π»ΠΈΡΡ:
- ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ Π²ΠΈΠ΄Π°: echo «::set-output name=NAME::VALUE» ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π·Π°Π΄Π°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² ΡΠ΅ΠΊΡΡΠ΅ΠΌ ΡΠ°Π³Π΅, ΡΠ°ΠΊ ΡΡΠΎΠ±Ρ Π΅Π³ΠΎ ΠΏΠΎΡΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ Π²ΠΎ Π²ΡΠ΅Ρ ΠΎΡΡΠ°Π»ΡΠ½ΡΡ ΡΠ°Π³Π°Ρ .
- ΠΏΠΎΠ»ΡΡΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΎΠΉ Π½Π° ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ ΡΠ°Π³Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅ΡΠ΅Π· ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΡΡΠΎΠ³ΠΎ ΡΠ°Π³Π°: ${{ steps.global_env.outputs.DOCKERHUB_IMAGE_NAME }}
- Π ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ GITHUB_REPOSITORY Ρ ΡΠ°Π½ΠΈΡΡΡ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ ΠΈ Π΅Π³ΠΎ Π²Π»Π°Π΄Π΅Π»Π΅Ρ (Β«owner/repo-nameΒ»). ΠΠ»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ Π²ΡΡΠ΅Π·Π°ΡΡ ΠΈΠ· ΡΡΠΎΠΉ ΡΡΡΠΎΠΊΠΈ Π²ΡΠ΅ ΠΊΡΠΎΠΌΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ, Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ bash ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠΎΠΌ: ${GITHUB_REPOSITORY#*/}
ΠΠ°Π»Π΅Π΅ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ±ΡΠ°ΡΡ Π΄ΠΎΠΊΠ΅Ρ-ΠΎΠ±ΡΠ°Π·:
docker build -t "docker.pkg.github.com/antkorwin/github-actions/github-actions:latest"
ΠΠ²ΡΠΎΡΠΈΠ·ΠΎΠ²Π°ΡΡΡΡ Π² registry:
docker login docker.pkg.github.com -u $GITHUB_ACTOR -p ${{secrets.GITHUB_TOKEN}}
Π ΠΎΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΠ°Π· Π² GitHub Packages Repository:
docker push "docker.pkg.github.com/antkorwin/github-actions/github-actions"
ΠΠ»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΡΠΊΠ°Π·Π°ΡΡ Π²Π΅ΡΡΠΈΡ ΠΎΠ±ΡΠ°Π·Π°, ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ²ΡΠ΅ ΡΠΈΡΡΡ ΠΈΠ· SHA-Ρ ΡΡΠ° ΠΊΠΎΠΌΠΌΠΈΡΠ° β GITHUB_SHA ΡΡΡ ΡΠΎΠΆΠ΅ Π΅ΡΡΡ Π½ΡΠ°Π½ΡΡ, Π΅ΡΠ»ΠΈ Π²Ρ Π±ΡΠ΄Π΅ΡΠ΅ Π΄Π΅Π»Π°ΡΡ ΡΠ°ΠΊΠΈΠ΅ ΡΠ±ΠΎΡΠΊΠΈ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈ merge Π² master, Π° Π΅ΡΠ΅ ΠΈ ΠΏΠΎ ΡΠΎΠ±ΡΡΠΈΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΏΡΠ»Π»-ΡΠ΅ΠΊΠ²Π΅ΡΡΠ°, ΡΠΎ SHA ΠΌΠΎΠΆΠ΅Ρ Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡ Ρ Ρ ΡΡΠ΅ΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ Π²ΠΈΠ΄ΠΈΠΌ Π² ΠΈΡΡΠΎΡΠΈΠΈ Π³ΠΈΡΠ°, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ actions/checkout Π΄Π΅Π»Π°Π΅Ρ ΡΠ²ΠΎΠΉ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΉ Ρ ΡΡ, ΡΡΠΎΠ±Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ Π²Π·Π°ΠΈΠΌΠ½ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ Π² PR.
ΠΡΠ»ΠΈ Π²ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ Π±Π»Π°Π³ΠΎΠΏΠΎΠ»ΡΡΠ½ΠΎ, ΡΠΎ ΠΎΡΠΊΡΡΠ² ΡΠ°Π·Π΄Π΅Π» packages (https://github.com/antkorwin/github-actions/packages) Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ, Π²Ρ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅ Π½ΠΎΠ²ΡΠΉ Π΄ΠΎΠΊΠ΅Ρ ΠΎΠ±ΡΠ°Π·:
Π’Π°ΠΌ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΡΠΏΠΈΡΠΎΠΊ Π²Π΅ΡΡΠΈΠΉ Π΄ΠΎΠΊΠ΅Ρ-ΠΎΠ±ΡΠ°Π·Π°.
ΠΡΡΠ°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π½Π°ΡΡΡΠΎΠΈΡΡ Π½Π°Ρ ΡΠ΅ΡΠ²Π΅Ρ Π½Π° ΡΠ°Π±ΠΎΡΡ Ρ ΡΡΠΈΠΌ registry ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊ ΡΠ΅ΡΠ²ΠΈΡΠ°. Π ΡΠΎΠΌ ΠΊΠ°ΠΊ ΡΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ΅ΡΠ΅Π· systemd, Ρ, ΠΏΠΎΠΆΠ°Π»ΡΠΉ, ΡΠ°ΡΡΠΊΠ°ΠΆΡ Π² Π΄ΡΡΠ³ΠΎΠΉ ΡΠ°Π·.
ΠΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ Π½Π΅ΡΠ»ΠΎΠΆΠ½ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ, ΠΊΠ°ΠΊ Π΄Π΅Π»Π°ΡΡ health check Π½Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ GitHub Actions. Π Π½Π°ΡΠ΅ΠΌ Π±ΡΡΠΎΠ²ΠΎΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π΅ΡΡΡ actuator, ΡΠ°ΠΊ ΡΡΠΎ 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"}
ΠΡΠ΅, ΡΡΠΎ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ β Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΠ°ΡΠΊ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΏΠΎ ΠΊΡΠΎΠ½Ρ, Π½Ρ Π° Π΅ΡΠ»ΠΈ Π²Π΄ΡΡΠ³ ΠΎΠ½ Π½Π°ΠΌ Π½Π΅ ΠΎΡΠ²Π΅ΡΠΈΡ, ΡΠΎ Π±ΡΠ΄Π΅ΠΌ ΡΠ»Π°ΡΡ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ Π² ΡΠ΅Π»Π΅Π³ΡΠ°ΠΌ.
ΠΠ»Ρ Π½Π°ΡΠ°Π»Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌΡΡ, ΠΊΠ°ΠΊ Π·Π°ΠΏΡΡΡΠΈΡΡ workflow ΠΏΠΎ ΠΊΡΠΎΠ½Ρ:
on:
schedule:
- cron: '*/5 * * * *'
ΠΡΠ΅ ΠΏΡΠΎΡΡΠΎ, Π΄Π°ΠΆΠ΅ Π½Π΅ Π²Π΅ΡΠΈΡΡΡ ΡΡΠΎ Π² Π³ΠΈΡΡ
Π°Π±Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ°ΠΊΠΈΠ΅ ΠΈΠ²Π΅Π½ΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΎΠ²ΡΠ΅ΠΌ Π½Π΅ ΡΠΊΠ»Π°Π΄ΡΠ²Π°ΡΡΡΡ Π² webhook-ΠΈ. ΠΠ΅ΡΠ°Π»ΠΈ Π΅ΡΡΡ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ:
ΠΡΠΎΠ²Π΅ΡΠΊΡ ΡΡΠ°ΡΡΡΠ° ΡΠ΅ΡΠ²Π΅ΡΠ° ΡΠ΄Π΅Π»Π°Π΅ΠΌ ΡΡΠΊΠ°ΠΌΠΈ ΡΠ΅ΡΠ΅Π· curl:
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 ΠΈ, Π΅ΡΠ»ΠΈ ΡΡΠΎ Π½Π΅ ΡΠ°ΠΊ, ΡΠΎ Π²ΡΡ ΠΎΠ΄ΠΈΠΌ Ρ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ. ΠΡΠ»ΠΈ Π½ΡΠΆΠ½ΠΎ ΡΡΠΊΠ°ΠΌΠΈ Β«Π·Π°Π²Π°Π»ΠΈΡΡΒ» Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅, ΡΠΎ exit 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, ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠΎΠΊΠ΅Π½ Π±ΠΎΡΠ° ΠΈ id ΡΠ°ΡΠ° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΈΡΠ°ΡΡ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ:
ΠΠ΅ Π·Π°Π±ΡΠ΄ΡΡΠ΅ ΠΏΡΠΎΠΏΠΈΡΠ°ΡΡ Π² ΡΠ΅ΠΊΡΠ΅ΡΠ°Ρ Π½Π° Π³ΠΈΡΡ Π°Π±Π΅: URL Π΄Π»Ρ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΈ ΡΠΎΠΊΠ΅Π½Ρ Π΄Π»Ρ ΡΠ΅Π»Π΅Π³ΡΠ°ΠΌ Π±ΠΎΡΠ°.
ΠΠΎΠ½ΡΡ ΡΡΠ΅ΠΊ β JIRA Π΄Π»Ρ Π»Π΅Π½ΠΈΠ²ΡΡ
Π― ΠΎΠ±Π΅ΡΠ°Π» ΡΡΠΎ ΠΌΡ Π²Π΅ΡΠ½Π΅ΠΌΡΡ ΠΊ JIRA, ΠΈ ΠΌΡ Π²Π΅ΡΠ½ΡΠ»ΠΈΡΡ. Π‘ΠΎΡΠ½ΠΈ ΡΠ°Π· Π½Π°Π±Π»ΡΠ΄Π°Π» Π½Π° ΡΡΠ΅Π½Π΄Π°ΠΏΠ°Ρ ΡΠΈΡΡΠ°ΡΠΈΡ, ΠΊΠΎΠ³Π΄Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΡΠ΄Π΅Π»Π°Π»ΠΈ ΡΠΈΡΡ, ΡΠ»ΠΈΠ»ΠΈ Π²Π΅ΡΠΊΡ, Π½ΠΎ Π·Π°Π±ΡΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΡΡΠ½ΡΡΡ Π·Π°Π΄Π°ΡΡ Π² JIRA. ΠΠΎΠ½Π΅ΡΠ½ΠΎ, Π΅ΡΠ»ΠΈ Π±Ρ Π²ΡΠ΅ ΡΡΠΎ Π΄Π΅Π»Π°Π»ΠΎΡΡ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅, ΡΠΎ Π±ΡΠ»ΠΎ Π±Ρ ΠΏΡΠΎΡΠ΅, Π½ΠΎ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΌΡ ΠΏΠΈΡΠ΅ΠΌ ΠΊΠΎΠ΄ Π² IDE, ΡΠ»ΠΈΠ²Π°Π΅ΠΌ Π²Π΅ΡΠΊΠΈ Π² bitbucket ΠΈΠ»ΠΈ GitHub, Π° Π·Π°Π΄Π°ΡΠΈ ΠΏΠΎΡΠΎΠΌ ΡΠ°ΡΠΊΠ°Π΅ΠΌ Π² Jira, Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ Π½Π°Π΄ΠΎ ΠΎΡΠΊΡΡΠ²Π°ΡΡ Π½ΠΎΠ²ΡΠ΅ ΠΎΠΊΠ½Π°, ΠΈΠ½ΠΎΠ³Π΄Π° Π»ΠΎΠ³ΠΈΠ½ΠΈΡΡΡΡ Π΅ΡΠ΅ ΡΠ°Π· ΠΈ Ρ.Π΄. ΠΠΎΠ³Π΄Π° ΡΡ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡΡ, ΡΡΠΎ Π½Π°Π΄ΠΎ Π΄Π΅Π»Π°ΡΡ Π΄Π°Π»ΡΡΠ΅, ΡΠΎ ΠΎΡΠΊΡΡΠ²Π°ΡΡ Π±ΠΎΡΠ΄Ρ Π»ΠΈΡΠ½ΠΈΠΉ ΡΠ°Π· Π½Π΅Ρ ΡΠΌΡΡΠ»Π°. Π ΠΈΡΠΎΠ³Π΅, ΡΡΡΠΎΠΌ Π½Π° ΡΡΠ΅Π½Π΄Π°ΠΏΠ΅ Π½Π°Π΄ΠΎ ΡΡΠ°ΡΠΈΡΡ Π²ΡΠ΅ΠΌΡ Π½Π° Π°ΠΊΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π΄ΠΎΡΠΊΠΈ Π·Π°Π΄Π°Ρ.
GitHub ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ Π½Π°ΠΌ ΠΈ Π² ΡΡΠΎΠΌ ΡΡΡΠΈΠ½Π½ΠΎΠΌ Π·Π°Π½ΡΡΠΈΠΈ, Π΄Π»Ρ Π½Π°ΡΠ°Π»Π° ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅ΡΠ΅ΡΡΠ³ΠΈΠ²Π°ΡΡ Π·Π°Π΄Π°ΡΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΎΠΌ, Π² ΠΊΠΎΠ»ΠΎΠ½ΠΊΡ code_review, ΠΊΠΎΠ³Π΄Π° Π·Π°ΠΊΠΈΠ½ΡΠ»ΠΈ ΠΏΡΠ»Π»-ΡΠ΅ΠΊΠ²Π΅ΡΡ. ΠΡΠ΅, ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ β ΡΡΠΎ ΠΏΡΠΈΠ΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ ΡΠΎΠ³Π»Π°ΡΠ΅Π½ΠΈΡ Π² Π½Π°ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠΈ Π²Π΅ΡΠΎΠΊ:
[ΠΈΠΌΡ ΠΏΡΠΎΠ΅ΠΊΡΠ°]-[Π½ΠΎΠΌΠ΅Ρ ΡΠ°ΡΠΊΠ°]-Π½Π°Π·Π²Π°Π½ΠΈΠ΅
Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ ΠΊΠ»ΡΡ ΠΏΡΠΎΠ΅ΠΊΡΠ° Β«GitHub ActionsΒ» Π±ΡΠ΄Π΅Ρ GA, ΡΠΎ GA-8-jira-bot
ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π²Π΅ΡΠΊΠΎΠΉ Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π·Π°Π΄Π°ΡΠΈ GA-8.
ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ JIRA ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠ΅ΡΠ΅Π· ΡΠΊΡΠ΅Π½Ρ ΠΎΡ Atlassian, ΠΎΠ½ΠΈ Π½Π΅ ΠΈΠ΄Π΅Π°Π»ΡΠ½Ρ, Π½Π°Π΄ΠΎ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ· Π½ΠΈΡ Ρ ΠΌΠ΅Π½Ρ Π²ΠΎΠΎΠ±ΡΠ΅ Π½Π΅ Π·Π°ΡΠ°Π±ΠΎΡΠ°Π»ΠΈ. ΠΠΎ ΠΌΡ ΠΎΠ±ΡΡΠ΄ΠΈΠΌ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅, ΡΡΠΎ ΡΠΎΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΈ Π°ΠΊΡΠΈΠ²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ.
ΠΠ»Ρ Π½Π°ΡΠ°Π»Π° Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΎΠΉΡΠΈ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ Π² 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 marketplace, ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π΄Π»Ρ ΡΡΠΎΠΉ Π·Π°Π΄Π°ΡΠΈ, Π½ΠΎ ΠΌΠ½Π΅ ΠΏΡΠΈΡΠ»ΠΎΡΡ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΠΎΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ ΡΠ΅ΡΠ΅Π· grep ΠΏΠΎ Π½Π°Π·Π²Π°Π½ΠΈΡ Π²Π΅ΡΠΊΠΈ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΡΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΠΎΡ Atlassian Π½ΠΈ Π² ΠΊΠ°ΠΊΡΡ Π½Π΅ Π·Π°Ρ ΠΎΡΠ΅Π»ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π° ΠΌΠΎΠ΅ΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅, ΡΠ°Π·Π±ΠΈΡΠ°ΡΡΡΡ, ΡΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌ Π½Π΅ ΡΠ°ΠΊ β Π΄ΠΎΠ»ΡΡΠ΅, ΡΠ΅ΠΌ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΊΠ°ΠΌΠΈ ΡΠΎΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅.
ΠΡΡΠ°Π»ΠΎΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΡΠΈΡΡ Π·Π°Π΄Π°ΡΡ Π² ΠΊΠΎΠ»ΠΎΠ½ΠΊΡ Β«Code reviewΒ» ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΏΡΠ»Π»-ΡΠ΅ΠΊΠ²Π΅ΡΡΠ°:
- name: Transition issue
if: ${{ success() }}
uses: atlassian/gajira-transition@master
with:
issue: ${{ steps.find_issue.outputs.ISSUE_ID }}
transition: "Code review"
ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π΅ΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π½Π° GitHub, Π²ΡΠ΅, ΡΡΠΎ Π΅ΠΌΡ Π½ΡΠΆΠ½ΠΎ β ΡΡΠΎ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π·Π°Π΄Π°ΡΠΈ, ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΉ Π½Π° ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ ΡΠ°Π³Π΅ ΠΈ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ Π² JIRA, ΠΊΠΎΡΠΎΡΡΡ ΠΌΡ Π΄Π΅Π»Π°Π»ΠΈ Π²ΡΡΠ΅.
Π’Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΡΡΠ³ΠΈΠ²Π°ΡΡ Π·Π°Π΄Π°ΡΠΈ ΠΏΡΠΈ merge Π² ΠΌΠ°ΡΡΠ΅Ρ, ΠΈ Π΄ΡΡΠ³ΠΈΡ ΡΠΎΠ±ΡΡΠΈΡΡ ΠΈΠ· GitHub workflow. Π ΠΎΠ±ΡΠ΅ΠΌ, Π²ΡΠ΅ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ Π²Π°ΡΠ΅ΠΉ ΡΠ°Π½ΡΠ°Π·ΠΈΠΈ ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΡΡΠΈΠ½Π½ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΡ.
ΠΡΠ²ΠΎΠ΄Ρ
ΠΡΠ»ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π½Π° ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΡΡ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΌΡ DEVOPS, ΡΠΎ ΠΌΡ ΠΏΠΎΠΊΡΡΠ»ΠΈ Π²ΡΠ΅ ΡΡΠ°ΠΏΡ, ΡΠ°Π·Π²Π΅ ΡΡΠΎ ΠΊΡΠΎΠΌΠ΅ operate, Π΄ΡΠΌΠ°Ρ, Π΅ΡΠ»ΠΈ ΠΏΠΎΡΡΠ°ΡΠ°ΡΡΡΡ, ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡΠ΄Ρ ΡΠΊΡΠ΅Π½ Π² ΠΌΠ°ΡΠΊΠ΅ΡΠ΅ Π΄Π»Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ Ρ help-desk ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ, ΡΠ°ΠΊ ΡΡΠΎ Π±ΡΠ΄Π΅ΠΌ ΡΡΠΈΡΠ°ΡΡ ΡΡΠΎ pipeline ΠΏΠΎΠ»ΡΡΠΈΠ»ΡΡ ΠΎΡΠ½ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΠΉ ΠΈ Π½Π° ΠΎΡΠ½ΠΎΠ²Π°Π½ΠΈΠΈ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ Π²ΡΠ²ΠΎΠ΄Ρ.
ΠΠ»ΡΡΡ:
- Marketplace Ρ Π³ΠΎΡΠΎΠ²ΡΠΌΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠΌΠΈ Π½Π° Π²ΡΠ΅ ΡΠ»ΡΡΠ°ΠΈ ΠΆΠΈΠ·Π½ΠΈ, ΡΡΠΎ ΠΎΡΠ΅Π½Ρ ΠΊΡΡΡΠΎ. Π Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΠΈΠ· Π½ΠΈΡ Π΅ΡΠ΅ ΠΈ ΠΈΡΡ ΠΎΠ΄Π½ΠΈΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ½ΡΡΡ ΠΊΠ°ΠΊ ΡΠ΅ΡΠΈΡΡ ΠΏΠΎΡ ΠΎΠΆΡΡ Π·Π°Π΄Π°ΡΡ Π»ΠΈΠ±ΠΎ Π·Π°ΠΏΠΎΡΡΠΈΡΡ feature request Π°Π²ΡΠΎΡΡ ΠΏΡΡΠΌΠΎ Π² Π³ΠΈΡΡ Π°Π± ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ.
- ΠΡΠ±ΠΎΡ ΡΠ΅Π»Π΅Π²ΠΎΠΉ ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ: Linux, mac os, windows Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π°Ρ ΡΠΈΡΠ°.
- Github Packages ΠΎΡΠ»ΠΈΡΠ½Π°Ρ Π²Π΅ΡΡ, Π΄Π΅ΡΠΆΠ°ΡΡ Π²ΡΡ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΡ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅ ΡΠ΄ΠΎΠ±Π½ΠΎ, Π½Π΅ Π½Π°Π΄ΠΎ ΡΠ΅ΡΡΠΈΡΡ ΠΏΠΎ ΡΠ°Π·Π½ΡΠΌ ΠΎΠΊΠΎΡΠΊΠ°ΠΌ, Π²ΡΠ΅ Π² ΡΠ°Π΄ΠΈΡΡΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ-Π΄Π²ΡΡ ΠΊΠ»ΠΈΠΊΠΎΠ² ΠΌΡΡΠΈ ΠΈ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½ΠΎ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠΎΠ²Π°Π½ΠΎ Ρ GitHub Actions. ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° docker registry Π² Π±Π΅ΡΠΏΠ»Π°ΡΠ½ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ β ΡΡΠΎ ΡΠΎΠΆΠ΅ Ρ ΠΎΡΠΎΡΠ΅Π΅ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎ.
- GitHub ΠΏΡΡΡΠ΅Ρ ΡΠ΅ΠΊΡΠ΅ΡΡ Π² Π»ΠΎΠ³Π°Ρ ΡΠ±ΠΎΡΠΊΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΈΠΌ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΏΠ°ΡΠΎΠ»Π΅ΠΉ ΠΈ ΡΠΎΠΊΠ΅Π½ΠΎΠ² Π½Π΅ ΡΠ°ΠΊ ΡΠΆ ΠΈ ΡΡΡΠ°ΡΠ½ΠΎ. ΠΠ° Π²ΡΠ΅ Π²ΡΠ΅ΠΌΡ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΎΠ² ΠΌΠ½Π΅ Π½Π΅ ΡΠ΄Π°Π»ΠΎΡΡ Π½ΠΈ ΡΠ°Π·Ρ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΡΠ΅ΠΊΡΠ΅Ρ Π² ΡΠΈΡΡΠΎΠΌ Π²ΠΈΠ΄Π΅ Π² ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ.
- ΠΠ΅ΡΠΏΠ»Π°ΡΠ΅Π½ Π΄Π»Ρ Open Source ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ²
ΠΠΈΠ½ΡΡΡ:
- YML, Π½Ρ Π½Π΅ Π»ΡΠ±Π»Ρ Ρ Π΅Π³ΠΎ. ΠΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ ΡΠ°ΠΊΠΈΠΌ ΡΠ»ΠΎΡ Ρ ΠΌΠ΅Π½Ρ ΡΠ°ΠΌΡΠΉ ΡΠ°ΡΡΡΠΉ commit message ΡΡΠΎ Β«fix yml formatΒ», ΡΠΎ Π·Π°Π±ΡΠ΄Π΅ΡΡ Π³Π΄Π΅-ΡΠΎ ΡΠ°Π± ΠΏΠΎΡΡΠ°Π²ΠΈΡΡ, ΡΠΎ Π½Π΅ Π½Π° ΡΠΎΠΉ ΡΡΡΠΎΠΊΠ΅ Π½Π°ΠΏΠΈΡΠ΅ΡΡ. Π ΠΎΠ±ΡΠ΅ΠΌ, ΡΠΈΠ΄Π΅ΡΡ ΠΏΠ΅ΡΠ΅Π΄ ΡΠΊΡΠ°Π½ΠΎΠΌ Ρ ΡΡΠ°Π½ΡΠΏΠΎΡΡΠΈΡΠΎΠΌ ΠΈ Π»ΠΈΠ½Π΅ΠΉΠΊΠΎΠΉ Π½Π΅ ΡΠ°ΠΌΠΎΠ΅ ΠΏΡΠΈΡΡΠ½ΠΎΠ΅ Π·Π°Π½ΡΡΠΈΠ΅.
- DEBUG, ΠΎΡΠ»Π°ΠΆΠΈΠ²Π°ΡΡ ΡΠ»ΠΎΡ ΠΊΠΎΠΌΠΌΠΈΡΠ°ΠΌΠΈ, Π·Π°ΠΏΡΡΠΊΠΎΠΌ ΠΏΠ΅ΡΠ΅ΡΠ±ΠΎΡΠΊΠΈ ΠΈ Π²ΡΠ²ΠΎΠ΄ΠΎΠΌ Π² ΠΊΠΎΠ½ΡΠΎΠ»Ρ Π½Π΅ Π²ΡΠ΅Π³Π΄Π° ΡΠ΄ΠΎΠ±Π½ΠΎ, Π½ΠΎ ΡΡΠΎ Π±ΠΎΠ»ΡΡΠ΅ ΠΈΠ· ΡΠ°Π·ΡΡΠ΄Π° Β«Π²Ρ Π·Π°ΠΆΡΠ°Π»ΠΈΡΡΒ», ΠΏΡΠΈΠ²ΡΠΊΠ»ΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΡΠ΄ΠΎΠ±Π½ΡΠΌΠΈ IDEA, ΠΊΠΎΠ³Π΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠ»Π°ΠΆΠΈΠ²Π°ΡΡ Π²ΡΠ΅, ΡΡΠΎ ΡΠ³ΠΎΠ΄Π½ΠΎ.
- Π‘Π²ΠΎΠΉ ΡΠΊΡΠ΅Π½ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°ΡΡ Π½Π° ΡΠ΅ΠΌ ΡΠ³ΠΎΠ΄Π½ΠΎ Π΅ΡΠ»ΠΈ Π·Π°Π²Π΅ΡΠ½ΡΡΡ Π΅Π³ΠΎ Π² Π΄ΠΎΠΊΠ΅Ρ, Π½ΠΎ Π½Π°ΡΠΈΠ²Π½ΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ javascript, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ ΡΡΠΎ Π΄Π΅Π»ΠΎ Π²ΠΊΡΡΠ°, Π½ΠΎ Ρ Π±Ρ ΠΏΡΠ΅Π΄ΠΏΠΎΡΠ΅Π» ΡΡΠΎ-ΡΠΎ Π΄ΡΡΠ³ΠΎΠ΅ Π·Π°ΠΌΠ΅ΡΡΠΎ js.
ΠΠ°ΠΏΠΎΠΌΠ½Ρ, ΡΡΠΎ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ ΡΠΎ Π²ΡΠ΅ΠΌΠΈ ΡΠΊΡΠΈΠΏΡΠ°ΠΌΠΈ ΡΡΡ:
ΠΠ° ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ Π½Π΅Π΄Π΅Π»Π΅ Ρ Π±ΡΠ΄Ρ Π²ΡΡΡΡΠΏΠ°ΡΡ Ρ
Π΄ΠΎΠΊΠ»Π°Π΄ΠΎΠΌ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΡΠ΅Π½ΡΠΈΠΈ Heisenbug 2020 Piter. Π Π°ΡΡΠΊΠ°ΠΆΡ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ, ΠΊΠ°ΠΊ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΠΎΡΠΈΠ±ΠΎΠΊ ΠΏΡΠΈ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ΅ ΡΠ΅ΡΡΠΎΠ²ΡΡ Π΄Π°Π½Π½ΡΡ , Π½ΠΎ ΠΈ ΠΏΠΎΠ΄Π΅Π»ΡΡΡ ΡΠ²ΠΎΠΈΠΌΠΈ ΡΠ΅ΠΊΡΠ΅ΡΠ°ΠΌΠΈ ΡΠ°Π±ΠΎΡΡ Ρ Π½Π°Π±ΠΎΡΠ°ΠΌΠΈ Π΄Π°Π½Π½ΡΡ Π² Java-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ !
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com