ProHoster > ΠΠ»ΠΎΠ³ > Pagdumala > Mga sirkulo sa impyerno nga adunay GitHub Actions (pagtukod ug CI/CD pipeline alang sa proyekto sa Java)
Mga sirkulo sa impyerno nga adunay GitHub Actions (pagtukod ug CI/CD pipeline alang sa proyekto sa Java)
Kanunay kong kinahanglan nga magtukod og pipeline alang sa pagtukod og mga proyekto sa Java. Usahay kini open source, usahay dili. Bag-ohay lang ako nakahukom sa pagsulay sa pagbalhin sa pipila sa akong mga repositoryo gikan sa Travis-CI ug TeamCity ngadto sa GitHub Actions, ug mao kini ang migawas niini.
Unsa ang atong i-automate?
Una, kinahanglan namon ang usa ka proyekto nga among i-automate, maghimo kami usa ka gamay nga aplikasyon sa Spring boot / Java 11 / Maven. Alang sa mga katuyoan niini nga artikulo, dili kami interesado sa lohika sa aplikasyon; ang imprastraktura sa palibot sa aplikasyon hinungdanon kanamo, busa ang usa ka yano nga REST API controller igo na alang kanamo.
Mahimo nimong tan-awon ang mga gigikanan dinhi: github.com/antkorwin/github-actions Ang tanan nga mga yugto sa pagtukod sa usa ka pipeline makita sa mga hangyo sa pagbitad alang niini nga proyekto.
JIRA ug pagplano
Angayan nga isulti nga kasagaran namong gigamit ang JIRA isip usa ka tracker sa isyu, busa maghimo kita og bulag nga board alang niini nga proyekto ug idugang ang unang mga isyu didto:
Usa ka gamay sa ulahi mobalik kami sa kung unsa nga makapaikag nga mga butang ang mahimo nga itanyag sa JIRA ug GitHub sa kombinasyon.
Gi-automate namo ang asembliya sa proyekto
Ang among proyekto sa pagsulay gitukod pinaagi sa maven, mao nga ang pagtukod niini yano ra, ang kinahanglan namon mao ang limpyo nga pakete sa mvn.
Aron mahimo kini gamit ang Github Actions, kinahanglan namon nga maghimo usa ka file sa repository nga naghulagway sa among daloy sa trabaho, mahimo kini gamit ang usa ka regular nga yml file, dili ako makaingon nga gusto nako ang "yml programming", apan unsa ang among mahimo - buhaton nato kini sa .github/ directory workflow/ file build.yml diin atong ihulagway ang mga aksyon sa dihang magtukod sa master branch:
on β kini usa ka paghulagway sa panghitabo diin ang among script ilunsad.
sa: pull_request/push - nagpakita nga kini nga workflow kinahanglan nga ilunsad sa matag higayon nga ang usa ka pagduso gihimo ngadto sa agalon ug pagbitad hangyo gibuhat.
Ang mosunod mao ang paghulagway sa mga buluhaton (trabaho) ug mga lakang sa pagpatuman (mga lakang) alang sa matag buluhaton.
run-on - dinhi mahimo naton mapili ang target nga OS, katingad-an, mahimo ka pa nga makapili sa Mac OS, apan sa mga pribadong repositoryo kini medyo mahal (itandi sa Linux).
gamit nagtugot kanimo sa paggamit pag-usab sa ubang mga aksyon, pananglitan, gamit ang aksyon/setup-java nga aksyon nga among gi-install ang palibot para sa Java 11.
Uban sa tabang sa uban sa mahimo natong ipiho ang mga parameter diin atong ilunsad ang aksyon, sa esensya mao kini ang mga argumento nga ipasa sa aksyon.
Ang nahabilin mao ang pagpadagan sa pagtukod sa proyekto kauban si Maven: run: mvn -B clean package bandera -B nag-ingon nga kinahanglan namon ang usa ka non-interactive mode aron ang maven kalit nga dili gusto nga mangutana kanamo
Nindot! Karon, sa matag higayon nga mopasalig ka sa agalon, magsugod ang pagtukod sa proyekto.
Pag-automate sa paglansad sa pagsulay
Ang asembliya maayo, apan sa pagkatinuod, ang usa ka proyekto mahimong luwas nga matigom, apan dili molihok. Busa, ang sunod nga lakang mao ang pag-automate sa mga pagsulay. Dugang pa, sayon ββββra ang pagtan-aw sa mga resulta sa pagpasa sa mga pagsulay kung maghimo ka usa ka pagrepaso sa PR - nahibal-an nimo nga sigurado nga ang mga pagsulay moagi ug walay usa nga nakalimot sa pagpadagan sa ilang sanga sa wala pa maghiusa.
Maghimo kami og mga pagsulay sa paghimo sa usa ka hangyo sa pagbitad ug paghiusa sa agalon, ug sa samang higayon among idugang ang paghimo sa usa ka taho sa pagsakop sa code.
Aron matabonan ang mga pagsulay, gigamit nako ang codecov kauban ang jacoco plugin. Ang codecov adunay kaugalingon nga aksyon, apan kinahanglan kini usa ka timaan aron molihok sa among hangyo sa pagbitad:
${{ secrets.CODECOV_TOKEN }} - makita nato kini nga pagtukod labaw pa sa kausa, ang mga sekreto usa ka mekanismo sa pagtipig sa mga sekreto sa GitHub, mahimo natong isulat didto ang mga password / token / host / url ug uban pang mga datos nga dili kinahanglan nga ilakip sa base sa repository code.
Mahimo nimong idugang ang usa ka variable sa mga sekreto sa mga setting sa repository sa GitHub:
Makakuha ka ug token sa codecov.io Pagkahuman sa pagtugot pinaagi sa GitHub, aron makadugang usa ka publiko nga proyekto kinahanglan nimo nga sundon ang usa ka link nga sama niini: GitHub user name/[repo nga ngalan]. Mahimo usab nga idugang ang usa ka pribado nga repository; aron mahimo kini, kinahanglan nimo nga hatagan ang mga katungod sa codecov sa aplikasyon sa Github.
Karon ang codecov bot mosulod sa matag usa sa among mga hangyo sa pagbitad ug magdugang usa ka graph sa pagbag-o sa sakup:
Magdugang ta ug static analyzer
Sa kadaghanan sa akong open source nga mga proyekto gigamit nako ang sonar cloud para sa static code analysis, sayon ββra ang pagkonektar sa travis-ci. Mao nga kini usa ka lohikal nga lakang kung mobalhin sa GitHub Actions aron buhaton ang parehas. Ang merkado sa aksyon usa ka cool nga butang, apan niining higayona gipaubos ko kini og gamay, tungod kay tungod sa batasan nakit-an nako ang aksyon nga akong gikinahanglan ug gidugang kini sa workflow. Apan kini nahimo nga ang sonar wala nagsuporta sa pagtrabaho pinaagi sa usa ka aksyon alang sa pag-analisar sa mga proyekto sa maven o gradle. Siyempre, kini gisulat sa dokumentasyon, apan kinsa ang nagbasa niini?!
Dili kini mahimo pinaagi sa usa ka aksyon, mao nga buhaton namo kini pinaagi sa mvn plugin:
SONAR_TOKEN - mahimong makuha sa sonarcloud.io ug kinahanglan nimo nga irehistro kini sa mga sekreto. GITHUB_TOKEN - kini usa ka built-in nga token nga gimugna sa GitHub, uban sa tabang nga ang sonarcloud[bot] makahimo sa pag-log in sa Git aron magbilin kanamo og mga mensahe sa mga hangyo sa pagbitad.
Dsonar.projectKey β ang ngalan sa proyekto sa sonar, makita nimo kini sa mga setting sa proyekto.
Dsonar.organisasyon - ngalan sa organisasyon gikan sa GitHub.
Naghimo kami usa ka hangyo sa pagbitad ug naghulat nga moabut ang sonarcloud[bot] sa mga komento:
Pagpagawas sa pagdumala
Ang pagtukod na-configure na, ang mga pagsulay gipadagan na, ug makahimo kami og pagpagawas. Atong tan-awon kon sa unsang paagi ang GitHub Actions makahimo sa pagdumala sa pagpagawas nga mas sayon.
Sa trabahoan, naa koy mga proyekto kansang code base naa sa bitbucket (ang tanan sama sa istorya nga "Nagsulat ako sa bitbucket sa adlaw, nagpasalig sa GitHub sa gabii"). Ikasubo, ang bitbucket walay built-in nga mga himan sa pagdumala sa pagpagawas. Kini usa ka problema, tungod kay alang sa matag pagpagawas kinahanglan nimo nga mano-mano ang paghimo sa usa ka panid sa panagtagbo ug paglabay sa tanan nga mga bahin nga gilakip sa pagpagawas didto, pagpangita sa mga palasyo sa hunahuna, mga buluhaton sa jira, gihimo sa repositoryo. Adunay daghang mga higayon nga masayop, mahimo nimong kalimtan ang usa ka butang o isulod ang usa ka butang nga gipagawas na sa miaging higayon, usahay dili klaro kung unsa ang pagklasipikar sa usa ka hangyo sa pagbitad ingon - kini ba usa ka bahin o pag-ayo sa bug, o mga pagsulay sa pag-edit, o usa ka butang nga imprastraktura.
Sa unsang paagi ang mga aksyon sa GitHub makatabang kanato? Adunay usa ka maayo nga aksyon - release drafter, gitugotan ka nga magbutang usa ka template sa file sa mga nota sa pagpagawas aron ma-set up ang mga kategorya sa mga hangyo sa pagbitad ug awtomatiko nga igrupo kini sa file sa mga nota sa pagpagawas:
Pananglitan nga template para sa pag-set up og report (.github/release-draafter.yml):
Ang tanan nga mga hangyo sa pagbitad gikan karon makolekta sa mga nota sa pagpagawas awtomatiko - salamangka!
Dinhi ang pangutana mahimong motungha: unsa man kung ang mga developer makalimot sa pagbutang sa mga tag sa PR? Unya dili klaro kung unsang kategorya ang ibutang niini, ug usab kinahanglan nimo nga atubangon kini nga mano-mano, sa matag PR nga gilain. Aron ayuhon kini nga problema, mahimo namong gamiton ang laing aksyon - label verifier - kini nagsusi sa presensya sa mga tag sa pull request. Kung wala'y gikinahanglan nga mga tag, nan ang tseke mapakyas ug makakita kami og mensahe mahitungod niini sa among pull request.
Karon ang bisan unsang pull-request kinahanglang markahan sa usa sa mga tag: type:fix, type:features, type:documentation, type:tests, type:config.
Auto-annotation sa mga hangyo sa pagbitad
Tungod kay among gihikap ang ingon nga hilisgutan sama sa epektibo nga trabaho nga adunay mga hangyo sa pagbitad, angay nga hisgutan ang ingon nga aksyon sama sa labeler, nagbutang kini mga tag sa PR base sa kung unsang mga file ang nabag-o. Pananglitan, mahimo natong markahan nga [pagtukod] ang bisan unsang hangyo sa pagbitad nga adunay mga pagbag-o sa direktoryo .github/workflow.
Wala ako molampos sa pagpares sa aksyon nga awtomatikong nagbutang sa mga label sa mga hangyo sa pagbitad uban ang aksyon nga nagsusi sa presensya sa gikinahanglan nga mga label; ang match-label dili gusto nga makita ang mga label nga gidugang sa bot. Daw mas sayon ββang pagsulat sa imong kaugalingong aksyon nga naghiusa sa duha ka hugna. Apan bisan sa kini nga porma kini sayon ββββnga gamiton; kinahanglan nimo nga magpili usa ka label gikan sa lista kung maghimo usa ka hangyo sa pagbitad.
Panahon na sa pag-deploy
Gisulayan nako ang daghang mga kapilian sa pag-deploy pinaagi sa GitHub Actions (pinaagi sa ssh, pinaagi sa scp, ug paggamit sa docker-hub), ug makaingon ako nga, lagmit, makit-an nimo ang usa ka paagi aron ma-upload ang binary sa server, bisan unsa pa ka hiwi ang imong pipeline. mao ang.
Ganahan ko sa opsyon sa pagtipig sa tibuok nga imprastraktura sa usa ka dapit, mao nga tan-awon nato kung unsaon pag-deploy sa GitHub Packages (kini usa ka repository alang sa binary nga sulod, npm, jar, docker).
Script alang sa paghimo sa usa ka docker nga imahe ug pagmantala niini sa GitHub Packages:
Una, kinahanglan namon nga tukuron ang JAR file sa among aplikasyon, pagkahuman among kuwentahon ang agianan sa GitHub docker registry ug ang ngalan sa among imahe. Adunay pipila ka mga limbong dinhi nga wala pa namon makit-an:
usa ka pagtukod sama sa: echo ":: set-output name = NAME:: VALUE" nagtugot kanimo sa pagtakda sa bili sa usa ka variable sa kasamtangan nga lakang, aron kini mabasa sa tanan nga uban nga mga lakang.
makuha nimo ang bili sa variable set sa miaging lakang pinaagi sa identifier niini nga lakang: ${{ steps.global_env.outputs.DOCKERHUB_IMAGE_NAME }}
Ang standard nga GITHUB_REPOSITORY variable nagtipig sa ngalan sa repository ug tag-iya niini ("tag-iya / repo-ngalan"). Aron maputol ang tanan gikan niini nga linya gawas sa ngalan sa repository, atong gamiton ang bash syntax: ${GITHUB_REPOSITORY#*/}
Sunod kinahanglan naton tukuron ang imahe sa docker:
Aron maipakita ang bersyon sa imahe, gigamit namon ang una nga mga numero gikan sa SHA hash sa commit - GITHUB_SHA adunay mga nuances usab dinhi, kung maghimo ka sa ingon nga mga pagtukod dili lamang kung maghiusa sa master, apan sumala usab sa paghimo sa hangyo sa pagbitad. nga panghitabo, nan ang SHA mahimong dili motakdo sa hash nga atong makita sa git history, tungod kay ang mga aksyon/checkout nga aksyon naghimo sa kaugalingon nga talagsaon nga hash aron malikayan ang deadlocking nga mga aksyon sa PR.
Kung maayo ang tanan, unya ablihan ang seksyon sa mga pakete (https://github.com/antkorwin/github-actions/packages) sa repository, makakita ka usa ka bag-ong imahe sa docker:
Didto mahimo usab nimo makita ang usa ka lista sa mga bersyon sa imahe sa docker.
Ang nahabilin mao ang pag-configure sa among server aron magtrabaho sa kini nga rehistro ug i-restart ang serbisyo. Mahimong hisgutan nako kung giunsa kini buhaton pinaagi sa systemd sa laing higayon.
Pagbantay
Atong tan-awon ang usa ka yano nga kapilian kung giunsa paghimo ang usa ka pagsusi sa kahimsog alang sa among aplikasyon gamit ang GitHub Actions. Ang among aplikasyon sa boot adunay actuator, mao nga dili na kami kinahanglan nga magsulat og API aron masusi ang kahimtang niini; nahimo na namo ang tanan alang sa mga tapulan. Kinahanglan lang nimo ibira ang host: SERVER-URL:PORT/actuator/health
Ang tanan nga among gikinahanglan mao ang pagsulat sa usa ka buluhaton aron masusi ang server gamit ang cron, ug kung kalit nga dili kini motubag kanamo, unya magpadala kami usa ka pahibalo pinaagi sa telegrama.
Una, atong mahibal-an kung giunsa pagpadagan ang usa ka cron workflow:
Susihon nato ang status sa server pinaagi sa curl:
jobs:
ping:
runs-on: ubuntu-18.04
steps:
- name: curl actuator
id: ping
run: |
echo "::set-output name=status::$(curl ${{secrets.SERVER_HOST}}/api/actuator/health)"
- name: health check
run: |
if [[ ${{ steps.ping.outputs.status }} != *"UP"* ]]; then
echo "health check is failed"
exit 1
fi
echo "It's OK"
Una, gitipigan namon sa usa ka variable kung unsa ang gitubag sa server sa hangyo, sa sunod nga lakang among gisusi nga ang status mao ang UP ug, kung dili kini ang kaso, nan migawas kami nga adunay sayup. Kung kinahanglan nimo nga "mabug-atan" ang usa ka aksyon gamit ang imong mga kamot, nan paggawas 1 - angay nga hinagiban.
- 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 }}
Nagpadala kami sa telegrama lamang kung ang aksyon napakyas sa miaging lakang. Aron magpadala usa ka mensahe gigamit namon ang appleboy/telegram-action; mabasa nimo kung giunsa pagkuha ang usa ka token sa bot ug chat id sa dokumentasyon: github.com/appleboy/telegram-action
Ayaw kalimti ang pagsulat sa mga sekreto sa Github: URL para sa server ug mga token para sa telegrama nga bot.
Bonus track - JIRA para sa mga tapulan
Nisaad ko nga mubalik mi sa JIRA, ug nibalik mi. Gatusan ka mga higayon nga akong naobserbahan ang usa ka sitwasyon sa mga stand-up sa dihang ang mga developers naghimo sa usa ka bahin, naghiusa sa usa ka sanga, apan nakalimot sa pagbitad sa isyu ngadto sa JIRA. Siyempre, kung kining tanan gihimo sa usa ka dapit, kini mas sayon, apan sa pagkatinuod kita magsulat sa code sa IDE, maghiusa sa mga sanga ngadto sa bitbucket o GitHub, ug dayon i-drag ang mga buluhaton ngadto sa Jira, alang niini kinahanglan natong ablihan ang bag-ong mga bintana. , usahay mag log in ug uban pa. Kung hingpit nimong nahinumduman kung unsa ang kinahanglan nimo nga buhaton sunod, nan walaβy kapuslanan sa pag-abli pag-usab sa pisara. Ingon usa ka sangputanan, sa buntag sa usa ka standup kinahanglan nimo nga mogahin og oras sa pag-update sa task board.
Ang GitHub makatabang usab kanamo sa kini nga naandan nga buluhaton; alang sa pagsugod, mahimo namon nga awtomatiko nga i-drag ang mga isyu sa kolum sa code_review kung magsumite kami usa ka hangyo sa pagbitad. Ang kinahanglan nimong buhaton mao ang pagsunod sa kombensiyon sa pagngalan sa sanga:
pananglitan, kung ang yawe sa proyekto nga "GitHub Actions" kay GA, nan GA-8-jira-bot mahimong usa ka sanga alang sa pagpatuman sa GA-8 nga buluhaton.
Ang panagsama sa JIRA naglihok pinaagi sa mga aksyon gikan sa Atlassian, dili sila perpekto, kinahanglan nako isulti nga ang uban kanila wala gyud molihok alang kanako. Apan hisgutan ra naton ang mga sigurado nga nagtrabaho ug aktibo nga gigamit.
Una kinahanglan nimo nga mag log in sa JIRA gamit ang aksyon: atlassian/gajira-login
Gikuha namo ang task identifier gikan sa ngalan sa sanga:
- name: Find Issue
id: find_issue
shell: bash
run: |
echo "::set-output name=ISSUE_ID::$(echo ${GITHUB_HEAD_REF} | egrep -o 'GA-[0-9]{1,4}')"
echo brach name: $GITHUB_HEAD_REF
echo extracted issue: ${GITHUB_HEAD_REF} | egrep -o 'GA-[0-9]{1,4}'
- name: Check Issue
shell: bash
run: |
if [[ "${{steps.find_issue.outputs.ISSUE_ID}}" == "" ]]; then
echo "Please name your branch according to the JIRA issue: [project_key]-[task_number]-branch_name"
exit 1
fi
echo succcessfully found JIRA issue: ${{steps.find_issue.outputs.ISSUE_ID}}
Kung mangita ka sa merkado sa GitHub, makapangita ka usa ka aksyon alang niini nga buluhaton, apan kinahanglan nako nga isulat ang parehas nga butang gamit ang grep gamit ang ngalan sa sanga, tungod kay kini nga aksyon gikan sa Atlassian dili gusto nga magtrabaho sa akong proyekto sa bisan unsang paagi. , aron mahibal-an kung unsa ang sayup didto - mas dugay kaysa pagbuhat sa parehas nga butang gamit ang imong mga kamot.
Ang nahabilin mao ang pagbalhin sa buluhaton sa kolum nga "Pagsusi sa code" kung maghimo usa ka hangyo sa pagbitad:
Adunay usa ka espesyal nga aksyon alang niini sa GitHub, ang tanan nga kinahanglan niini mao ang isyu ID nga nakuha sa miaging lakang ug ang pagtugot sa JIRA nga among gihimo sa ibabaw.
Sa parehas nga paagi, mahimo nimong i-drag ang mga buluhaton kung maghiusa sa master, ug uban pang mga panghitabo gikan sa workflow sa GitHub. Sa kinatibuk-an, kini tanan nagdepende sa imong imahinasyon ug tinguha nga i-automate ang naandan nga mga proseso.
kaplag
Kung imong tan-awon ang klasiko nga diagram sa DEVOPS, gitabonan namon ang tanan nga mga yugto, gawas nga tingali nag-operate, sa akong hunahuna kung sulayan nimo, makit-an nimo ang pipila nga aksyon sa merkado alang sa panagsama sa sistema sa help-desk, mao nga atong hunahunaon nga ang pipeline mibalik. mahimong bug-os ug ang mga konklusyon mahimong makuha base sa paggamit niini.
Mga Pro:
Marketplace nga adunay andam nga mga aksyon alang sa tanan nga mga okasyon, kini cool kaayo. Sa kadaghanan niini, mahimo usab nimo tan-awon ang source code aron masabtan kung giunsa pagsulbad ang parehas nga problema o pag-post sa usa ka hangyo nga bahin sa tagsulat direkta sa GitHub repository.
Pagpili sa target nga plataporma alang sa asembliya: Linux, mac os, windows usa ka makapaikag nga bahin.
Ang Github Packages usa ka maayo nga butang, kini sayon ββββnga itago ang tibuok nga imprastraktura sa usa ka dapit, dili nimo kinahanglan nga mag-surf sa lain-laing mga bintana, ang tanan anaa sa sulod sa radius sa usa o duha ka mga pag-klik sa mouse ug hingpit nga gisagol sa GitHub Actions. Ang suporta sa rehistro sa Docker sa libre nga bersyon usa usab ka maayong bentaha.
Ang GitHub nagtago sa mga sekreto sa pagtukod og mga log, mao nga ang paggamit niini sa pagtipig sa mga password ug mga token dili kaayo makahadlok. Sa tanan nakong mga eksperimento, wala gyud nako makita ang sekreto sa putli nga porma niini sa console.
Libre para sa mga proyekto sa Open Source
Kahinumduman:
YML, aw, di ko ganahan niya. Kung nagtrabaho sa ingon nga dagan, ang labing kasagaran nga mensahe sa komit nga naa nako mao ang "pag-ayo sa yml format", unya nakalimot ka nga magbutang usa ka tab sa usa ka lugar, o isulat nimo kini sa sayup nga linya. Sa kinatibuk-an, ang paglingkod sa atubangan sa usa ka screen nga adunay protractor ug ruler dili ang labing nindot nga kasinatian.
Ang DEBUG, pag-debug sa dagan gamit ang mga commit, pagpadagan sa usa ka pagtukod pag-usab, ug ang pag-output sa console dili kanunay kombenyente, apan kini labi pa sa kategorya nga "nasobra na ka"; naanad ka sa pagtrabaho uban ang kombenyente nga IDEA, kung mahimo nimo i-debug ang bisan unsang butang. .
Mahimo nimong isulat ang imong aksyon sa bisan unsang butang kung imong giputos kini sa Docker, apan ang javascript lamang ang gisuportahan sa lumad, siyempre kini usa ka butang sa lami, apan gusto nako ang usa ka butang imbis sa js.
Sa sunod semana magperform ko report sa komperensya sa Heisenbug 2020 Piter. Sultihan ko ikaw dili lamang kung unsaon paglikay sa mga sayup sa pag-andam sa datos sa pagsulay, apan ipaambit usab ang akong mga sekreto sa pagtrabaho sa mga data set sa mga aplikasyon sa Java!