Rrethinat e ferrit me GitHub Actions (ndërtojmë CI/CD pipeline për projektin Java)

Rrethinat e ferrit me GitHub Actions (ndërtojmë CI/CD pipeline për projektin Java)

Më ndodh shpesh të ndërtoj një pipeline për ndërtimin e projekteve në Java. Ndonjëherë janë open-source, ndonjëherë jo. Së fundmi, vendosa të provoj të transferoj disa nga depot e mia nga Travis-CI dhe TeamCity në GitHub Actions, dhe kjo është ajo që arrita.

ÇfarĂ« do tĂ« automatizojmĂ«

Për të filluar, na nevojitet një projekt që do të automatizojmë, le të krijojmë një aplikacion të vogël në Spring Boot / Java 11 / Maven. Në këtë artikull, logjika e aplikacionit nuk na intereson fare, na intereson infrastruktura përreth aplikacionit, kështu që na mjafton një kontrollues i thjeshtë REST API.

Mund ta shihni kodin burimor këtu: github.com/antkorwin/github-actions të gjitha etapet e ndërtimit të pipeline-it janë pasqyruar në pull requests të këtij projekti.

JIRA dhe planifikimi

Duhet thënë se zakonisht përdorim JIRA si një ndjekës të detyrave, kështu që le të krijojmë një bord të veçantë për këtë projekt dhe të hedhim aty detyrat e para:

Rrethinat e ferrit me GitHub Actions (ndërtojmë CI/CD pipeline për projektin Java)

Pak më vonë do të kthehemi te ajo që mund të ofrojë në lidhje JIRA dhe GitHub.

Automatizojmë ndërtimin e projektit

Projekti ynë testues ndërttohet përmes maven, kështu që ndërtimi i tij është mjaft i thjeshtë, e gjithë çfarë na nevojitet është mvn clean package.

PĂ«r ta bĂ«rĂ« kĂ«tĂ« me ndihmĂ«n e GitHub Actions, na nevojitet tĂ« krijojmĂ« nĂ« repository njĂ« skedĂ« me pĂ«rshkrimin e workflow-t tonĂ«, kjo mund tĂ« bĂ«het me njĂ« skedĂ« tĂ« zakonshme yml, nuk mund tĂ« them se mĂ« pĂ«lqen «programimi nĂ« yml», por çfarĂ« tĂ« bĂ«jmĂ« — krijojmĂ« nĂ« direktorinĂ« .github/workflow/ skedĂ«n build.yml nĂ« tĂ« cilĂ«n do tĂ« pĂ«rshkruajmĂ« veprimet gjatĂ« ndĂ«rtimit tĂ« degĂ«s master:

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

nĂ« — kjo Ă«shtĂ« pĂ«rshkrimi i ngjarjes qĂ« do tĂ« aktivizojĂ« skriptin tonĂ«.

on: pull_request / push — tregon se ky workflow duhet tĂ« aktivizohet nĂ« çdo push nĂ« master dhe krijimin e pull requests.

Më pas shkon përshkrimi i detyrave (jobs) dhe hapat e ekzekutimit (steps) për secilën detyrë.

runs-on — kĂ«tu mund tĂ« zgjedhim sistemin operativ tĂ« destinacionit, me befasinĂ« mund tĂ« zgjidhni edhe Mac OS, por nĂ« repository private, kjo Ă«shtĂ« njĂ« kĂ«naqĂ«si mjaft e kushtueshme (nĂ« krahasim me linux).

uses lejon ri-përdorimin e veprimeve të tjera, kështu që, për shembull, me anë të veprimit actions/setup-java ne instalojmë ambientin për Java 11.

With the help of with Ne mund të përcaktojmë parametrat me të cilat aktivizojmë veprimin, në thelb, këto janë argumentet që do të kalohen në aksion.

Tani mbetet vetëm të përfundojmë ndërtimin e projektit me Maven: run: mvn -B clean package --all -B tregon që na nevojitet modu i mos-interaksionit, për të mos lejuar që Maven të kërkojë ndonjëherë diçka prej nesh

Rrethinat e ferrit me GitHub Actions (ndërtojmë CI/CD pipeline për projektin Java)

Fantastike! Tani, me çdo commit në master, ndërtohet projekti.

Automatizojmë nisjen e testeve

