Cirklar av helvetet med GitHub Actions (bygger CI/CD-pipeline för ett Java-projekt)

Cirklar av helvetet med GitHub Actions (bygger CI/CD-pipeline för ett Java-projekt)

Jag bygger ofta pipelines för att kompilera projekt i Java. Ibland Àr det öppen kÀllkod, ibland inte. Nyligen bestÀmde jag mig för att prova pÄ att flytta en del av mina repo frÄn Travis-CI och TeamCity till GitHub Actions, och hÀr Àr vad jag fick ut av det.

Vad ska vi automatisera

Först behöver vi ett projekt som vi ska automatisera, lÄt oss skapa en liten applikation i Spring Boot / Java 11 / Maven. I den hÀr artikeln kommer vi inte att fokusera pÄ applikationens logik alls, det viktiga för oss Àr infrastrukturen runt applikationen, sÄ en enkel REST API-kontroller rÀcker.

Du kan titta pÄ kÀllkoden hÀr: github.com/antkorwin/github-actions alla steg i byggandet av pipeline-konceptet Äterspeglas i pull requests för detta projekt.

JIRA och planering

Det Àr vÀrt att nÀmna att vi vanligtvis anvÀnder JIRA som en uppgiftsspÄrare, sÄ lÄt oss skapa ett separat styre för detta projekt och lÀgga till vÄra första uppgifter dÀr:

Cirklar av helvetet med GitHub Actions (bygger CI/CD-pipeline för ett Java-projekt)

Lite senare kommer vi att Äterkomma till vad som kan vara intressant med kombinationen av JIRA och GitHub.

Automatisera projektets byggprocess

VÄrt testprojekt kompileras med maven, sÄ byggprocessen Àr ganska enkel, allt vi behöver Àr mvn clean package.

För att göra detta med hjÀlp av GitHub Actions mÄste vi skapa en fil i repo som beskriver vÄr workflow; detta kan göras med en vanlig yml-fil. Jag kan inte sÀga att jag gillar 'programmering i yml', men vad ska man göra - vi skapar en fil build.yml i katalogen .github/workflow/ dÀr vi kommer att beskriva ÄtgÀrderna vid byggandet av mastergrenen:

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 — detta Ă€r beskrivningen av hĂ€ndelsen som ska utlösa vĂ„rt skript.

on: pull_request / push — anger att denna workflow ska köras vid varje push till master och nĂ€r pull requests görs.

Sedan följer beskrivningen av uppgifterna (jobs) och stegen för att utföra (steps) för varje uppgift.

runs-on — hĂ€r kan vi vĂ€lja mĂ„l-OS, överraskande nog kan vi till och med vĂ€lja Mac OS, men pĂ„ privata repositorier Ă€r detta en ganska kostsam affĂ€r (jĂ€mfört med linux).

uses tillÄter att ÄteranvÀnda andra actions, sÄ exempelvis med action actions/setup-java installerar vi miljön för Java 11.

Med hjÀlp av with Vi kan ange de parametrar vi startar ÄtgÀrden med, i grunden Àr detta argument som kommer att överföras till actionen.

Det Àr bara att köra maven för att bygga projektet: run: mvn -B clean package flagga -B detta sÀger att vi behöver ett icke-interaktivt lÀge, sÄ att maven inte plötsligt vill frÄga oss nÄgot

Cirklar av helvetet med GitHub Actions (bygger CI/CD-pipeline för ett Java-projekt)

UtmÀrkt! Nu körs projektbygget vid varje commit till master.

Vi automatiserar teststarten

Byggandet Ă€r bra, men i verkligheten kan projektet byggas framgĂ„ngsrikt men Ă€ndĂ„ inte fungera. DĂ€rför behöver vi nĂ€sta steg för att automatisera testkörningen. Dessutom Ă€r det ganska praktiskt att se resultatet av testkörningen nĂ€r man gör en granskning av PR — man vet exakt att testerna passerar, och ingen har glömt att köra sin gren innan man slĂ„r samman.

Vi gör teststarten vid skapandet av pull request och vid sammanslagning till master, och vi lÀgger ocksÄ till byggandet av en rapport om code-coverage.

name: Bygg

on:
  pull_request:
    branches:
      - '*'
  push:
    branches:
      - 'master'

jobs:
  build:
    runs-on: ubuntu-18.04
    steps:
      - uses: actions/checkout@v1
      - name: konfigurera 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 }}

