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

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

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:

Man kan fĂ„ token pĂ„ efter inloggning via GitHub, för att lĂ€gga till ett offentligt projekt behöver man bara följa en lĂ€nk av typen: /[repo name]. ĐŃĐžĐČаŃĐœŃĐč ŃĐ”ĐżĐŸĐ·ĐžŃĐŸŃĐžĐč ŃĐŸĐ¶Đ” ĐŒĐŸĐ¶ĐœĐŸ ĐŽĐŸĐ±Đ°ĐČĐžŃŃ, ĐŽĐ»Ń ŃŃĐŸĐłĐŸ ĐœĐ°ĐŽĐŸ ЎаŃŃ ĐżŃаĐČа codecov ĐżŃĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ ĐČ ĐłĐžŃŃ Đ°Đ±Đ”.

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:

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Ă„ 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:

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:

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.

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

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.

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:

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

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:
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.

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.

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:
NÀsta vecka kommer jag att tala pÄ 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
