Circles of Hell ืขื GitHub Actions (ื‘ื ื™ื™ืช ืฆื™ื ื•ืจ CI/CD ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Java)

Circles of Hell ืขื GitHub Actions (ื‘ื ื™ื™ืช ืฆื™ื ื•ืจ CI/CD ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Java)

ืœืขืชื™ื ืงืจื•ื‘ื•ืช ืื ื™ ืฆืจื™ืš ืœื‘ื ื•ืช ืฆื™ื ื•ืจ ืœื‘ื ื™ื™ืช ืคืจื•ื™ืงื˜ื™ื ื‘ื’'ืื•ื•ื”. ืœืคืขืžื™ื ื–ื” ืงื•ื“ ืคืชื•ื— ื•ืœืคืขืžื™ื ืœื. ืœืื—ืจื•ื ื” ื”ื—ืœื˜ืชื™ ืœื ืกื•ืช ืœื”ืขื‘ื™ืจ ื—ืœืง ืžื”ืžืื’ืจื™ื ืฉืœื™ ืž-Travis-CI ื•-TeamCity ืœ-GitHub Actions, ื•ื–ื” ืžื” ืฉื™ืฆื ืžื–ื”.

ืžื” ื ืขืฉื” ืื•ื˜ื•ืžื˜ื™ืช?

ืจืืฉื™ืช, ืื ื—ื ื• ืฆืจื™ื›ื™ื ืคืจื•ื™ืงื˜ ืฉื ืขืฉื” ืื•ื˜ื•ืžื˜ื™ืช, ื‘ื•ืื• ื ืขืฉื” ืืคืœื™ืงืฆื™ื” ืงื˜ื ื” ื‘-Spring boot/Java 11/Maven. ืœืฆื•ืจืš ืžืืžืจ ื–ื” ืœื ื ืชืขื ื™ื™ืŸ ื›ืœืœ ื‘ืœื•ื’ื™ืงืช ื”ืืคืœื™ืงืฆื™ื”, ื”ืชืฉืชื™ืช ืžืกื‘ื™ื‘ ืœืืคืœื™ืงืฆื™ื” ื—ืฉื•ื‘ื” ืœื ื•, ื›ืš ืฉื‘ืงืจ REST API ืคืฉื•ื˜ ื™ืกืคื™ืง ืœื ื•.

ืืชื” ื™ื›ื•ืœ ืœืจืื•ืช ืืช ื”ืžืงื•ืจื•ืช ื›ืืŸ: github.com/antkorwin/github-actions ื›ืœ ืฉืœื‘ื™ ื‘ื ื™ื™ืช ื”ืฆื™ื ื•ืจ ื‘ืื™ื ืœื™ื“ื™ ื‘ื™ื˜ื•ื™ ื‘ื‘ืงืฉื•ืช ื”ืžืฉื™ื›ื” ืœืคืจื•ื™ืงื˜ ื–ื”.

JIRA ื•ืชื›ื ื•ืŸ

ื›ื“ืื™ ืœื•ืžืจ ืฉื‘ื“ืจืš ื›ืœืœ ืื ื• ืžืฉืชืžืฉื™ื ื‘-JIRA ื›ืžืขืงื‘ ืื—ืจ ื‘ืขื™ื•ืช, ืื– ื‘ื•ืื• ื ื™ืฆื•ืจ ืœื•ื— ื ืคืจื“ ืœืคืจื•ื™ืงื˜ ื”ื–ื” ื•ื ื•ืกื™ืฃ ืฉื ืืช ื”ื‘ืขื™ื•ืช ื”ืจืืฉื•ื ื•ืช:

Circles of Hell ืขื GitHub Actions (ื‘ื ื™ื™ืช ืฆื™ื ื•ืจ CI/CD ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Java)

ืงืฆืช ืžืื•ื—ืจ ื™ื•ืชืจ ื ื—ื–ื•ืจ ืœืื™ืœื• ื“ื‘ืจื™ื ืžืขื ื™ื™ื ื™ื JIRA ื•-GitHub ื™ื›ื•ืœื™ื ืœื”ืฆื™ืข ื‘ืฉื™ืœื•ื‘.

ืื ื• ื”ื•ืคื›ื™ื ืืช ื”ื”ืจื›ื‘ื” ืœืื•ื˜ื•ืžื˜ื™ืช ืฉืœ ื”ืคืจื•ื™ืงื˜

ืคืจื•ื™ืงื˜ ื”ื‘ื“ื™ืงื” ืฉืœื ื• ื ื‘ื ื” ื‘ืืžืฆืขื•ืช maven, ืื– ื‘ื ื™ื™ืชื• ื“ื™ ืคืฉื•ื˜ื”, ื›ืœ ืžื” ืฉืื ื—ื ื• ืฆืจื™ื›ื™ื ื–ื” ืืช ื”ื—ื‘ื™ืœื” ื”ื ืงื™ื™ื” ืฉืœ mvn.

ื›ื“ื™ ืœืขืฉื•ืช ื–ืืช ื‘ืืžืฆืขื•ืช Github Actions, ื ืฆื˜ืจืš ืœื™ืฆื•ืจ ื‘ืžืื’ืจ ืงื•ื‘ืฅ ื”ืžืชืืจ ืืช ื–ืจื™ืžืช ื”ืขื‘ื•ื“ื” ืฉืœื ื•, ื–ื” ื™ื›ื•ืœ ืœื”ื™ืขืฉื•ืช ืขื ืงื•ื‘ืฅ 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 - ื–ื” ืชื™ืื•ืจ ืฉืœ ื”ืื™ืจื•ืข ืฉื‘ื• ื”ืชืกืจื™ื˜ ืฉืœื ื• ื™ื•ืฉืง.

ื‘: pull_request/push - ืžืฆื™ื™ืŸ ืฉืฆืจื™ืš ืœื”ืคืขื™ืœ ืืช ื–ืจื™ืžืช ื”ืขื‘ื•ื“ื” ื”ื–ื• ื‘ื›ืœ ืคืขื ืฉืžืชื‘ืฆืขืช ื“ื—ื™ืคื” ืœืžืืกื˜ืจ ื•ื™ื•ืฆืจื•ืช ื‘ืงืฉื•ืช ืžืฉื™ื›ื”.

ืœื”ืœืŸ ืชื™ืื•ืจ ืฉืœ ื”ืžืฉื™ืžื•ืช (ืžืฉืจื•ืช) ื•ืฉืœื‘ื™ ื‘ื™ืฆื•ืข (ืฆืขื“ื™ื) ืขื‘ื•ืจ ื›ืœ ืžืฉื™ืžื”.