För testtÀckning anvÀnder jag codecov i kombination med jacoco-plugin. Codecov har sin egen action, men den behöver en token för att fungera med vÄr pull request:

${{ secrets.CODECOV_TOKEN }} — en sĂ„dan konstruktion kommer vi att se flera gĂ„nger, secrets Ă€r en mekanism för att lagra hemligheter pĂ„ GitHub, dĂ€r kan vi ange lösenord/tokens/vĂ€rdar/url:er och andra data som inte bör synas i kodbasen.

Man kan lÀgga till en variabel i secrets i instÀllningarna för repositoryt pÄ GitHub:

Cirklar av helvetet med GitHub Actions (bygger CI/CD-pipeline för ett Java-projekt)

Man kan fĂ„ token pĂ„ codecov.io efter inloggning via GitHub, för att lĂ€gga till ett offentligt projekt behöver man bara följa en lĂ€nk av typen: GitHub anvĂ€ndarnamn/[repo name]. ПроĐČĐ°Ń‚ĐœŃ‹Đč Ń€Đ”ĐżĐŸĐ·ĐžŃ‚ĐŸŃ€ĐžĐč Ń‚ĐŸĐ¶Đ” ĐŒĐŸĐ¶ĐœĐŸ ĐŽĐŸĐ±Đ°ĐČоть, ĐŽĐ»Ń ŃŃ‚ĐŸĐłĐŸ ĐœĐ°ĐŽĐŸ Юать праĐČа codecov ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃŽ ĐČ ĐłĐžŃ‚Ń…Đ°Đ±Đ”.

Cirklar av helvetet med GitHub Actions (bygger CI/CD-pipeline för ett Java-projekt)

Vi lÀgger till jacoco-plugin i POM-filen:

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

Nu kommer varje pull request att fÄ besök av codecov-boten och lÀgga till en graf över Àndringar i tÀckning:

Cirklar av helvetet med GitHub Actions (bygger CI/CD-pipeline för ett Java-projekt)

LĂ€gg till en statisk analysator

I de flesta av mina open source-projekt anvÀnder jag SonarCloud för statisk kodanalys, det Àr ganska lÀtt att koppla det till Travis CI. SÄ det Àr ett logiskt steg vid migrering till GitHub Actions att göra detsamma. Marknadsaktiveringen Àr en hÀftig grej, men denna gÄng föll det lite kort, eftersom jag av vana hittade den nödvÀndiga aktiviteten och skrev in den i arbetsflödet. Men det visade sig att Sonar inte stöder arbete via en ÄtgÀrd för att analysera projekt pÄ Maven eller Gradle. Det Àr naturligtvis angivet i dokumentationen, men vem lÀser den?!

Via ÄtgÀrden gÄr det inte, sÄ vi gör det via 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: StÀll in JDK
        uses: actions/setup-java@v1
        with:
          java-version: 1.11
      - name: Analysera med SonarCloud
#       stÀll in miljövariabler:
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
#       kör 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 — kan erhĂ„llas pĂ„ sonarcloud.io och mĂ„ste anges i secrets. GITHUB_TOKEN — det inbyggda token som genereras av GitHub, med vilket sonarcloud[bot] kan autentisera sig i git för att lĂ€mna meddelanden i vĂ„ra pull requests.

Dsonar.projectKey — projektets namn i Sonar, kan ses i projektinstĂ€llningarna.

Dsonar.organization — organisationsnamnet frĂ„n GitHub.

Skapa en pull request och vÀnta pÄ att sonarcloud[bot] ska komma med kommentarer:

Cirklar av helvetet med GitHub Actions (bygger CI/CD-pipeline för ett Java-projekt)

Release management

Bygget Àr instÀllt, testerna Àr genomförda, det Àr dags att göra en release. LÄt oss titta pÄ hur GitHub Actions hjÀlper till att förenkla release management.

PĂ„ jobbet har jag projekt vars kodbas ligger i Bitbucket (allt som i den dĂ€r historien "pĂ„ dagen skriver jag i Bitbucket, pĂ„ natten commitar jag till GitHub"). TyvĂ€rr saknar Bitbucket inbyggda verktyg för att hantera releaser. Det Ă€r ett problem, eftersom vi för varje release manuellt mĂ„ste skapa en sida i Confluence och samla alla funktioner som ingĂ„r i releasen, granska alla resurser, uppgifter i Jira, commits i repository. Det finns mĂ„nga chanser att göra fel, man kan glömma nĂ„got eller skriva in nĂ„got som redan slĂ€pptes förra gĂ„ngen, ibland Ă€r det bara oklart vad man ska hĂ€nföra nĂ„gon pull request till — Ă€r det en funktion, en buggfix, en testjustering, eller nĂ„got infrastrukturrelaterat.

