자바 콘솔 애플리케이션을 만들고 있는 중에 테스트를 직접 실행하지 않아도 그 결과를 믿을만한 방법으로 보여주고 싶어 테스트 자동화에 대해 알아보기 시작했습니다.
CI/CD 서비스를 제공하는 플랫폼은 Travic Ci, Jenkins등 여러가지가 있지만, 그 중에 GitHub Actions를 사용했습니다. 최근 TIL의 README 업데이트 자동화를 위해 사용해본 경험이 있고, 이미 널리 빌드와 테스트 자동화를 위해 사용되고 있으며 GitHub 내에서 사용할 수 있어 접근성이 편리하기 때문이라는 세 가지 이유 때문에 선택했습니다.
먼저 GitHub Actions를 재빨리 맛보고 제가 필요한 기능으로 수정해 프로젝트에 적용해보겠습니다.
https://docs.github.com/ko/actions/quickstart
GitHub이 제공하는 친절한 문서의 안내를 따라 순식간에 자동화를 경험한 다음 프로젝트에 다시 적용시켜보겠습니다.
GitHub-Action에 들어가서 새 파일 만들기를 클릭
파일이름은 상관없지만 경로는 아래와 같아야합니다.
github-actions-demo.yml파일의 내용은 아래와 같이 작성합니다.
name: GitHub Actions Demo
run-name: ${{ github.actor }} is testing out GitHub Actions 🚀
on: [push]
jobs:
Explore-GitHub-Actions:
runs-on: ubuntu-latest
steps:
- run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event."
- run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub!"
- run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}."
- name: Check out repository code
uses: actions/checkout@v3
- run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner."
- run: echo "🖥️ The workflow is now ready to test your code on the runner."
- name: List files in the repository
run: |
ls ${{ github.workspace }}
- run: echo "🍏 This job's status is ${{ job.status }}."
name : GitHub Actions Demo
이 이름은 아래와 같이 프로젝트 레포의 actions 탭의 workflow의 제목입니다.
run-name: ${{ github.actor }} is testing out GitHub Actions 🚀
위에 작성한 name의 워크플로우로부터 생성된 workflow runs의 이름.
아래처럼 github.actor에는 내 깃헙 유져네임이 들어갑니다.
on: [push]
이 워크플로우를 실행하는 조건을 명시합니다. 이 예시에서는 프로젝트를 push하거나 누가 pull request를 merge할 때마다 워크플로우가 실행됩니다. 기본적으로 모든 브렌치에 적용되나, 특정한 브렌치, paths, 또는 tag를 지정할 수 있습니다.
jobs:
GitHub Actions Demo workflow에서 실행되는 모든 job들을 모은 그룹 입니다.
Explore-GitHub-Actions:
job의 이름을 임의로 정한 것입니다. 다른 이름으로 변경할 수 있으며
이 코드의 하위 값들은 job의 속성을 정의합니다.
여기에서 설정한 이름은 아래의 사진과 같이 확인할 수 있습니다.
runs-on: ubuntu-latest
우리가 github action을 실행할 때마다 github에서 가상 머신을 host해서 이 job들을 실행합니다. 여기서는 ubuntu linux runner의 가장 최신 버전에서 job이 실행되어야함을 설정합니다. windows와 같은 다른 환경으로도 설정할 수도 있습니다.
steps:
'Explore-GitHub-Actions' job에서 실행되는 모든 단계들을 모은 그룹을 가리킵니다.
uses: actions/checkout@v3
use 키워드는 이 step이 'actions/checkout'이라는 이름으로 지정된 작업을 검색하도록 지시합니다. 다시 말해, 러너가 내 레포지토리를 확인하고, 다운로드 받아 내 코드에 대한 스크립트나 다른 action들을 실행할 수 있게 합니다. 그래서 내 작업의 경우, push가 발생할 때마다 workflow가 리포지토리에 실행될 수 있도록 이 체크아웃 작업을 해줘야합니다.
Each job will run inside its own virtual machine runner, or inside a container, and has one or more steps that either run a script that you define or run an action, which is a reusable extension that can simplify your workflow.
changes commit버튼을 누르고, 이 커밋을 위한 새로운 브랜치를 생성하기를 선택하고, Propose changes를 클릭하여 pull request를 합니다.
결과를 보러 가자 Action을 클릭해서
내가 생성한 워크 플로우를 클릭하고
실행중인 workflows 중 내가 보고 싶은 것을 하나 클릭합시다.
다시 왼쪽의 jobs를 보면 Explore_GitHub_Actions를 클릭하여
실행중인 워크 플로우의 진행 단계를 확인할 수 있는 로그를 확인할 수 있다. 이것저것 클릭해보면
프로젝트 내의 디렉토리 목록들도 볼 수 있고 job의 상태라던지 정보도 확인할 수 있습니다.
나는 maven으로 빌드한 java 애플리케이션의 테스트를 자동화할 것이기 때문에 앞으로는 위의 예문에는 없는 키워드들을 설명하겠습니다.
제가 만든 자바 애플리케이션은 콘솔에서 작동하며 빌드 자동화의 기능이 필요하지 않기 때문에 test 자동화에 관한 내용과 java 환경설정 내용만을 추가했습니다.
작성한 yml파일의 내용은 아래와 같습니다.
name: testJava Actions
run-name: testing out GitHub Actions
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3 #1
with:
java-version: '17'
distribution: 'temurin'
# test
- name: run tests in testJava
run: mvn test #2
#1 actions/setup-java@v3
이 단계에서는 job의 runner(virtual machine)에 지정된 java를 설치한다. actions/checkout처럼 action/setup-java라는 이름으로 지정된 작업을 검색하여 실행하도록 하는 키워드가 use.
#2 run: mvn test
run
이라는 키워드는는 job에게 runner에서 명령어를 실행하게 한다. 이 경우 mvn test
명령어로 maven 프로젝트 내의 모든 테스트를 실행하여 log에서 결과를 볼 수 있도록 했습니다.
maven guide : How do I compile mytest sources and run my unit tests?
자, 일단 정상적으로 workflow가 수행되었습니다. test와 관련된 step을 클릭해 결과를 확인해보겠습니다.
길고 긴 로그 끝 모든 테스트가 정상적으로 수행되었음을 확인할 수 있었습니다.
실행된 workflow 페이지에 들어가면
Create status badge 버튼이 있습니다. 이 버튼을 눌러
status badge Markdown 버튼을 눌러 코드를 복사한 다음, README.md에 붙여넣어 commit하면 아래의 뱃지를 추가할 수 있습니다.