ืคื•ืขืœ ื”ืœืื” - ื›ืืŸ ืื ื—ื ื• ื™ื›ื•ืœื™ื ืœื‘ื—ื•ืจ ืืช ืžืขืจื›ืช ื”ื”ืคืขืœื” ื”ื™ืขื“, ื‘ืื•ืคืŸ ืžืคืชื™ืข, ืืชื” ื™ื›ื•ืœ ืืคื™ืœื• ืœื‘ื—ื•ืจ ื‘-Mac OS, ืื‘ืœ ื‘ืžืื’ืจื™ื ืคืจื˜ื™ื™ื ื–ื” ื“ื™ ื™ืงืจ (ื‘ื”ืฉื•ื•ืื” ืœืœื™ื ื•ืงืก).

ืฉื™ืžื•ืฉื™ื ืžืืคืฉืจ ืœืš ืœืขืฉื•ืช ืฉื™ืžื•ืฉ ื—ื•ื–ืจ ื‘ืคืขื•ืœื•ืช ืื—ืจื•ืช, ืœืžืฉืœ, ื‘ืืžืฆืขื•ืช ืคืขื•ืœืช actions/setup-java ืื ื• ืžืชืงื™ื ื™ื ืืช ื”ืกื‘ื™ื‘ื” ืขื‘ื•ืจ Java 11.

ื‘ืืžืฆืขื•ืช ืขื ืื ื• ื™ื›ื•ืœื™ื ืœืฆื™ื™ืŸ ืืช ื”ืคืจืžื˜ืจื™ื ืฉื‘ืืžืฆืขื•ืชื ืื ื• ืžืคืขื™ืœื™ื ืืช ื”ืคืขื•ืœื”, ื‘ืขืฆื ืืœื• ื”ื˜ื™ืขื•ื ื™ื ืฉื™ื•ืขื‘ืจื• ืœืคืขื•ืœื”.

ื›ืœ ืžื” ืฉื ื•ืชืจ ื”ื•ื ืœื”ืคืขื™ืœ ืืช ื‘ื ื™ื™ืช ื”ืคืจื•ื™ืงื˜ ืขื Maven: run: mvn -B clean package ื“ื’ืœ -B ืื•ืžืจ ืฉืื ื—ื ื• ืฆืจื™ื›ื™ื ืžืฆื‘ ืœื ืื™ื ื˜ืจืืงื˜ื™ื‘ื™ ื›ื“ื™ ืฉื”ืžืื‘ืŸ ืœืคืชืข ืœื ื™ืจืฆื” ืœืฉืื•ืœ ืื•ืชื ื• ืžืฉื”ื•

Circles of Hell ืขื GitHub Actions (ื‘ื ื™ื™ืช ืฆื™ื ื•ืจ CI/CD ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Java)

ื’ื“ื•ืœ! ื›ืขืช, ื‘ื›ืœ ืคืขื ืฉืืชื” ืžืชื—ื™ื™ื‘ ืœืžืืกื˜ืจ, ื‘ื ื™ื™ืช ื”ืคืจื•ื™ืงื˜ ืžืชื—ื™ืœื”.

ืื•ื˜ื•ืžืฆื™ื” ืฉืœ ื”ืฉืงื•ืช ื‘ื“ื™ืงื”

ื”ืจื›ื‘ื” ื˜ื•ื‘ื”, ืื‘ืœ ื‘ืžืฆื™ืื•ืช, ืคืจื•ื™ืงื˜ ื™ื›ื•ืœ ืœื”ื™ื•ืช ืžื•ืจื›ื‘ ื‘ื‘ื˜ื—ื”, ืื‘ืœ ืœื ืœืขื‘ื•ื“. ืœื›ืŸ, ื”ืฉืœื‘ ื”ื‘ื ื”ื•ื ืœื”ืคื•ืš ืืช ืจื™ืฆื•ืช ื”ื‘ื“ื™ืงื” ืœืื•ื˜ื•ืžื˜ื™ื•ืช. ื‘ื ื•ืกืฃ, ื“ื™ ื ื•ื— ืœื”ืกืชื›ืœ ืขืœ ืชื•ืฆืื•ืช ื”ืžืขื‘ืจ ื‘ืžื‘ื—ื ื™ื ื›ืืฉืจ ืขื•ืฉื™ื ืกืงื™ืจืช ื™ื—ืกื™ ืฆื™ื‘ื•ืจ โ€“ ื™ื•ื“ืขื™ื ื‘ื•ื•ื“ืื•ืช ืฉื”ื‘ื“ื™ืงื•ืช ืขื•ื‘ืจื•ืช ื•ืืฃ ืื—ื“ ืœื ืฉื›ื— ืœื”ืคืขื™ืœ ืืช ื”ืกื ื™ืฃ ืฉืœื• ืœืคื ื™ ื‘ื™ืฆื•ืข ืžื™ื–ื•ื’.

ื ืขืจื•ืš ื‘ื“ื™ืงื•ืช ื‘ืขืช ื™ืฆื™ืจืช ื‘ืงืฉืช pull ื•ื ืžื–ื’ ืœืชื•ืš ื”ืžืืกื˜ืจ, ื•ื‘ืžืงื‘ื™ืœ ื ื•ืกื™ืฃ ื™ืฆื™ืจืช ื“ื•ื— ืขืœ ื›ื™ืกื•ื™ ืงื•ื“.

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 ื™ืฉ ืคืขื•ืœื” ืžืฉืœื•, ืื‘ืœ ื”ื•ื ืฆืจื™ืš ืืกื™ืžื•ืŸ ื›ื“ื™ ืœืขื‘ื•ื“ ืขื ื‘ืงืฉืช ื”ืžืฉื™ื›ื” ืฉืœื ื•:

${{ secrets.CODECOV_TOKEN }} โ€” ืื ื—ื ื• ื ืจืื” ืืช ื”ื‘ื ื™ื™ื” ื”ื–ื• ื™ื•ืชืจ ืžืคืขื ืื—ืช, ืกื•ื“ื•ืช ื–ื” ืžื ื’ื ื•ืŸ ืœืื—ืกื•ืŸ ืกื•ื“ื•ืช ื‘-GitHub, ื ื•ื›ืœ ืœื›ืชื•ื‘ ืฉื ืกื™ืกืžืื•ืช/ืืกื™ืžื•ื ื™ื/ืžืืจื—ื™ื/ื›ืชื•ื‘ื•ืช ืืชืจื™ื ื•ื ืชื•ื ื™ื ื ื•ืกืคื™ื ืฉืœื ืฆืจื™ื›ื™ื ืœื”ื™ื›ืœืœ ื‘ื‘ืกื™ืก ื”ืงื•ื“ ืฉืœ ื”ืžืื’ืจ.

