GitHub үйлдлүүдтэй тамын тойрог (Java төсөлд зориулсан CI/CD дамжуулах хоолой барих)

GitHub үйлдлүүдтэй тамын тойрог (Java төсөлд зориулсан CI/CD дамжуулах хоолой барих)

Би Java хэл дээр төсөл барихын тулд дамжуулах хоолой барих шаардлагатай болдог. Заримдаа энэ нь нээлттэй эх сурвалж, заримдаа тийм биш юм. Би саяхан Travis-CI болон TeamCity-ээс зарим репозиторуудыг GitHub Actions руу шилжүүлэхээр шийдсэн бөгөөд энэ нь үүнээс гарсан юм.

Бид юуг автоматжуулах вэ?

Эхлээд бидэнд автоматжуулах төсөл хэрэгтэй байна, Spring boot / Java 11 / Maven дээр жижиг програм хийцгээе. Энэ нийтлэлийн зорилгын үүднээс бид програмын логикийг огт сонирхохгүй; програмын эргэн тойрон дахь дэд бүтэц нь бидний хувьд чухал тул энгийн REST API хянагч бидэнд хангалттай байх болно.

Та эндээс эх сурвалжуудыг үзэж болно: github.com/antkorwin/github-actions Дамжуулах хоолой барих бүх үе шатыг энэ төслийн татах хүсэлтэд тусгасан болно.

JIRA ба төлөвлөлт

Бид ихэвчлэн JIRA-г асуудал хянагч болгон ашигладаг гэдгийг хэлэх нь зүйтэй болов уу, тиймээс энэ төсөлд зориулж тусдаа самбар үүсгэж, эхний асуудлуудыг энд оруулъя:

GitHub үйлдлүүдтэй тамын тойрог (Java төсөлд зориулсан CI/CD дамжуулах хоолой барих)

Хэсэг хугацааны дараа бид JIRA болон GitHub хосолсон ямар сонирхолтой зүйлсийг санал болгож болох талаар эргэн харах болно.

Бид төслийн угсралтыг автоматжуулдаг

Манай туршилтын төсөл нь maven-ээр бүтээгдсэн тул үүнийг бүтээх нь маш энгийн бөгөөд бидэнд mvn clean багц л хэрэгтэй.

Үүнийг Github Actions ашиглан хийхийн тулд бид репозиторт өөрсдийн ажлын урсгалыг тодорхойлсон файл үүсгэх хэрэгтэй болно, үүнийг энгийн yml файлаар хийж болно, би "yml програмчлалд" дуртай гэж хэлж чадахгүй, гэхдээ бид юу хийж чадах вэ - Бид үүнийг .github/ directory 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 - Энэ бол бидний зохиолыг эхлүүлэх үйл явдлын тайлбар юм.

дээр: татах_хүсэлт/түлхэх — мастер руу түлхэх болон татах хүсэлтийг үүсгэх бүрт энэ ажлын урсгалыг эхлүүлэх шаардлагатайг харуулж байна.

Дараах нь даалгаврын тайлбар юм (ажлын байр) болон гүйцэтгэх үе шатууд (алхам) ажил бүрийн хувьд.

гүйдэг - Энд бид зорилтот үйлдлийн системээ сонгож болно, гайхалтай нь та Mac OS-ийг ч сонгож болно, гэхдээ хувийн хадгалах газруудад энэ нь нэлээд үнэтэй байдаг (Линукстой харьцуулахад).

хэрэглээ Бид Java 11-д зориулсан орчинг суулгасан actions/setup-java үйлдлийг ашиглан бусад үйлдлүүдийг дахин ашиглах боломжийг танд олгоно.

Тусламжийн тусламжтайгаар хамтран Бид үйлдлийг эхлүүлэх параметрүүдийг тодорхойлж болно, үндсэндээ эдгээр нь үйлдэлд дамжуулагдах аргументууд юм.

Үлдсэн зүйл бол Maven дахь төслийн бүтцийг ажиллуулах явдал юм. run: mvn -B clean package туг -B Мавен гэнэт биднээс ямар нэг зүйл асуухыг хүсэхгүй байхын тулд бидэнд интерактив бус горим хэрэгтэй гэж хэлсэн

GitHub үйлдлүүдтэй тамын тойрог (Java төсөлд зориулсан CI/CD дамжуулах хоолой барих)

