* 프로그래머스, 타입스크립트로 함께하는 웹 풀 사이클 개발(React, Node.js) 5기 강의 수강 내용을 정리하는 포스팅.
* 원활한 내용 이해를 위해 수업에서 제시된 자료 이외에, 개인적으로 조사한 자료 등을 덧붙이고 있음.
.pem 키 파일을 통한 SSH 접속 및 보안 그룹(Security Group) 설정~/.minikube/ca.crt, client.crt, client.key 등)kubectl, 브라우저, MySQL 접속을 통해 서비스 정상 동작 확인SCM Checkout → Unit Test (코드 커버리지 포함) → Production Build → Packaging → Image Push → Staging 배포 → Acceptance Test → Release → Smoke Test
git clone, npm test, docker build/ push, Terraform을 이용한 배포 자동화c8 등을 이용하여 테스트 커버리지를 측정tsconfig 및 Makefile 설정을 통해 테스트 실행 시 제외 파일 지정 및 HTML 보고서 생성npm build 명령을 통해 build 디렉토리 산출물 생성make image 타겟을 사용하여 이미지 빌드 후 ECR에 푸시stage("Docker") {
steps {
script {
def beImg = docker.build("${IMG_NAME_BE}", "--platform=linux/amd64 -f backend/Dockerfile backend")
def feImg = docker.build("${IMG_NAME_FE}", "--platform=linux/amd64 -f frontend/Dockerfile frontend")
docker.withRegistry("https://${REGISTRY_URI}", "ecr:ap-northeast-2:AWS_CREDENTIALS") {
beImg.push("${VERSION_TAG}")
feImg.push("${VERSION_TAG}")
}
}
}
}
dpy-staging.sh를 작성하여 리소스 적용 및 제거 자동화# dpy-staging.sh
VAR_FILE="staging.tfvars"
: ${KUBECONFIG_PATH:="~/.kube/config"}
: ${IMG_BE:="<Your image URI here>"}
: ${IMG_FE:="<Your image URI here>"}
if [ "$1" = "on" ] ; then
cat staging.conf setup.conf > notes.tf
terraform init -reconfigure -no-color
terraform apply --auto-approve -no-color \
-var-file="${VAR_FILE}" \
-var "kubernetes_config_path=${KUBECONFIG_PATH}" \
-var "container_image_be=${IMG_BE}" \
-var "container_image_fe=${IMG_FE}"
elif [ "$1" = "off" ] ; then
cat staging.conf setup.conf > notes.tf
terraform init -reconfigure -no-color
terraform destroy --auto-approve -no-color \
-var-file="${VAR_FILE}" \
-var "kubernetes_config_path=${KUBECONFIG_PATH}"
else
echo "Usage: $0 <on/off>"
fi
class TestLoginlogout():
def setup_method(self, method):
options = webdriver.ChromeOptions()
options.add_argument('--headless=new')
self.driver = webdriver.Remote(
command_executor='http://localhost:30050/wd/hub',
options=options
)
self.vars = {}
def teardown_method(self, method):
self.driver.quit()
def test_loginlogout(self):
self.driver.get("https://notes-staging.prgms-fullcycle.com/")
self.driver.implicitly_wait(10)
self.login()
self.driver.implicitly_wait(10)
self.logout()
# login() and logout() methods defined similarly...