ืืชื” ื™ื›ื•ืœ ืœื”ื•ืกื™ืฃ ืžืฉืชื ื” ืœืกื•ื“ื•ืช ื‘ื”ื’ื“ืจื•ืช ื”ืžืื’ืจ ื‘- GitHub:

Circles of Hell ืขื GitHub Actions (ื‘ื ื™ื™ืช ืฆื™ื ื•ืจ CI/CD ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Java)

ืืชื” ื™ื›ื•ืœ ืœืงื‘ืœ ืืกื™ืžื•ืŸ ื‘ codecov.io ืœืื—ืจ ืื™ืฉื•ืจ ื‘ืืžืฆืขื•ืช GitHub, ื›ื“ื™ ืœื”ื•ืกื™ืฃ ืคืจื•ื™ืงื˜ ืฆื™ื‘ื•ืจื™, ืืชื” ืจืง ืฆืจื™ืš ืœืขืงื•ื‘ ืื—ืจ ืงื™ืฉื•ืจ ื›ื–ื”: ืฉื ืžืฉืชืžืฉ GitHub/[ืฉื ืจื™ืคื•]. ื ื™ืชืŸ ืœื”ื•ืกื™ืฃ ื’ื ืžืื’ืจ ืคืจื˜ื™; ื›ื“ื™ ืœืขืฉื•ืช ื–ืืช, ืขืœื™ืš ืœืชืช ื–ื›ื•ื™ื•ืช codecov ืœืืคืœื™ืงืฆื™ื” ื‘- Github.

Circles of Hell ืขื GitHub Actions (ื‘ื ื™ื™ืช ืฆื™ื ื•ืจ CI/CD ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Java)

ื”ื•ืกืฃ ืืช ื”ืคืœืื’ื™ืŸ 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 ื™ื–ื™ืŸ ื›ืœ ืื—ืช ืžื‘ืงืฉื•ืช ื”ืžืฉื™ื›ื” ืฉืœื ื• ื•ื™ื•ืกื™ืฃ ื’ืจืฃ ืฉื™ื ื•ื™ ื›ื™ืกื•ื™:

Circles of Hell ืขื GitHub Actions (ื‘ื ื™ื™ืช ืฆื™ื ื•ืจ CI/CD ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Java)

ื‘ื•ืื• ื ื•ืกื™ืฃ ืžื ืชื— ืกื˜ื˜ื™

ื‘ืจื•ื‘ ืคืจื•ื™ืงื˜ื™ ื”ืงื•ื“ ื”ืคืชื•ื— ืฉืœื™ ืื ื™ ืžืฉืชืžืฉ ื‘ืขื ืŸ ืกื•ื ืืจ ืœื ื™ืชื•ื— ืงื•ื“ ืกื˜ื˜ื™, ื“ื™ ืงืœ ืœื”ืชื—ื‘ืจ ืœ-travis-ci. ืื– ื–ื” ืฆืขื“ ื”ื’ื™ื•ื ื™ ื‘ืžืขื‘ืจ ืœ-GitHub Actions ืœืขืฉื•ืช ืืช ืื•ืชื• ื”ื“ื‘ืจ. ืฉื•ืง ื”ืืงืฉืŸ ื”ื•ื ื“ื‘ืจ ืžื’ื ื™ื‘, ืื‘ืœ ื”ืคืขื ื”ื•ื ืงืฆืช ืื›ื–ื‘ ืื•ืชื™, ื›ื™ ืžืชื•ืš ื”ืจื’ืœ ืžืฆืืชื™ ืืช ื”ืืงืฉืŸ ืฉื”ื™ื™ืชื™ ืฆืจื™ืš ื•ื”ื•ืกืคืชื™ ืื•ืชื• ืœืชื”ืœื™ืš ื”ืขื‘ื•ื“ื”. ืื‘ืœ ื”ืชื‘ืจืจ ืฉืกื•ื ืืจ ืื™ื ื• ืชื•ืžืš ื‘ืขื‘ื•ื“ื” ื‘ืืžืฆืขื•ืช ืคืขื•ืœื” ืœื ื™ืชื•ื— ืคืจื•ื™ืงื˜ื™ื ื‘-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 - ื ื™ืชืŸ ืœื”ืฉื™ื’ ื‘ sonarcloud.io ื•ืืชื” ืฆืจื™ืš ืœืจืฉื•ื ืืช ื–ื” ื‘ืกื•ื“ื•ืช. GITHUB_TOKEN - ื–ื”ื• ืืกื™ืžื•ืŸ ืžื•ื‘ื ื” ืฉ-GitHub ืžื™ื™ืฆืจ, ื‘ืขื–ืจืชื• sonarcloud[bot] ื™ื•ื›ืœ ืœื”ื™ื›ื ืก ืœ-Git ืขืœ ืžื ืช ืœื”ืฉืื™ืจ ืœื ื• ื”ื•ื“ืขื•ืช ื‘ื‘ืงืฉื•ืช pull.

Dsonar.projectKey - ืฉื ื”ืคืจื•ื™ืงื˜ ื‘ืกื•ื ืืจ, ืืชื” ื™ื›ื•ืœ ืœืจืื•ืช ืื•ืชื• ื‘ื”ื’ื“ืจื•ืช ื”ืคืจื•ื™ืงื˜.

ื“ืกื•ื ืจ.ืืจื’ื•ืŸ - ืฉื ื”ืืจื’ื•ืŸ ืž-GitHub.

ืื ื• ืžื’ื™ืฉื™ื ื‘ืงืฉืช ืžืฉื™ื›ื” ื•ืžื—ื›ื™ื ืฉ-sonarcloud[bot] ื™ื’ื™ืข ื‘ืชื’ื•ื‘ื•ืช:

Circles of Hell ืขื GitHub Actions (ื‘ื ื™ื™ืช ืฆื™ื ื•ืจ CI/CD ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Java)

ื ื™ื”ื•ืœ ืฉื—ืจื•ืจ

ื”-build ื”ื•ื’ื“ืจ, ื”ื‘ื“ื™ืงื•ืช ื”ื•ืคืขืœื•, ื•ืื ื—ื ื• ื™ื›ื•ืœื™ื ืœื”ื•ืฆื™ื ืžื”ื“ื•ืจื”. ื‘ื•ืื• ื ืกืชื›ืœ ื›ื™ืฆื“ ืคืขื•ืœื•ืช GitHub ื™ื›ื•ืœื•ืช ืœื”ืงืœ ื‘ื”ืจื‘ื” ืขืœ ื ื™ื”ื•ืœ ื”ื”ืคืฆื•ืช.