NdĂ«rtimi Ă«shtĂ« i mirĂ«, por nĂ« realitet projekti mund tĂ« ndĂ«rtohet pa problem, por tĂ« mos funksionojĂ«. Prandaj, hapi vijues Ă«shtĂ« automatizimi i ekzekutimit tĂ« testeve. PĂ«r mĂ« tepĂ«r, Ă«shtĂ« shumĂ« e dobishme tĂ« shikosh rezultatin e kalimit tĂ« testeve kur bĂ«n rishikimin e PR — e di me siguri qĂ« testet kalojnĂ« dhe askush nuk ka harruar tĂ« ekzekutojĂ« degĂ«n e tij para se tĂ« bĂ«jĂ« merge.

Bëjmë nisjen e testeve gjatë krijimit të pull-request-it dhe merge në master, dhe po ashtu do të shtojmë ndërtimin e raportit mbi mbulimin e kodit.

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 }}

Për mbulimin e testeve përdor codecov në kombinim me plugjin jacoco. Codecov ka veprimin e tij, por për të punuar me pull-request-in tonë, i nevojitet një token:

${{ secrets.CODECOV_TOKEN }} — njĂ« konstrukt tĂ« tillĂ« do ta takojmĂ« edhe disa herĂ«, secrets Ă«shtĂ« mekanizmi i ruajtjes sĂ« sekreteve nĂ« GitHub, ku mund tĂ« pĂ«rshkruajmĂ« fjalĂ«kalime/tokenĂ«/hoste/URL dhe tĂ« dhĂ«na tĂ« tjera qĂ« nuk duhet tĂ« shfaqen nĂ« kodin burim.

Të shtosh një variabël në secrets, mund të bëhet në cilësimet e depozitës në GitHub:

Rrethinat e ferrit me GitHub Actions (ndërtojmë CI/CD pipeline për projektin Java)

Mund tĂ« marrĂ«sh tokenin nĂ« codecov.io pas autorizimit pĂ«rmes GitHub, pĂ«r tĂ« shtuar njĂ« projekt publik, thjesht duhet tĂ« ndjekĂ«sh njĂ« lidhje tĂ« kĂ«tij lloji: Emri i pĂ«rdoruesit tĂ« GitHub/[repo name]. ПроĐČĐ°Ń‚ĐœŃ‹Đč Ń€Đ”ĐżĐŸĐ·ĐžŃ‚ĐŸŃ€ĐžĐč Ń‚ĐŸĐ¶Đ” ĐŒĐŸĐ¶ĐœĐŸ ĐŽĐŸĐ±Đ°ĐČоть, ĐŽĐ»Ń ŃŃ‚ĐŸĐłĐŸ ĐœĐ°ĐŽĐŸ Юать праĐČа codecov ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃŽ ĐČ ĐłĐžŃ‚Ń…Đ°Đ±Đ”.

Rrethinat e ferrit me GitHub Actions (ndërtojmë CI/CD pipeline për projektin Java)

Shtojmë plugjin jacoco në skedarin POM:

org.jacoco
	jacoco-maven-plugin
	0.8.4
	
		
			
				prepare-agent
			
		
		
		
			report
			test
			
				report
			
		
	


	org.apache.maven.plugins
	maven-surefire-plugin
	2.22.2
	
		plain
		
			**/*Test*.java
			**/*IT*.java

Tani tani çdo pull request do të hyjë boti codecov dhe do të shtojë grafikun e ndryshimit të mbulimit:

Rrethinat e ferrit me GitHub Actions (ndërtojmë CI/CD pipeline për projektin Java)

Të shtojmë një analizues statik

Në shumicën e projekteve të mia open source unë përdor sonar cloud për analizën statike të kodit, është mjaft e lehtë të lidhet me travis-ci. Pra, ky është një hap logjik gjatë migrimit në GitHub Actions, të bëjmë të njëjtën gjë. Marketingu i veprimeve është një gjë e shkëlqyer, por këtë herë ai më ka lënë pak në baltë, sepse për zakon kam gjetur veprimin e nevojshëm dhe e kam shkruar atë në workflow. Doli se sonar nuk mbështet funksionimin përmes veprimit për analizimin e projekteve në maven ose gradle. Kjo është shpjeguar natyrisht në dokumentacion, por kush e lexon atë?!

