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:

Mga sirkulo sa impyerno nga adunay GitHub Actions (pagtukod ug CI/CD pipeline alang sa proyekto sa Java)

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:

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 β€” 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

Mga sirkulo sa impyerno nga adunay GitHub Actions (pagtukod ug CI/CD pipeline alang sa proyekto sa Java)

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.

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

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:

Mga sirkulo sa impyerno nga adunay GitHub Actions (pagtukod ug CI/CD pipeline alang sa proyekto sa Java)

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.

Mga sirkulo sa impyerno nga adunay GitHub Actions (pagtukod ug CI/CD pipeline alang sa proyekto sa Java)

Idugang ang jacoco plugin sa POM file:

<plugin>
	<groupId>org.jacoco</groupId>
	<artifactId>jacoco-maven-plugin</artifactId>
	<version>0.8.4</version>
	<executions>
		<execution>
			<goals>
				<goal>prepare-agent</goal>
			</goals>
		</execution>
		<!-- attached to Maven test phase -->
		<execution>
			<id>report</id>
			<phase>test</phase>
			<goals>
				<goal>report</goal>
			</goals>
		</execution>
	</executions>
</plugin>
<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-surefire-plugin</artifactId>
	<version>2.22.2</version>
	<configuration>
		<reportFormat>plain</reportFormat>
		<includes>
			<include>**/*Test*.java</include>
			<include>**/*IT*.java</include>
		</includes>
	</configuration>
</plugin>

Karon ang codecov bot mosulod sa matag usa sa among mga hangyo sa pagbitad ug magdugang usa ka graph sa pagbag-o sa sakup:

Mga sirkulo sa impyerno nga adunay GitHub Actions (pagtukod ug CI/CD pipeline alang sa proyekto sa Java)

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:

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

Mga sirkulo sa impyerno nga adunay GitHub Actions (pagtukod ug CI/CD pipeline alang sa proyekto sa Java)

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:

Mga sirkulo sa impyerno nga adunay GitHub Actions (pagtukod ug CI/CD pipeline alang sa proyekto sa Java)

Pananglitan nga template para sa pag-set up og report (.github/release-draafter.yml):

name-template: 'v$NEXT_PATCH_VERSION'
tag-template: 'v$NEXT_PATCH_VERSION'
categories:
  - title: ' New Features'
    labels:
      - 'type:features'
# Π² эту ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡŽ собираСм всС PR с ΠΌΠ΅Ρ‚ΠΊΠΎΠΉ type:features

  - title: ' Bugs Fixes'
    labels:
      - 'type:fix'
# Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ для ΠΌΠ΅Ρ‚ΠΊΠΈ type:fix ΠΈ Ρ‚.Π΄.

  - title: ' Documentation'
    labels:
      - 'type:documentation'

  - title: ' Configuration'
    labels:
      - 'type:config'

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

Pagdugang og script aron makamugna og draft release (.github/workflows/release-draft.yml):

name: "Create draft release"

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

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.

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'

Karon ang bisan unsang pull-request kinahanglang markahan sa usa sa mga tag: type:fix, type:features, type:documentation, type:tests, type:config.

Mga sirkulo sa impyerno nga adunay GitHub Actions (pagtukod ug CI/CD pipeline alang sa proyekto sa Java)

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.

Ang pagkonektar niini yano ra:

name: "Auto-assign themes to PR"

on:
  - pull_request

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

Kinahanglan usab namon ang usa ka file nga naghulagway sa mga sulat tali sa mga direktoryo sa proyekto ug mga hilisgutan sa paghangyo sa pagbitad:

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

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

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

theme:documentation:
  - "docs/**"

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

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

Mga sirkulo sa impyerno nga adunay GitHub Actions (pagtukod ug CI/CD pipeline alang sa proyekto sa Java)

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:

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

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:

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

Log in sa rehistro:

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

Ug i-publish ang imahe sa GitHub Packages Repository:

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

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.

Mga sirkulo sa impyerno nga adunay GitHub Actions (pagtukod ug CI/CD pipeline alang sa proyekto sa Java)

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:

Mga sirkulo sa impyerno nga adunay GitHub Actions (pagtukod ug CI/CD pipeline alang sa proyekto sa Java)

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

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

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:

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

Yano ra, dili ko makatuo nga sa Github makahimo ka og mga panghitabo nga dili gyud angay sa mga webhook. Ang mga detalye anaa sa dokumentasyon: help.github.com/en/actions/reference/events-that-trigger-workflows#scheduled-events-schedule

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

Mga sirkulo sa impyerno nga adunay GitHub Actions (pagtukod ug CI/CD pipeline alang sa proyekto sa Java)

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

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

Aron mahimo kini, kinahanglan nimo nga makakuha usa ka token sa JIRA, kung giunsa kini buhaton gihulagway dinhi: confluence.atlassian.com/cloud/api-tokens-938839638.html

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:

  - name: Transition issue
    if: ${{ success() }}
    uses: atlassian/gajira-transition@master
    with:
      issue: ${{ steps.find_issue.outputs.ISSUE_ID }}
      transition: "Code review"

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.

Mga sirkulo sa impyerno nga adunay GitHub Actions (pagtukod ug CI/CD pipeline alang sa proyekto sa Java)

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 sirkulo sa impyerno nga adunay GitHub Actions (pagtukod ug CI/CD pipeline alang sa proyekto sa Java)

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.

Pahinumdoman ko ikaw nga ang repository nga adunay tanan nga mga script ania dinhi: github.com/antkorwin/github-actions

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!

Source: www.habr.com