Circles of hell with GitHub Actions (ngawangun pipa CI/CD pikeun proyék Java)

Circles of hell with GitHub Actions (ngawangun pipa CI/CD pikeun proyék Java)

Kuring mindeng kudu ngawangun pipa pikeun ngawangun proyék di Jawa. Kadang éta open source, kadang henteu. Kuring nembe mutuskeun pikeun nyobaan mindahkeun sababaraha repositori kuring ti Travis-CI sareng TeamCity ka GitHub Actions, sareng ieu anu kaluar tina éta.

Naon anu bakal urang otomatiskeun?

Mimiti, urang peryogi proyék anu bakal urang otomatiskeun, hayu urang ngadamel aplikasi leutik dina boot Spring / Java 11 / Maven. Pikeun kaperluan artikel ieu, urang moal kabetot dina logika aplikasi pisan; infrastruktur sabudeureun aplikasi penting pikeun kami, jadi controller REST API basajan bakal cukup keur urang.

Anjeun tiasa ningali sumberna di dieu: github.com/antkorwin/github-actions Sakabéh tahapan ngawangun pipa a reflected dina requests tarikan pikeun proyék ieu.

JIRA jeung tata

Éta patut disebutkeun yen urang biasana make JIRA salaku tracker masalah, jadi hayu urang nyieun hiji dewan misah pikeun proyék ieu tur nambahkeun masalah munggaran aya:

Circles of hell with GitHub Actions (ngawangun pipa CI/CD pikeun proyék Java)

Sakedap deui urang bakal uih deui kana hal-hal anu pikaresepeun anu tiasa ditawarkeun JIRA sareng GitHub dina kombinasi.

Urang ngajadikeun otomatis assembly proyék

Proyék uji kami diwangun via maven, janten ngawangun éta saderhana, sadayana anu urang peryogikeun nyaéta pakét bersih mvn.

Pikeun ngalakukeun ieu nganggo Github Actions, urang kedah nyiptakeun file dina gudang anu ngajelaskeun alur kerja urang, ieu tiasa dilakukeun ku file yml biasa, kuring henteu tiasa nyarios yén kuring resep "yml programming", tapi naon anu urang tiasa laksanakeun - urang ngalakukeun eta dina .github / workflow diréktori / file build.yml nu urang bakal ngajelaskeun lampah nalika ngawangun cabang master:

name: Build

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

jobs:
  build:
    runs-on: ubuntu-18.04
    steps:
      - uses: actions/checkout@v1
      - name: set up JDK 11
        uses: actions/setup-java@v1
        with:
          java-version: 1.11
      - name: Maven Package
        run: mvn -B clean package -DskipTests

on - ieu mangrupikeun pedaran ngeunaan acara dimana naskah urang bakal diluncurkeun.

asup: pull_request / push - nunjukkeun yén alur kerja ieu kedah diluncurkeun unggal waktos nyorong dilakukeun ka master sareng panjaluk tarik diciptakeun.

Di handap ieu pedaran tugas (jobs) jeung léngkah-léngkah palaksanaan (léngkah) pikeun tiap tugas.

ngajalankeun-on - Di dieu urang tiasa milih target OS, heran, anjeun malah tiasa milih Mac OS, tapi dina repositories swasta ieu rada mahal (dibandingkeun Linux).

kagunaan ngamungkinkeun anjeun ngagunakeun deui tindakan anu sanés, contona, nganggo tindakan / setup-java anu kami pasang lingkungan pikeun Java 11.

ku jeung urang bisa nangtukeun parameter jeung nu urang ngajalankeun aksi, dasarna ieu argumen nu bakal dibikeun ka aksi.

Sadaya anu tetep nyaéta ngajalankeun proyék ngawangun di Maven: run: mvn -B clean package bandéra -B nyebutkeun yen urang kudu mode non-interaktif ambéh maven nu dumadakan teu hayang nanya kami hal

Circles of hell with GitHub Actions (ngawangun pipa CI/CD pikeun proyék Java)