Përmes veprimit nuk është e mundur, kështu që do ta bëjmë përmes mvn plugin:

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 — mund tĂ« merret nĂ« sonarcloud.io dhe duhet tĂ« shkruhet nĂ« secrets. GITHUB_TOKEN — Ă«shtĂ« njĂ« token i integruar, i cili gjenerohet nga GitHub, me tĂ« cilin sonarcloud[bot] do tĂ« mund tĂ« autentikohet nĂ« git, pĂ«r tĂ« lĂ«nĂ« komente nĂ« pull requestet.

Dsonar.projectKey — emri i projektit nĂ« sonar, mund tĂ« shikohet nĂ« cilĂ«simet e projektit.

Dsonar.organization — emri i organizatĂ«s nga GitHub.

Bëmë një pull request dhe presim, kur sonarcloud[bot] të vijë me komente:

Rrethinat e ferrit me GitHub Actions (ndërtojmë CI/CD pipeline për projektin Java)

Menaxhimi i lëshimeve

Ndërtimin e kemi konfiguruar, testet i kemi kryer, tani mund të bëjmë një lëshim. Le të shohim se si GitHub Actions ndihmon shumë në thjeshtimin e menaxhimit të lëshimeve.

NĂ« punĂ« kam projekte, baza e kodit tĂ« cilĂ«ve ndodhet nĂ« bitbucket (siç thotĂ« historia «nĂ« ditĂ« shkruaj nĂ« bitbucket, nĂ« natĂ« komitoj nĂ« GitHub»). FatkeqĂ«sisht, bitbucket nuk ka mjete tĂ« ndĂ«rtuara pĂ«r menaxhimin e lĂ«shimeve. Kjo Ă«shtĂ« njĂ« problem, sepse pĂ«r çdo lĂ«shim duhet tĂ« krijohet manualisht njĂ« faqe nĂ« confluence dhe tĂ« derdhen atje tĂ« gjitha karakteristikat qĂ« janĂ« pĂ«rfshirĂ« nĂ« lĂ«shim, tĂ« rishikohet tĂ«rĂ« mendja, detyrat nĂ« jira, komitet nĂ« depo. Ka shumĂ« shanse pĂ«r gabime, mund tĂ« harrohet diçka ose tĂ« shkruhet ajo qĂ« Ă«shtĂ« lĂ«shuar mĂ« herĂ«t, ndonjĂ«herĂ« Ă«shtĂ« thjesht e paqartĂ« se çfarĂ« duhet t'i atribuohesh njĂ« pull-request-i — Ă«shtĂ« njĂ« karakteristikĂ« apo njĂ« rregullim gabimesh, ose njĂ« rregullim testesh, ose diçka infrastrukturore.

Si mund tĂ« na ndihmojĂ« GitHub actions? Ka njĂ« ekzekutues tĂ« shkĂ«lqyer — release drafter, ai lejon tĂ« pĂ«rcaktohet njĂ« shabllon i skedarit release notes, nĂ« mĂ«nyrĂ« qĂ« tĂ« konfigurohen kategoritĂ« e pull-request-eve dhe t'i grupojĂ« automatikisht ato nĂ« skedarin release notes:

Rrethinat e ferrit me GitHub Actions (ndërtojmë CI/CD pipeline për projektin Java)

Shembuj i shabllonit për konfigurimin e raportit (.github/release-drafter.yml):

name-template: 'v$NEXT_PATCH_VERSION'
tag-template: 'v$NEXT_PATCH_VERSION'
categories:
  - title: ' Karakteristika të Reja'
    labels:
      - 'type:features'
# në këtë kategori mbledhim të gjitha PR me etiketën type:features

  - title: ' Rregullime Gabimesh'
    labels:
      - 'type:fix'
# njësoj për etiketën type:fix etj.

  - title: ' Dokumentacion'
    labels:
      - 'type:documentation'

  - title: ' Konfigurim'
    labels:
      - 'type:config'

change-template: '- $TITLE @$AUTHOR (#$NUMBER)'
template: |
  ## Ndryshimet
  $CHANGES

Shtojmë skriptin për gjenerimin e një skice të lëshimit (.github/workflows/release-draft.yml):

name: "Krijo skicën e lëshimit"

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 }}