ื‘ืขื‘ื•ื“ื”, ื™ืฉ ืœื™ ืคืจื•ื™ืงื˜ื™ื ืฉื‘ืกื™ืก ื”ืงื•ื“ ืฉืœื”ื ื”ื•ื ื‘-bitbucket (ื”ื›ืœ ื›ืžื• ื‘ืกื™ืคื•ืจ ื”ื”ื•ื "ืื ื™ ื›ื•ืชื‘ ืœ-bitbucket ื‘ืžื”ืœืš ื”ื™ื•ื, ืžืชื—ื™ื™ื‘ ืœ-GitHub ื‘ืœื™ืœื”"). ืœืžืจื‘ื” ื”ืฆืขืจ, ืœ-bitbucket ืื™ืŸ ื›ืœื™ ื ื™ื”ื•ืœ ืžื”ื“ื•ืจื•ืช ืžื•ื‘ื ื™ื. ื–ื• ื‘ืขื™ื”, ื›ื™ ืขื‘ื•ืจ ื›ืœ ืžื”ื“ื•ืจื” ืืชื” ืฆืจื™ืš ืœื™ืฆื•ืจ ื™ื“ื ื™ืช ืขืžื•ื“ ื‘ืžืคื’ืฉ ื•ืœื–ืจื•ืง ืœืฉื ืืช ื›ืœ ื”ืคื™ืฆ'ืจื™ื ื”ื›ืœื•ืœื™ื ื‘ืžื”ื“ื•ืจื”, ืœื—ืคืฉ ื‘ืืจืžื•ื ื•ืช ื”ืžื•ื—, ืžืฉื™ืžื•ืช ื‘ื’'ื™ืจื”, ืžืชื—ื™ื™ื‘ื™ื ื‘ืžืื’ืจ. ื™ืฉ ื”ืจื‘ื” ืกื™ื›ื•ื™ื™ื ืœื˜ืขื•ืช, ืืคืฉืจ ืœืฉื›ื•ื— ืžืฉื”ื• ืื• ืœื”ื–ื™ืŸ ืžืฉื”ื• ืฉื›ื‘ืจ ืฉื•ื—ืจืจ ื‘ืคืขื ื”ืงื•ื“ืžืช, ืœืคืขืžื™ื ืคืฉื•ื˜ ืœื ื‘ืจื•ืจ ืœืžื” ืœืกื•ื•ื’ ื‘ืงืฉืช pull - ื”ืื ื–ื” ืคื™ืฆ'ืจ ืื• ืชื™ืงื•ืŸ ื‘ืื’, ืื• ื‘ื“ื™ืงื•ืช ืขืจื™ื›ื”, ืื• ืžืฉื”ื• ืชืฉืชื™ืชื™ .

ื›ื™ืฆื“ ืคืขื•ืœื•ืช GitHub ื™ื›ื•ืœื•ืช ืœืขื–ื•ืจ ืœื ื•? ื™ืฉื ื” ืคืขื•ืœื” ืžืฆื•ื™ื ืช - ืžื ืกื— ืฉื—ืจื•ืจ, ื–ื” ืžืืคืฉืจ ืœืš ืœื”ื’ื“ื™ืจ ืชื‘ื ื™ืช ืงื•ื‘ืฅ ืฉืœ ื”ืขืจื•ืช ืฉื—ืจื•ืจ ื›ื“ื™ ืœื”ื’ื“ื™ืจ ืงื˜ื’ื•ืจื™ื•ืช ืฉืœ ื‘ืงืฉื•ืช ืžืฉื™ื›ื” ื•ืœืงื‘ืฅ ืื•ืชืŸ ืื•ื˜ื•ืžื˜ื™ืช ื‘ืงื•ื‘ืฅ ื”ืขืจื•ืช ื”ืฉื—ืจื•ืจ:

Circles of Hell ืขื GitHub Actions (ื‘ื ื™ื™ืช ืฆื™ื ื•ืจ CI/CD ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Java)