Hur kan GitHub Actions hjĂ€lpa oss? Det finns en utmĂ€rkt Ă„tgĂ€rd — release drafter, som gör att man kan stĂ€lla in en mall för release notes, för att kategorisera pull requests och automatiskt gruppera dem i filen med release notes:

Cirklar av helvetet med GitHub Actions (bygger CI/CD-pipeline för ett Java-projekt)

Exempel pÄ en mall för att konfigurera rapporten (.github/release-drafter.yml):

name-template: 'v$NEXT_PATCH_VERSION'
tag-template: 'v$NEXT_PATCH_VERSION'
categories:
  - title: 'Nya funktioner'
    labels:
      - 'type:features'
# i denna kategori samlar vi alla PR som har etiketten type:features

  - title: 'Bugfixar'
    labels:
      - 'type:fix'
# pÄ samma sÀtt för etiketten type:fix osv.

  - title: 'Dokumentation'
    labels:
      - 'type:documentation'

  - title: 'Konfiguration'
    labels:
      - 'type:config'

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

Vi lÀgger till ett skript för att generera utkastet av releasen (.github/workflows/release-draft.yml):

name: "Skapa utkastrelease"

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

FrĂ„n och med nu kommer alla pull requests automatiskt att samlas i release notes — magi!

HĂ€r kan en frĂ„ga uppstĂ„: vad hĂ€nder om utvecklarna glömmer att sĂ€tta etiketter i PR? DĂ„ Ă€r det oklart vilken kategori det ska hĂ€nföras till och man fĂ„r Ă„terigen gĂ„ igenom varje PR manuellt. För att Ă„tgĂ€rda detta problem kan vi anvĂ€nda Ă€nnu en Ă„tgĂ€rd — label verifier — som kontrollerar förekomsten av etiketter pĂ„ pull request. Om det inte finns nĂ„gon obligatorisk etikett kommer kontrollen att misslyckas och vi fĂ„r ett meddelande om detta i vĂ„r pull request.

name: "Verifiera typetiketter"

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'

Nu mÄste varje pull request mÀrkas med en av etiketterna: type:fix, type:features, type:documentation, type:tests, type:config.

Cirklar av helvetet med GitHub Actions (bygger CI/CD-pipeline för ett Java-projekt)

Automatisk annotering av pull-begÀrningar

Eftersom vi har berört Àmnet effektivt arbete med pull-begÀrningar, Àr det vÀrt att nÀmna en ÄtgÀrd som kallas labeler, som sÀtter etiketter pÄ PR baserat pÄ vilka filer som har Àndrats. Till exempel kan vi mÀrka en pull-begÀran som [build] om det finns Àndringar i katalogen .github/workflow.

Det Àr ganska enkelt att koppla in det:

name: "Automatiskt tilldela teman till PR"

on:
  - pull_request

jobs:
  triage:
    runs-on: ubuntu-18.04
    steps:
      - uses: actions/labeler@v2
        with:
          repo-token: ${{ secrets.GITHUB_TOKEN }}

Vi kommer ocksÄ att behöva en fil som beskriver hur projektets kataloger matchar temana för pull-begÀrningar:

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

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

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

theme:documentation:
  - "docs/**"

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

Jag lyckades inte kombinera ÄtgÀrden som automatiskt sÀtter etiketter i pull-begÀrningar med ÄtgÀrden som kontrollerar nÀrvaron av nödvÀndiga etiketter; match-label vill inte se etiketter som sÀtts av boten. Det verkar enklare att skriva en egen ÄtgÀrd som kombinerar bÄda faserna. Men Àven i detta format Àr det ganska bekvÀmt att vÀlja en etikett frÄn listan nÀr man skapar en pull-begÀran.

Dags att deploya

Cirklar av helvetet med GitHub Actions (bygger CI/CD-pipeline för ett Java-projekt)

Jag har testat flera alternativ för deploy genom GitHub Actions (via ssh, via scp, och med hjÀlp av docker-hub), och jag kan sÀga att ni nog kommer att hitta ett sÀtt att ladda upp en binÀr fil till servern, oavsett hur krÄnglig er pipeline Àr.

Jag gillade alternativet att ha hela infrastrukturen pÄ ett stÀlle, sÄ lÄt oss se hur vi kan göra deploy till GitHub Packages (detta Àr ett repo för binÀrt innehÄll, npm, jar, docker).