TĂ« gjitha pull-request-et nga ky moment do tĂ« grumbullohen automatikisht nĂ« release notes — magji!

KĂ«tu mund tĂ« lindĂ« pyetja: çfarĂ« nĂ«se zhvilluesit harrojnĂ« tĂ« vendosin etiketat nĂ« PR? AtĂ«herĂ« Ă«shtĂ« e paqartĂ«, nĂ« cilĂ«n kategori i pĂ«rket, dhe pĂ«rsĂ«ri do tĂ« duhet tĂ« merremi me secilin PR veç e veç. PĂ«r tĂ« zgjidhur kĂ«tĂ« problem, mund tĂ« pĂ«rdorim njĂ« tjetĂ«r ekzekutues — label verifier — ai kontrollon prani e etiketimeve nĂ« pull-request. NĂ«se nuk ka asnjĂ« etiketĂ« tĂ« detyrueshme, atĂ«herĂ« verifikimi do tĂ« dĂ«shtojĂ« dhe ne do ta shohim kĂ«tĂ« mesazh nĂ« pull-request-in tonĂ«.

name: "Verifiko etiketat e tipit"

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'

Tani çdo pull-request duhet të etiketohet me një nga etiketat: type:fix, type:features, type:documentation, type:tests, type:config.

Rrethinat e ferrit me GitHub Actions (ndërtojmë CI/CD pipeline për projektin Java)

Auto-anotimi i kërkesave për tërheqje

Pasi që përmendëm një temë si puna efektive me kërkesat për tërheqje, duhet të flasim edhe për një veprim si labeler, i cili vendos etiketa në PR në bazë të dosjeve që janë ndryshuar. Për shembull, mund ta marksim si [build] çdo kërkesë për tërheqje që ka ndryshime në katalogun .github/workflow.

Të lidhësh këtë është mjaft e thjeshtë:

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 }}

Na nevojitet gjithashtu një file për përshkrimin e përputhshmërisë së katalogjeve të projektit me temat e kërkesave për tërheqje:

theme:build:
  - ".github/**"
  - "pom.xml"
  - ".travis.yml"
  - ".gitignore"
  - "Dockerfile"

theme:code:
  - "src/main/*"

theme:tests:
  - "src/test/*"

theme:documentation:
  - "docs/**"

theme:TRASH:
  - ".idea/**"
  - "target/**"

Nuk arrita të bashkoj veprimin që automatikisht vendos etiketa në kërkesat për tërheqje me veprimin që kontrollon praninë e etiketeve obligative, match-label nuk do të pranojë etiketat e vendosura nga boti. Duket se është më e lehtë të shkruash veprimin tënd, që bashkon të dy fazat. Por edhe në këtë formë, është mjaft e lehtë të përdoret, duhet të zgjidhni një etiketë nga lista kur krijoni kërkesën për tërheqje.

ËshtĂ« koha pĂ«r tĂ« bĂ«rĂ« deploy

Rrethinat e ferrit me GitHub Actions (ndërtojmë CI/CD pipeline për projektin Java)

Kam provuar disa variante për deploy përmes GitHub Actions (nëpërmjet ssh, nëpërmjet scp, dhe me docker-hub), dhe mund të them se, me sa duket, do të gjeni një mënyrë për të ngarkuar binarin në server, pavarësisht se sa i komplikuar është pipeline juaj.

Më pëlqeu varianti që mbante gjithë infrastrukturën në një vend, prandaj le të shohim se si të bëjmë deploy në GitHub Packages (ky është një depo për përmbajtje binare, npm, jar, docker).

Skirp tim i ndërtimit të imazhit docker dhe publikimit të tij në GitHub Packages:

emri: Nxjerr imazhin docker

në:
  shtyp:
    degët:
      - 'master'

punët:

  ndërtim_imazhi_docker:
    funksionon në: ubuntu-18.04
    hapa:

#     Ndërto JAR:
      - përdor: actions/checkout@v1
      - emri: caktoni JDK 11
        përdor: actions/setup-java@v1
        me:
          java-version: 1.11
      - emri: Paketa Maven
        ekzekuto: mvn -B clean compile package -DskipTests

