Rrethinat e Ferrit me GitHub Actions (ndërtojmë CI/CD pipeline për një projekt Java)

Rrethinat e Ferrit me GitHub Actions (ndërtojmë CI/CD pipeline për një projekt Java)

Së shpesh më duhet të ndërtoj një pipeline për ndërtimin e projekteve në Java. Ndonjëherë është open source, ndonjëherë jo. Kohët e fundit vendosa të provoj të transferoj disa nga reposet e mia nga Travis-CI dhe TeamCity në GitHub Actions, dhe ja çfarë rezultati arrita.

Çfarë do të automatizojmë

Fillimisht, na nevojitet një projekt që do të automatizojmë, le të krijojmë një aplikacion të vogël në Spring Boot / Java 11 / Maven. Brenda kësaj artikulli, logjika e aplikacionit nuk do të na interesojë fare, na rëndësishme është infrastruktura rreth aplikacionit, kështu që na mjafton një kontrollues i thjeshtë REST API.

Mund të shikoni burimet këtu: github.com/antkorwin/github-actions të gjitha fazat e ndërtimit të pipeline-it reflektohen në pull request-et e këtij projekti.

JIRA dhe planifikimi

Duhet thënë se zakonisht përdorim JIRA si ndjekës të detyrave, prandaj le të krijojmë një board të veçantë për këtë projekt dhe të shtojmë atje detyrat fillestare:

Rrethinat e Ferrit me GitHub Actions (ndërtojmë CI/CD pipeline për një projekt Java)

Pak më vonë do të kthehemi të shohim se çfarë interesante mund të ofrojnë lidhja e JIRA dhe GitHub.

Automatizojmë ndërtimin e projektit

Projekti ynë testues ndërtuohet përmes Maven, kështu që ndërtimi i tij është mjaft i thjeshtë, gjithçka që na nevojitet është mvn clean package.

Për ta bërë këtë me GitHub Actions, na duhen krijuar në depo një skedar që përshkruan workflow-in tonë, kjo mund të bëhet me një skedar të zakonshëm yml, nuk mund të them që më pëlqen «programimi në yml», por çfarë të bëjmë — krijojmë në direktorinë .github/workflow/ skedarin build.yml në të cilin 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

— ky është një përshkrim i ngjarjes, mbi të cilin do të nisë skripti ynë.

on: pull_request / push — tregon se ky workflow duhet të niset për çdo push në master dhe kur krijohen pull request-e.

Më pas vjen përshkrimi i detyrave (punë) dhe hapave të ekzekutimit (steps) për çdo detyrë.

runs-on — këtu mund të zgjidhni sistemin operativ të synuar, për çudi mund të zgjidhni madje edhe Mac OS, por në depo private kjo është një kënaqësi mjaft e shtrenjtë (në krahasim me linux-in).

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

Me ndihmën e me ne mund të specifikojmë parametrat me të cilat nisim veprimin, në thelb janë argumentet që do të kalohen në veprimin.

Nuk mbetet gjë tjetër veçse të nisim ndërtimin e projektit me Maven: run: mvn -B clean package flaga -B tregon se na nevojitet mode non-interactive, që Maven të mos na pyesë për ndonjë gjë.

Rrethinat e Ferrit me GitHub Actions (ndërtojmë CI/CD pipeline për një projekt Java)

Shkëlqyer! Tani, me çdo commit në master, aktivizohet ndërtimi i projektit.

Automatizojmë nisin e testeve

Ndërtimi është i mirë, por në realitet projekti mund të ndërtosh mirë, por të mos funksionojë. Prandaj hapi tjetër është të merremi me automatizimin e ekzekutimit të testeve. Për më tepër, është shumë e dobishme të shihni rezultatet e kalimit të testeve kur bëni rishikimin e PR - e dini saktësisht që testet përshkohen dhe askush nuk harroi, para se të bëni bashkimin, të testoni filialin tuaj.

Nisim ekzekutimin e testeve kur krijojmë pull request dhe bashkohen në master, dhe njëkohësisht të shtojmë ndërtimin e raportit për 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, unë përdor codecov në bashkëpunim me plugin-in jacoco. codecov ka veprimin e tij, por për të punuar me pull-request-in tonë, ai i nevojitet një token:

${{ secrets.CODECOV_TOKEN }} — një konstruksion të tillë do ta takojmë edhe disa herë, secrets është mekanizmi i ruajtjes së sekreteve në GitHub, ku mund të regjistrojmë fjalëkalime/token, hoste, URL dhe të dhëna të tjera që nuk duhet të shfaqen në kodin e depozitës.

Për të shtuar një variablë në secrets, mund ta bëni këtë në cilësimet e depozitës në GitHub:

Rrethinat e Ferrit me GitHub Actions (ndërtojmë CI/CD pipeline për një projekt Java)

Token-in mund ta merrni në codecov.io pas autorizimit përmes GitHub, për të shtuar projektin publik, mjafton të ndiqni një lidhje të tipit: Emri i përdoruesit në GitHub/[repo name]. Приватный репозиторий тоже можно добавить, для этого надо дать права codecov приложению в гитхабе.

Rrethinat e Ferrit me GitHub Actions (ndërtojmë CI/CD pipeline për një projekt Java)

Shtojmë plugin-in 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, në çdo kërkesë tonën për tërheqje, do të hyjë boti codecov dhe do të shtojë një grafik të ndryshimit të mbulimit:

Rrethinat e Ferrit me GitHub Actions (ndërtojmë CI/CD pipeline për një projekt Java)

Do të shtojmë një analizues statik

Në shumicën e projekteve të mia open-source përdor sonar cloud për analizën statike të kodit, është mjaft e lehtë ta lidhësh me travis-ci. Pra, ky është një hap logjik në migrimin në GitHub Actions, të bësh të njëjtën gjë. Marketingu i aksioneve është një gjë e mirë, por këtë herë pak më ka shqetësuar, sepse me zakon e gjeta aksionin e nevojshëm dhe e shkrova në workflow. Por doli se sonar nuk mbështet punën përmes aksionit për analizën e projekteve në maven ose gradle. Natyrisht, për këtë është shkruar në dokumentacion, por kush e lexon atë?!

Përmes aksionit nuk mundemi, prandaj 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 ta shkruash në secrets. GITHUB_TOKEN — është një token i integruar, i cili gjenerohet nga GitHub, me ndihmën e tij sonarcloud[bot] do të mund të autorizohet në git për të na lënë mesazhe në kërkesat e bashkimit.

Dsonar.projectKey — emri i projektit në Sonar, mund ta shihni në cilësimet e projektit.

Dsonar.organization — emri i organizatës nga GitHub.

Krijojmë një kërkesë bashkimi dhe presim që sonarcloud[bot] të vijë në komentet:

Rrethinat e Ferrit me GitHub Actions (ndërtojmë CI/CD pipeline për një projekt Java)

Menaxhimi i lëshimeve

Build-in e kemi konfigurua, testet i kemi përfunduar, tani mund të bëjmë një lëshim. Le të shohim se si GitHub Actions ndihmon ndjeshëm në thjeshtimin e menaxhimit të lëshimeve.

Në punë kam projekte, ku kodi është në bitbucket (të gjitha si në atë histori «ditën shkruaj në bitbucket, natën bëj commit në GitHub»). Fatkeqësisht, në bitbucket nuk ka mjete të integruara për menaxhimin e lëshimeve. Kjo është një problem, sepse për çdo lëshim duhet të krijosh manualisht një faqe në confluence dhe të transferosh atje të gjitha karakteristikat e përfshira në lëshim, të shqyrtosh mendimet, detyrat në jira, commit-et në repository. Ka shumë mundësi për gabime, mund të harrosh diçka ose të shkruash atë që e kemi lëshuar më herët, ndonjëherë thjesht nuk është e qartë se si të kategorizosh një kërkesë bashkimi — është një tipar apo një rregullim i gabimeve, apo përmirësim testesh, apo diçka infrastrukturore.

Si GitHub actions mund të na ndihmojë? Ka një veprim të shkëlqyer — release drafter, i cili lejon të caktoni një model për skedën e shënimeve të lëshimit, për të organizuar kategoritë e pull-request-ave dhe për t'i grupuar ato automatikisht në skedën e shënimeve të lëshimit:

Rrethinat e Ferrit me GitHub Actions (ndërtojmë CI/CD pipeline për një projekt Java)

Shembulli i një modeli për konfigurimin e raportit (.github/release-drafter.yml):

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

  - title: ' Korrigjimet e Gabimeve'
    labels:
      - 'type:fix'