Script för att bygga en docker-image och publicera den i GitHub Packages:

namn: Distribuera docker-bild

pÄ:
  push:
    grenar:
      - 'master'

jobb:

  bygga_docker_bild:
    körs-pÄ: ubuntu-18.04
    steg:

#     Bygg JAR:
      - anvÀnder: actions/checkout@v1
      - namn: stÀlla in JDK 11
        anvÀnder: actions/setup-java@v1
        med:
          java-version: 1.11
      - namn: Maven Paket
        kör: mvn -B clean compile package -DskipTests

#     StÀll in globala miljövariabler:
      - namn: stÀlla in globalt env
        id: global_env
        kör: |
          echo "::set-output name=IMAGE_NAME::${GITHUB_REPOSITORY#*/}"
          echo "::set-output name=DOCKERHUB_IMAGE_NAME::docker.pkg.github.com/${GITHUB_REPOSITORY}/${GITHUB_REPOSITORY#*/}"

#     Bygg Docker-bild:
      - namn: Bygg och tagga bild
        kör: |
          docker build -t "${{ steps.global_env.outputs.DOCKERHUB_IMAGE_NAME }}:latest" -t "${{ steps.global_env.outputs.DOCKERHUB_IMAGE_NAME }}:${GITHUB_SHA::8}" .

      - namn: Docker inloggning
        kör: docker login docker.pkg.github.com -u $GITHUB_ACTOR -p ${{secrets.GITHUB_TOKEN}}

#     Publicera bild till github paketförrÄd:
      - namn: Publicera bild
        env:
          IMAGE_NAME: $GITHUB_REPOSITORY
        kör: docker push "docker.pkg.github.com/$GITHUB_REPOSITORY/${{ steps.global_env.outputs.IMAGE_NAME }}"

Först behöver vi bygga JAR-filen av vÄr applikation, varefter vi berÀknar sökvÀgen till GitHub docker-register och namnet pÄ vÄr bild. HÀr finns nÄgra knep som vi Ànnu inte har stött pÄ:

  • konstruktionen av typen: echo «::set-output name=NAME::VALUE» gör att vi kan stĂ€lla in ett vĂ€rde för variabeln i det aktuella steget sĂ„ att den sedan kan lĂ€sas i alla andra steg.
  • För att fĂ„ vĂ€rdet pĂ„ variabeln som stĂ€lldes in i föregĂ„ende steg kan vi anvĂ€nda identifieraren för det steget: ${{ steps.global_env.outputs.DOCKERHUB_IMAGE_NAME }}
  • I den standardvariabeln GITHUB_REPOSITORY lagras namnet pĂ„ förvaret och dess Ă€gare ("owner/repo-name"). För att klippa bort allt utom namnet pĂ„ förvaret frĂ„n denna strĂ€ng anvĂ€nder vi bash-syntax: ${GITHUB_REPOSITORY#*/}

DÀrefter behöver vi bygga docker-bilden:

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

Logga in i registret:

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

Och publicera bilden i GitHub Packages Repository:

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

För att ange versionen av bilden anvÀnder vi de första siffrorna frÄn SHA-hashen av commit: GITHUB_SHA har ocksÄ sina nyanser, om du gör sÄdana byggen inte bara vid merge till master, utan Àven vid hÀndelsen av att skapa en pull-request, kan SHA:n skilja sig frÄn hashvÀrdet som vi ser i git-historiken, eftersom ÄtgÀrden actions/checkout gör sin unika hash för att undvika ömsesidiga blockeringar av ÄtgÀrder i PR.

Cirklar av helvetet med GitHub Actions (bygger CI/CD-pipeline för ett Java-projekt)

Om allt gick vÀl, sÄ nÀr du öppnar avsnittet paket (https://github.com/antkorwin/github-actions/packages) i förvaret, kommer du att se den nya docker-bilden:

Cirklar av helvetet med GitHub Actions (bygger CI/CD-pipeline för ett Java-projekt)

HÀr kan du ocksÄ se listan över versioner av docker-avbilden.

Det ÄterstÄr bara att konfigurera vÄr server för att arbeta med detta register och starta om tjÀnsten. Hur man gör detta via systemd, fÄr jag nog berÀtta om vid ett annat tillfÀlle.

Övervakning

LÄt oss titta pÄ ett enkelt alternativ för att göra health check av vÄr applikation med hjÀlp av GitHub Actions. I vÄr botapplikation finns det en actuator, sÄ API:et för att kontrollera dess tillstÄnd behöver vi inte ens skriva, allt Àr redan fÀrdigt för de lata. Det rÀcker att göra ett anrop till vÀrden: 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"}

Det enda vi behöver göra Àr att skriva en uppgift för att kontrollera servern en gÄng i minuten, och om den inte svarar, sÄ skickar vi en avisering till Telegram.

Först ska vi ta reda pÄ hur man kör workflow pÄ ett schema:

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

Det Àr enkelt, man kan knappt tro att man kan göra sÄdana hÀndelser pÄ GitHub som verkligen inte passar in i webhookar. Detaljer finns i dokumentationen: help.github.com/en/actions/reference/events-that-trigger-workflows#scheduled-events-schedule

Vi gör serverstatuskontrollen manuellt via 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 "hÀlsokontroll misslyckades"
            exit 1
          fi
          echo "Det Àr okej"

Först sparar vi i en variabel vad servern svarade pĂ„ förfrĂ„gan, i nĂ€sta steg kontrollerar vi att status Ă€r UP och om det inte Ă€r sĂ„ avslutar vi med ett fel. Om man behöver stĂ€nga ner Ă„tgĂ€rden manuellt, sĂ„ exit 1 – ett passande vapen.

  - name: skicka alert i telegram
    if: ${{ failure() }}
    uses: appleboy/telegram-action@master
    with:
      to: ${{ secrets.TELEGRAM_TO }}
      token: ${{ secrets.TELEGRAM_TOKEN }}
      message: |
        HĂ€lsokontroll av:
        ${{secrets.SERVER_HOST}}/api/actuator/health
        misslyckades med resultatet:
        ${{ steps.ping.outputs.status }}

Vi gör sÀndningen till Telegram endast om ÄtgÀrden misslyckades i föregÄende steg. För att skicka meddelandet anvÀnder vi appleboy/telegram-action; du kan lÀsa i dokumentationen hur du fÄr en bot-token och chat-ID: github.com/appleboy/telegram-action

Cirklar av helvetet med GitHub Actions (bygger CI/CD-pipeline för ett Java-projekt)

Glöm inte att ange i GitHub-hemligheter: URL för servern och tokens för Telegram-boten.

BonusspĂ„r – JIRA för de lata

Jag lovade att vi skulle ÄtervÀnda till JIRA, och vi har gjort det. Jag har hundratals gÄnger sett situationen pÄ standups dÀr utvecklarna gjort en funktion, slÀppt en gren, men glömt att dra uppgiften i JIRA. SjÀlvklart skulle det vara enklare om allt gjordes pÄ ett stÀlle, men faktiskt skriver vi kod i en IDE, slÀpper grenar i Bitbucket eller GitHub, och drar sedan uppgifterna till JIRA, för detta mÄste vi öppna nya fönster, ibland logga in igen etc. NÀr du perfekt minns vad som behöver göras hÀrnÀst finns det ingen mening med att öppna tavlan en gÄng till. I slutÀndan mÄste vi spendera tid pÄ morgonen under standupen för att uppdatera uppgiftsbrÀdan.

GitHub kommer att hjÀlpa oss Àven med denna rutinuppgift, först kan vi automatiskt dra uppgifter till kolumnen code_review nÀr vi skickar en pull-request. Allt som behövs Àr att följa namngivningskonventionen för grenarna:

[projektets namn]-[uppgiftsnummer]-namn

till exempel, om projektets nyckel 'GitHub Actions' Àr GA, sÄ GA-8-jira-bot kan vara en gren för att genomföra uppgiften GA-8.

Integrationen med JIRA fungerar via Atlassians actions, de Àr inte perfekta, jag mÄste sÀga, vissa av dem har överhuvudtaget inte fungerat för mig. Men vi kommer endast att diskutera de som vi vet fungerar och som anvÀnds aktivt.

Först mÄste du autentisera dig i JIRA med hjÀlp av ÄtgÀrden: 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 }}

För detta behöver du fÄ en token i JIRA, hur detta görs beskrivs hÀr: confluence.atlassian.com/cloud/api-tokens-938839638.html

Extrahera uppgiftens identifierare frÄn grenens namn:

  - 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 "VĂ€nligen namnge din gren enligt JIRA-uppgiften: [project_key]-[task_number]-branch_name"
        exit 1
      fi
      echo framgÄngsrikt hittad JIRA-uppgift: ${{steps.find_issue.outputs.ISSUE_ID}}

Om du söker i GitHub marketplace kan du hitta en ÄtgÀrd för denna uppgift, men jag var tvungen att skriva samma sak via grep baserat pÄ grenens namn, eftersom denna ÄtgÀrd frÄn Atlassian vÀgrade att fungera i mitt projekt, och det skulle ta lÀngre tid att ta reda pÄ vad som var fel Àn att göra det manuellt.

Det enda som ÄterstÄr Àr att flytta uppgiften till kolumnen "Code review" nÀr du skapar en pull request:

  - name: ÖvergĂ„ng av Ă€rende
    if: ${{ success() }}
    uses: atlassian/gajira-transition@master
    with:
      issue: ${{ steps.find_issue.outputs.ISSUE_ID }}
      transition: "Code review"

Det finns en speciell ÄtgÀrd pÄ GitHub för detta; allt den behöver Àr ID:t för Àrendet som erhölls i föregÄende steg och autentisering i JIRA, vilket vi gjorde tidigare.

Cirklar av helvetet med GitHub Actions (bygger CI/CD-pipeline för ett Java-projekt)

PÄ samma sÀtt kan du dra över uppgifter vid sammanslagning till master, och vid andra hÀndelser i GitHub-workflow. I princip beror allt pÄ din fantasi och vilja att automatisera rutinprocesser.

Slutsatser

Om vi tittar pÄ den klassiska DEVOPS-diagrammet har vi tÀckt alla steg, förutom operate. Jag tror, om vi anstrÀnger oss, kan vi hitta nÄgon ÄtgÀrd i marknadsplatsen för integration med ett help-desk-system, sÄ vi kan anta att pipeline Àr grundlig och att vi kan dra slutsatser baserat pÄ dess anvÀndning.

Cirklar av helvetet med GitHub Actions (bygger CI/CD-pipeline för ett Java-projekt)

Fördelar:

  • Marknadsplatsen med fĂ€rdiga Ă„tgĂ€rder för alla tillfĂ€llen Ă€r riktigt bra. I de flesta kan du ocksĂ„ se kĂ€llkoden för att förstĂ„ hur man löser liknande problem eller posta en funktionsförfrĂ„gan direkt till författaren i GitHub-repot.
  • Valet av mĂ„lplattform för byggande: Linux, macOS, Windows Ă€r en ganska intressant funktion.
  • GitHub Packages Ă€r en utmĂ€rkt sak; att hĂ„lla hela infrastrukturen pĂ„ en plats Ă€r praktiskt, du behöver inte surfa runt i olika fönster, allt finns inom en-till-tvĂ„ musknĂ€pp, och Ă€r perfekt integrerat med GitHub Actions. Stödet för Docker-registret i gratisversionen Ă€r ocksĂ„ en bra fördel.
  • GitHub gömmer hemligheter i byggloggarna, sĂ„ att anvĂ€nda det för att lagra lösenord och tokens Ă€r inte sĂ„ hemskt. Under hela min tid med experiment har jag inte en enda gĂ„ng sett en hemlighet i klartext i konsolen.
  • Gratis för Open Source-projekt

Nackdelar:

  • YML, jag gillar det inte. NĂ€r jag arbetar med ett sĂ„dant flöde Ă€r mitt vanligaste commit-meddelande "fix yml format"; ibland glömmer man att sĂ€tta en tab eller skriver pĂ„ fel rad. SĂ„ att sitta framför skĂ€rmen med en gradskiva och linjal Ă€r inte det trevligaste.
  • DEBUG, att felsöka flöden med commits, Ă„terbyggnader och utskrift till konsolen Ă€r inte alltid bekvĂ€mt, men det faller mer under kategorin "ni har blivit bortskĂ€mda", dĂ„ vi har vant oss vid att arbeta med bekvĂ€ma IDE:er dĂ€r man kan felsöka allt.
  • Du kan skriva din egen action i vilket sprĂ„k som helst om du packar den i Docker, men endast JavaScript stöds nativt. SjĂ€lvklart Ă€r det en smaksak, men jag skulle föredra nĂ„got annat istĂ€llet för js.

Jag pÄminner om att lagret med alla skript finns hÀr: github.com/antkorwin/github-actions

NÀsta vecka kommer jag att tala pÄ med en presentation Heisenbug 2020 Piter konferensen. Jag kommer att berÀtta inte bara hur man undviker misstag vid förberedning av testdata, utan ocksÄ dela med mig av mina hemligheter för att arbeta med datamÀngder i Java-applikationer!

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster