-
Notifications
You must be signed in to change notification settings - Fork 1
[#9] CICD: Gradle 빌드/Docker 배포 자동화를 위한 workflow.yml 추가 #14
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,101 @@ | ||||||||||||||||||||||||||||||||||
| name: TripTalk CI/CD with Gradle, Test, and Docker | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| on: | ||||||||||||||||||||||||||||||||||
| workflow_dispatch: | ||||||||||||||||||||||||||||||||||
| push: | ||||||||||||||||||||||||||||||||||
| branches: [ "develop" ] | ||||||||||||||||||||||||||||||||||
| pull_request: | ||||||||||||||||||||||||||||||||||
| branches: [ "develop" ] | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| permissions: | ||||||||||||||||||||||||||||||||||
| contents: read | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| jobs: | ||||||||||||||||||||||||||||||||||
| CI-CD: | ||||||||||||||||||||||||||||||||||
| runs-on: ubuntu-latest | ||||||||||||||||||||||||||||||||||
| permissions: | ||||||||||||||||||||||||||||||||||
| contents: read | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| steps: | ||||||||||||||||||||||||||||||||||
| # 1. 코드 체크아웃 | ||||||||||||||||||||||||||||||||||
| - uses: actions/checkout@v4 | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| # 2. JDK 21 설정 | ||||||||||||||||||||||||||||||||||
| - name: Set up JDK 21 | ||||||||||||||||||||||||||||||||||
| uses: actions/setup-java@v4 | ||||||||||||||||||||||||||||||||||
| with: | ||||||||||||||||||||||||||||||||||
| java-version: '21' | ||||||||||||||||||||||||||||||||||
| distribution: 'temurin' | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| # 3. Gradle 캐시 | ||||||||||||||||||||||||||||||||||
| - name: Setup Gradle | ||||||||||||||||||||||||||||||||||
| uses: gradle/actions/setup-gradle@v3 | ||||||||||||||||||||||||||||||||||
| with: | ||||||||||||||||||||||||||||||||||
| path: | | ||||||||||||||||||||||||||||||||||
| ~/.gradle/caches | ||||||||||||||||||||||||||||||||||
| ~/.gradle/wrapper | ||||||||||||||||||||||||||||||||||
| key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} | ||||||||||||||||||||||||||||||||||
| restore-keys: | | ||||||||||||||||||||||||||||||||||
| ${{ runner.os }}-gradle- | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| # 4. application.yml 생성 | ||||||||||||||||||||||||||||||||||
| - name: Make application.yml from Secret | ||||||||||||||||||||||||||||||||||
| run: | | ||||||||||||||||||||||||||||||||||
| mkdir -p ./src/main/resources | ||||||||||||||||||||||||||||||||||
| echo "${{ secrets.APPLICATION_DEV_YML_BASE64 }}" | base64 --decode > ./src/main/resources/application.yml | ||||||||||||||||||||||||||||||||||
| echo "=== [DEBUG] application.yml ===" | ||||||||||||||||||||||||||||||||||
| cat ./src/main/resources/application.yml | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| # 5. gradlew 권한 부여 | ||||||||||||||||||||||||||||||||||
| - name: Grant Execute Permission For Gradlew | ||||||||||||||||||||||||||||||||||
| run: chmod +x gradlew | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| # 6. Gradle build | ||||||||||||||||||||||||||||||||||
| - name: Build Gradle (without test) | ||||||||||||||||||||||||||||||||||
| run: ./gradlew bootJar -x test | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| # 7. Docker Build & Push | ||||||||||||||||||||||||||||||||||
| - name: Docker Build & Push | ||||||||||||||||||||||||||||||||||
| run: | | ||||||||||||||||||||||||||||||||||
| docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }} | ||||||||||||||||||||||||||||||||||
| docker build -t ${{ secrets.DOCKER_USERNAME }}/triptalk-spring:latest . | ||||||||||||||||||||||||||||||||||
| docker push ${{ secrets.DOCKER_USERNAME }}/triptalk-spring:latest | ||||||||||||||||||||||||||||||||||
|
Comment on lines
+58
to
+62
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Docker 로그인 시 보안 모범 사례를 따르세요 현재 방식은 # 7. Docker Build & Push
- - name: Docker Build & Push
- run: |
- docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
- docker build -t ${{ secrets.DOCKER_USERNAME }}/triptalk-spring:latest .
- docker push ${{ secrets.DOCKER_USERNAME }}/triptalk-spring:latest
+ - name: Log in to Docker Hub
+ uses: docker/login-action@v3
+ with:
+ username: ${{ secrets.DOCKER_USERNAME }}
+ password: ${{ secrets.DOCKER_PASSWORD }}
+
+ - name: Build and push Docker image
+ uses: docker/build-push-action@v5
+ with:
+ push: true
+ tags: ${{ secrets.DOCKER_USERNAME }}/triptalk-spring:latest📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| # 8. 서버 배포 (Dev 서버) | ||||||||||||||||||||||||||||||||||
| - name: Deploy to Dev | ||||||||||||||||||||||||||||||||||
| uses: appleboy/ssh-action@master | ||||||||||||||||||||||||||||||||||
| if: contains(github.ref,'develop') | ||||||||||||||||||||||||||||||||||
| with: | ||||||||||||||||||||||||||||||||||
| key: ${{ secrets.PRIVATE_KEY }} | ||||||||||||||||||||||||||||||||||
| host: ${{ secrets.HOST }} | ||||||||||||||||||||||||||||||||||
| username: ${{ secrets.USERNAME }} | ||||||||||||||||||||||||||||||||||
| port: 22 | ||||||||||||||||||||||||||||||||||
| script: | | ||||||||||||||||||||||||||||||||||
| cd ~/app | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| # 기존 컨테이너 정리 | ||||||||||||||||||||||||||||||||||
| docker-compose -f docker-compose.yml down || true | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| # 최신 이미지 pull | ||||||||||||||||||||||||||||||||||
| docker pull ${{ secrets.DOCKER_USERNAME }}/triptalk-spring:latest | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| # 컨테이너 재시작 | ||||||||||||||||||||||||||||||||||
| docker-compose -f docker-compose.yml up -d --remove-orphans | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| # 사용하지 않는 이미지 삭제 | ||||||||||||||||||||||||||||||||||
| docker image prune -f | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| # 9. 현재 시간 출력 | ||||||||||||||||||||||||||||||||||
| current-time: | ||||||||||||||||||||||||||||||||||
| needs: CI-CD | ||||||||||||||||||||||||||||||||||
| runs-on: ubuntu-latest | ||||||||||||||||||||||||||||||||||
| steps: | ||||||||||||||||||||||||||||||||||
| - name: Get Current Time | ||||||||||||||||||||||||||||||||||
| uses: 1466587594/get-current-time@v2 | ||||||||||||||||||||||||||||||||||
| id: current-time | ||||||||||||||||||||||||||||||||||
| with: | ||||||||||||||||||||||||||||||||||
| format: YYYY-MM-DDTHH:mm:ss | ||||||||||||||||||||||||||||||||||
| utcOffset: "+09:00" | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| - name: Print Current Time | ||||||||||||||||||||||||||||||||||
| run: echo "Current Time=${{steps.current-time.outputs.formattedTime}}" | ||||||||||||||||||||||||||||||||||
|
Comment on lines
+88
to
+101
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion | 🟠 Major 불필요한 작업을 제거하세요
- name: Print Current Time
run: echo "Current Time=${{steps.current-time.outputs.formattedTime}}"
-
- # 9. 현재 시간 출력
- current-time:
- needs: CI-CD
- runs-on: ubuntu-latest
- steps:
- - name: Get Current Time
- uses: 1466587594/get-current-time@v2
- id: current-time
- with:
- format: YYYY-MM-DDTHH:mm:ss
- utcOffset: "+09:00"
-
- - name: Print Current Time
- run: echo "Current Time=${{steps.current-time.outputs.formattedTime}}"📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
설정 파일의 전체 내용을 워크플로우 로그에 출력하면 데이터베이스 비밀번호, API 키, 토큰 등 민감한 정보가 노출됩니다. GitHub 로그는 기본적으로 공개되므로 보안 위험이 매우 높습니다.
디버그 출력(46-47줄)을 제거해야 합니다.
- name: Make application.yml from Secret run: | mkdir -p ./src/main/resources echo "${{ secrets.APPLICATION_DEV_YML_BASE64 }}" | base64 --decode > ./src/main/resources/application.yml - echo "=== [DEBUG] application.yml ===" - cat ./src/main/resources/application.yml📝 Committable suggestion
🤖 Prompt for AI Agents