ืชื‘ื ื™ืช ืœื“ื•ื’ืžื” ืœื”ื’ื“ืจืช ื“ื•ื— (.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.

Circles of Hell ืขื GitHub Actions (ื‘ื ื™ื™ืช ืฆื™ื ื•ืจ CI/CD ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Java)

ื”ืขืจื” ืื•ื˜ื•ืžื˜ื™ืช ืฉืœ ื‘ืงืฉื•ืช ืžืฉื™ื›ื”

ืžื›ื™ื•ื•ืŸ ืฉื ื’ืขื ื• ื‘ื ื•ืฉื ื›ืžื• ืขื‘ื•ื“ื” ืืคืงื˜ื™ื‘ื™ืช ืขื ื‘ืงืฉื•ืช ืžืฉื™ื›ื”, ื›ื“ืื™ ืœื“ื‘ืจ ืขืœ ืคืขื•ืœื” ื›ื–ื• ื›ืžื• ืชื™ื•ื’, ื”ื™ื ืฉืžื” ืชื’ื™ื•ืช ื‘-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 ืœื ืจื•ืฆื” ืœืจืื•ืช ืืช ื”ืชื•ื•ื™ื•ืช ืฉื ื•ืกืคื• ืขืœ ื™ื“ื™ ื”ื‘ื•ื˜. ื ืจืื” ืฉืงืœ ื™ื•ืชืจ ืœื›ืชื•ื‘ ืคืขื•ืœื” ืžืฉืœืš ื”ืžืฉืœื‘ืช ืืช ืฉื ื™ ื”ืฉืœื‘ื™ื. ืื‘ืœ ืืคื™ืœื• ื‘ืฆื•ืจื” ื–ื• ื–ื” ื“ื™ ื ื•ื— ืœืฉื™ืžื•ืฉ; ืืชื” ืฆืจื™ืš ืœื‘ื—ื•ืจ ืชื•ื•ื™ืช ืžื”ืจืฉื™ืžื” ื‘ืขืช ื™ืฆื™ืจืช ื‘ืงืฉืช ืžืฉื™ื›ื”.

ื”ื’ื™ืข ื”ื–ืžืŸ ืœืคืจื•ืก

Circles of Hell ืขื GitHub Actions (ื‘ื ื™ื™ืช ืฆื™ื ื•ืจ CI/CD ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Java)

ื ื™ืกื™ืชื™ ืžืกืคืจ ืืคืฉืจื•ื™ื•ืช ืคืจื™ืกื” ื“ืจืš GitHub Actions (ื“ืจืš ssh, ื“ืจืš scp ื•ืฉื™ืžื•ืฉ ื‘-docer-hub), ื•ืื ื™ ื™ื›ื•ืœ ืœื•ืžืจ ืฉื›ื›ืœ ื”ื ืจืื”, ืชืžืฆื ื“ืจืš ืœื”ืขืœื•ืช ืืช ื”ื‘ื™ื ืืจื™ ืœืฉืจืช, ืœื ืžืฉื ื” ื›ืžื” ื”ืฆื™ื ื•ืจ ืฉืœืš ืขืงื•ื ื”ื•ื.

ืื”ื‘ืชื™ ืืช ื”ืืคืฉืจื•ืช ืœืฉืžื•ืจ ืืช ื›ืœ ื”ืชืฉืชื™ืช ื‘ืžืงื•ื ืื—ื“, ืื– ื‘ื•ืื• ื ืกืชื›ืœ ื›ื™ืฆื“ ืœืคืจื•ืก ืœ-GitHub Packages (ื–ื”ื• ืžืื’ืจ ืœืชื•ื›ืŸ ื‘ื™ื ืืจื™, npm, jar, docker).

ืกืงืจื™ืคื˜ ืœื‘ื ื™ื™ืช ืชืžื•ื ืช docker ื•ืคืจืกื•ื ืฉืœื” ื‘ื—ื‘ื™ืœื•ืช 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 docker registry ื•ืืช ืฉื ื”ืชืžื•ื ื” ืฉืœื ื•. ื™ืฉ ื›ืืŸ ื›ืžื” ื˜ืจื™ืงื™ื ืฉืขื“ื™ื™ืŸ ืœื ื ืชืงืœื ื• ื‘ื”ื:

  • ื‘ื ื™ื™ื” ื›ืžื•: echo "::set-output name=NAME::VALUE" ืžืืคืฉืจืช ืœืš ืœื”ื’ื“ื™ืจ ืืช ื”ืขืจืš ืฉืœ ืžืฉืชื ื” ื‘ืฉืœื‘ ื”ื ื•ื›ื—ื™, ื›ืš ืฉื ื™ืชืŸ ื™ื”ื™ื” ืœืงืจื•ื ืื•ืชื• ื‘ื›ืœ ืฉืืจ ื”ืฉืœื‘ื™ื.
  • ืืชื” ื™ื›ื•ืœ ืœืงื‘ืœ ืืช ื”ืขืจืš ืฉืœ ื”ืžืฉืชื ื” ืฉื”ื•ื’ื“ืจ ื‘ืฉืœื‘ ื”ืงื•ื“ื ื“ืจืš ื”ืžื–ื”ื” ืฉืœ ืฉืœื‘ ื–ื”: ${{ steps.global_env.outputs.DOCKERHUB_IMAGE_NAME }}
  • ื”ืžืฉืชื ื” ื”ืกื˜ื ื“ืจื˜ื™ GITHUB_REPOSITORY ืžืื—ืกืŸ ืืช ืฉื ื”ืžืื’ืจ ื•ื”ื‘ืขืœื™ื ืฉืœื• ("ื‘ืขืœื™ื/ืฉื ืจื™ืคื•"). ืขืœ ืžื ืช ืœื—ืชื•ืš ื”ื›ืœ ืžื”ืฉื•ืจื” ื”ื–ื• ืžืœื‘ื“ ืฉื ื”ืžืื’ืจ, ื ืฉืชืžืฉ ื‘ืชื—ื‘ื™ืจ bash: ${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 hash ืฉืœ ื”-commit - GITHUB_SHA ื™ืฉ ื›ืืŸ ื’ื ื ื™ื•ืื ืกื™ื, ืื ืชื‘ืฆืข ื‘ื ื™ื™ื” ื›ื–ื• ืœื ืจืง ื‘ืขืช ืžื™ื–ื•ื’ ืœืชื•ืš ืžืืกื˜ืจ, ืืœื ื’ื ืขืœ ืคื™ ื™ืฆื™ืจืช ื‘ืงืฉืช ื”ืžืฉื™ื›ื” ืื™ืจื•ืข, ืื– ื™ื™ืชื›ืŸ ืฉ-SHA ืœื ื™ืชืื™ื ืœ-hash ืฉืื ื• ืจื•ืื™ื ื‘ื”ื™ืกื˜ื•ืจื™ื™ืช git, ืžื›ื™ื•ื•ืŸ ืฉืคืขื•ืœืช ื”-actions/checkout ืžื™ื™ืฆืจืช hash ื™ื™ื—ื•ื“ื™ ืžืฉืœื” ื›ื“ื™ ืœืžื ื•ืข ืคืขื•ืœื•ืช ืžื‘ื•ื™ ืกืชื•ื ื‘-PR.

Circles of Hell ืขื GitHub Actions (ื‘ื ื™ื™ืช ืฆื™ื ื•ืจ CI/CD ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Java)

ืื ื”ื›ืœ ื”ืกืชื“ืจ ื›ืฉื•ืจื”, ื•ืื– ืคืชื™ื—ืช ืžื“ื•ืจ ื”ื—ื‘ื™ืœื•ืช (https://github.com/antkorwin/github-actions/packages) ื‘ืžืื’ืจ, ืชืจืื” ืชืžื•ื ืช docker ื—ื“ืฉื”:

Circles of Hell ืขื GitHub Actions (ื‘ื ื™ื™ืช ืฆื™ื ื•ืจ CI/CD ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Java)

ืฉื ืชื•ื›ืœ ื’ื ืœืจืื•ืช ืจืฉื™ืžื” ืฉืœ ื’ืจืกืื•ืช ืฉืœ ืชืžื•ื ืช ื”-docker.

ื›ืœ ืžื” ืฉื ื•ืชืจ ื”ื•ื ืœื”ื’ื“ื™ืจ ืืช ื”ืฉืจืช ืฉืœื ื• ืœืขื‘ื•ื“ ืขื ื”ืจื™ืฉื•ื ื”ื–ื” ื•ืœื”ืคืขื™ืœ ืžื—ื“ืฉ ืืช ื”ืฉื™ืจื•ืช. ืื ื™ ื›ื ืจืื” ืื“ื‘ืจ ืขืœ ืื™ืš ืœืขืฉื•ืช ืืช ื–ื” ื“ืจืš systemd ื‘ืคืขื ืื—ืจืช.

ื ื™ื˜ื•ืจ

ื‘ื•ืื• ื ืกืชื›ืœ ืขืœ ืืคืฉืจื•ืช ืคืฉื•ื˜ื” ื›ื™ืฆื“ ืœื‘ืฆืข ื‘ื“ื™ืงืช ืชืงื™ื ื•ืช ืขื‘ื•ืจ ื”ืืคืœื™ืงืฆื™ื” ืฉืœื ื• ื‘ืืžืฆืขื•ืช GitHub Actions. ืœืืคืœื™ืงืฆื™ื™ืช ื”ืืชื—ื•ืœ ืฉืœื ื• ื™ืฉ ืžืคืขื™ืœ, ืื– ืื ื—ื ื• ืืคื™ืœื• ืœื ืฆืจื™ื›ื™ื ืœื›ืชื•ื‘ 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"}

ื›ืœ ืžื” ืฉืื ื—ื ื• ืฆืจื™ื›ื™ื ื–ื” ืœื›ืชื•ื‘ ืžืฉื™ืžื” ืœื‘ื“ื•ืง ืืช ื”ืฉืจืช ื‘ืืžืฆืขื•ืช cron, ื•ืื ืคืชืื•ื ื”ื•ื ืœื ืขื•ื ื” ืœื ื•, ืื– ื ืฉืœื— ื”ื•ื“ืขื” ื‘ืืžืฆืขื•ืช ืžื‘ืจืง.

ืจืืฉื™ืช, ื‘ื•ืื• ื ื‘ื™ืŸ ื›ื™ืฆื“ ืœื”ืคืขื™ืœ ื–ืจื™ืžืช ืขื‘ื•ื“ื” ืฉืœ cron:

on:
  schedule:
    - cron:  '*/5 * * * *'

ื–ื” ืคืฉื•ื˜, ืื ื™ ืืคื™ืœื• ืœื ืžืืžื™ืŸ ืฉื‘-Github ืืชื” ื™ื›ื•ืœ ืœื™ืฆื•ืจ ืื™ืจื•ืขื™ื ืฉืœื ืžืชืื™ืžื™ื ื‘ื›ืœืœ ืœ-webhooks. ืคืจื˜ื™ื ื‘ืชื™ืขื•ื“: help.github.com/en/actions/reference/events-that-trigger-workflows#scheduled-events-schedule

ื‘ื•ืื• ื ื‘ื“ื•ืง ืืช ืžืฆื‘ ื”ืฉืจืช ื‘ืื•ืคืŸ ื™ื“ื ื™ ื‘ืืžืฆืขื•ืช 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 ื•ืื ื–ื” ืœื ื”ืžืงืจื”, ืื– ื ืฆื ืขื ืฉื’ื™ืื”. ืื ืืชื” ืฆืจื™ืš "ืœื”ืฆื™ืฃ" ืคืขื•ืœื” ืขื ื”ื™ื“ื™ื™ื ืฉืœืš, ืื– ืฆื ืž- 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.com/appleboy/telegram-action

Circles of Hell ืขื GitHub Actions (ื‘ื ื™ื™ืช ืฆื™ื ื•ืจ CI/CD ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Java)

ืืœ ืชืฉื›ื— ืœื›ืชื•ื‘ ื‘ืกื•ื“ื•ืช ื‘-Github: URL ืœืฉืจืช ื•ืืกื™ืžื•ื ื™ื ืœื‘ื•ื˜ ื”ื˜ืœื’ืจื.

ืจืฆื•ืขืช ื‘ื•ื ื•ืก - JIRA ืœืขืฆืœื ื™ื

ื”ื‘ื˜ื—ืชื™ ืฉื ื—ื–ื•ืจ ืœ-JIRA, ื•ื—ื–ืจื ื•. ืžืื•ืช ืคืขืžื™ื ืจืื™ืชื™ ืžืฆื‘ ื‘ืกื˜ื ื“-ืืคื™ื ื›ืืฉืจ ืžืคืชื—ื™ื ืขืฉื• ืคื™ืฆ'ืจ, ืžื™ื–ื’ื• ืกื ื™ืฃ, ืื‘ืœ ืฉื›ื—ืชื™ ืœื’ืจื•ืจ ืืช ื”ื ื•ืฉื ืœ-JIRA. ื›ืžื•ื‘ืŸ, ืื ื›ืœ ื–ื” ื”ื™ื” ื ืขืฉื” ื‘ืžืงื•ื ืื—ื“, ื–ื” ื”ื™ื” ืงืœ ื™ื•ืชืจ, ืื‘ืœ ืœืžืขืฉื” ืื ื—ื ื• ื›ื•ืชื‘ื™ื ืงื•ื“ ื‘-IDE, ืžืžื–ื’ื™ื ืกื ื™ืคื™ื ืœืชื•ืš bitbucket ืื• GitHub, ื•ืื– ื’ื•ืจืจื™ื ืืช ื”ืžืฉื™ืžื•ืช ืœืชื•ืš Jira, ื‘ืฉื‘ื™ืœ ื–ื” ืื ื—ื ื• ืฆืจื™ื›ื™ื ืœืคืชื•ื— ื—ืœื•ื ื•ืช ื—ื“ืฉื™ื , ืœืคืขืžื™ื ืœื”ื™ื›ื ืก ืฉื•ื‘ ื•ื›ื•'. ื›ืืฉืจ ืืชื” ื–ื•ื›ืจ ื”ื™ื˜ื‘ ืžื” ืืชื” ืฆืจื™ืš ืœืขืฉื•ืช ื”ืœืื”, ืื– ืื™ืŸ ื˜ืขื ืœืคืชื•ื— ืืช ื”ืœื•ื— ืฉื•ื‘. ื›ืชื•ืฆืื” ืžื›ืš, ื‘ื‘ื•ืงืจ ื‘ืกื˜ื ื“ืืค ืืชื” ืฆืจื™ืš ืœื”ืงื“ื™ืฉ ื–ืžืŸ ืœืขื“ื›ื•ืŸ ืœื•ื— ื”ืžืฉื™ืžื•ืช.

GitHub ื’ื ื™ืขื–ื•ืจ ืœื ื• ื‘ืžืฉื™ืžื” ื”ืฉื’ืจืชื™ืช ื”ื–ื•; ื‘ืชื•ืจ ื”ืชื—ืœื”, ืื ื• ื™ื›ื•ืœื™ื ืœื’ืจื•ืจ ื‘ืขื™ื•ืช ืื•ื˜ื•ืžื˜ื™ืช ืœืขืžื•ื“ืช code_review ื›ืืฉืจ ืื ื• ืฉื•ืœื—ื™ื ื‘ืงืฉืช ืžืฉื™ื›ื”. ื›ืœ ืžื” ืฉืืชื” ืฆืจื™ืš ืœืขืฉื•ืช ื”ื•ื ืœืขืงื•ื‘ ืื—ืจ ืžื•ืกื›ืžื•ืช ืฉืžื•ืช ื”ืกื ื™ืคื™ื:

[ะธะผั ะฟั€ะพะตะบั‚ะฐ]-[ะฝะพะผะตั€ ั‚ะฐัะบะฐ]-ะฝะฐะทะฒะฐะฝะธะต

ืœื“ื•ื’ืžื”, ืื ืžืคืชื— ื”ืคืจื•ื™ืงื˜ "GitHub Actions" ื”ื•ื 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, ืื™ืš ืœืขืฉื•ืช ื–ืืช ืžืชื•ืืจ ื›ืืŸ: confluence.atlassian.com/cloud/api-tokens-938839638.html

ืื ื• ืžื—ืœืฆื™ื ืืช ืžื–ื”ื” ื”ืžืฉื™ืžื” ืžืฉื ื”ืกื ื™ืฃ:

  - 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 ื‘ืืžืฆืขื•ืช ืฉื ื”ืกื ื™ืฃ, ื›ื™ ื”ืคืขื•ืœื” ื”ื–ื• ืžืื˜ืœืกื™ืืŸ ืœื ืจืฆืชื” ืœืขื‘ื•ื“ ืขืœ ื”ืคืจื•ื™ืงื˜ ืฉืœื™ ื‘ืฉื•ื ืื•ืคืŸ , ื›ื“ื™ ืœื”ื‘ื™ืŸ ืžื” ืœื ื‘ืกื“ืจ ืฉื - ื™ื•ืชืจ ื–ืžืŸ ืžืืฉืจ ืœืขืฉื•ืช ืืช ืื•ืชื• ื”ื“ื‘ืจ ืขื ื”ื™ื“ื™ื™ื.

ื›ืœ ืžื” ืฉื ื•ืชืจ ื”ื•ื ืœื”ืขื‘ื™ืจ ืืช ื”ืžืฉื™ืžื” ืœืขืžื•ื“ื” "ืกืงื™ืจืช ืงื•ื“" ื‘ืขืช ื™ืฆื™ืจืช ื‘ืงืฉืช ืžืฉื™ื›ื”:

  - name: Transition issue
    if: ${{ success() }}
    uses: atlassian/gajira-transition@master
    with:
      issue: ${{ steps.find_issue.outputs.ISSUE_ID }}
      transition: "Code review"

ื™ืฉื ื” ืคืขื•ืœื” ืžื™ื•ื—ื“ืช ืœื›ืš ื‘-GitHub, ื›ืœ ืžื” ืฉื”ื•ื ืฆืจื™ืš ื–ื” ืืช ืžื–ื”ื” ื”ื‘ืขื™ื” ืฉื”ื•ืฉื’ ื‘ืฉืœื‘ ื”ืงื•ื“ื ื•ื”ื”ืจืฉืื” ื‘-JIRA ืฉืขืฉื™ื ื• ืœืžืขืœื”.

Circles of Hell ืขื GitHub Actions (ื‘ื ื™ื™ืช ืฆื™ื ื•ืจ CI/CD ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Java)

ื‘ืื•ืชื• ืื•ืคืŸ, ืืชื” ื™ื›ื•ืœ ืœื’ืจื•ืจ ืžืฉื™ืžื•ืช ื‘ืขืช ืžื™ื–ื•ื’ ืœืชื•ืš ื”ืžืืกื˜ืจ, ื•ืื™ืจื•ืขื™ื ืื—ืจื™ื ืžื–ืจื™ืžืช ื”ืขื‘ื•ื“ื” ืฉืœ GitHub. ื‘ืื•ืคืŸ ื›ืœืœื™, ื”ื›ืœ ืชืœื•ื™ ื‘ื“ืžื™ื•ืŸ ื•ื‘ืจืฆื•ืŸ ืฉืœื›ื ืœื”ืคื•ืš ืชื”ืœื™ื›ื™ื ืฉื’ืจืชื™ื™ื ืœืื•ื˜ื•ืžื˜ื™ื™ื.

ืžืžืฆืื™ื

ืื ืชืกืชื›ืœ ืขืœ ื“ื™ืื’ืจืžืช DEVOPS ื”ืงืœืืกื™, ื›ื™ืกื™ื ื• ืืช ื›ืœ ื”ืฉืœื‘ื™ื, ืคืจื˜ ืื•ืœื™ ืœืชืคืขื•ืœ, ืื ื™ ื—ื•ืฉื‘ ืฉืื ืชื ืกื”, ืชื•ื›ืœ ืœืžืฆื•ื ืคืขื•ืœื” ื›ืœืฉื”ื™ ื‘ืฉื•ืง ืœืื™ื ื˜ื’ืจืฆื™ื” ืขื ืžืขืจื›ืช ื”-Help-Desk, ืื– ื ื ื™ื— ืฉื”ืฆื™ื ื•ืจ ื”ืชื”ืคืš ืœื”ื™ื•ืช ื™ืกื•ื“ื™ ื•ื ื™ืชืŸ ืœื”ืกื™ืง ืžืกืงื ื•ืช ืขืœ ืกืžืš ื”ืฉื™ืžื•ืฉ ื‘ื•.

Circles of Hell ืขื GitHub Actions (ื‘ื ื™ื™ืช ืฆื™ื ื•ืจ CI/CD ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ Java)

ื™ืชืจื•ื ื•ืช:

  • ืฉื•ืง ืขื ืคืขื•ืœื•ืช ืžื•ื›ื ื•ืช ืœื›ืœ ืื™ืจื•ืข, ื–ื” ืžืื•ื“ ืžื’ื ื™ื‘. ื‘ืจื•ื‘ื ืชื•ื›ืœื• ื’ื ืœื”ืกืชื›ืœ ื‘ืงื•ื“ ื”ืžืงื•ืจ ื›ื“ื™ ืœื”ื‘ื™ืŸ ื›ื™ืฆื“ ืœืคืชื•ืจ ื‘ืขื™ื” ื“ื•ืžื” ืื• ืœืคืจืกื ื‘ืงืฉืช ืชื›ื•ื ื” ืœืžื—ื‘ืจ ื™ืฉื™ืจื•ืช ื‘ืžืื’ืจ GitHub.
  • ื‘ื—ื™ืจืช ืคืœื˜ืคื•ืจืžืช ื”ื™ืขื“ ืœื”ืจื›ื‘ื”: ืœื™ื ื•ืงืก, mac os, windows ื”ื™ื ืชื›ื•ื ื” ืžืขื ื™ื™ื ืช ืœืžื“ื™.
  • ื—ื‘ื™ืœื•ืช Github ื–ื” ื“ื‘ืจ ื ื”ื“ืจ, ื ื•ื— ืœืฉืžื•ืจ ืืช ื›ืœ ื”ืชืฉืชื™ืช ื‘ืžืงื•ื ืื—ื“, ืœื ืฆืจื™ืš ืœื’ืœื•ืฉ ื“ืจืš ื—ืœื•ื ื•ืช ืฉื•ื ื™ื, ื”ื›ืœ ื ืžืฆื ื‘ืจื“ื™ื•ืก ืฉืœ ืœื—ื™ืฆืช ืขื›ื‘ืจ ืื—ืช ืื• ืฉืชื™ื™ื ื•ืžืฉื•ืœื‘ ื‘ืฆื•ืจื” ืžื•ืฉืœืžืช ืขื GitHub Actions. ืชืžื™ื›ื” ื‘ืจื™ืฉื•ื Docker ื‘ื’ืจืกื” ื”ื—ื™ื ืžื™ืช ื”ื™ื ื’ื ื™ืชืจื•ืŸ ื˜ื•ื‘.
  • GitHub ืžืกืชื™ืจ ืกื•ื“ื•ืช ื‘ื™ื•ืžื ื™ ื‘ื ื™ื™ื”, ื›ืš ืฉื”ืฉื™ืžื•ืฉ ื‘ื• ืœืื—ืกื•ืŸ ืกื™ืกืžืื•ืช ื•ืืกื™ืžื•ื ื™ื ืื™ื ื• ื›ืœ ื›ืš ืžืคื—ื™ื“. ื‘ืžื”ืœืš ื›ืœ ื”ื ื™ืกื•ื™ื™ื ืฉืœื™, ืžืขื•ืœื ืœื ื”ืฆืœื—ืชื™ ืœืจืื•ืช ืืช ื”ืกื•ื“ ื‘ืฆื•ืจืชื• ื”ื˜ื”ื•ืจื” ื‘ืงื•ื ืกื•ืœื”.
  • ื—ื™ื ื ืขื‘ื•ืจ ืคืจื•ื™ืงื˜ื™ื ื‘ืงื•ื“ ืคืชื•ื—

ื—ืกืจื•ื ื•ืช:

  • YML, ื•ื‘ื›ืŸ, ืื ื™ ืœื ืื•ื”ื‘ ืื•ืชื•. ื›ืฉืขื•ื‘ื“ื™ื ืขื ื–ืจื™ืžื” ื›ื–ื•, ื”ื•ื“ืขืช ื”-commit ื”ื ืคื•ืฆื” ื‘ื™ื•ืชืจ ืฉื™ืฉ ืœื™ ื”ื™ื "ืชืงืŸ yml ืคื•ืจืžื˜", ื•ืื– ืืชื” ืฉื•ื›ื— ืœืฉื™ื ื˜ืื‘ ืื™ืคืฉื”ื•, ืื• ืฉืืชื” ื›ื•ืชื‘ ืื•ืชื• ื‘ืฉื•ืจื” ื”ืœื ื ื›ื•ื ื”. ื‘ื›ืœืœ, ื™ืฉื™ื‘ื” ืžื•ืœ ืžืกืš ืขื ืžื“ ื–ื•ื•ื™ืช ื•ืกืจื’ืœ ื–ื• ืœื ื”ื—ื•ื•ื™ื” ื”ื›ื™ ื ืขื™ืžื”.
  • DEBUG, ืื™ืชื•ืจ ื‘ืื’ื™ื ืฉืœ ื”ื–ืจื™ืžื” ืขื commits, ื”ืคืขืœืช ื‘ื ื™ื™ื” ืžื—ื“ืฉ ื•ืคืœื˜ ืœืงื•ื ืกื•ืœื” ื–ื” ืœื ืชืžื™ื“ ื ื•ื—, ืื‘ืœ ื–ื” ื™ื•ืชืจ ืžืงื˜ื’ื•ืจื™ื™ืช "ื”ื’ื–ืžืชื"; ืืชื” ืจื’ื™ืœ ืœืขื‘ื•ื“ ืขื IDEA ื ื•ื—, ื›ืืฉืจ ืืชื” ื™ื›ื•ืœ ืœื ืคื•ืช ื›ืœ ื“ื‘ืจ .
  • ืืชื” ื™ื›ื•ืœ ืœื›ืชื•ื‘ ืืช ื”ืคืขื•ืœื” ืฉืœืš ืขืœ ื›ืœ ื“ื‘ืจ ืื ืืชื” ืขื•ื˜ืฃ ืื•ืชื” ื‘-Docker, ืื‘ืœ ืจืง javascript ื ืชืžืš ื‘ืื•ืคืŸ ืžืงื•ืจื™, ื›ืžื•ื‘ืŸ ืฉื–ื” ืขื ื™ื™ืŸ ืฉืœ ื˜ืขื, ืื‘ืœ ืื ื™ ืžืขื“ื™ืฃ ืžืฉื”ื• ืื—ืจ ื‘ืžืงื•ื js.

ื”ืจืฉื• ืœื™ ืœื”ื–ื›ื™ืจ ืœื›ื ืฉื”ืžืื’ืจ ืขื ื›ืœ ื”ืกืงืจื™ืคื˜ื™ื ื ืžืฆื ื›ืืŸ: github.com/antkorwin/github-actions

ื‘ืฉื‘ื•ืข ื”ื‘ื ืื ื™ ืžื•ืคื™ืข ืขื ืœื”ื’ื™ืฉ ืชืœื•ื ื” ื‘ื›ื ืก Heisenbug 2020 Piter. ืื ื™ ืื’ื™ื“ ืœืš ืœื ืจืง ืื™ืš ืœื”ื™ืžื ืข ืžื˜ืขื•ื™ื•ืช ื‘ืขืช ื”ื›ื ืช ื ืชื•ื ื™ ื‘ื“ื™ืงื”, ืืœื ื’ื ืœืฉืชืฃ ืืช ืกื•ื“ื•ืช ื”ืขื‘ื•ื“ื” ืฉืœื™ ืขื ืขืจื›ื•ืช ื ืชื•ื ื™ื ื‘ื™ื™ืฉื•ืžื™ Java!

ืžืงื•ืจ: www.habr.com