diff --git a/.github/workflows/block.yml b/.github/workflows/block.yml new file mode 100644 index 00000000..4f3b7317 --- /dev/null +++ b/.github/workflows/block.yml @@ -0,0 +1,14 @@ +name: Block Perf to Develop + +on: + pull_request: + branches: [ "develop" ] + +jobs: + block-perf-pr: + runs-on: ubuntu-latest + if: github.head_ref == 'perf' + steps: + - run: | + echo "🚫 perf-test β†’ develop 병합은 κΈˆμ§€λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€." + exit 1 diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index f5cc1b90..bdb04224 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -22,12 +22,12 @@ jobs: java-version: '17' distribution: 'temurin' - # 3. Docker 이미지 build 및 push + # 3. Docker 이미지 build 및 push - name: docker build and push run: | docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }} - docker build -t ${{ secrets.DOCKER_USERNAME }}/gotcha:latest . - docker push ${{ secrets.DOCKER_USERNAME }}/gotcha:latest + docker build -t ${{ secrets.DOCKER_USERNAME }}/gotcha_perf_test:latest . + docker push ${{ secrets.DOCKER_USERNAME }}/gotcha_perf_test:latest # 4. ec2 pull - name: Deploy to server @@ -38,10 +38,10 @@ jobs: username: ${{ secrets.SERVER_USERNAME }} key: ${{ secrets.SERVER_KEY }} script: | - docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }} +# docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }} docker system prune -a -f docker-compose down - docker rmi ${{ secrets.DOCKER_USERNAME }}/gotcha:latest - docker pull ${{ secrets.DOCKER_USERNAME }}/gotcha:latest + docker rmi ${{ secrets.DOCKER_USERNAME }}/gotcha_perf_test:latest + docker pull ${{ secrets.DOCKER_USERNAME }}/gotcha_perf_test:latest docker-compose up -d diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8ef11687..93afabf7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,7 +2,7 @@ name: Continuous Integration on: pull_request: - branches: [ "develop" ] + branches: [ "perf-test" ] workflow_dispatch: inputs: logLevel: @@ -24,7 +24,7 @@ on: required: false permissions: - contents: write + contents: read jobs: develop-test: @@ -36,46 +36,14 @@ jobs: with: ref: ${{ github.event.pull_request.head.ref }} - # 1. Node.js μ„€μΉ˜ (AsyncAPI CLI μ‹€ν–‰μš©) - - name: Setup Node.js - uses: actions/setup-node@v3 - with: - node-version: '18' - - - name: Clean old docs - run: rm -rf gotcha-socket/src/main/resources/static.docs gotcha-socket/src/main/resources/static/docs - - # 3. AsyncAPI CLI μ „μ—­ μ„€μΉ˜ (μ΅œμ‹  버전) - - name: Install AsyncAPI CLI - run: npm install -g @asyncapi/cli@latest - - # 4. AsyncAPI β†’ HTML λ¬Έμ„œ μžλ™ 생성 - - name: Generate HTML Docs - run: | - asyncapi generate fromTemplate gotcha-socket/asyncapi.yaml @asyncapi/html-template@3.0.0 --output gotcha-socket/src/main/resources/static/docs --use-new-generator - - # 5. λ¬Έμ„œ 변경사항 컀밋 & ν‘Έμ‹œ - - name: Commit and Push Generated Docs - run: | - git config --global user.name "github-actions" - git config --global user.email "actions@github.com" - - git add gotcha-socket/src/main/resources/static/docs - if git diff --cached --quiet; then - echo "No changes to commit" - else - git commit -m "Auto-update AsyncAPI docs" - git push - fi - - # 7. μžλ°” ν™˜κ²½ μ„€μ • + # 2. μžλ°” ν™˜κ²½ μ„€μ • - name: Set up JDK 17 uses: actions/setup-java@v3 with: java-version: '17' distribution: 'temurin' - # 7. ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•œ DB μ„€μ • + # 3. ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•œ DB μ„€μ • - name: Setup MySQL uses: mirromutth/mysql-action@v1.1 with: @@ -83,11 +51,11 @@ jobs: mysql user: ${{ secrets.MYSQL_TEST_USER }} mysql password: ${{ secrets.MYSQL_TEST_PASSWORD }} - # 8. Gradlew μ‹€ν–‰ κΆŒν•œ μ„€μ • + # 4. Gradlew μ‹€ν–‰ κΆŒν•œ μ„€μ • - name: Run chmod to make gradlew executable run: chmod +x ./gradlew - # 9. Gradle Test μ‹€ν–‰ + # 5. Gradle Test μ‹€ν–‰ - name: Build with Gradle uses: gradle/gradle-build-action@bd5760595778326ba7f1441bcf7e88b49de61a25 with: diff --git a/gotcha/src/main/resources/application-perf.yml b/gotcha/src/main/resources/application-perf.yml new file mode 100644 index 00000000..3e68f057 --- /dev/null +++ b/gotcha/src/main/resources/application-perf.yml @@ -0,0 +1,10 @@ +spring: + datasource: + url: jdbc:mysql://${PERF_DATABASE_HOST:localhost}:${DATABASE_PORT:3306}/${PERF_DATABASE_NAME:gotcha} + username: ${PERF_DATABASE_USER:root} + password: ${PERF_DATABASE_PASSWORD:password} + driver-class-name: com.mysql.cj.jdbc.Driver + +csrf: + cookie: + secure: false \ No newline at end of file diff --git a/gotcha/src/main/resources/application.yml b/gotcha/src/main/resources/application.yml index 3ab8b25a..66cfe2a0 100644 --- a/gotcha/src/main/resources/application.yml +++ b/gotcha/src/main/resources/application.yml @@ -1,6 +1,6 @@ spring: profiles: - active: ${SPRING_PROFILES_ACTIVE:dev} + active: ${SPRING_PROFILES_ACTIVE:perf} jpa: hibernate: diff --git a/load-test/config.env b/load-test/config.env new file mode 100644 index 00000000..e69de29b diff --git a/load-test/locustfile.py b/load-test/locustfile.py new file mode 100644 index 00000000..ae78d4bb --- /dev/null +++ b/load-test/locustfile.py @@ -0,0 +1,6 @@ +from locust import HttpUser, between +from scenario.login import LoginScenario + +class WebsiteUser(HttpUser): + tasks = [LoginScenario] + wait_time = between(1, 3) diff --git a/load-test/scenario/login.py b/load-test/scenario/login.py new file mode 100644 index 00000000..c71fb005 --- /dev/null +++ b/load-test/scenario/login.py @@ -0,0 +1,19 @@ +from locust import TaskSet, task + +class LoginScenario(TaskSet): + token = None + + @task + def login_and_store_token(self): + res = self.client.post( + "/api/auth/sign-in", + json={ + "email": "test@gmail.com", + "password": "asdfasdf1" + } + ) + if res.status_code == 200: + self.token = res.json().get("accessToken") # 응닡 ꡬ쑰에 맞게 key 확인 + print(f"[성곡] 토큰: {self.token}") + else: + print(f"[μ‹€νŒ¨] 둜그인 μ‹€νŒ¨: {res.status_code} / {res.text}")