Hebat! Ayeuna, unggal waktos anjeun komitmen ka master, pangwangunan proyék dimimitian.

Ngajalankeun uji otomatis

Majelis téh alus, tapi kanyataanana, hiji proyék bisa dirakit aman, tapi teu jalan. Ku alatan éta, lengkah saterusna nyaéta pikeun ngajadikeun otomatis uji coba. Sajaba ti éta, éta cukup merenah pikeun nempo hasil lulus tés mun anjeun ngalakukeun review PR - anjeun terang pasti yén tés lulus tur teu saurang ogé poho ngajalankeun cabang maranéhanana saméméh ngahiji.

Urang bakal ngajalankeun tés nalika nyieun pamundut tarikan jeung ngagabung kana master, sarta dina waktos anu sareng urang nambahkeun kreasi laporan on kode-sinyalna.

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

Pikeun nutupan tés, kuring nganggo codecov sareng plugin jacoco. codecov gaduh tindakan sorangan, tapi peryogi token pikeun damel sareng pamundut tarik kami:

${{ secrets.CODECOV_TOKEN }} - urang bakal ningali konstruksi ieu leuwih ti sakali, Rahasia mangrupakeun mékanisme pikeun nyimpen Rahasia di GitHub, urang bisa nulis aya kecap akses / tokens / host / URL na data sejenna nu teu kudu kaasup dina dasar kode Repository.

Anjeun tiasa nambihan variabel kana rusiah dina setélan gudang di GitHub:

Circles of hell with GitHub Actions (ngawangun pipa CI/CD pikeun proyék Java)

Anjeun bisa meunangkeun token di codecov.io Saatos otorisasina via GitHub, pikeun nambihan proyék umum anjeun ngan ukur kedah nuturkeun tautan sapertos kieu: Ngaran pamaké GitHub/ [ngaran repo]. Repositori swasta ogé tiasa nambihan; pikeun ngalakukeun ieu, anjeun kedah masihan hak codecov kana aplikasi di Github.

Circles of hell with GitHub Actions (ngawangun pipa CI/CD pikeun proyék Java)

Tambahkeun plugin jacoco kana file POM:

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

Ayeuna bot codecov bakal ngalebetkeun unggal pamundut tarik urang sareng nambihan grafik parobahan sinyalna:

Circles of hell with GitHub Actions (ngawangun pipa CI/CD pikeun proyék Java)

Hayu urang tambahkeun analisa statik

Dina kalolobaan proyék open source kuring ngagunakeun awan sonar pikeun analisis kode statik, éta cukup gampang pikeun nyambung ka travis-ci. Janten éta léngkah anu logis nalika migrasi ka GitHub Actions pikeun ngalakukeun anu sami. Pasar aksi mangrupikeun hal anu saé, tapi waktos ieu kuring rada turun, sabab tina kabiasaan kuring mendakan tindakan anu kuring peryogikeun sareng nambihanana kana alur kerja. Tapi tétéla yén sonar teu ngarojong gawé ngaliwatan hiji aksi pikeun nganalisis proyék on maven atanapi gradle. Tangtosna, ieu ditulis dina dokuméntasi, tapi saha anu macana?!

Teu mungkin ngaliwatan hiji aksi, jadi urang bakal ngalakukeun eta ngaliwatan 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 - tiasa didapet di sonarcloud.io jeung anjeun kudu ngadaptar eta dina Rahasia. GITHUB_TOKEN - ieu token diwangun-di nu GitHub dibangkitkeun, kalayan bantuan nu sonarcloud[bot] bakal bisa asup ka Git guna ninggalkeun kami pesen dina requests tarikan.

Dsonar.projectKey - nami proyék dina sonar, anjeun tiasa ningali dina setélan proyék.

Dsonar.organisasi - nami organisasi ti GitHub.

Kami ngadamel pamundut tarik sareng ngantosan sonarcloud[bot] sumping dina koméntar:

Circles of hell with GitHub Actions (ngawangun pipa CI/CD pikeun proyék Java)

Ngaleupaskeun manajemén