# gjithashtu për etiketën type:fix etj.

  - title: ' Dokumentacioni'
    labels:
      - 'type:documentation'

  - title: ' Konfigurimi'
    labels:
      - 'type:config'

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

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

name: "Krijo draft lëshimi"

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ë mblidhen automatikisht në shënimet e lëshimit — magji!

Këtu mund të lindë një pyetje: çfarë nëse zhvilluesit harrojnë të vendosin etiketat në PR? Atëherë nuk kuptohet në cilën kategori ta përfshijmë, dhe sërish do të duhet të merremi me çdo PR veç e veç. Për të zgjidhur këtë problem, mund të përdorim një veprim tjetër — verifikuesin e etiketimeve — ai kontrollon siç duken etiketat në kërkesën për tërheqje. Nëse nuk ka asnjë etiketë të detyrueshme, kontrolli do të dështojë dhe ne do ta shohim një mesazh për këtë në kërkesën tonë për tërheqje.

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'

Tani çdo kërkesë për tërheqje 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 një projekt Java)

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

Pasi që e përmendëm një temë si puna efektive me kërkesat për tërheqje, është e rëndësishme të flasim edhe për këtë veprim tjetër, siç është etiketuesi, ai vendos etiketat në PR në bazë të skedareve të ndryshuara. Për shembull, ne mund ta etiketojmë si [build] çdo kërkesë për tërheqje në të cilën ka ndryshime në katalogun .github/workflow.

Ta lidhësh atë është mjaft e thjeshtë:

emri: "Auto-assign themes to PR"

në:
  - pull_request

punët:
  triage:
    vjen në: ubuntu-18.04
    hapa:
      - përdor: actions/labeler@v2
        me:
          repo-token: ${{ secrets.GITHUB_TOKEN }}

Na nevojitet gjithashtu një skedar për përshkrimin e përputhjes së katalogëve të projektit me temat e pull-request-ave:

tema:ndërtim:
  - ".github/**"
  - "pom.xml"
  - ".travis.yml"
  - ".gitignore"
  - "Dockerfile"

tema:kod:
  - "src/main/*"

tema:teste:
  - "src/test/*"

tema:dokumentacion:
  - "docs/**"

tema:MBETURINA:
  - ".idea/**"
  - "target/**"

Nuk arrita të lidh veprimin që automatikisht vendos etiketat në pull-request-a me veprimin që kontrollon praninë e etiketave të detyrueshme, match-label nuk do të shohë etiketat e vendosura nga boti. Duket se është më e thjeshtë të shkruaj një veprim timin që përfshin të dyja etapet. Por edhe në këtë formë është mjaft e përshtatshme, duhet të zgjidhni një etiketë nga lista gjatë krijimit të pull-request-it.

Është koha për të bërë deploy

Rrethinat e Ferrit me GitHub Actions (ndërtojmë CI/CD pipeline për një projekt Java)

Kam provuar disa variante për depozitim përmes GitHub Actions (përmes ssh, përmes scp, dhe me ndihmën e docker-hub), dhe mund të them se, me siguri do të gjeni një mënyrë për të ngarkuar binarët në server, pavarësisht sa i çrregullt të jetë pipeline-i juaj.

Më pëlqeu opsioni për të mbajtur gjithë infrastrukturën në një vend, prandaj le të shohim si të bëjmë deploy në GitHub Packages (ky është një repo për përmbajtje binar, npm, jar, docker).

Scripti për ndërtimin e imazhit docker dhe publikimin e tij në GitHub Packages:

name: Deploy docker image

on:
  push:
    branches:
      - 'master'

jobs:

  build_docker_image:
    runs-on: ubuntu-18.04
    steps:

#     Build JAR:
      - uses: actions/checkout@v1
      - name: set up JDK 11
        uses: actions/setup-java@v1
        with:
          java-version: 1.11
      - name: Maven Package
        run: mvn -B clean compile package -DskipTests

#     Set global environment variables:
      - name: set global env
        id: global_env
        run: |
          echo "::set-output name=IMAGE_NAME::${GITHUB_REPOSITORY#*/}"
          echo "::set-output name=DOCKERHUB_IMAGE_NAME::docker.pkg.github.com/${GITHUB_REPOSITORY}/${GITHUB_REPOSITORY#*/}"

#     Build Docker image:
      - name: Build and tag image
        run: |
          docker build -t "${{ steps.global_env.outputs.DOCKERHUB_IMAGE_NAME }}:latest" -t "${{ steps.global_env.outputs.DOCKERHUB_IMAGE_NAME }}:${GITHUB_SHA::8}" .

      - name: Docker login
        run: docker login docker.pkg.github.com -u $GITHUB_ACTOR -p ${{secrets.GITHUB_TOKEN}}

#     Publish image to github package repository:
      - name: Publish image
        env:
          IMAGE_NAME: $GITHUB_REPOSITORY
        run: docker push "docker.pkg.github.com/$GITHUB_REPOSITORY/${{ steps.global_env.outputs.IMAGE_NAME }}"

Për të filluar, na nevojitet të mbledhim JAR-n e aplikacionit tonë, pastaj llogarisim rrugën dhe emrin e imazhit në regjistrin docker të GitHub-it. Ka disa truke këtu, me të cilat ende nuk jemi përballur:

  • konstruksioni i formës: echo «::set-output name=NAME::VALUE» lejon të përcaktohet vlera e një variabli në hapin aktual, në mënyrë që më pas të mund të lexohet në të gjithë hapat e tjerë.
  • për të marrë vlerën e variablit të vendosur në hapin e kaluar, mund ta bëni këtë përmes identifikuesit të këtij hapi: ${{ steps.global_env.outputs.DOCKERHUB_IMAGE_NAME }}
  • Në variablën standarde GITHUB_REPOSITORY ruhet emri i regjistrit dhe pronari i tij («owner/repo-name»). Për të nxjerrë nga kjo varg gjithçka përveç emrit të regjistrit, do të përdorim sintaksën bash: ${GITHUB_REPOSITORY#*/}

Pastaj, na nevojitet të mbledhim imazhin docker:

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

Të identifikohemi në regjistrin:

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

Dhe të publikojmë imazhin në Repository-n e Pakove të GitHub-it:

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

Për të specifikuar versionin e imazhit, përdorim numrat e parë nga SHA-hashi i commit-it — GITHUB_SHA ka gjithashtu nuances, nëse do të bëni këto ndërtime jo vetëm kur bashkoni në master, por edhe në ngjarjen e krijimit të pull-request-it, atëherë SHA mund të mos përputhet me hash-in që shohim në historinë e git-it, sepse veprimi actions/checkout krijon hash-in e vet unik për të shmangur bllokimet e ndërsjella në veprimet e PR.

Rrethinat e Ferrit me GitHub Actions (ndërtojmë CI/CD pipeline për një projekt Java)

Nëse gjithçka ka shkuar mirë, duke hapur seksionin packages (https://github.com/antkorwin/github-actions/packages) në depo, do të shihni një imazh të ri docker:

Rrethinat e Ferrit me GitHub Actions (ndërtojmë CI/CD pipeline për një projekt Java)

Aty mund të shihni gjithashtu listën e versioneve të imazhit docker.

Mbete vetëm të konfigurojmë serverin tonë për të punuar me këtë registry dhe të fillojmë rinisjen e shërbimit. Si ta bëjmë këtë përmes systemd, ndoshta do ta tregoj në një herë tjetër.

Monitorimi

Le të shohim një variant të thjeshtë, si të bëjmë kontrollin e shëndetit të aplikacionit tonë përmes GitHub Actions. Në aplikacionin tonë boot, ka actuator, kështu që API për të kontrolluar gjendjen e tij as nuk ka nevojë të shkruhet, për të lenjtë është bërë gjithçka. Thjesht duhet të thërrasim host-in: 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"}

E gjithë çka na nevojitet është të shkruajmë një detyrë për verifikimin e serverit në cron, dhe nëse ndonjëherë ai nuk na përgjigjet, atëherë do të dërgojmë një njoftim në Telegram.

Së pari, le të shohim se si të aktivizojmë workflow me cron:

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

E thjeshtë, madje nuk besoj se në GitHub mund të krijosh evenamente që nuk janë të përshtatshme për webhook. Detajet gjenden në dokumentacion: help.github.com/en/actions/reference/events-that-trigger-workflows#scheduled-events-schedule

Verifikimin e statusit të serverit do ta bëjmë manualisht me 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 "kontrolli i shëndetit ka dështuar"
            exit 1
          fi
          echo "Është në rregull"

Së pari, ruajmë në një variabël atë që përgjigjet serveri në kërkesë, në hapin tjetër kontrollojmë nëse statusi është UP dhe, nëse nuk është kështu, dalim me një gabim. Nëse duam ta "biem" veprimin manualisht, atëherë exit 1 është arma e duhur.

  - name: dërgo paralajmërim në telegram
    if: ${{ failure() }}
    uses: appleboy/telegram-action@master
    with:
      to: ${{ secrets.TELEGRAM_TO }}
      token: ${{ secrets.TELEGRAM_TOKEN }}
      message: |
        Kontrolli i shëndetit të:
        ${{secrets.SERVER_HOST}}/api/actuator/health
        dështoi me rezultatin:
        ${{ steps.ping.outputs.status }}

Ne dërgojmë në telegram vetëm nëse veprimi dështoi në hapin e mëparshëm. Për dërgimin e mesazhit, përdorim appleboy/telegram-action, për atë se si të merrni tokenin e botit dhe id-në e bisedës, mund të lexoni në dokumentacion: github.com/appleboy/telegram-action

Rrethinat e Ferrit me GitHub Actions (ndërtojmë CI/CD pipeline për një projekt Java)

Mos harroni të shenoni në sekretet e GitHub: URL-në për serverin dhe tokenet për botin e telegramit.

Kënga bonus — JIRA për të lenjët

Premtova se do të kthehemi te JIRA, dhe ne u kthyem. Njëqind herë kam parë në stand-up situatën, kur zhvilluesit e bënë veçorinë, përfunduan degën, por harruan të tërheqin detyrën në JIRA. Sigurisht, po të bëhej gjithçka në një vend, do të ishte më e lehtë, por në të vërtetë ne shkruajmë kodin në IDE, përfundojmë degët në bitbucket ose GitHub, ndërsa detyrat më pas i rregullojmë në Jira, për këtë duhet të hapim dritare të reja, ndonjëherë të loginohemi përsëri etj. Kur ti e di saktësisht se çfarë duhet të bësh më pas, nuk ka shumë kuptim të hapësh bordin një herë tjetër. Si rezultat, në mëngjes në stand-up duhet të shpenzojmë kohë për të azhurnuar tabelën e detyrave.

GitHub do të na ndihmojë edhe në këtë detyrë rutinë, fillimisht mund të tërheqim automatikisht detyrat në kolonën code_review, kur të kemi dërguar një kërkesë për bashkim. E gjithë që na nevojitet është të respektojmë marrëveshjen për emërtimin e degëve:

[emri i projektit]-[numri i detyrës]-titulli

për shembull, nëse çelësi i projektit "GitHub Actions" është GA, atëherë GA-8-jira-bot mund të jetë dega për realizimin e detyrës GA-8.

Integrimi me JIRA funksionon përmes veprimeve nga Atlassian, ato nuk janë perfekt, duhet të them se disa nga to nuk më kanë funksionuar fare. Por ne do të diskutojmë vetëm ato që përfundimisht funksionojnë dhe përdoren aktivisht.

Fillimisht, duhet të kaloni authentikimin në JIRA përmes veprimit: 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 }}

