Java ã§ãããžã§ã¯ããæ§ç¯ããããã®ãã€ãã©ã€ã³ãæ§ç¯ããå¿
èŠãããããšããããããŸãã ãªãŒãã³ãœãŒã¹ã®å Žåãããã°ãããã§ãªãå ŽåããããŸãã æè¿ããªããžããªã®äžéšã Travis-CI ãš TeamCity ãã GitHub Actions ã«ç§»åããŠã¿ãããšã«ããŸããããã®çµæããããªããŸããã
äœãèªååããã®ã§ãããã?
ãŸããèªååãããããžã§ã¯ããå¿ èŠã§ããSpring Boot / Java 11 / Maven ã§å°ããªã¢ããªã±ãŒã·ã§ã³ãäœæããŸãããã ãã®èšäºã®ç®çã§ã¯ãã¢ããªã±ãŒã·ã§ã³ ããžãã¯ã«ã¯ãŸã£ããèå³ããããŸãããã¢ããªã±ãŒã·ã§ã³åšèŸºã®ã€ã³ãã©ã¹ãã©ã¯ãã£ãéèŠã§ãããããåçŽãª REST API ã³ã³ãããŒã©ãŒã§ååã§ãã
ããã§ãœãŒã¹ã衚瀺ã§ããŸãã
JIRA ãšèšç»
éåžžãåé¡è¿œè·¡ããŒã«ãšã㊠JIRA ã䜿çšããŠããããšãèšã£ãŠãããŸãããã®ããããã®ãããžã§ã¯ãçšã«å¥ã®ããŒããäœæããæåã®åé¡ãããã«è¿œå ããŸãããã
å°ãåŸã§ãJIRA ãš GitHub ãçµã¿åãããŠã©ã®ãããªèå³æ·±ãæ©èœãæäŸã§ãããã«æ»ããŸãã
ãããžã§ã¯ãã®çµã¿ç«ãŠãèªååããŸã
ç§ãã¡ã®ãã¹ã ãããžã§ã¯ã㯠Maven ãä»ããŠæ§ç¯ãããŠãããããæ§ç¯ã¯éåžžã«ç°¡åã§ãå¿ èŠãªã®ã¯ mvn clean ããã±ãŒãžã ãã§ãã
Github Actions ã䜿çšããŠãããè¡ãã«ã¯ãã¯ãŒã¯ãããŒã説æãããã¡ã€ã«ããªããžããªã«äœæããå¿ èŠããããŸããããã¯éåžžã® yml ãã¡ã€ã«ã§å®è¡ã§ããŸããç§ã¯ãyml ããã°ã©ãã³ã°ãã奜ããšã¯èšããŸããããäœãã§ããã§ãããã -ããã¯ã.github/ ãã£ã¬ã¯ã㪠workflow/ ãã¡ã€ã« build.yml ã§è¡ããŸãããã®ãã¡ã€ã«ã«ã¯ã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 â ããã¯ãã¹ã¯ãªãããèµ·åãããã€ãã³ãã®èª¬æã§ãã
ãªã³: ãã«ãªã¯ãšã¹ã/ããã·ã¥ â ãã¹ã¿ãŒãžã®ããã·ã¥ãè¡ããããã« ãªã¯ãšã¹ããäœæããããã³ã«ããã®ã¯ãŒã¯ãããŒãèµ·åããå¿ èŠãããããšã瀺ããŸãã
以äžã«ã¿ã¹ã¯ã®èª¬æã瀺ããŸã (jobs) ãšå®è¡ã¹ããã (ã¹ããã) ã¿ã¹ã¯ããšã«ã
èµ°ã - ããã§ã¯ã¿ãŒã²ãã OS ãéžæã§ããŸããé©ãã¹ãããšã« Mac OS ãéžæã§ããŸããããã©ã€ããŒã ãªããžããªã§ã¯ãã㯠(Linux ãšæ¯èŒããŠ) éåžžã«é«äŸ¡ã§ãã
䜿çšãããŸã ããã«ãããä»ã®ã¢ã¯ã·ã§ã³ãåå©çšã§ããŸããããšãã°ãactions/setup-java ã¢ã¯ã·ã§ã³ã䜿çšã㊠Java 11 ã®ç°å¢ãã€ã³ã¹ããŒã«ããŸãã
çšã㊠ã ã¢ã¯ã·ã§ã³ãèµ·åãããã©ã¡ãŒã¿ãæå®ã§ããŸããåºæ¬çã«ããããã¯ã¢ã¯ã·ã§ã³ã«æž¡ãããåŒæ°ã§ãã
æ®ã£ãŠããã®ã¯ãMaven ã§ãããžã§ã¯ãã®ãã«ããå®è¡ããããšã ãã§ãã run: mvn -B clean package
ãã©ã° -B Maven ãçªç¶äœããå°ããªãããã«ããããã«ãé察話åã¢ãŒããå¿
èŠã§ãããšèšããŸãã
çŽ æŽãããïŒ ããã§ããã¹ã¿ãŒã«ã³ããããããã³ã«ããããžã§ã¯ãã®ãã«ããéå§ãããŸãã
ãã¹ãèµ·åã®èªåå
çµã¿ç«ãŠã¯è¯ãã®ã§ãããå®éã«ã¯ããããžã§ã¯ãã¯å®å šã«çµã¿ç«ãŠãããšãã§ããŠããæ©èœããããã§ã¯ãããŸããã ãããã£ãŠã次ã®ã¹ãããã¯ãã¹ãã®å®è¡ãèªååããããšã§ãã ããã«ãPR ã¬ãã¥ãŒãè¡ããšãã«ããã¹ãã«åæ Œããçµæã確èªããã®ã¯éåžžã«äŸ¿å©ã§ãããã¹ããåæ ŒããããŒãžãè¡ãåã«ãã©ã³ããå®è¡ããããšãå¿ããŠãã人ãããªãããšã確å®ã«ããããŸãã
ãã«ãªã¯ãšã¹ãã®äœææã«ãã¹ããå®è¡ããŠãã¹ã¿ãŒã«ããŒãžããåæã«ã³ãŒãã«ãã¬ããžã«é¢ããã¬ããŒãã®äœæãè¿œå ããŸãã
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 }}
ãã¹ããã«ããŒããããã«ãcodecov ã jacoco ãã©ã°ã€ã³ãšçµã¿åãããŠäœ¿çšââããŸãã codecov ã«ã¯ç¬èªã®ã¢ã¯ã·ã§ã³ããããŸããããã« ãªã¯ãšã¹ããåŠçããã«ã¯ããŒã¯ã³ãå¿ èŠã§ãã
${{ secrets.CODECOV_TOKEN }}
â ãã®æ§é ã¯äœåºŠãèŠãããšã«ãªããŸãããã·ãŒã¯ã¬ãã㯠GitHub ã«ã·ãŒã¯ã¬ãããä¿åããããã®ã¡ã«ããºã ã§ãããããã«ãã¹ã¯ãŒã/ããŒã¯ã³/ãã¹ã/URL ãããªããžããªã®ã³ãŒã ããŒã¹ã«å«ããã¹ãã§ã¯ãªããã®ä»ã®ããŒã¿ãæžã蟌ãããšãã§ããŸãã
GitHub ã®ãªããžããªèšå®ã§ã·ãŒã¯ã¬ããã«å€æ°ãè¿œå ã§ããŸãã
ããŒã¯ã³ã¯æ¬¡ã®å Žæã§ååŸã§ããŸã
jacoco ãã©ã°ã€ã³ã 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>
ããã§ãcodecov ããããåãã« ãªã¯ãšã¹ããå ¥åããã«ãã¬ããžå€æŽã°ã©ããè¿œå ããŸãã
éçã¢ãã©ã€ã¶ãŒãè¿œå ããŸããã
ç§ã®ãªãŒãã³ãœãŒã¹ ãããžã§ã¯ãã®ã»ãšãã©ã§ã¯ãéçã³ãŒãåæã«ãœã㌠ã¯ã©ãŠãã䜿çšããŠããŸããtravis-ci ãžã®æ¥ç¶ã¯éåžžã«ç°¡åã§ãã ãããã£ãŠãGitHub Actions ã«ç§»è¡ãããšãã«ãåãããšãè¡ãã®ã¯è«ççãªã¹ãããã§ãã ã¢ã¯ã·ã§ã³ ããŒã±ããã¯çŽ æŽããããã®ã§ãããä»åã¯å°ããã£ããããŸãããç¿æ £ã§å¿ èŠãªã¢ã¯ã·ã§ã³ãèŠã€ããŠã¯ãŒã¯ãããŒã«è¿œå ããããã§ãã ãããããœããŒã¯ãMaven ãŸã㯠Gradle ã§ãããžã§ã¯ããåæããããã®ã¢ã¯ã·ã§ã³ã®å®è¡ããµããŒãããŠããªãããšãå€æããŸããã ãã¡ãããããã¯ããã¥ã¡ã³ãã«æžãããŠããŸããã誰ããããèªãã®ã§ãããã?
ã¢ã¯ã·ã§ã³ã§ã¯å®è¡ã§ããªããããmvn ãã©ã°ã€ã³ã䜿çšããŠå®è¡ããŸãã
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 - ã§å
¥æã§ããŸã
Dsonar.projectKey â ãœããŒå ã®ãããžã§ã¯ãã®ååããããžã§ã¯ãèšå®ã§ç¢ºèªã§ããŸãã
Dsonar.organization â GitHub ããååŸããçµç¹ã®ååã
ãã«ãªã¯ãšã¹ããäœæããsonarcloud[bot] ãã³ã¡ã³ãã«æ¥ãã®ãåŸ ã¡ãŸãã
ãªãªãŒã¹ç®¡ç
ãã«ããæ§æããããã¹ããå®è¡ããããªãªãŒã¹ã§ããããã«ãªããŸããã GitHub Actions ã«ãã£ãŠãªãªãŒã¹ç®¡çãã©ã®ããã«ç°¡åã«ãªãããèŠãŠã¿ãŸãããã
ä»äºã§ã¯ãã³ãŒã ããŒã¹ã bitbucket ã«ãããããžã§ã¯ãããããŸã (ãã¹ãŠãããæ¥äžã¯ bitbucket ã«æžã蟌ã¿ãå€ã¯ GitHub ã«ã³ãããããããšãã話ã®ãããªãã®ã§ã)ã æ®å¿µãªãããbitbucket ã«ã¯ãªãªãŒã¹ç®¡çããŒã«ãçµã¿èŸŒãŸããŠããŸããã ããã¯åé¡ã§ãããªãªãŒã¹ããšã« confluence ã§ããŒãžãæåã§äœæããããã«ãªãªãŒã¹ã«å«ãŸãããã¹ãŠã®æ©èœãæå ¥ããå¿ã®å®®æ®¿ãjira ã®ã¿ã¹ã¯ããªããžããªã®ã³ããããæ€çŽ¢ããå¿ èŠãããããã§ãã ééããç¯ãå¯èœæ§ã¯ãããããããŸããäœããå¿ããããååãªãªãŒã¹æžã¿ã®ãã®ãå ¥åãããããå¯èœæ§ããããŸããå Žåã«ãã£ãŠã¯ããã« ãªã¯ãšã¹ããäœã«åé¡ããããæ確ã§ã¯ãªãå ŽåããããŸããæ©èœãªã®ãããã°ä¿®æ£ãªã®ãããã¹ãã®ç·šéãªã®ãããããšãäœãã€ã³ãã©çãªãã®ã
GitHub ã®ã¢ã¯ã·ã§ã³ã¯ã©ã®ããã«åœ¹ç«ã€ã®ã§ãããã? ãªãªãŒã¹ ãã©ãã¿ãŒãšããçŽ æŽãããã¢ã¯ã·ã§ã³ããããŸããããã䜿çšãããšããªãªãŒã¹ ããŒã ãã¡ã€ã« ãã³ãã¬ãŒããèšå®ããŠãã« ãªã¯ãšã¹ãã®ã«ããŽãªãèšå®ãããããããªãªãŒã¹ ããŒã ãã¡ã€ã«å ã§èªåçã«ã°ã«ãŒãåã§ããŸãã
ã¬ããŒããèšå®ããããã®ãã³ãã¬ãŒãã®äŸ (.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
ãã©ãã ãªãªãŒã¹ (.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 }}
ä»åŸããã¹ãŠã®ãã« ãªã¯ãšã¹ãã¯èªåçã«ãªãªãŒã¹ ããŒãã«åéãããŸã - éæ³ã§ã!
ããã§ãéçºè ã PR ã«ã¿ã°ãä»ããã®ãå¿ãããã©ããªãã®ããšããçåãçãããããããŸããã ãã®å Žåããããã©ã®ã«ããŽãªã«åé¡ããããæ確ã§ã¯ãªããªãããã¯ãå PR ãåå¥ã«æåã§åŠçããå¿ èŠããããŸãã ãã®åé¡ã解決ããã«ã¯ãå¥ã®ã¢ã¯ã·ã§ã³ã§ããã©ãã«ããªãã¡ã€ã¢ã䜿çšã§ããŸããããã¯ããã«ãªã¯ãšã¹ãã«ã¿ã°ãååšãããã©ããããã§ãã¯ããŸãã å¿ èŠãªã¿ã°ããªãå Žåããã§ãã¯ã¯å€±æãããã« ãªã¯ãšã¹ãã«ããã«é¢ããã¡ãã»ãŒãžã衚瀺ãããŸãã
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'
ä»åŸã¯ããã¹ãŠã®ãã«ãªã¯ãšã¹ãã«ãtype:fixãtype:featuresãtype:documentationãtype:testsãtype:config ã®ããããã®ã¿ã°ãä»ããå¿ èŠããããŸãã
ãã«ãªã¯ãšã¹ãã®èªåã¢ãããŒã·ã§ã³
ãã« ãªã¯ãšã¹ãã®å¹æçãªäœæ¥ãªã©ã®ãããã¯ã«ã€ããŠè§Šããã®ã§ãå€æŽããããã¡ã€ã«ã«åºã¥ã㊠PR ã«ã¿ã°ãä»ããã©ãã©ãŒãªã©ã®ã¢ã¯ã·ã§ã³ã«ã€ããŠã説æãã䟡å€ããããŸãã ããšãã°ããã£ã¬ã¯ããªãžã®å€æŽãå«ããã« ãªã¯ãšã¹ãã [build] ãšããŠããŒã¯ã§ããŸãã .github/workflow
.
æ¥ç¶ã¯éåžžã«ç°¡åã§ãã
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 }}
ãããžã§ã¯ã ãã£ã¬ã¯ããªãšãã« ãªã¯ãšã¹ã ãããã¯ã®éã®å¯Ÿå¿é¢ä¿ãèšè¿°ãããã¡ã€ã«ãå¿ èŠã§ãã
theme:build:
- ".github/**"
- "pom.xml"
- ".travis.yml"
- ".gitignore"
- "Dockerfile"
theme:code:
- "src/main/*"
theme:tests:
- "src/test/*"
theme:documentation:
- "docs/**"
theme:TRASH:
- ".idea/**"
- "target/**"
ãã« ãªã¯ãšã¹ãã«ã©ãã«ãèªåçã«é 眮ããã¢ã¯ã·ã§ã³ãšãå¿ èŠãªã©ãã«ã®ååšããã§ãã¯ããã¢ã¯ã·ã§ã³ãçµã¿åãããããšãã§ããŸããã§ãããmatch-label ã¯ããããã«ãã£ãŠè¿œå ãããã©ãã«ã衚瀺ããããªãã®ã§ãã äž¡æ¹ã®ã¹ããŒãžãçµã¿åãããç¬èªã®ã¢ã¯ã·ã§ã³ãäœæããæ¹ãç°¡åãªããã§ãã ãã ãããã®ãã©ãŒã ã§ãéåžžã«äœ¿ããããããã« ãªã¯ãšã¹ããäœæãããšãã«ãªã¹ãããã©ãã«ãéžæããå¿ èŠããããŸãã
å°å ¥ã®æéã§ã
GitHub Actions çµç±ã§ããã€ãã®ãããã€ã¡ã³ã ãªãã·ã§ã³ (ssh çµç±ãscp çµç±ãdocker-hub ã®äœ¿çš) ãè©ŠããŠã¿ãŸãããããã€ãã©ã€ã³ãã©ãã»ã©äžæ£ã§ãã£ãŠãããã€ããªããµãŒããŒã«ã¢ããããŒãããæ¹æ³ã¯ããããèŠã€ããã§ããããã¯ã
ã€ã³ãã©ã¹ãã©ã¯ãã£å šäœã XNUMX ãæã«ä¿æãããªãã·ã§ã³ãæ°ã«å ¥ã£ãã®ã§ãGitHub ããã±ãŒãž (ããã¯ãã€ã㪠ã³ã³ãã³ããnpmãjarãdocker ã®ãªããžããª) ã«ãããã€ããæ¹æ³ãèŠãŠã¿ãŸãããã
Docker ã€ã¡ãŒãžãæ§ç¯ã㊠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 }}"
ãŸããã¢ããªã±ãŒã·ã§ã³ã® JAR ãã¡ã€ã«ãæ§ç¯ããå¿ èŠããããŸãããã®åŸãGitHub Docker ã¬ãžã¹ããªãžã®ãã¹ãšã€ã¡ãŒãžã®ååãèšç®ããŸãã ããã«ã¯ãŸã èŠã€ãã£ãŠããªãããªãã¯ãããã€ããããŸãã
- echo "::set-output name=NAME::VALUE" ã®ãããªæ§é ã䜿çšãããšãçŸåšã®ã¹ãããã§å€æ°ã®å€ãèšå®ã§ãããããä»ã®ãã¹ãŠã®ã¹ãããã§å€æ°ã®å€ãèªã¿åãããšãã§ããŸãã
- ãã®ã¹ãããã®èå¥åãéããŠãåã®ã¹ãããã§èšå®ããå€æ°ã®å€ãååŸã§ããŸã: ${{steps.global_env.outputs.DOCKERHUB_IMAGE_NAME }}
- æšæºã® GITHUB_REPOSITORY å€æ°ã«ã¯ããªããžããªã®ååãšãã®ææè (ãowner/repo-nameã) ãæ ŒçŽãããŸãã ãã®è¡ãããªããžããªã®ååãé€ããã¹ãŠãåé€ããã«ã¯ãbash æ§æ ${GITHUB_REPOSITORY#*/} ã䜿çšããŸãã
次ã«ãDocker ã€ã¡ãŒãžãæ§ç¯ããå¿ èŠããããŸãã
docker build -t "docker.pkg.github.com/antkorwin/github-actions/github-actions:latest"
ã¬ãžã¹ããªã«ãã°ã€ã³ããŸãã
docker login docker.pkg.github.com -u $GITHUB_ACTOR -p ${{secrets.GITHUB_TOKEN}}
ãããŠãã€ã¡ãŒãžã GitHub ããã±ãŒãž ãªããžããªã«å ¬éããŸãã
docker push "docker.pkg.github.com/antkorwin/github-actions/github-actions"
ã€ã¡ãŒãžã®ããŒãžã§ã³ã瀺ãããã«ãã³ãããã® SHA ããã·ã¥ã®æåã®æ°åã䜿çšããŸã (GITHUB_SHA)ããã¹ã¿ãŒã«ããŒãžãããšãã ãã§ãªãããã« ãªã¯ãšã¹ãã®äœæã«åŸã£ãŠãã®ãããªãã«ããäœæããå Žåã¯ãããã«ããã¥ã¢ã³ã¹ããããŸããã€ãã³ãã®å Žåãã¢ã¯ã·ã§ã³/ãã§ãã¯ã¢ãŠã ã¢ã¯ã·ã§ã³ã¯ PR ã§ã®ããããã㯠ã¢ã¯ã·ã§ã³ãåé¿ããããã«ç¬èªã®äžæã®ããã·ã¥ãäœæãããããSHA 㯠git å±¥æŽã«è¡šç€ºãããããã·ã¥ãšäžèŽããªãå¯èœæ§ããããŸãã
ãã¹ãŠãããŸããã£ãå Žåã¯ããªããžããªã®ããã±ãŒãž ã»ã¯ã·ã§ã³ (https://github.com/antkorwin/github-actions/packages) ãéããšãæ°ãã Docker ã€ã¡ãŒãžã衚瀺ãããŸãã
ããã§ã¯ãDocker ã€ã¡ãŒãžã®ããŒãžã§ã³ã®ãªã¹ãã確èªã§ããŸãã
æ®ã£ãŠããã®ã¯ããã®ã¬ãžã¹ããªãšé£æºããããã«ãµãŒããŒãæ§æãããµãŒãã¹ãåèµ·åããããšã ãã§ãã systemd ã䜿çšããŠãããè¡ãæ¹æ³ã«ã€ããŠã¯ãããããå¥ã®æ©äŒã«èª¬æããäºå®ã§ãã
ç£èŠ
GitHub Actions ã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ã®ãã«ã¹ãã§ãã¯ãè¡ãæ¹æ³ã®ç°¡åãªãªãã·ã§ã³ãèŠãŠã¿ãŸãããã ç§ãã¡ã®ããŒã ã¢ããªã±ãŒã·ã§ã³ã«ã¯ã¢ã¯ãã¥ãšãŒã¿ãŒãããããããã®ã¹ããŒã¿ã¹ããã§ãã¯ããããã® API ãèšè¿°ããå¿
èŠãããããŸãããæ ãè
åãã®ããšã¯ãã¹ãŠãã§ã«å®äºããŠããŸãã ãã¹ãããã«ããã ãã§ãã 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"}
å¿ èŠãªã®ã¯ãcron ã䜿çšããŠãµãŒããŒããã§ãã¯ããã¿ã¹ã¯ãäœæããããšã ãã§ããçªç¶å¿çããªããªã£ãå Žåã¯ãé»å ±ã§éç¥ãéä¿¡ããŸãã
ãŸããcron ã¯ãŒã¯ãããŒãå®è¡ããæ¹æ³ãç解ããŸãããã
on:
schedule:
- cron: '*/5 * * * *'
åçŽãªããšã§ãããGithub 㧠Webhook ã«ãŸã£ããåœãŠã¯ãŸããªãã€ãã³ããäœæã§ãããªããŠä¿¡ããããŸããã 詳现ã¯ããã¥ã¡ã³ãã«èšèŒãããŠããŸãã
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"
ãŸãããµãŒããŒããªã¯ãšã¹ãã«å¿çããå 容ãå€æ°ã«ä¿åãã次ã®ã¹ãããã§ã¹ããŒã¿ã¹ã UP ã§ããããšã確èªããããã§ãªãå Žåã¯ãšã©ãŒã§çµäºããŸãã æã§ã¢ã¯ã·ã§ã³ããå§åãããå¿ èŠãããå Žåã¯ã 1çªåºå£ - é©åãªæŠåšã
- 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 }}
åã®ã¹ãããã§ã¢ã¯ã·ã§ã³ã倱æããå Žåã«ã®ã¿ãã¬ã°ã©ã ã«éä¿¡ããŸãã ã¡ãã»ãŒãžãéä¿¡ããã«ã¯ãappleboy/telegram-action ã䜿çšããŸããããã ããŒã¯ã³ãšãã£ãã ID ãååŸããæ¹æ³ã«ã€ããŠã¯ãããã¥ã¡ã³ããåç
§ããŠãã ããã
Github ã«ã·ãŒã¯ã¬ãããå¿ããã«èšå ¥ããŠãã ãã: ãµãŒããŒã® URL ãšé»å ±ãããã®ããŒã¯ã³ã
ããŒãã¹ ãã©ã㯠- æ ãè ã®ããã® JIRA
JIRA ã«æ»ããšçŽæããæ»ã£ãŠããŸããã ç§ã¯ã¹ã¿ã³ãã¢ããã§ãéçºè ãæ©èœãäœæãããã©ã³ããããŒãžããããåé¡ã JIRA ã«ãã©ãã°ããã®ãå¿ãããšããç¶æ³ãäœçŸåã芳å¯ããŠããŸããã ãã¡ãããããããã¹ãŠã XNUMX ãæã§å®è¡ã§ããã°ç°¡åã§ãããå®éã«ã¯ IDE ã§ã³ãŒããèšè¿°ãããã©ã³ãã bitbucket ãŸã㯠GitHub ã«ããŒãžããã¿ã¹ã¯ã Jira ã«ãã©ãã°ããŸãããã®ããã«ã¯ãæ°ãããŠã£ã³ããŠãéãå¿ èŠããããŸãã ãæã åãã°ã€ã³ãªã©ã 次ã«äœãããå¿ èŠãããããå®å šã«èŠããŠããã°ãããŒããå床éãå¿ èŠã¯ãããŸããã ãã®çµæãæã®ã¹ã¿ã³ãã¢ããã§ã¯ã¿ã¹ã¯ããŒããæŽæ°ããã®ã«æéãè²»ããå¿ èŠããããŸãã
GitHub ã¯ããã®æ¥åžžçãªã¿ã¹ã¯ã«ã圹ç«ã¡ãŸãããŸãããã« ãªã¯ãšã¹ããéä¿¡ãããšãã«ãåé¡ã code_review åã«èªåçã«ãã©ãã°ã§ããŸãã å¿ èŠãªã®ã¯ããã©ã³ãã®åœåèŠåã«åŸãããšã ãã§ãã
[ÐžÐŒÑ Ð¿ÑПекÑа]-[ÐœÐŸÐŒÐµÑ ÑаÑка]-МазваМОе
ããšãã°ããããžã§ã¯ã ããŒãGitHub Actionsãã GA ã®å Žåã GA-8-jira-bot
GA-8 ã¿ã¹ã¯ãå®è£
ããããã®ãã©ã³ãã§ããå¯èœæ§ããããŸãã
JIRA ãšã®çµ±åã¯ãAtlassian ããã®ã¢ã¯ã·ã§ã³ãéããŠæ©èœããŸããããããã¯å®ç§ã§ã¯ãªããããã€ãã¯ç§ã«ãšã£ãŠãŸã£ããæ©èœããªãã£ããšèšããããåŸãŸããã ãã ãã確å®ã«æ©èœããç©æ¥µçã«äœ¿çšãããŠãããã®ã«ã€ããŠã®ã¿èª¬æããŸãã
ãŸããã¢ã¯ã·ã§ã³ atlassian/gajira-login ã䜿çšã㊠JIRA ã«ãã°ã€ã³ããå¿ èŠããããŸãã
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 }}
ãããè¡ãã«ã¯ãJIRA ã§ããŒã¯ã³ãååŸããå¿
èŠããããŸãããã®æ¹æ³ã«ã€ããŠã¯ãããã§èª¬æããŸãã
ãã©ã³ãåããã¿ã¹ã¯èå¥åãæœåºããŸãã
- 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}}
GitHub ããŒã±ãããã¬ã€ã¹ã§æ€çŽ¢ãããšããã®ã¿ã¹ã¯ã®ã¢ã¯ã·ã§ã³ãèŠã€ããããšãã§ããŸãããAtlassian ããã®ãã®ã¢ã¯ã·ã§ã³ã¯ç§ã®ãããžã§ã¯ãã§ã¯ãŸã£ããæ©èœããªãã£ãããããã©ã³ãã®ååã䜿çšã㊠grep ã䜿çšããŠåãããšãèšè¿°ããå¿ èŠããããŸããã ãäœãééã£ãŠããã®ããç解ããã«ã¯ãæã§åãããšããããããæéãããããŸãã
æ®ã£ãŠããã®ã¯ããã« ãªã¯ãšã¹ãã®äœææã«ã¿ã¹ã¯ããã³ãŒã ã¬ãã¥ãŒãåã«ç§»åããããšã ãã§ãã
- name: Transition issue
if: ${{ success() }}
uses: atlassian/gajira-transition@master
with:
issue: ${{ steps.find_issue.outputs.ISSUE_ID }}
transition: "Code review"
GitHub ã«ã¯ããã«å¯Ÿããç¹å¥ãªã¢ã¯ã·ã§ã³ããããŸããå¿ èŠãªã®ã¯ãåã®ã¹ãããã§ååŸããèª²é¡ ID ãšãäžã§è¡ã£ã JIRA ã§ã®æ¿èªã ãã§ãã
åæ§ã«ããã¹ã¿ãŒã«ããŒãžãããšãã«ã¿ã¹ã¯ããGitHub ã¯ãŒã¯ãããŒããä»ã®ã€ãã³ãããã©ãã°ã§ããŸãã äžè¬ã«ãããã¯ãã¹ãŠããªãã®æ³ååãšæ¥åžžçãªããã»ã¹ãèªååããããšããé¡æã«ããã£ãŠããŸãã
æèŠ
å€å žç㪠DEVOPS å³ãèŠããšãããããæäœãé€ããã¹ãŠã®æ®µéãã«ããŒãããŠããŸããè©ŠããŠã¿ããšãåžå Žã§ãã«ã ãã¹ã¯ ã·ã¹ãã ãšã®çµ±åã«é¢ããäœããã®ã¢ã¯ã·ã§ã³ãèŠã€ãããšæããŸãããã®ããããã€ãã©ã€ã³ãåãæ¿ãã£ããšä»®å®ããŸãã培åºçã«æ€èšãããã®äœ¿çšç¶æ³ã«åºã¥ããŠçµè«ãå°ãåºãããšãã§ããŸãã
é·æïŒ
- ããããå Žé¢ã«å¯Ÿå¿ããæ¢æã®ã¢ã¯ã·ã§ã³ãåããããŒã±ãããã¬ã€ã¹ãããã¯éåžžã«ã¯ãŒã«ã§ãã ãããã®ã»ãšãã©ã§ã¯ããœãŒã¹ ã³ãŒããåç §ããŠåæ§ã®åé¡ã解決ããæ¹æ³ãç解ããããGitHub ãªããžããªã§äœæè ã«æ©èœãªã¯ãšã¹ããçŽæ¥æçš¿ãããããããšãã§ããŸãã
- ã¢ã»ã³ããªã®ã¿ãŒã²ãã ãã©ãããã©ãŒã (Linuxãmac osãwindows) ãéžæããããšã¯ãéåžžã«èå³æ·±ãæ©èœã§ãã
- Github ããã±ãŒãžã¯åªããæ©èœã§ãã€ã³ãã©ã¹ãã©ã¯ãã£å šäœã XNUMX ãæã«ä¿ç®¡ã§ããŠäŸ¿å©ã§ããå¥ã®ãŠã£ã³ããŠãé²èŠ§ããå¿ èŠããªããããŠã¹ã XNUMX åã XNUMX åã¯ãªãã¯ããã ãã§ãã¹ãŠãå®çµããGitHub Actions ãšå®å šã«çµ±åãããŠããŸãã ç¡æçã§ã® Docker ã¬ãžã¹ããªã®ãµããŒããè¯ãå©ç¹ã§ãã
- GitHub ã¯ãã«ã ãã°ã«ç§å¯ãé ããããGitHub ã䜿çšããŠãã¹ã¯ãŒããããŒã¯ã³ãä¿åããããšã¯ããã»ã©æãããšã§ã¯ãããŸããã ç§ã®ãã¹ãŠã®å®éšäžãã³ã³ãœãŒã«å ã§ãã®ç§å¯ãçŽç²ãªåœ¢ã§èŠãããšã¯ã§ããŸããã§ããã
- ãªãŒãã³ãœãŒã¹ãããžã§ã¯ãã«ã¯ç¡æ
çæïŒ
- YML ããã§ãããç§ã¯åœŒã奜ãã§ã¯ãããŸããã ãã®ãããªãããŒã§äœæ¥ããå Žåãæãäžè¬çãªã³ããã ã¡ãã»ãŒãžã¯ãyml 圢åŒãä¿®æ£ããŠãã ãããã§ããå Žåã«ãã£ãŠã¯ãã©ããã«ã¿ãã眮ãå¿ããããééã£ãè¡ã«ã¿ããèšè¿°ãããããããšããããŸãã äžè¬ã«ãå床åšãšå®èŠãæã£ãŠç»é¢ã®åã«åº§ãã®ã¯ãããŸã楜ããçµéšã§ã¯ãããŸããã
- DEBUGãã³ãããã«ãããããŒã®ãããã°ããªãã«ãã®å®è¡ãã³ã³ãœãŒã«ãžã®åºåã¯å¿ ããã䟿å©ãšã¯éããŸããããã©ã¡ãããšãããšããããããã®éšé¡ã«å±ããäœã§ããããã°ã§ãã䟿å©ãª IDEA ã䜿çšããããšã«æ £ããŠããŸãã ã
- Docker ã§ã©ããããã°äœã§ãã¢ã¯ã·ã§ã³ãæžãããšãã§ããŸããããã€ãã£ãã«ãµããŒããããŠããã®ã¯ JavaScript ã ãã§ãããã¡ããããã¯å¥œã¿ã®åé¡ã§ãããç§ã¯ js ã§ã¯ãªãä»ã®ãã®ã奜ã¿ãŸãã
ãã¹ãŠã®ã¹ã¯ãªãããå«ããªããžããªã¯ããã«ããããšãæãåºããŠãã ããã
æ¥é±ã¯äžç·ã«åºæŒããŸã
å ±å ãã€ãŒã³ãã°2020ããŒã¿ãŒäŒè°ã«ãŠã ãã¹ã ããŒã¿ãæºåããéã®ééããé¿ããæ¹æ³ã ãã§ãªããJava ã¢ããªã±ãŒã·ã§ã³ã§ããŒã¿ ã»ãããæäœããéã®ç§èš£ãå ±æããŸãã
åºæïŒ habr.com