#     Caktoni variabla globale mjedisi:
      - emri: caktoni env global
        id: global_env
        ekzekuto: |
          echo "::set-output name=IMAGE_NAME::${GITHUB_REPOSITORY#*\/}"
          echo "::set-output name=DOCKERHUB_IMAGE_NAME::docker.pkg.github.com\/${GITHUB_REPOSITORY}\/${GITHUB_REPOSITORY#*\/}"

#     Ndërtoni imazhin Docker:
      - emri: Ndërto dhe etiketoni imazhin
        ekzekuto: |
          docker build -t "${{ steps.global_env.outputs.DOCKERHUB_IMAGE_NAME }}:latest" -t "${{ steps.global_env.outputs.DOCKERHUB_IMAGE_NAME }}:${GITHUB_SHA::8}" .

      - emri: Konektimi në Docker
        ekzekuto: docker login docker.pkg.github.com -u $GITHUB_ACTOR -p ${{secrets.GITHUB_TOKEN}}

#     Publikoni imazhin në repositorin e paketave në github:
      - emri: Publiko imazhin
        env:
          IMAGE_NAME: $GITHUB_REPOSITORY
        ekzekuto: docker push "docker.pkg.github.com\/$GITHUB_REPOSITORY\/${{ steps.global_env.outputs.IMAGE_NAME }}"

Për të filluar, na duhet të ndërtojmë skedarin JAR të aplikacionit tonë, pas së cilës llogaritëm rrugën për regjistrin Docker të GitHub dhe emrin e imazhit tonë. Këtu ka disa figura që nuk i kemi hasur më parë:

  • Struktura e formatit: echo «::set-output name=NAME::VALUE» lejon caktimin e njĂ« vlerĂ« varianti nĂ« hapin aktual, nĂ« mĂ«nyrĂ« qĂ« tĂ« mund tĂ« lexohet mĂ« vonĂ« nĂ« tĂ« gjithĂ« hapat e tjerĂ«.
  • PĂ«r tĂ« marrĂ« vlerĂ«n e variantit tĂ« caktuar nĂ« hapin e mĂ«parshĂ«m mund tĂ« pĂ«rdorim identifikuesin e kĂ«tij hapi: ${{ steps.global_env.outputs.DOCKERHUB_IMAGE_NAME }}
  • NĂ« ndryshoren standarde GITHUB_REPOSITORY ruhen emri i repositorit dhe pronari («owner/repo-name»). PĂ«r tĂ« nxjerrĂ« nga kjo varg gjithçka pĂ«rveç emrit tĂ« repositorit, do tĂ« pĂ«rdorim sintaksĂ«n bash: ${GITHUB_REPOSITORY#*\/}

Më pas, duhet të ndërtojmë imazhin docker:

docker build -t "docker.pkg.github.com\/antkorwin\/github-actions\/github-actions:latest"

Identifikohuni në regjistër:

docker login docker.pkg.github.com -u $GITHUB_ACTOR -p ${{secrets.GITHUB_TOKEN}}

Dhe publikoni imazhin në Repositorin e Paketave në GitHub:

docker push "docker.pkg.github.com\/antkorwin\/github-actions\/github-actions"

PĂ«r tĂ« caktuar versionin e imazhit, ne pĂ«rdorim shifrat e para nga SHA-hashi i commit-it — GITHUB_SHA kĂ«tu gjithashtu ka nuanca, nĂ«se do tĂ« bĂ«ni kĂ«to ndĂ«rtime jo vetĂ«m gjatĂ« bashkimit nĂ« master, por edhe pĂ«r ngjarjen e krijimit tĂ« njĂ« kĂ«rkese pĂ«r bashkim, atĂ«herĂ« SHA mund tĂ« mos pĂ«rputhet me hash-in qĂ« ne shohim nĂ« historinĂ« e git-it, sepse veprimi actions/checkout krijon njĂ« hash unik, pĂ«r tĂ« shmangur bllokimin e ndĂ«rsjellĂ« tĂ« veprimeve nĂ« PR.

Rrethinat e ferrit me GitHub Actions (ndërtojmë CI/CD pipeline për projektin Java)

Nëse gjithçka ka shkuar për mrekulli, atëherë duke hapur seksionin e paketave (https://github.com/antkorwin/github-actions/packages) në repositor, do të shihni një imazh të ri docker:

Rrethinat e ferrit me GitHub Actions (ndërtojmë CI/CD pipeline për projektin Java)

At the same place, you can view the list of Docker image versions.

All that's left is to configure our server to work with this registry and restart the service. I'll probably explain how to do this with systemd another time.

Monitorimi

Let's look at a simple way to perform a health check of our application using GitHub Actions. Our boot application has an actuator, so there's no need to write an API for checking its status; everything is already done for the lazy ones. You just need to hit the host: 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"}

All we need to do is to write a cron task to check the server, and if it doesn't respond, we will send a notification to Telegram.

First, let's figure out how to run the workflow on a cron schedule:

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

It's simple, I can't believe that such events can be created in GitHub, which don't fit into webhooks at all. The details are in the documentation: help.github.com/en/actions/reference/events-that-trigger-workflows#scheduled-events-schedule

We'll check the server status manually using 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 failed"
            exit 1
          fi
          echo "It's OK"

First, we save the response from the server to a variable, then in the next step, we check that the status is UP and, if not, we exit with an error. If you need to manually 'fail' the action, then exit 1 — is a suitable instrument.

  - 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 }}

