1.1 GitHub Action Security값 설정
1.2 GitHub Action yml파일 작성
1.3 DockerFile 작성
2.1 ECS 만들기
2.2 클러스터 설정
2.3 테스크 정의
2.4 CI/CD 테스트하기
EC2없이 Fargete(서버리스)를 사용해서 배포를 진행하겠다.
FROM gradle:7.6-jdk17-alpine as build
ENV APP_HOME=/apps/
WORKDIR $APP_HOME
COPY build.gradle settings.gradle gradlew $APP_HOME
COPY gradle $APP_HOME/gradle
RUN chmod +x gradlew
RUN ./gradlew build || return 0
COPY src $APP_HOME/src
RUN ./gradlew clean build
FROM openjdk:17.0.2-jdk
ENV APP_HOME=/apps
ARG ARTIFACT_NAME=app.jar
ARG JAR_FILE_PATH=build/libs/[applicationFile]-0.0.1-SNAPSHOT.jar
WORKDIR $APP_HOME
COPY --from=build $APP_HOME/$JAR_FILE_PATH $ARTIFACT_NAME
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
이제 로컬에서 설정해야할 부분은 aws.yml작성말고 다 끝났다. 이제 ECS로 가서 Cluter를 설정해보자
1. 테스트 정의 구성 후 작성한다.
!! 혹시 에러가 날경우
상단에 이렇게 현재 진행상태가 보일것이다. 우측에 [CloudFormation으로 보기]를 눌러서 우측에 이벤트 탭을 보면 log확인이 가능하다.
...생략...
# env파일에 본인이 설정을하면 되겠다.
env:
AWS_REGION: #본인이 만든 Region명
ECR_REPOSITORY: # ECR 레포지토리 명
ECR_IMAGE_TAG: # ECR에 Image 생성시 붙일 태그
AWS_ACCESS_KEY: # GitHub Security에 넣은 AWS Access Key
AWS_SECRET_KEY: # GitHub Security에 넣은 AWS Secrity Key ECS_CLUSTER: # 생성한 클러스터 명
ECS_SERVICE: # 클러스터의 서비스명
CONTAINER_NAME: # 태스크설정시 넣은 컨테이너 명
... 생략...
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ env.AWS_ACCESS_KEY}}
aws-secret-access-key: ${{ env.AWS_SECRET_KEY }}
aws-region: ${{ env.AWS_REGION }}
... 생략...
env:
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
IMAGE_TAG: ${{ env.ECR_IMAGE_TAG }}
run: |
#ECR에 넣을 Docker Image를 생성하는 과정
docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG ./TestDockerGit/.
docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
...생략...
uses: aws-actions/amazon-ecs-render-task-definition@v1
with:
# task-definition을 확인가능하다.
task-definition: task-definition.json
container-name: ${{ env.CONTAINER_NAME }}
image: ${{ steps.build-image.outputs.image }}
- name: Deploy Amazon ECS task definition
uses: aws-actions/amazon-ecs-deploy-task-definition@v1
with:
task-definition: task-definition.json
service: ${{ env.ECS_SERVICE }}
cluster: ${{ env.ECS_CLUSTER }}
wait-for-service-stability: true
위 yml에 task-deficition이 보일것이다. 설정하는법은 아래와 같다.
생성한 task로 가서 컨테이너 우측에 json으로 클립보드로 복사한다.
복사한 데이터를 gitRepository 최 상위폴더에 task-definition.json파일을 생성후 붙여넣는다.
@RestController
public class Testcontroller {
@GetMapping("/test")
public ResponseEntity TestAPI(){
return new ResponseEntity("테스트 데이터" , HttpStatus.OK );
}
@GetMapping("/health")
public ResponseEntity HealthAPI(){
return new ResponseEntity("up" , HttpStatus.OK );
}
}
API 요청해보기 (/test)
정상적으로 "테스트 데이터"라는 값이 반환된다.
데이터값 변환
@RestController
public class Testcontroller {
@GetMapping("/test")
public ResponseEntity TestAPI(){
return new ResponseEntity("CI/CD TEST" , HttpStatus.OK );
}
@GetMapping("/health")
public ResponseEntity HealthAPI(){
return new ResponseEntity("up" , HttpStatus.OK );
}
}
이렇게하면 같은 엔드포인트라도 "CI/CD TEST"를 갑을 반환하게 한다.
이렇게 수정한뒤 별도의 작업없이 git에 push 해보도록 하겠다.
git add .
git commit -m'/test 반환값 변환'
git push
이렇게 하면 정상적으로 workflows가 돌아가는것이 보인다.
git action이 돌아가는 중이다.
새로운 값이 잘 반환되었다. 서버에서 변경값이 잘 적용된것이다.