Агуу их! Одоо таныг мастерт даатгах болгонд төслийн бүтээн байгуулалт эхэлдэг.

Туршилтыг автоматжуулах

Угсрах нь сайн, гэхдээ бодит байдал дээр төслийг аюулгүйгээр угсарч болно, гэхдээ ажиллахгүй. Тиймээс дараагийн алхам бол туршилтын ажиллагааг автоматжуулах явдал юм. Нэмж дурдахад, та 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 }}

Туршилтуудыг хамрахын тулд би codecov-ийг jacoco залгаастай хамт ашигладаг. codecov өөрийн гэсэн үйлдэлтэй боловч бидний татах хүсэлттэй ажиллахын тулд тэмдэгт хэрэгтэй:

${{ secrets.CODECOV_TOKEN }} - бид энэ бүтээн байгуулалтыг нэгээс олон удаа харах болно, нууц нь GitHub-д нууц хадгалах механизм бөгөөд бид тэнд нууц үг/токен/хост/url болон репозиторын кодын санд оруулах ёсгүй бусад өгөгдлийг бичиж болно.

Та GitHub дээрх репозиторын тохиргоонд нууцлалд хувьсагч нэмж болно:

GitHub үйлдлүүдтэй тамын тойрог (Java төсөлд зориулсан CI/CD дамжуулах хоолой барих)

Та токен авах боломжтой codecov.io GitHub-ээр зөвшөөрөл авсны дараа нийтийн төсөл нэмэхийн тулд та дараах холбоосыг дагахад л хангалттай. GitHub хэрэглэгчийн нэр/[репо нэр]. Мөн хувийн репозитор нэмж болно, үүнийг хийхийн тулд та Github дахь програмд ​​​​кодковын эрхийг өгөх хэрэгтэй.

GitHub үйлдлүүдтэй тамын тойрог (Java төсөлд зориулсан CI/CD дамжуулах хоолой барих)

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>

Одоо codecov bot нь бидний татах хүсэлт бүрийг оруулж, хамрах хүрээг өөрчлөх график нэмнэ:

GitHub үйлдлүүдтэй тамын тойрог (Java төсөлд зориулсан CI/CD дамжуулах хоолой барих)

Статик анализатор нэмье

Миний ихэнх нээлттэй эхийн төслүүдэд би статик кодын шинжилгээнд sonar үүл ашигладаг бөгөөд travis-ci-тэй холбогдоход маш хялбар байдаг. Тиймээс энэ нь GitHub Actions руу шилжих нь логик алхам юм. Action market бол гайхалтай зүйл боловч энэ удаад намайг бага зэрэг унагасан, учир нь би зуршлаасаа болж өөрт хэрэгтэй үйлдлээ олж, ажлын урсгалдаа нэмсэн. Гэвч 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 - хаягаар авч болно sonarcloud.io мөн та үүнийг нууцаар бүртгүүлэх хэрэгтэй. GITHUB_TOKEN - энэ нь GitHub-ийн үүсгэсэн суурилагдсан токен бөгөөд үүний тусламжтайгаар sonarcloud[bot] Git-д нэвтэрч, татах хүсэлтэд мессеж үлдээх боломжтой болно.

Dsonar.projectKey — sonar дахь төслийн нэр, та үүнийг төслийн тохиргооноос харж болно.

Dsonar.organization — GitHub-аас байгууллагын нэр.

Бид татах хүсэлт гаргаж, sonarcloud[bot] коммент хэсэгт ирэхийг хүлээнэ.

GitHub үйлдлүүдтэй тамын тойрог (Java төсөлд зориулсан CI/CD дамжуулах хоолой барих)

Суллах удирдлага

Бүтэц тохируулагдсан, туршилтууд хийгдсэн бөгөөд бид хувилбар гаргах боломжтой. GitHub Actions нь хувилбарын менежментийг хэрхэн хялбаршуулж болохыг харцгаая.

Ажил дээрээ би кодын суурь нь bitbucket-д байдаг төслүүдтэй (бүх зүйл "Би өдөр нь bitbucket руу бичдэг, шөнө нь GitHub-д бичдэг" гэсэн үлгэрт гардаг шиг). Харамсалтай нь bitbucket-д хувилбарын удирдлагын хэрэгсэл байхгүй. Энэ нь асуудал юм, учир нь хувилбар болгоны хувьд та гар аргаар нийлсэн хуудас үүсгэж, хувилбарт багтсан бүх функцийг тэнд хаях, оюун ухааны ордон, жира дахь даалгавар, репозитороос хайх хэрэгтэй. Алдаа гаргах олон боломж байдаг, та ямар нэг зүйлийг мартаж эсвэл хамгийн сүүлд гаргасан зүйлийг оруулах боломжтой, заримдаа татах хүсэлтийг юу гэж ангилах нь тодорхойгүй байдаг - энэ нь функц эсвэл алдаа засах, эсвэл засварлах тест үү, эсвэл ямар нэг зүйл дэд бүтцийн .

GitHub-ийн үйлдэл бидэнд хэрхэн туслах вэ? Маш сайн үйлдэл байна - хувилбарын төсөл боловсруулагч, энэ нь татах хүсэлтийн ангиллыг тохируулах, тэдгээрийг хувилбарын тэмдэглэлийн файлд автоматаар бүлэглэх боломжийг олгодог хувилбарын тэмдэглэлийн файлын загвар:

GitHub үйлдлүүдтэй тамын тойрог (Java төсөлд зориулсан CI/CD дамжуулах хоолой барих)

Тайлан үүсгэх жишээ загвар (.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 дээр шошго тавихаа мартвал яах вэ? Дараа нь үүнийг аль ангилалд оруулах нь тодорхойгүй байгаа тул та үүнийг гараар, 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'

Одоо аливаа татах хүсэлтийг төрөл: засах, төрөл: онцлог, төрөл: баримт бичиг, төрөл: тест, төрөл: тохиргоо гэсэн шошгуудын аль нэгээр тэмдэглэх ёстой.

GitHub үйлдлүүдтэй тамын тойрог (Java төсөлд зориулсан CI/CD дамжуулах хоолой барих)

Татаж авах хүсэлтийн автомат тайлбар

Бид татах хүсэлттэй үр дүнтэй ажиллах сэдвийг хөндсөн тул шошгологч гэх мэт үйлдлийн талаар ярих нь зүйтэй бөгөөд энэ нь аль файлыг өөрчилсөн дээр үндэслэн PR-д шошго тавьдаг. Жишээлбэл, бид лавлахад өөрчлөлт оруулах дурын татах хүсэлтийг [үүсгэх] гэж тэмдэглэж болно .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 үйлдлүүдтэй тамын тойрог (Java төсөлд зориулсан CI/CD дамжуулах хоолой барих)

Би GitHub Actions-ээр (ssh-ээр, scp-ээр дамжуулан, docker-hub-аар) хэд хэдэн байршуулах сонголтыг туршиж үзсэн бөгөөд та дамжуулах хоолой хичнээн хазайсан байсан ч хоёртын файлыг серверт байршуулах арга замыг олох болно гэж би хэлж чадна. байна.

Дэд бүтцийг бүхэлд нь нэг дор хадгалах сонголт надад таалагдсан тул GitHub багцуудад хэрхэн байршуулахыг харцгаая (энэ нь хоёртын контент, npm, jar, 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 докерын бүртгэл рүү очих зам болон зургийнхаа нэрийг тооцоолно. Бидний хараахан олж хараагүй хэд хэдэн заль мэх байна:

  • : 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 хэш-ийн эхний цифрүүдийг ашигладаг - GITHUB_SHA энд бас нарийн ялгаа бий, хэрэв та зөвхөн мастерт нэгтгэх үед төдийгүй татах хүсэлтийн дагуу ийм бүтцийг хийвэл үйл явдал, дараа нь SHA нь бидний гитийн түүхэнд хардаг хэштэй таарахгүй байж магадгүй, учир нь үйлдэл/төлбөрийн үйлдэл нь PR-д саад учруулах үйлдлээс зайлсхийхийн тулд өөрийн өвөрмөц хэшийг үүсгэдэг.

GitHub үйлдлүүдтэй тамын тойрог (Java төсөлд зориулсан CI/CD дамжуулах хоолой барих)

Хэрэв бүх зүйл сайн болсон бол репозитор дахь багцын хэсгийг (https://github.com/antkorwin/github-actions/packages) нээвэл та шинэ докерын дүрсийг харах болно.

GitHub үйлдлүүдтэй тамын тойрог (Java төсөлд зориулсан CI/CD дамжуулах хоолой барих)

Тэнд та мөн докер зургийн хувилбаруудын жагсаалтыг харж болно.

Энэ бүртгэлтэй ажиллахаар серверээ тохируулаад үйлчилгээг дахин эхлүүлэх л үлдлээ. Үүнийг 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 дээр вэб дэгээнд огт тохирохгүй үйл явдлуудыг үүсгэж чадна гэдэгт би итгэж чадахгүй байна. Дэлгэрэнгүй мэдээллийг баримт бичигт оруулсан болно: 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"

Эхлээд бид серверийн хүсэлтэд юу гэж хариулсаныг хувьсагч болгон хадгалж, дараагийн алхамд статус ДЭЭШ байгаа эсэхийг шалгаж, хэрэв тийм биш бол алдаа гаргана. Хэрэв та үйлдлийг гараараа "дарах" хэрэгтэй бол гарах 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-г авах талаар баримтаас уншиж болно: github.com/appleboy/telegram-action

GitHub үйлдлүүдтэй тамын тойрог (Java төсөлд зориулсан CI/CD дамжуулах хоолой барих)

Github дээрх нууцын талаар бичихээ бүү мартаарай: серверийн URL болон телеграм ботын токенууд.

Шагналт зам - залхуу хүмүүст зориулсан JIRA

Би JIRA-д буцаж ирнэ гэж амласан бөгөөд бид буцаж ирлээ. Хөгжүүлэгчид нэг функц хийж, салбараа нэгтгэсэн ч асуудлыг JIRA руу чирэхээ мартсан зэрэг нөхцөл байдлыг би олон зуун удаа ажигласан. Мэдээжийн хэрэг, хэрэв энэ бүгдийг нэг дор хийсэн бол энэ нь илүү хялбар байх болно, гэхдээ үнэндээ бид IDE дээр код бичиж, салбаруудыг bitbucket эсвэл GitHub руу нэгтгэж, дараа нь Jira руу даалгавруудыг чирдэг, үүний тулд бид шинэ цонх нээх хэрэгтэй. , заримдаа дахин нэвтрэх гэх мэт. Дараа нь юу хийхээ сайн санаж байвал самбарыг дахин нээх нь утгагүй болно. Үүний үр дүнд өглөө босоод та ажлын самбарыг шинэчлэхэд цаг зарцуулах хэрэгтэй.

GitHub нь энэ ердийн ажилд бидэнд туслах болно; эхлэгчдэд бид татах хүсэлтийг илгээх үед бид асуудлыг code_review баганад автоматаар чирж болно. Та хийх ёстой зүйл бол салбарыг нэрлэх конвенцийг дагах явдал юм.

[имя проекта]-[номер таска]-название

Жишээлбэл, хэрэв "GitHub Actions" төслийн түлхүүр нь GA бол GA-8-jira-bot GA-8 даалгаврыг хэрэгжүүлэх салбар байж болно.

JIRA-тай нэгтгэх нь Atlassian-ийн үйлдлээр ажилладаг, тэдгээр нь төгс биш, зарим нь надад огт тохирохгүй байсан гэж би хэлэх ёстой. Гэхдээ бид зөвхөн тодорхой ажиллаж, идэвхтэй ашиглаж байгаа зүйлсийг л хэлэлцэх болно.

Эхлээд та atlassian/gajira-login гэсэн үйлдлийг ашиглан JIRA руу нэвтрэх хэрэгтэй

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 зах зээлээс хайвал энэ даалгаврын үйлдлийг олох боломжтой, гэхдээ Atlassian-ын энэ үйлдэл миний төсөл дээр ямар нэгэн байдлаар ажиллахыг хүсээгүй тул салбарын нэрийг ашиглан grep ашиглан ижил зүйлийг бичих шаардлагатай болсон. , тэнд юу болсныг олж мэдэхийн тулд - гараараа ижил зүйлийг хийхээс илүү урт.

Татаж авах хүсэлтийг үүсгэхдээ даалгаврыг "Код шалгах" баганад шилжүүлэх л үлдлээ.

  - 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 үйлдлүүдтэй тамын тойрог (Java төсөлд зориулсан CI/CD дамжуулах хоолой барих)

Үүний нэгэн адил та GitHub ажлын урсгалаас мастер болон бусад үйл явдлуудыг нэгтгэх үед даалгавруудыг чирж болно. Ерөнхийдөө энэ бүхэн таны төсөөлөл, ердийн үйл явцыг автоматжуулах хүслээс хамаарна.

үр дүн нь

Хэрэв та сонгодог DEVOPS диаграммыг харвал бид ажиллахаас бусад бүх үе шатыг хамарсан, хэрэв та оролдвол зах зээл дээр тусламжийн ширээний системтэй нэгтгэх арга хэмжээ авах боломжтой гэж бодож байна. нарийвчилсан байх ёстой бөгөөд түүний хэрэглээнд үндэслэн дүгнэлт хийж болно.

GitHub үйлдлүүдтэй тамын тойрог (Java төсөлд зориулсан CI/CD дамжуулах хоолой барих)

Нөхцөл:

  • Бүх тохиолдлуудад зориулсан бэлэн арга хэмжээ бүхий зах зээл, энэ нь маш сайхан юм. Тэдгээрийн дийлэнх нь та ижил төстэй асуудлыг хэрхэн шийдвэрлэхийг ойлгохын тулд эх кодыг харж эсвэл GitHub репозитор дээр зохиогчийн хүсэлтийг шууд илгээж болно.
  • Угсрах зорилтот платформыг сонгох нь: Linux, mac os, windows нь нэлээд сонирхолтой онцлог юм.
  • Github багцууд нь маш сайн зүйл бөгөөд бүх дэд бүтцийг нэг дор хадгалахад тохиромжтой, та өөр цонхоор аялах шаардлагагүй, бүх зүйл хулганы нэг эсвэл хоёр товшилтын радиус дотор байдаг бөгөөд GitHub үйлдлүүдтэй төгс нийцдэг. Үнэгүй хувилбарт Docker бүртгэлийн дэмжлэг үзүүлэх нь бас сайн давуу тал юм.
  • GitHub нь бүтээх бүртгэлд нууцыг нуудаг тул нууц үг, жетон хадгалахад ашиглах нь тийм ч аймшигтай биш юм. Бүх туршилтынхаа үеэр би нууцыг хэзээ ч консол дээр цэвэр хэлбэрээр нь харж чадаагүй.
  • Нээлттэй эхийн төслүүдэд үнэ төлбөргүй

Нөхцөл байдал:

  • YML, би түүнд дургүй. Ийм урсгалтай ажиллахад надад байдаг хамгийн түгээмэл commit мессеж бол "yml форматыг засах" бөгөөд дараа нь та хаа нэгтээ таб тавихаа мартсан эсвэл буруу мөрөнд бичдэг. Ерөнхийдөө дэлгэцийн өмнө протектор, захирагчтай суух нь тийм ч таатай зүйл биш юм.
  • DEBUG, commits ашиглан урсгалыг дибаг хийх, дахин бүтээхийг ажиллуулах, консол руу гаргах нь үргэлж тохиромжтой байдаггүй, гэхдээ энэ нь "та хэтрүүлсэн" гэсэн ангилалд багтдаг; та ямар ч зүйлийг дибаг хийх боломжтой үед тохиромжтой IDEA-тай ажиллахад дассан. .
  • Хэрэв та үүнийг Docker-д боож өгвөл ямар ч зүйл дээр өөрийн үйлдлээ бичиж болно, гэхдээ зөвхөн javascript-г дэмждэг, энэ нь мэдээжийн хэрэг таашаалын асуудал, гэхдээ би js-ийн оронд өөр зүйлийг илүүд үзэх болно.

Бүх скрипт бүхий агуулах энд байгааг сануулъя: github.com/antkorwin/github-actions

Ирэх долоо хоногт би тоглолтоо хийнэ тайлан Heisenbug 2020 Piter бага хурал дээр. Би танд тестийн өгөгдлийг бэлтгэхдээ алдаа гаргахаас хэрхэн зайлсхийх талаар хэлээд зогсохгүй Java программ дахь өгөгдлийн багцтай ажиллах нууцаа хуваалцах болно!

Эх сурвалж: www.habr.com