We send the notification to Telegram only if the action failed in the previous step. To send a message, we use appleboy/telegram-action; you can read in the documentation how to obtain the bot token and chat ID: github.com/appleboy/telegram-action

Rrethinat e ferrit me GitHub Actions (ndërtojmë CI/CD pipeline për projektin Java)

Do not forget to specify in the GitHub secrets: the server URL and the tokens for the Telegram bot.

Bonus track — JIRA for the lazy

I promised that we would return to JIRA, and we did. I have seen hundreds of times in stand-ups the situation where developers have implemented a feature, merged a branch, but forgot to move the task in JIRA. Of course, if all this were done in one place, it would be easier, but in fact, we write code in an IDE, merge branches in Bitbucket or GitHub, and then move tasks in Jira, which requires opening new windows, sometimes logging in again, etc. When you clearly remember what needs to be done next, there’s no point in opening the board again. As a result, in the morning during the stand-up, we need to spend time updating the task board.

GitHub will help us with this routine task as well; to start, we can automatically move tasks to the code_review column when we submit a pull request. All that is needed is to adhere to the branch naming convention:

[project_name]-[task_number]-title

for example, if the project key "GitHub Actions" is GA, then GA-8-jira-bot could be a branch for implementing task GA-8.

The integration with JIRA works through actions from Atlassian; they are not perfect, and I must say that some of them have not worked for me at all. But we will discuss only those that definitely work and are actively used.

To begin with, you need to authorize in JIRA using the action: 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 }}

For this, you need to obtain a token in JIRA; how to do this is described here: confluence.atlassian.com/cloud/api-tokens-938839638.html

We extract the task identifier from the branch name:

  - 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 branch 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 successfully found JIRA issue: ${{steps.find_issue.outputs.ISSUE_ID}}

If you search in the GitHub marketplace, you can find an action for this task, but I had to write the same thing using grep on the branch name because that action from Atlassian did not want to work on my project; figuring out what was wrong took longer than doing the same manually.

Nuk duhet vetëm të transferoni detyrën në kolonën "Code review" kur krijoni pull request-in:

  - emri: Kalimi i detyrës
    nëse: ${{ sukses() }}
    përdor: atlassian/gajira-transition@master
    me:
      detyra: ${{ hapat.gjej_detyrën.daljet.ISSUE_ID }}
      kalimi: "Code review"

Për këtë ka një veprim të veçantë në GitHub, gjithçka që i nevojitet është identifikuesi i detyrës, i marrë në hapin e mëparshëm, dhe autorizimi në JIRA, që e bëmë më lart.

Rrethinat e ferrit me GitHub Actions (ndërtojmë CI/CD pipeline për projektin Java)

Po ashtu, mund të tërhiqni detyrat gjatë merge në master dhe ngjarjeve të tjera nga GitHub workflow. Në përgjithësi, gjithçka varet nga imagjinata juaj dhe dëshira për të automatizuar proceset e zakonshme.

Përfundimet

Nëse shikoni diagramin klasik të DEVOPS, duhet ta kemi mbuluar të gjitha fazat, përveç operate, mendoj se nëse përpiqemi, mund të gjejmë ndonjë aksion në treg për integrimin me sistemin e ndihmës, kështu që le të mendojmë se pipeline doli mjaft i mirë dhe në bazë të përdorimit të tij mund të nxirren përfundime.