Për këtë duhet të merrni një token në JIRA, si të bëhet kjo është e shkruar këtu: confluence.atlassian.com/cloud/api-tokens-938839638.html

Ekstraktojmë identifikuesin e detyrës nga emri i degës:

  - name: Gjej Problemin
    id: find_issue
    shell: bash
    run: |
      echo "::set-output name=ISSUE_ID::$(echo ${GITHUB_HEAD_REF} | egrep -o 'GA-[0-9]{1,4}')"
      echo emri i degës: $GITHUB_HEAD_REF
      echo problemi i nxjerrë: ${GITHUB_HEAD_REF} | egrep -o 'GA-[0-9]{1,4}'

  - name: Kontrollo Problemin
    shell: bash
    run: |
      if [[ "${{steps.find_issue.outputs.ISSUE_ID}}" == "" ]]; then
        echo "Ju lutem emëroni degën tuaj sipas problemit JIRA: [project_key]-[task_number]-branch_name"
        exit 1
      fi
      echo ndodhi suksesesh të gjejmë problemin JIRA: ${{steps.find_issue.outputs.ISSUE_ID}}

Nëse kërkoni në tregun e GitHub, mund të gjeni një veprim për këtë detyrë, por më duhej të shkruaja të njëjtën gjë përmes grep në emrin e degës, sepse kjo veprim nga Atlassian nuk deshi të punonte në projektin tim, dhe të kuptoj se çfarë nuk shkon merr më shumë kohë sesa ta bëj manualisht.

