diff --git a/.github/workflows/dev-cd.yml b/.github/workflows/dev-cd.yml new file mode 100644 index 0000000..a7c42fa --- /dev/null +++ b/.github/workflows/dev-cd.yml @@ -0,0 +1,57 @@ +name: Deploy to Dev + +on: + workflow_dispatch: + push: + branches: + - dev + +jobs: + deploy-dev: # 개발 환경 배포 + runs-on: ubuntu-latest + + steps: + - name: Get Github Actions IP # 깃허브의 현재 ip가져오기 + id: ip + uses: haythem/public-ip@v1.2 + + - name: Setting environment variables + run: | + echo "AWS_DEFAULT_REGION=ap-northeast-2" >> $GITHUB_ENV + echo "AWS_SG_NAME=general-web-sg" >> $GITHUB_ENV + + - name: Configure AWS Credentials # AWS 관련 설정값 등록 + uses: aws-actions/configure-aws-credentials@v1 + with: + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws-region: ap-northeast-2 + + - name: Add Github Actions IP to Security group # 보안 그룹에 깃허브 ip 추가 + run: | + aws ec2 authorize-security-group-ingress --group-name ${{ env.AWS_SG_NAME }} --protocol tcp --port 22 --cidr ${{ steps.ip.outputs.ipv4 }}/32 + env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + AWS_DEFAULT_REGION: ap-northeast-2 + + - name: Deploy to Dev EC2 + uses: appleboy/ssh-action@master + with: + host: ${{ secrets.DEV_EC2_HOST }} # Dev EC2의 호스트 주소 + username: ${{ secrets.EC2_USER }} # SSH 사용자 + key: ${{ secrets.DEV_EC2_KEY }} # SSH 비밀 키 + script_stop: true # 연결 실패 시 작업 중지 + script: | + cd services/${{ github.event.repository.name }} + git pull origin dev + npm ci --omit=dev + pm2 reload ${{ github.event.repository.name }} + + - name: Remove Github Actions IP from security group # 추가했던 ip 삭제 + run: | + aws ec2 revoke-security-group-ingress --group-name ${{ env.AWS_SG_NAME }} --protocol tcp --port 22 --cidr ${{ steps.ip.outputs.ipv4 }}/32 + env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + AWS_DEFAULT_REGION: ap-northeast-2 \ No newline at end of file diff --git a/.github/workflows/dev-ci.yml b/.github/workflows/dev-ci.yml new file mode 100644 index 0000000..fb4a096 --- /dev/null +++ b/.github/workflows/dev-ci.yml @@ -0,0 +1,30 @@ +name: dev CI + +on: + workflow_dispatch: + pull_request: + branches: + - dev + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - name: Checkout code # 코드 체크아웃 단계 + uses: actions/checkout@v2 + + - name: Set up Node.js # Node.js 설정 단계 + uses: actions/setup-node@v2 + with: + node-version: '18' # 사용할 Node.js 버전 설정 + + - name: Install dependencies # 종속성 설치 단계 + run: npm install + + - name: Run lint # 코드 스타일 검사 단계 + run: npm run lint + continue-on-error: false # lint 실패 시 작업 중단 + + - name: Run tests # 테스트 실행 단계 + run: npm test diff --git a/.github/workflows/prod-cd.yml b/.github/workflows/prod-cd.yml new file mode 100644 index 0000000..c75232d --- /dev/null +++ b/.github/workflows/prod-cd.yml @@ -0,0 +1,57 @@ +name: Deploy to Prod + +on: + workflow_dispatch: + push: + branches: + - main + +jobs: + deploy-prod: # 배포 환경 배포 + runs-on: ubuntu-latest + + steps: + - name: Get Github Actions IP # 깃허브의 현재 ip가져오기 + id: ip + uses: haythem/public-ip@v1.2 + + - name: Setting environment variables + run: | + echo "AWS_DEFAULT_REGION=ap-northeast-2" >> $GITHUB_ENV + echo "AWS_SG_NAME=general-web-sg" >> $GITHUB_ENV + + - name: Configure AWS Credentials # AWS 관련 설정값 등록 + uses: aws-actions/configure-aws-credentials@v1 + with: + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws-region: ap-northeast-2 + + - name: Add Github Actions IP to Security group # 보안 그룹에 깃허브 ip 추가 + run: | + aws ec2 authorize-security-group-ingress --group-name ${{ env.AWS_SG_NAME }} --protocol tcp --port 22 --cidr ${{ steps.ip.outputs.ipv4 }}/32 + env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + AWS_DEFAULT_REGION: ap-northeast-2 + + - name: Deploy to PROD EC2 + uses: appleboy/ssh-action@master + with: + host: ${{ secrets.PROD_EC2_HOST }} # Prod EC2의 호스트 주소 + username: ${{ secrets.EC2_USER }} # SSH 사용자 + key: ${{ secrets.PROD_EC2_KEY }} # SSH 비밀 키 + script_stop: true # 연결 실패 시 작업 중지 + script: | + cd services/${{ github.event.repository.name }} + git pull origin main + npm ci --omit=dev + pm2 reload ${{ github.event.repository.name }} + + - name: Remove Github Actions IP from security group # 추가했던 ip 삭제 + run: | + aws ec2 revoke-security-group-ingress --group-name ${{ env.AWS_SG_NAME }} --protocol tcp --port 22 --cidr ${{ steps.ip.outputs.ipv4 }}/32 + env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + AWS_DEFAULT_REGION: ap-northeast-2 \ No newline at end of file diff --git a/.github/workflows/prod-ci.yml b/.github/workflows/prod-ci.yml new file mode 100644 index 0000000..315d2f4 --- /dev/null +++ b/.github/workflows/prod-ci.yml @@ -0,0 +1,30 @@ +name: prod CI + +on: + workflow_dispatch: + pull_request: + branches: + - main + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - name: Checkout code # 코드 체크아웃 단계 + uses: actions/checkout@v2 + + - name: Set up Node.js # Node.js 설정 단계 + uses: actions/setup-node@v2 + with: + node-version: '18' # 사용할 Node.js 버전 설정 + + - name: Install dependencies # 종속성 설치 단계 + run: npm install + + - name: Run lint # 코드 스타일 검사 단계 + run: npm run lint + continue-on-error: false # lint 실패 시 작업 중단 + + - name: Run tests # 테스트 실행 단계 + run: npm test diff --git a/package-lock.json b/package-lock.json index b50f349..df1172c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,18 +1,18 @@ { "name": "user-service", - "version": "1.0.0", + "version": "1.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "user-service", - "version": "1.0.0", + "version": "1.1.0", "license": "UNLICENSED", "dependencies": { "@frolog/common-utils": "^1.0.5", "@frolog/express-api-server": "^1.0.8", - "@frolog/frolog-api": "^1.0.3", - "@frolog/models": "^1.0.3", + "@frolog/frolog-api": "^1.3.3", + "@frolog/models": "^1.3.2", "aws-sdk": "^2.1692.0", "bcrypt": "^5.1.1", "dotenv": "^16.4.5", @@ -1343,9 +1343,10 @@ } }, "node_modules/@frolog/frolog-api": { - "version": "1.0.3", - "resolved": "http://dev.frolog.kr/verdaccio/@frolog/frolog-api/-/frolog-api-1.0.3.tgz", - "integrity": "sha512-V9V4nyFXFD8CoNLV7PaCEH+2+FMH1fdEiwZJDSgJvhWbALIIKm5UtdJMFzNPDbbMEyOpLX1N0J0xCG5YdfhPJw==", + "version": "1.3.3", + "resolved": "http://dev.frolog.kr/verdaccio/@frolog/frolog-api/-/frolog-api-1.3.3.tgz", + "integrity": "sha512-G4lGFBslrSNZgobSZA1FMZ6KVD2kGlp6payTrTgBQywnmQRskhtRfzLQhGOTGmes+C4uMgoPdia27k5Nk7LLeg==", + "license": "UNLICENSED", "dependencies": { "ajv": "^8.16.0" }, @@ -1354,9 +1355,10 @@ } }, "node_modules/@frolog/models": { - "version": "1.0.3", - "resolved": "http://dev.frolog.kr/verdaccio/@frolog/models/-/models-1.0.3.tgz", - "integrity": "sha512-YCsM7lA/1Yx5VGtKcyxz/svOZLUSC60uw83oSy88tdqRYm4rpM0fmu8YFiQGdqX7nAGht3CkRs7vImuUCfYUFA==", + "version": "1.3.2", + "resolved": "http://dev.frolog.kr/verdaccio/@frolog/models/-/models-1.3.2.tgz", + "integrity": "sha512-Pmm2fSQGAa0UuJceBd/7O7+a7ZJU0vWcrJhIEtjcqgludJB4mGAgCGDrI1d3WqSzzzGeGdDtE6B7/s5EnHdzlQ==", + "license": "UNLICENSED", "dependencies": { "@frolog/common-utils": "^1.0.5", "mysql2": "^3.11.3", diff --git a/package.json b/package.json index c2ab974..5912951 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "user-service", - "version": "1.0.0", + "version": "1.1.0", "main": "src/index.js", "type": "module", "scripts": { @@ -29,8 +29,8 @@ "dependencies": { "@frolog/common-utils": "^1.0.5", "@frolog/express-api-server": "^1.0.8", - "@frolog/frolog-api": "^1.0.3", - "@frolog/models": "^1.0.3", + "@frolog/frolog-api": "^1.3.3", + "@frolog/models": "^1.3.2", "aws-sdk": "^2.1692.0", "bcrypt": "^5.1.1", "dotenv": "^16.4.5", diff --git a/src/services/postUser.js b/src/services/postUser.js index 85c2207..d677719 100644 --- a/src/services/postUser.js +++ b/src/services/postUser.js @@ -16,14 +16,20 @@ export default async function postUser(reqDto) { const encryptedEmail = encryptData(email, EMAIL_SECRET); const emailHash = hashEmail(email); - // 비밀번호 해싱 - const pwHash = hashSync(reqDto.password, BCRYPT_ROUNDS); + // 로그인 타입에 따른 데이터 설정 + const isGoogleLogin = !reqDto.password; + + const pwHash = isGoogleLogin + ? null + : hashSync(reqDto.password, BCRYPT_ROUNDS); + const loginType = isGoogleLogin ? 1 : 0; // 0: 로컬 로그인, 1: 구글 로그인 // 테이블 INSERT const user = await User.create({ email: encryptedEmail, email_hash: Buffer.from(emailHash, 'hex'), pw_hash: pwHash, + login_type: loginType, is_admin: reqDto.is_admin, }).catch(handleSqlError);