Wangunan parantos dikonpigurasi, tés parantos dijalankeun, sareng urang tiasa ngabebaskeun. Hayu urang tingali kumaha GitHub Actions tiasa ngajantenkeun manajemén rilis langkung gampang.

Di tempat kerja, kuring gaduh proyék anu kodeu dasarna aya dina bitbucket (sadayana sapertos dina carita éta "Kuring nyerat ka bitbucket siang, komitmen ka GitHub wengi"). Hanjakalna, bitbucket henteu gaduh alat manajemén pelepasan anu diwangun. Ieu masalah, sabab pikeun tiap release anjeun kudu sacara manual nyieun kaca dina confluence jeung buang sagala fitur kaasup dina release dinya, neangan ngaliwatan istana pikiran, tugas di jira, commits di Repository nu. Aya seueur kasempetan pikeun ngalakukeun kasalahan, anjeun tiasa mopohokeun hiji hal atanapi ngalebetkeun hiji hal anu parantos dileupaskeun kapungkur, kadang-kadang teu jelas naon anu kedah digolongkeun kana pamundut tarik - naha éta mangrupikeun fitur atanapi perbaikan bug, atanapi tés éditan, atanapi hiji hal infrastruktur.

Kumaha tindakan GitHub tiasa ngabantosan urang? Aya aksi anu hébat - drafter pelepasan, éta ngamungkinkeun anjeun nyetél template file catetan pelepasan pikeun nyetél kategori pamundut tarik sareng sacara otomatis ngagolongkeunana dina file catetan pelepasan:

Circles of hell with GitHub Actions (ngawangun pipa CI/CD pikeun proyék Java)

Conto template pikeun nyetél laporan (.github/release-drafter.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

Tambahkeun naskah pikeun ngahasilkeun draf 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 }}

Sadaya paménta tarik ti ayeuna bakal dikumpulkeun dina catetan pelepasan sacara otomatis - sihir!

Di dieu patarosan tiasa timbul: kumaha upami pamekar hilap nempatkeun tag dina PR? Lajeng teu jelas kategori nu nempatkeun eta, jeung deui anjeun bakal kudu nungkulan eta sacara manual, kalawan unggal PR misah. Pikeun ngalereskeun masalah ieu, urang tiasa nganggo tindakan anu sanés - verifier labél - éta pariksa ayana tag dina pamundut tarik. Upami teu aya tag anu diperyogikeun, maka pamariksaan bakal gagal sareng kami bakal ningali pesen ngeunaan ieu dina pamundut tarik kami.

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'

Ayeuna sagala pull-pamundut kudu ditandaan ku salah sahiji tags: tipe: ngalereskeun, tipe: fitur, tipe: dokuméntasi, tipe: tés, tipe: config.

Circles of hell with GitHub Actions (ngawangun pipa CI/CD pikeun proyék Java)

Auto-annotation of requests tarikan

Kusabab urang keuna kana topik kayaning karya éféktif jeung requests tarikan, éta patut ngawangkong ngeunaan hiji aksi saperti labeler, nempatkeun tag dina PR dumasar kana file nu geus robah. Contona, urang bisa ditandaan salaku [ngawangun] sagala pamundut tarikan nu ngandung parobahan dina diréktori .github/workflow.

Nyambungkeun éta cukup saderhana:

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

Urang ogé peryogi file anu ngajelaskeun korespondensi antara diréktori proyék sareng jejer pamundut tarik:

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

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

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

theme:documentation:
  - "docs/**"

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

Kuring henteu hasil masangkeun tindakan anu otomatis nempatkeun labél dina pamundut tarik sareng tindakan anu mariksa ayana labél anu diperyogikeun; labél-cocog henteu hoyong ningali labél anu ditambihan ku bot. Sigana leuwih gampang nulis aksi anjeun sorangan nu ngagabungkeun duanana tahapan. Tapi sanajan dina formulir ieu cukup merenah ngagunakeun, anjeun kudu milih labél tina daptar nalika nyieun pamundut tarikan.