Kjo mbetet vetëm për të kaluar detyrën në kolonën «Rishikimi i kodit» kur krijoni një kërkesë tërheqjeje:

  - name: Kaloni problemin
    if: ${{ success() }}
    uses: atlassian/gajira-transition@master
    with:
      issue: ${{ steps.find_issue.outputs.ISSUE_ID }}
      transition: "Rishikimi i kodit"

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

Rrethinat e Ferrit me GitHub Actions (ndërtojmë CI/CD pipeline për një projekt Java)

Në të njëjtën mënyrë, mund të tërhiqni detyrat gjatë merge në master dhe në ngjarje të tjera nga GitHub workflow. Në përgjithësi, gjithçka varet nga fantazia juaj dhe dëshira për të automatizuar proceset rutinë.

Përfundimet

Nëse shikoni diagramin klasik DEVOPS, kemi mbuluar të gjitha fazat, ndoshta përveç operimit. Mendoj se, nëse përpiqemi, mund të gjejmë ndonjë veprim në tregun e aplikacioneve për integrimin me sistemin help-desk, kështu që le të themi se pipeline doli i plotë dhe, mbi bazën e përdorimit të tij, mund të nxjerrim përfundime.

Rrethinat e Ferrit me GitHub Actions (ndërtojmë CI/CD pipeline për një projekt Java)

Avantazhet:

  • Tregu i aplikacioneve me veprime të gatshme për çdo rast është shumë i shkëlqyer. Në shumicën e tyre, gjithashtu mund të shikoni burimet për të kuptuar si të zgjidhni një detyrë të ngjashme ose të postoni një kërkesë veçorie tek autori drejtpërdrejt në repozitorin e GitHub.
  • Zgjedhja e platformës së synuar për ndërtimin: Linux, macOS, Windows është një veçori mjaft interesante.
  • GitHub Packages është një gjë e shkëlqyer; mbajtja e gjithë infrastrukturës në një vend është e përshtatshme, nuk nevojitet të kërkoni nëpër okat e ndryshme, gjithçka është brenda një ose dy klikimeve të mausit dhe është integuruar mrekullisht me GitHub Actions. Mbështetje për docker registry në versionin falas është gjithashtu një avantazh i mirë.
  • GitHub fsheh sekrete në log-et e ndërtimit, prandaj përdorimi i tij për ruajtjen e fjalëkalimeve dhe tokenëve nuk është kaq i frikshëm. Gjatë të gjithë eksperimenteve, nuk më ka ndodhur asnjëherë të shoh një sekret në formë të pastër në konsolë.
  • I lirë për projektet Open Source

Disavantazhet:

  • YML, nuk e pëlqej. Kur punoj me një fluks të tillë, mesazhi më i shpeshtë i commit-it është "fix yml format", ose harroj të vendos një tab, ose shkruaj në rreshtin e gabuar. Në përgjithësi, të qëndrosh përpara ekranit me transport e linjë nuk është një aktivitet shumë i këndshëm.
  • DEBUG, të debug-osh fluksin me commit-e, duke e nisur ndërtesën dhe duke e output-uar në konsolë nuk është gjithmonë e lehtë, por kjo është më shumë si "ju jeni bërë të kërkoni komoditet", jeni mësuar të punoni me IDEA të rehatshme, kur mund të debug-on çdo gjë.
  • Mund të shkruani veprimin tuaj në çfarëdo gjuhe nëse e vendosni në docker, por natyrisht mbështetet vetëm javascript, sigurisht që është çështje shije, por do të preferoja diçka tjetër në vend të js.

Më kujtohet se repozitori me të gjitha skriptet është këtu: github.com/antkorwin/github-actions

Javaj në javën e ardhshme do të bëj një prezentim në konferencën Heisenbug 2020 Piter. Do të flas jo vetëm për mënyrat për të shmangur gabimet gjatë përgatitjes së të dhënave testuese, por gjithashtu do të ndaj sekretet e mia të punës me grumbujt e të dhënave në aplikacionet Java!

Burimi: habr.com

Bli një hosting të besueshëm për faqet me mbrojtje DDoS, VPS VDS serverë 🔥 Bli një hosting të besueshëm për faqet me mbrojtje DDoS, VPS VDS serverë | ProHoster