이번 포스팅에서는 지금까지 docker이미지 생성, aws Elastic Beanstalk에 이미지를 업로드한 과정 등을 Github Actions를 이용해 자동화시켜보겠습니다.
기존에 Jenkins, Circle ci에서 ci/cd를 제공하는 것과 동일하게 github에서 제공하는 ci/cd 툴입니다. 제가 느낀 장점은 다음과 같습니다.
먼저, github에서 제공되고 있는 기능이어서 따로 설치할 필요가 없고, github action marketplace에서 수많은 기능들을 손쉽게 사용할 수 있을 때면 행보캅니다,,, (감덩) 따로 jenkins를 docker 설정하지 않고 yml 파일만 업로드해주면 된다는 점도 너무 매력적입니다
이번 포스팅에서 2개의 yml 파일을 작성해서 actions들을 만들건데, 먼저 첫번째는 빌드 입니다. Github actions 를 자세히 설명하는 포스팅은 아니기 때문에 간단히 알아보고 넘어가겠습니다.
두 가지의 actions을 정의해볼 건데, 첫번째는 build 액션과 두번째는 deploy 액션입니다. 먼저 살펴볼 action은 빌드 과정에 문제가 없는지 체크하는 액션입니다. 모든 테스트 코드와 빌드에 오류가 없을때만 정상적으로 동작합니다.
name: build CI
on:
pull_request:
branches: [main]
jobs: #jobs 는 여러개의 step들로 이루어집니다.
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3 # workflow가 repository를 접근할 수 있게 checkout합니다.
- name: Set up JDK 11
uses: actions/setup-java@v3 # java 환경 설정
with:
java-version: '11'
distribution: 'temurin'
- name: Build with Gradle # gradle을 이용한 java 빌드
uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
with:
arguments: build
스크립트에 대해서 간단히 설명하면,
각각의 자세한 사용방법은 action marketplace들을 참조하시면 됩니다.
위의 정의된 action 을 통해, 빌드에 아무 문제가 없는지 확인합니다. 만약 테스트코드 오류나 빌드과정에 문제가 있다면 오류를 발생시킵니다.
branch를 새로 만들고 변경사항을 push 하고, main branch에서 pull request를 요청하면 아래와 같이 정의한 github action이 잘 동작하는 것을 볼 수 있습니다.!!
다음은 deploy 자동화를 위한 script를 작성해보겠습니다.
name: deploy
on: # main branch에 push를 할 때 동작합니다!
push:
branches: [ main ]
workflow_dispatch:
env:
# Java
JAVA_VERSION: 1.15
# DockerHub
DOCKER_HUB_USERNAME: woohobi
# AWS & Elastic Bean Stalk
AWS_REGION: eu-central-1
EB_ENVIRONMENT_NAME: Deployment-env
EB_APPLICATION_NAME: deployment
EB_DEPLOYMENT_PACKAGE: elasticbeanstalk/docker-compose.yml
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Java JDK
uses: actions/setup-java@v1.4.3
with:
java-version: ${{ env.JAVA_VERSION }}
- name: Build Number
id: build-number
run: echo "::set-output name=BUILD_NUMBER::$(date '+%-d.%-m.%Y.%-H.%-M.%-S')"
- name: Docker Login
uses: docker/login-action@f3364599c6aa293cdc2b8391b1b56d0c30e45c8a
with:
username: ${{ env.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_PASSWORD }}
- name: Push to Dockerhub
run: ./gradlew jib
- name: Beanstalk Deploy
uses: einaregilsson/beanstalk-deploy@ebe3476a4ce991d54336935e75e78dd9d86f9408
with:
aws_access_key: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws_secret_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
region: ${{ env.AWS_REGION }}
environment_name: ${{ env.EB_ENVIRONMENT_NAME }}
application_name: ${{ env.EB_APPLICATION_NAME }}
deployment_package: ${{ env.EB_DEPLOYMENT_PACKAGE }}
version_label: ${{ steps.build-number.outputs.BUILD_NUMBER }}
version_description: Version ${{steps.build-number.outputs.BUILD_NUMBER}} deployed via github actions ${{ github.sha }}
wait_for_deployment: 60
deploy 액션에서는 docker login, aws 배포를 위해 env 변수 설정 해줍니다. 각각의 변수들은 docker hub, aws 페이지에서 확인할 수 있습니다. 한국에 계시다면 aws-region을 ap-northeast-2로 설정해주시면 됩니다.
docker image를 업로드하고, aws Elastic Beanstalk에 자동 배포를 하기 위해서는 몇가지의 추가 과정이 필요합니다. 한 가지씩 살펴보겠습니다.
AWS Identity and Access Management(IAM)은 AWS 리소스에 대한 액세스를 안전하게 제어할 수 있는 웹 서비스입니다. IAM을 사용하여 beanstalk에 배포를 할 수 있는 권한을 부여해줍니다.
IAM - 엑세스 관리 - 사용자 - 사용자 추가 경로로 사용자를 추가하고 권한을 부여해야 합니다. 우리는 github actions 에서 CLI 방식으로 배포를 할 것이기에 프로그래밍 방식 엑세스 를 체크해줍니다.
권한 설정 파트에서는 기존 정책 직접 연결 - AWS ElasticBeanstalk Administrator Access 를 체크해줍니다. (기존에 AWS ElasticBeanstalk FullAccess 에서 변경되었습니다.)
다음 페이지에서 권한 설정을 해줍니다.
다른 부분은 default 상태로 넘어가면 성공적으로 IAM 사용자를 만든 것을 볼 수 있습니다. 엑세스 키와 비밀 엑세스 키는 일종의 아이디 - 비밀번호 라고 생각해주시면 됩니다.
또 한 가지 주의할 점은 yml 파일은 github에 업로드하는 파일이어서 password 같은 중요한 정보는 절대 외부에 노출하면 안 됩니다. github secrets을 통해 key-value의 암호화 된 형태로 변수들을 사용할 수 있습니다.
AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, DOCKER_HUB_PASSWORD를 New Repository secret 을 통해 추가해줍니다.
새로운 버전을 배포하기 전, ("/hello") 경로로 접속하면 404 에러가 뜨는 모습을 확인할 수 있습니다.
간단한 api를 작성하고 자동화가 잘 동작하는지 확인해보겠습니다.
@RestController
public class helloController {
@GetMapping("/hello")
public String hello() {
return "hello Changwan!";
}
}
변경 사항을 새로운 branch에 commit - push 하면 pull request를 생성할 수 있는 창을 볼 수 있습니다
pull request 를 누르면 처음에 build.yml에 작성한 스크립트대로 동작하겠죠??!
build가 문제 없이 동작한 것을 확인할 수 있고, pull request를 main branch로 merge 해줍니다!
merge를 해주면 우리가 작성한 controller 대로 값을 리턴해주는 것을 확인할 수 있습니다 🙌🙌
이번 시리즈를 통해 도커 이미지를 beanstalk에 배포하였고, github actions 를 통해 이미지 배포를 자동화하는 것까지 해보았습니다. 이 시리즈는 여기까지고 많은 도움이 되었으면 바랍니다 ㅎㅎㅎ!!!