Waktosna pikeun nyebarkeun

Circles of hell with GitHub Actions (ngawangun pipa CI/CD pikeun proyék Java)

Kuring nyobian sababaraha pilihan panyebaran via GitHub Actions (via ssh, via scp, sareng nganggo docker-hub), sareng kuring tiasa nyebatkeun yén, paling dipikaresep, anjeun bakal mendakan cara pikeun unggah binér ka server, henteu paduli kumaha bengkok pipa anjeun. nyaeta.

Kuring resep pilihan ngajaga sakabéh infrastruktur di hiji tempat, jadi hayu urang nempo kumaha nyebarkeun ka Paket GitHub (ieu gudang keur eusi binér, npm, jar, docker).

Skrip pikeun ngawangun gambar docker sareng nyebarkeunana dina Paket GitHub:

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

Mimiti, urang kedah ngawangun file JAR tina aplikasi urang, saatos urang ngitung jalur ka pendaptaran docker GitHub sareng nami gambar urang. Aya sababaraha trik di dieu anu urang henteu acan mendakan:

  • konstruksi kawas: echo ":: set-output name = NAME :: VALUE" ngidinan Anjeun pikeun ngeset nilai variabel dina hambalan ayeuna, meh bisa lajeng dibaca dina sakabéh hambalan séjén.
  • Anjeun bisa meunangkeun nilai tina set variabel dina hambalan saméméhna ngaliwatan identifier tina hambalan ieu: ${{ steps.global_env.outputs.DOCKERHUB_IMAGE_NAME }}
  • Variabel GITHUB_REPOSITORY standar nyimpen nami gudang sareng nu gaduhna ("boga/repo-ngaran"). Pikeun motong sadayana tina garis ieu iwal nami Repository, urang bakal nganggo sintaksis bash: ${GITHUB_REPOSITORY#*/}

Salajengna urang kedah ngawangun gambar docker:

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

Asup ka pendaptaran:

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

Sareng nyebarkeun gambar ka Repository Paket GitHub:

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

Pikeun nunjukkeun versi gambar, kami nganggo digit munggaran tina SHA hash of commit - GITHUB_SHA ogé aya nuansa di dieu, upami anjeun ngadamel gedong sapertos henteu ngan ukur nalika ngahijikeun kana master, tapi ogé dumasar kana kreasi pamundut tarik. acara, mangka SHA bisa jadi teu cocog jeung Hash nu urang tingali dina sajarah git, sabab lampah / Peta Checkout ngajadikeun Hash unik sorangan ulah lampah deadlocking dina PR.

Circles of hell with GitHub Actions (ngawangun pipa CI/CD pikeun proyék Java)

Upami sadayana damel saé, teras muka bagian bungkusan (https://github.com/antkorwin/github-actions/packages) dina gudang, anjeun bakal ningali gambar docker énggal:

Circles of hell with GitHub Actions (ngawangun pipa CI/CD pikeun proyék Java)

Aya anjeun ogé tiasa ningali daptar versi gambar docker.

Sadaya anu tetep nyaéta ngonpigurasikeun server kami pikeun damel sareng pendaptaran ieu sareng balikan deui jasa. Kuring meureun bakal ngobrol ngeunaan kumaha carana ngalakukeun ieu ngaliwatan systemd lain waktos.

Ngawaskeun

Hayu urang tingali pilihan saderhana ngeunaan cara ngalakukeun pamariksaan kaséhatan pikeun aplikasi kami nganggo GitHub Actions. Aplikasi boot kami ngagaduhan aktuator, janten kami henteu kedah nyerat API pikeun mariksa statusna; kami parantos ngalaksanakeun sadayana pikeun anu puguh. Anjeun ngan perlu narik 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"}

Sadaya anu urang peryogikeun nyaéta nyerat tugas pikeun mariksa server nganggo cron, sareng upami ujug-ujug henteu ngawaler kami, maka kami bakal ngirim béwara via telegram.

Mimiti, hayu urang terang kumaha ngajalankeun alur kerja cron:

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

Ieu basajan, abdi malah teu bisa yakin yén dina Github anjeun bisa nyieun acara nu teu cocog kana webhooks pisan. Rincian aya dina dokuméntasi: help.github.com/en/actions/reference/events-that-trigger-workflows#scheduled-events-schedule

Hayu urang pariksa status server sacara manual 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 "health check is failed"
            exit 1
          fi
          echo "It's OK"

Kahiji, urang simpen kana variabel naon server direspon kana pamundut, dina lengkah saterusna urang pariksa yen statusna UP na, upami ieu teu masalahna, lajeng urang kaluar kalawan kasalahan. Lamun perlu "overwhelm" hiji aksi jeung leungeun anjeun, lajeng kaluar 1 - pakarang cocog.

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

Urang ngirim ka telegram ngan lamun aksi gagal dina hambalan saméméhna. Pikeun ngirim pesen kami nganggo appleboy / telegram-aksi; anjeun tiasa maca ngeunaan kumaha carana kéngingkeun token bot sareng id obrolan dina dokuméntasi: github.com/appleboy/telegram-action

Circles of hell with GitHub Actions (ngawangun pipa CI/CD pikeun proyék Java)

Tong hilap nyerat dina rusiah dina Github: URL pikeun server sareng token pikeun bot telegram.

Lagu bonus - JIRA pikeun puguh

Kuring jangji yén urang bakal balik deui ka JIRA, sarta kami geus balik. Ratusan kali Kuring geus katalungtik kaayaan di stand-up nalika pamekar dijieun fitur a, ngahiji cabang, tapi poho nyered masalahna kana JIRA. Tangtosna, upami sadayana ieu dilakukeun dina hiji tempat, éta bakal langkung gampang, tapi kanyataanna urang nyerat kode dina IDE, ngahijikeun cabang kana bitbucket atanapi GitHub, teras sered tugas kana Jira, pikeun ieu urang kedah muka windows énggal. , sok asup deui jeung sajabana. Nalika anjeun émut sampurna naon anu anjeun kedah laksanakeun salajengna, maka henteu aya gunana pikeun muka dewan deui. Hasilna, isuk-isuk dina standup anjeun kudu méakkeun waktu ngamutahirkeun dewan tugas.

GitHub ogé bakal ngabantosan urang dina tugas rutin ieu; pikeun ngamimitian, urang tiasa nyered masalah sacara otomatis kana kolom code_review nalika urang ngalebetkeun pamundut tarik. Sadaya anu anjeun kedah laksanakeun nyaéta nuturkeun konvénsi nami cabang:

[имя проекта]-[номер таска]-название

contona,, lamun konci proyék "GitHub Laku lampah" nyaeta ga, lajeng GA-8-jira-bot bisa jadi cabang pikeun ngalaksanakeun tugas GA-8.

Integrasi jeung JIRA jalan ngaliwatan lampah ti Atlassian, aranjeunna henteu sampurna, Kuring kudu nyebutkeun yén sababaraha di antarana teu dianggo pikeun kuring pisan. Tapi urang bakal ngabahas ngan ukur anu pasti dianggo sareng aktip dianggo.

Mimiti anjeun kedah log in JIRA nganggo tindakan: 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 }}

Jang ngalampahkeun ieu, anjeun kudu meunang token dina JIRA, kumaha ngalakukeun ieu dijelaskeun di dieu: confluence.atlassian.com/cloud/api-tokens-938839638.html

Kami nimba identifier tugas tina nami cabang:

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

Upami anjeun milarian dina pasar GitHub, anjeun tiasa mendakan tindakan pikeun tugas ieu, tapi kuring kedah nyerat hal anu sami nganggo grep nganggo nami cabang, sabab tindakan ieu ti Atlassian henteu hoyong ngerjakeun proyék kuring ku cara naon waé. , Pikeun terang naon anu salah di dinya - langkung lami tibatan ngalakukeun hal anu sami sareng panangan anjeun.

Sadaya anu tetep nyaéta mindahkeun tugas kana kolom "Tinjauan Kode" nalika nyiptakeun pamundut tarik:

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

Aya tindakan khusus pikeun ieu dina GitHub, anu diperyogikeun nyaéta ID masalah anu dicandak dina léngkah sateuacana sareng otorisasina di JIRA anu kami lakukeun di luhur.

Circles of hell with GitHub Actions (ngawangun pipa CI/CD pikeun proyék Java)

Dina cara anu sami, anjeun tiasa nyéred tugas nalika ngahijikeun kana master, sareng acara sanés tina alur kerja GitHub. Sacara umum, éta sadayana gumantung kana imajinasi anjeun sareng kahayang pikeun ngajadikeun otomatis prosés rutin.

papanggihan

Lamun nempo diagram DEVOPS Palasik, kami geus katutupan sagala tahapan, iwal sugan beroperasi, Jigana lamun coba, anjeun tiasa manggihan sababaraha aksi di pasar pikeun integrasi jeung sistem pitulung-meja, ku kituna urang bakal nganggap yén pipa ngancik. kaluar taliti tur conclusions bisa ditarik dumasar kana pamakéan na.

Circles of hell with GitHub Actions (ngawangun pipa CI/CD pikeun proyék Java)

pro:

  • Pasar kalayan tindakan siap-siap pikeun sadaya kasempetan, ieu saé pisan. Dina kalolobaanana, anjeun ogé tiasa ningali kode sumber pikeun ngartos kumaha ngabéréskeun masalah anu sami atanapi ngirimkeun pamundut fitur ka panulis langsung dina gudang GitHub.
  • Milih platform udagan pikeun assembly: Linux Ubuntu, mac os, windows mangrupakeun fitur cukup metot.
  • Paket Github mangrupikeun hal anu saé, éta gampang pikeun ngajaga sadayana infrastruktur dina hiji tempat, anjeun henteu kedah ngaluncurkeun windows anu béda, sadayana aya dina radius hiji atanapi dua klik beurit sareng sampurna terpadu sareng Aksi GitHub. Pangrojong pendaptaran Docker dina versi gratis ogé kauntungan anu saé.
  • GitHub nyumputkeun rusiah dina ngawangun log, janten ngagunakeunana pikeun nyimpen kecap akses sareng token henteu pikasieuneun. Salami sadaya percobaan kuring, kuring henteu kantos ningali rusiah dina bentuk murni na dina konsol.
  • Gratis pikeun proyék Open Source

kontra:

  • YML, sumur, abdi teu resep anjeunna. Nalika damel sareng aliran sapertos kitu, pesen komitmen anu paling umum anu kuring gaduh nyaéta "ngalereskeun format yml", teras anjeun hilap nempatkeun tab dimana waé, atanapi anjeun nyerat dina garis anu salah. Sacara umum, linggih di hareupeun layar kalayan protractor sareng pangawasa sanés pangalaman anu paling pikaresepeun.
  • DEBUG, debugging aliran kalawan commits, ngajalankeun hiji ngawangun deui, sarta kaluaran ka konsol teu salawasna merenah, tapi éta leuwih ti kategori "anjeun overdone"; Anjeun geus dipaké pikeun gawé bareng IDEA merenah, nalika anjeun tiasa debug nanaon. .
  • Anjeun tiasa nyerat tindakan anjeun dina naon waé upami anjeun dibungkus dina Docker, tapi ngan ukur JavaScript anu dirojong sacara asli, tangtosna ieu masalah rasa, tapi kuring bakal resep anu sanés tibatan JS.

Hayu atuh ngingetkeun yén Repository sareng sadaya skrip aya di dieu: github.com/antkorwin/github-actions

Minggu hareup kuring bakal manggung sareng laporan dina konferensi Heisenbug 2020 Piter. Kuring gé ngabejaan Anjeun teu ngan kumaha carana nyingkahan kasalahan nalika Nyiapkeun data test, tapi ogé babagi Rahasia kuring gawé bareng set data dina aplikasi Java!

sumber: www.habr.com