Rrethinat e ferrit me GitHub Actions (ndërtojmë CI/CD pipeline për projektin Java)

Avantazhet:

  • Marketplace me veprimet e gatshme pĂ«r çdo rast Ă«shtĂ« shumĂ« e shkĂ«lqyer. NĂ« shumicĂ«n e tyre, madje mund tĂ« shihni burimin, pĂ«r tĂ« kuptuar se si tĂ« zgjidhni njĂ« detyrĂ« tĂ« ngjashme ose tĂ« postoni njĂ« kĂ«rkesĂ« pĂ«r veçori tek autori direkt nĂ« depozitĂ«n e GitHub.
  • Zgjedhja e platformĂ«s sĂ« synuar pĂ«r ndĂ«rtim: Linux, macOS, Windows Ă«shtĂ« njĂ« veçori mjaft interesante.
  • GitHub Packages Ă«shtĂ« njĂ« gjĂ« e shkĂ«lqyer, mbajtja e tĂ« gjithĂ« infrastrukturĂ«s nĂ« njĂ« vend Ă«shtĂ« e pĂ«rshtatshme, nuk Ă«shtĂ« nevoja tĂ« shfletosh nĂ«pĂ«r okĂ« tĂ« ndryshme, gjithçka Ă«shtĂ« brenda njĂ« apo dy klikimeve dhe Ă«shtĂ« perfekt e integruar me GitHub Actions. MbĂ«shtetje pĂ«r docker registry nĂ« versionin falas — kjo Ă«shtĂ« njĂ« avantazh i mirĂ«.
  • GitHub fsheh sekrety nĂ« log-Ă«t e ndĂ«rtimit, prandaj pĂ«rdorimi i tij pĂ«r mbajtjen e fjalĂ«kalimeve dhe tokenĂ«ve nuk Ă«shtĂ« aq i frikshĂ«m. GjatĂ« tĂ« gjithĂ« eksperimenteve tĂ« mia nuk kam arritur asnjĂ«herĂ« tĂ« shoh sekretin nĂ« mĂ«nyrĂ« tĂ« pastĂ«r nĂ« konsolĂ«.
  • FalĂ« pĂ«r projektet Open Source

Disavantazhet:

  • YML, nuk e pĂ«lqej. Kur punoj me njĂ« flow tĂ« tillĂ«, mesazhi im mĂ« i shpeshtĂ« i commit-it Ă«shtĂ« "riparo formatin yml", atĂ«herĂ« harrohet tĂ« vendosĂ«sh ndonjĂ« tab, atĂ«herĂ« shkruhet nĂ« rreshtin e gabuar. NĂ« pĂ«rgjithĂ«si, tĂ« qĂ«ndrosh pĂ«rpara ekranit me tjetĂ«r ndihmues dhe linjĂ«n nuk Ă«shtĂ« njĂ« aktivitet i kĂ«ndshĂ«m.
  • DEBUG, debugimi i flow me commit-e, nisjen e ri ndĂ«rtimit dhe output-in nĂ« konsolĂ« nuk Ă«shtĂ« gjithmonĂ« i pĂ«rshtatshĂ«m, por kjo Ă«shtĂ« mĂ« shumĂ« nĂ« kategorinĂ« "ju jeni tepruar", jeni mĂ«suar tĂ« punoni me IDEA tĂ« pĂ«rshtatshme, kur mund tĂ« debugoni gjithçka.
  • Mund ta shkruash njĂ« aksion mbi çfarĂ«do nĂ«se e mbĂ«shtjell nĂ« Docker, por natyrshĂ«m mbĂ«shtetet vetĂ«m JavaScript; sigurisht, Ă«shtĂ« njĂ« çështje shije, por do tĂ« preferoja diçka tjetĂ«r nĂ« vend tĂ« JS.

Më kujto, se depoja me të gjithë skriptet është këtu: github.com/antkorwin/github-actions

Javën e ardhshme do të flas prezantim të shkëlqyer në konferencën Heisenbug 2020 Piter. Do të flas jo vetëm për mënyrën se si të shmangim gabimet gjatë përgatitjes së të dhënave testuese, por gjithashtu do të ndaj sekretet e mia për punën me grupe të dhënash në aplikacionet Java!

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster