Доираҳои ҷаҳаннам бо Actions GitHub (сохтани лӯлаи CI/CD барои лоиҳаи Java)

Доираҳои ҷаҳаннам бо Actions GitHub (сохтани лӯлаи CI/CD барои лоиҳаи Java)

Ба ман лозим меояд, ки барои сохтани лоиҳаҳо дар Ява қубур созам. Баъзан он манбаи кушода аст, баъзан он нест. Ман ба наздикӣ тасмим гирифтам, ки баъзе аз анборҳои худро аз Travis-CI ва TeamCity ба GitHub Actions интиқол диҳам ва ин чизест, ки аз он ба вуҷуд омадааст.

Мо чиро автоматӣ хоҳем кард?

Аввалан, ба мо лоиҳае лозим аст, ки онро автоматӣ кунем, биёед дар Spring boot / Java 11 / Maven як барномаи хурд созем. Барои мақсадҳои ин мақола, мо ба мантиқи барнома умуман таваҷҷӯҳ зоҳир нахоҳем кард; инфрасохтори атрофи барнома барои мо муҳим аст, аз ин рӯ барои мо як контролери оддии REST API кифоя мекунад.

Шумо метавонед манбаъҳоро дар ин ҷо бубинед: github.com/antkorwin/github-actions Ҳама марҳилаҳои сохтмони қубур дар дархостҳои ҷалби ин лоиҳа инъикос ёфтаанд.

JIRA ва банақшагирӣ

Бояд гуфт, ки мо одатан JIRA-ро ҳамчун трекери масъала истифода мебарем, аз ин рӯ биёед барои ин лоиҳа тахтаи алоҳида эҷод кунем ва масъалаҳои аввалро дар он ҷо илова кунем:

Доираҳои ҷаҳаннам бо Actions GitHub (сохтани лӯлаи 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 — чунин аст тавсифи вокеае, ки дар он сценарияи мо cap мешавад.

оид ба: pull_request/push — нишон медиҳад, ки ин ҷараёни кор бояд ҳар дафъае, ки ба усто тела дода мешавад ва дархостҳои кашидан эҷод карда мешаванд, оғоз карда шавад.

Дар зер тавсифи вазифаҳо (љойњои) ва қадамҳои иҷро (қадам) барои ҳар як вазифа.

давидан - дар ин ҷо мо метавонем OS-и ҳадафро интихоб кунем, тааҷҷубовар аст, ки шумо ҳатто метавонед Mac OS-ро интихоб кунед, аммо дар анбори хусусӣ ин хеле гарон аст (дар муқоиса бо Linux).

истифодаи ба шумо имкон медиҳад, ки амалҳои дигарро дубора истифода баред, масалан, бо истифода аз амали амалҳо/setup-java мо муҳити Java 11-ро насб мекунем.

Бо кӯмаки бо мо метавонем параметрҳоеро муайян кунем, ки бо онҳо амалро оғоз мекунем, аслан ин далелҳое мебошанд, ки ба амал интиқол дода мешаванд.

Танҳо иҷрои лоиҳа дар Maven боқӣ мемонад: run: mvn -B clean package флаг -B мегӯяд, ки ба мо режими интерактивӣ лозим аст, то мавен ногаҳон намехоҳад аз мо чизе пурсад

Доираҳои ҷаҳаннам бо Actions GitHub (сохтани лӯлаи CI/CD барои лоиҳаи Java)

Аҷоиб! Ҳоло, ҳар дафъае, ки шумо ба усто ваъда медиҳед, сохтмони лоиҳа оғоз мешавад.

Оғози санҷиши автоматӣ

Монтаж хуб аст, аммо дар асл, лоиҳаро бехатар ҷамъ кардан мумкин аст, аммо кор намекунад. Аз ин рӯ, қадами оянда автоматикунонии санҷишҳо мебошад. Илова бар ин, ҳангоми гузаронидани баррасии 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 илова кунед:

Доираҳои ҷаҳаннам бо Actions GitHub (сохтани лӯлаи CI/CD барои лоиҳаи Java)

Шумо метавонед нишона гиред codecov.io Пас аз авторизатсия тавассути GitHub, барои илова кардани лоиҳаи ҷамъиятӣ шумо танҳо бояд истиноди зеринро пайгирӣ кунед: Номи корбари GitHub/[номи репо]. Анбори хусусӣ низ метавонад илова карда шавад; барои ин, шумо бояд ба барнома дар Github ҳуқуқи codecov диҳед.

Доираҳои ҷаҳаннам бо Actions GitHub (сохтани лӯлаи 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 ҳар як дархости моро ворид мекунад ва диаграммаи тағирёбии фарогириро илова мекунад:

Доираҳои ҷаҳаннам бо Actions GitHub (сохтани лӯлаи CI/CD барои лоиҳаи Java)

Биёед як анализатори статикиро илова кунем

Дар аксари лоиҳаҳои кушодаи ман ман абри sonar-ро барои таҳлили коди статикӣ истифода мебарам, пайваст шудан ба travis-ci хеле осон аст. Ҳамин тавр, ин як қадами мантиқӣ ҳангоми гузаштан ба Actions GitHub барои анҷом додани ҳамин кор аст. Бозори амалиёт чизи аҷиб аст, аммо ин дафъа он маро каме ноумед кард, зеро аз рӯи одат ман амали лозимаро ёфтам ва онро ба ҷараёни кор илова кардам. Аммо маълум шуд, ки 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 [бот] метавонад ба Git ворид шавад, то ба мо дар дархостҳои ҷалб паём гузорад.

Dsonar.projectKey — номи лоиха дар сонар, шумо онро дар танзимоти лоиха дидан мумкин аст.

Dsonar.organization — номи ташкилот аз GitHub.

Мо дархости ҷалб мекунем ва интизорем, ки sonarcloud [бот] дар шарҳҳо ворид шавад:

Доираҳои ҷаҳаннам бо Actions GitHub (сохтани лӯлаи CI/CD барои лоиҳаи Java)

Идоракунии озод

Сохт танзим карда шуд, озмоишҳо иҷро шуданд ва мо метавонем озод кунем. Биёед бубинем, ки чӣ гуна Actions GitHub метавонад идоракунии нашрҳоро хеле осон кунад.

Дар ҷои кор ман лоиҳаҳое дорам, ки пойгоҳи кодашон дар битбук аст (ҳама чиз дар он ҳикоя аст, ки “Ман рӯзона ба bitbucket менависам, шабона ба GitHub менависам”). Мутаассифона, bitbucket дорои асбобҳои дарунсохташудаи идоракунии релизҳо нест. Ин мушкилот аст, зеро барои ҳар як нашр шумо бояд ба таври дастӣ як саҳифа эҷод кунед ва ҳамаи хусусиятҳои ба релиз дохилшударо дар он ҷо партоед, дар қасрҳои ақл ҷустуҷӯ кунед, вазифаҳо дар jira, иҷро дар анбор. Имкониятҳои зиёде барои хато кардан вуҷуд доранд, шумо метавонед чизеро фаромӯш кунед ё чизеро ворид кунед, ки бори охир нашр шудааст, баъзан маълум нест, ки дархости кашиданро чӣ гуна тасниф кардан мумкин аст - ин хусусият ё ислоҳи хато аст ё санҷишҳои таҳриркунӣ ё чизи инфрасохторӣ.

Чӣ тавр амалҳои GitHub ба мо кӯмак карда метавонанд? Як амали олӣ вуҷуд дорад - таҳиягари релиз, он ба шумо имкон медиҳад, ки қолаби файли ёддоштҳои релизро барои муқаррар кардани категорияҳои дархостҳои кашидан ва ба таври худкор дар файли қайдҳои релиз гурӯҳбандӣ кунед:

Доираҳои ҷаҳаннам бо Actions GitHub (сохтани лӯлаи 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 фаромӯш кунанд? Пас маълум нест, ки онро ба кадом категория гузоред ва боз ба шумо лозим меояд, ки бо он дастӣ, бо ҳар як 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:хусусиятҳо, type:documentation, type:tests, type:config.

Доираҳои ҷаҳаннам бо Actions GitHub (сохтани лӯлаи CI/CD барои лоиҳаи Java)

Ба таври худкор эзоҳ додани дархостҳои кашидан

Азбаски мо ба чунин мавзӯъ, ба монанди кори муассир бо дархостҳои кашидан дахл кардем, бояд дар бораи чунин амале ба мисли labeler сӯҳбат кунем, он тегҳоро дар 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 намехоҳад нишонаҳоеро, ки бот илова кардааст, бубинад. Навиштани амали худ, ки ҳарду марҳиларо муттаҳид мекунад, осонтар ба назар мерасад. Аммо ҳатто дар ин шакл истифодаи он хеле қулай аст, шумо бояд ҳангоми эҷоди дархости кашидан аз рӯйхат нишона интихоб кунед.

Вақти ҷойгиркунӣ расидааст

Доираҳои ҷаҳаннам бо Actions GitHub (сохтани лӯлаи CI/CD барои лоиҳаи Java)

Ман якчанд вариантҳои ҷойгиркуниро тавассути 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 номи анбор ва соҳиби онро нигоҳ медорад (“соҳиб/repo-ном”). Барои буридани ҳама чиз аз ин сатр ба ҷуз номи анбор, мо синтаксиси 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-и commit истифода мебарем - GITHUB_SHA дар ин ҷо инчунин нозукиҳо мавҷуданд, агар шумо ин гуна сохтмонҳоро на танҳо ҳангоми якҷояшавӣ ба мастер, балки инчунин мувофиқи эҷоди дархости кашолакунӣ созед. ҳодиса, пас SHA метавонад ба хэше, ки мо дар таърихи гит мебинем, мувофиқат накунад, зеро амалҳо/амали чекӣ хэши беназири худро месозад, то аз амалҳои басташавӣ дар PR пешгирӣ кунад.

Доираҳои ҷаҳаннам бо Actions GitHub (сохтани лӯлаи CI/CD барои лоиҳаи Java)

Агар ҳама чиз хуб кор кунад, пас бахши бастаҳоро (https://github.com/antkorwin/github-actions/packages) дар репозитория кушоед, шумо тасвири нави докерро хоҳед дид:

Доираҳои ҷаҳаннам бо Actions GitHub (сохтани лӯлаи CI/CD барои лоиҳаи Java)

Дар он ҷо шумо инчунин метавонед рӯйхати версияҳои тасвири докерро бинед.

Танҳо ин аст, ки сервери моро барои кор бо ин реестр танзим кардан ва хидматро аз нав оғоз кардан аст. Ман эҳтимол дар бораи чӣ гуна ин корро тавассути 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"

Аввалан, мо он чизеро, ки сервер ба дархост ҷавоб дод, дар як тағирёбанда захира мекунем, дар қадами оянда мо тафтиш мекунем, ки вазъ 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-ро истифода мебарем; шумо метавонед дар бораи чӣ гуна гирифтани аломати бот ва ID чат дар ҳуҷҷатҳо хонед: github.com/appleboy/telegram-action

Доираҳои ҷаҳаннам бо Actions GitHub (сохтани лӯлаи CI/CD барои лоиҳаи Java)

Фаромӯш накунед, ки дар сирри Github нависед: URL барои сервер ва токенҳо барои боти телеграмма.

Роҳи бонус - JIRA барои танбалҳо

Ман ваъда додам, ки мо ба ҶИРА бармегардем ва мо баргаштем. Садҳо маротиба ман вазъро дар стенд-апҳо мушоҳида кардам, ки таҳиягарон як хусусият сохтанд, филиалро муттаҳид карданд, аммо кашидани масъаларо ба JIRA фаромӯш карданд. Албатта, агар ин ҳама дар як ҷо анҷом дода мешуд, осонтар мебуд, аммо дар асл мо дар IDE код менависем, шохаҳоро дар bitbucket ё GitHub якҷоя мекунем ва сипас вазифаҳоро ба Jira кашола мекунем, барои ин мо бояд тирезаҳои нав кушоем. , баъзан дубора ворид шавед ва ғайра. Вақте ки шумо ба таври комил дар хотир доред, ки чӣ кор кардан лозим аст, пас боз кушодани тахта ҳеҷ маъно надорад. Дар натиҷа, саҳар дар стенд ба шумо лозим аст, ки вақтро барои навсозии панели вазифаҳо сарф кунед.

GitHub инчунин дар ин вазифаи муқаррарӣ ба мо кӯмак хоҳад кард; барои шурӯъкунандагон, вақте ки мо дархости кашиданро пешниҳод мекунем, мо метавонем масъалаҳоро ба таври худкор ба сутуни code_review кашем. Ба шумо танҳо лозим аст, ки конвенсияи номи филиалро риоя кунед:

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

масалан, агар калиди лоиҳаи "Actions GitHub" GA бошад, пас GA-8-jira-bot барои ичрои вазифаи ГА-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 гиред, чӣ тавр ин корро кардан дар ин ҷо тавсиф шудааст: 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 бо истифода аз номи филиал ҳамон чизро нависам, зеро ин амал аз 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 дар боло иҷрошуда лозим аст.

Доираҳои ҷаҳаннам бо Actions GitHub (сохтани лӯлаи CI/CD барои лоиҳаи Java)

Ба ҳамин тариқ, шумо метавонед ҳангоми якҷояшавӣ ба устод ва дигар рӯйдодҳоро аз ҷараёни кории GitHub кашола кунед. Умуман, ин ҳама аз тасаввурот ва хоҳиши автоматикунонии равандҳои муқаррарии шумо вобаста аст.

натиҷаҳои

Агар шумо ба диаграммаи классикии DEVOPS назар кунед, мо ҳама марҳилаҳоро фаро гирифтем, ба истиснои амалиёт, ман фикр мекунам, ки агар шумо кӯшиш кунед, шумо метавонед дар бозор барои ҳамгироӣ бо системаи ёрирасон амале пайдо кунед, аз ин рӯ мо фарз мекунем, ки лӯлаи қубур табдил ёфтааст. мукаммал буда, аз руи истифодаи он хулосахо баровардан мумкин аст.

Доираҳои ҷаҳаннам бо Actions GitHub (сохтани лӯлаи CI/CD барои лоиҳаи Java)

Тарафдор:

  • Бозор бо амалҳои омода барои ҳама ҳолатҳо, ин хеле аҷиб аст. Дар аксари онҳо, шумо инчунин метавонед ба рамзи сарчашма нигаред, то бифаҳмед, ки чӣ гуна ҳалли мушкилоти шабеҳ ё интишори дархости хусусият ба муаллиф мустақиман дар анбори GitHub.
  • Интихоби платформаи мақсаднок барои васлкунӣ: Linux, mac OS, windows як хусусияти ҷолиб аст.
  • Бастаҳои Github як чизи олӣ аст, барои нигоҳ доштани тамоми инфрасохтор дар як ҷо қулай аст, ба шумо лозим нест, ки тавассути равзанаҳои гуногун сайр кунед, ҳама чиз дар радиуси як ё ду клики муш ҷойгир аст ва бо Actions GitHub комилан ҳамгиро шудааст. Дастгирии феҳристи Docker дар версияи ройгон низ бартарии хуб аст.
  • GitHub дар гузоришҳои сохтмон асрорро пинҳон мекунад, аз ин рӯ истифодаи он барои нигоҳ доштани паролҳо ва нишонаҳо он қадар даҳшатнок нест. Дар давоми тамоми озмоишҳои ман, ман ҳеҷ гоҳ натавонистам, ки сирри онро дар шакли покаш дар консол бубинам.
  • Барои лоиҳаҳои кушодаасос ройгон

Эзоҳ:

  • YML, хуб, ман ӯро дӯст намедорам. Ҳангоми кор бо чунин ҷараён, маъмултарин паёми масъулияте, ки ман дорам, ин аст "фикр формати yml", пас шумо гузоштани ҷадвалро фаромӯш мекунед ё онро дар хати нодуруст менависед. Умуман, дар назди экран бо транспортир ва ченак нишастан аз ҳама гуворотарин таҷрибаи корӣ нест.
  • DEBUG, ислоҳи ҷараён бо супоришҳо, иҷро кардани барқарорсозӣ ва баровардан ба консол на ҳамеша қулай аст, аммо он бештар аз категорияи "шумо аз ҳад зиёд кор кардаед" аст; шумо одат кардаед, ки бо IDEA мувофиқ кор кунед, вақте ки шумо метавонед ҳама чизро ислоҳ кунед .
  • Шумо метавонед амали худро дар ҳама чиз нависед, агар шумо онро дар Docker печонед, аммо танҳо JavaScript ба таври маҳаллӣ дастгирӣ карда мешавад, албатта ин як масъалаи завқ аст, аммо ман ба ҷои js чизи дигареро афзалтар медонам.

Хотиррасон мекунам, ки анбор бо ҳама скриптҳо дар ин ҷост: github.com/antkorwin/github-actions

Ҳафтаи оянда ман бо ӯ баромад мекунам гузориш дар конфронси Heisenbug 2020 Piter. Ман ба шумо на танҳо мегӯям, ки чӣ гуна аз хатогиҳо ҳангоми таҳияи маълумоти тестӣ канорагирӣ кунед, балки инчунин асрори кор бо маҷмӯи додаҳо дар замимаҳои Java мубодила мекунам!

Манбаъ: will.com