1- # name: develop push Build and Deploy
2- #
3- # on:
4- # push:
5- # branches: [ "develop" ]
6- #
7- # env:
8- # DOCKERHUB_USERNAME: fittheman
9- # DOCKERHUB_IMAGE_NAME: fittheman-server
10- #
11- # jobs:
12- # build-deploy:
13- # runs-on: ubuntu-latest
14- # environment: DEV
15- #
16- # steps:
17- # # 체크아웃
18- # - name: Checkout
19- # uses: actions/checkout@v4
20- #
21- # # JDK 17 세팅
22- # - name: Set up JDK 17
23- # uses: actions/setup-java@v4
24- # with:
25- # java-version: '17'
26- # distribution: 'temurin'
27- #
28- # # 테스트 환경에서 필요한 컨테이너 실행 (redis, postgres)
29- # - name: Run Containers
30- # run: docker compose -f ./docker-compose-test.yml up -d
31- #
32- # # 테스트 환경에서 필요한 스키마, 데이터 등록
33- # - name: Apply Schema and Data
34- # env:
35- # TEST_POSTGRES_CONTAINER_NAME: "${{ github.event.repository.name }}-postgres-1"
36- # TEST_POSTGRES_USER: test
37- # TEST_POSTGRES_DB: ftm_test_db
38- # run: |
39- # echo "⏳ Waiting for postgres to be ready..."
40- # until docker exec -i $TEST_POSTGRES_CONTAINER_NAME pg_isready -U $TEST_POSTGRES_USER -d $TEST_POSTGRES_DB; do
41- # echo "postgres is not ready yet. Retrying in 3 seconds..."
42- # sleep 3
43- # done
44- # echo "✅ postgres is ready!"
45- #
46- # echo "${{ secrets.SCHEMA_SQL }}" | docker exec -i $TEST_POSTGRES_CONTAINER_NAME psql -U $TEST_POSTGRES_USER -d $TEST_POSTGRES_DB
47- # echo "${{ secrets.DATA_SQL }}" | docker exec -i $TEST_POSTGRES_CONTAINER_NAME psql -U $TEST_POSTGRES_USER -d $TEST_POSTGRES_DB
48- #
49- # # Gradlew 실행 권한 허용
50- # - name: Grant Execute Permission for Gradlew
51- # run: chmod +x ./gradlew
52- #
53- # # .env 파일 생성
54- # - name: Load secrets into .env file
55- # run: |
56- # echo "${{ secrets.ENV }}" >> .env
57- #
58- # # Swagger API 문서화 task 실행
59- # - name: Apply Swagger API Document Task
60- # run: ./gradlew copyOasToSwagger
61- #
62- # # Rest Docs API 문서화 task 실행
63- # - name: Apply Rest Docs API Document Task
64- # run: ./gradlew copyDocument
65- #
66- # # Gradle 빌드
67- # - name: Build with Gradle
68- # id: gradle
69- # uses: gradle/gradle-build-action@v2
70- # with:
71- # arguments: |
72- # bootJar
73- # --scan
74- # cache-read-only: ${{ github.ref != 'refs/heads/main' && github.ref != 'refs/heads/develop' }}
75- #
76- # # Dockerhub 로그인
77- # - name: Login to Dockerhub
78- # uses: docker/login-action@v3
79- # with:
80- # username: ${{ env.DOCKERHUB_USERNAME }}
81- # password: ${{ secrets.DOCKERHUB_ACCESS_TOKEN }}
82- #
83- # # Docker 메타데이터
84- # - name: Extract Docker metadata
85- # id: metadata
86- # uses: docker/metadata-action@v5.5.0
87- # env:
88- # DOCKERHUB_IMAGE_FULL_NAME: ${{ env.DOCKERHUB_USERNAME }}/${{ env.DOCKERHUB_IMAGE_NAME }}
89- # with:
90- # images: ${{ env.DOCKERHUB_IMAGE_FULL_NAME }}
91- # tags: |
92- # type=sha,prefix=
93- #
94- # # Docker 이미지 빌드, 도커허브 푸시
95- # - name: Build and Push Docker image
96- # uses: docker/build-push-action@v3
97- # with:
98- # context: .
99- # push: true
100- # tags: ${{ steps.metadata.outputs.tags }} # 추출된 도커 메타데이터 tags -> "${DOCKERHUB_USERNAME}/${DOCKERHUB_IMAGE_NAME}:{TAG}
101- #
102- # # EC2 서버로 docker-compose.yml 파일 복사
103- # - name: Copy docker-compose file to EC2
104- # uses: burnett01/rsync-deployments@7.0.1
105- # with:
106- # switches: -avzr --delete
107- # path: docker-compose.yml
108- # remote_host: ${{ secrets.EC2_HOST }}
109- # remote_user: ${{ secrets.EC2_USER }}
110- # remote_key: ${{ secrets.SSH_PRIVATE_KEY }}
111- # remote_path: /home/ubuntu/
112- #
113- # # EC2 서버로 nginx 파일 복사
114- # # docker-compose.yml 에서 nginx 컨테이너 실행 시 파일을 마운트하기 위함
115- # - name: Copy default.conf file to EC2
116- # uses: burnett01/rsync-deployments@7.0.1
117- # with:
118- # switches: -avzr --delete
119- # path: ./nginx
120- # remote_host: ${{ secrets.EC2_HOST }}
121- # remote_user: ${{ secrets.EC2_USER }}
122- # remote_key: ${{ secrets.SSH_PRIVATE_KEY }}
123- # remote_path: /home/ubuntu
124- #
125- # # EC2 배포
126- # - name: Deploy to EC2 Server
127- # uses: appleboy/ssh-action@v1.0.3
128- # env:
129- # IMAGE_FULL_PATH: ${{ steps.metadata.outputs.tags }}
130- # DOCKERHUB_IMAGE_NAME: ${{ env.DOCKERHUB_IMAGE_NAME }}
131- # with:
132- # host: ${{ secrets.EC2_HOST }}
133- # username: ${{ secrets.EC2_USER }}
134- # key: ${{ secrets.SSH_PRIVATE_KEY }}
135- # envs: IMAGE_FULL_PATH, DOCKERHUB_IMAGE_NAME # docker-compose.yml 에서 사용할 환경 변수
136- # debug: true
137- # script: |
138- # echo "${{ secrets.DOCKERHUB_ACCESS_TOKEN }}" | docker login -u "${{ secrets.DOCKERHUB_USERNAME }}" --password-stdin
139- # docker compose up -d
140- # docker image prune -a -f
1+ name : develop push Build and Deploy
2+
3+ on :
4+ push :
5+ branches : [ "develop" ]
6+
7+ env :
8+ DOCKERHUB_USERNAME : fittheman
9+ DOCKERHUB_IMAGE_NAME : fittheman-server
10+
11+ jobs :
12+ build-deploy :
13+ runs-on : ubuntu-latest
14+ environment : DEV
15+
16+ steps :
17+ # 체크아웃
18+ - name : Checkout
19+ uses : actions/checkout@v4
20+ with :
21+ ref : ${{ inputs.ref }}
22+
23+ # JDK 17 세팅
24+ - name : Set up JDK 17
25+ uses : actions/setup-java@v4
26+ with :
27+ java-version : ' 17'
28+ distribution : ' temurin'
29+
30+ # 테스트 환경에서 필요한 컨테이너 실행 (redis, postgres)
31+ - name : Run Containers
32+ run : docker compose -f ./docker-compose-test.yml up -d
33+
34+ # 테스트 환경에서 필요한 스키마, 데이터 등록
35+ - name : Apply Schema and Data
36+ env :
37+ TEST_POSTGRES_CONTAINER_NAME : " ${{ github.event.repository.name }}-postgres-1"
38+ TEST_POSTGRES_USER : test
39+ TEST_POSTGRES_DB : ftm_test_db
40+ run : |
41+ echo "⏳ Waiting for postgres to be ready..."
42+ until docker exec -i $TEST_POSTGRES_CONTAINER_NAME pg_isready -U $TEST_POSTGRES_USER -d $TEST_POSTGRES_DB; do
43+ echo "postgres is not ready yet. Retrying in 3 seconds..."
44+ sleep 3
45+ done
46+ echo "✅ postgres is ready!"
47+
48+ echo "${{ secrets.SCHEMA_SQL }}" | docker exec -i $TEST_POSTGRES_CONTAINER_NAME psql -U $TEST_POSTGRES_USER -d $TEST_POSTGRES_DB
49+ echo "${{ secrets.DATA_SQL }}" | docker exec -i $TEST_POSTGRES_CONTAINER_NAME psql -U $TEST_POSTGRES_USER -d $TEST_POSTGRES_DB
50+
51+ # Gradlew 실행 권한 허용
52+ - name : Grant Execute Permission for Gradlew
53+ run : chmod +x ./gradlew
54+
55+ # .env 파일 생성
56+ - name : Load secrets into .env file
57+ run : |
58+ echo "${{ secrets.ENV }}" >> .env
59+
60+ # Swagger API 문서화 task 실행
61+ - name : Apply Swagger API Document Task
62+ run : ./gradlew copyOasToSwagger
63+
64+ # Rest Docs API 문서화 task 실행
65+ - name : Apply Rest Docs API Document Task
66+ run : ./gradlew copyDocument
67+
68+ # Gradle 빌드
69+ - name : Build with Gradle
70+ id : gradle
71+ uses : gradle/gradle-build-action@v2
72+ with :
73+ arguments : |
74+ bootJar
75+ --scan
76+ cache-read-only : ${{ github.ref != 'refs/heads/main' && github.ref != 'refs/heads/develop' }}
77+
78+ # Dockerhub 로그인
79+ - name : Login to Dockerhub
80+ uses : docker/login-action@v3
81+ with :
82+ username : ${{ env.DOCKERHUB_USERNAME }}
83+ password : ${{ secrets.DOCKERHUB_ACCESS_TOKEN }}
84+
85+ # Docker 메타데이터
86+ - name : Extract Docker metadata
87+ id : metadata
88+ uses : docker/metadata-action@v5.5.0
89+ env :
90+ DOCKERHUB_IMAGE_FULL_NAME : ${{ env.DOCKERHUB_USERNAME }}/${{ env.DOCKERHUB_IMAGE_NAME }}
91+ with :
92+ images : ${{ env.DOCKERHUB_IMAGE_FULL_NAME }}
93+ tags : |
94+ type=sha,prefix=
95+
96+ # Docker 이미지 빌드, 도커허브 푸시
97+ - name : Build and Push Docker image
98+ uses : docker/build-push-action@v3
99+ with :
100+ context : .
101+ push : true
102+ tags : ${{ steps.metadata.outputs.tags }} # 추출된 도커 메타데이터 tags -> "${DOCKERHUB_USERNAME}/${DOCKERHUB_IMAGE_NAME}:{TAG}
103+
104+ # GCE 배포
105+ - name : Deploy to GCE Server
106+ uses : appleboy/ssh-action@v1.0.3
107+ env :
108+ IMAGE_FULL_PATH : ${{ steps.metadata.outputs.tags }}
109+ DOCKERHUB_IMAGE_NAME : ${{ env.DOCKERHUB_IMAGE_NAME }}
110+ with :
111+ host : ${{ secrets.GCE_HOST }}
112+ username : ${{ secrets.GCE_USER }}
113+ key : ${{ secrets.GCE_SSH_PRIVATE_KEY }}
114+ envs : IMAGE_FULL_PATH, DOCKERHUB_IMAGE_NAME # docker-compose.yml 에서 사용할 환경 변수
115+ debug : true
116+ script : |
117+ echo "${{ secrets.DOCKERHUB_ACCESS_TOKEN }}" | docker login -u "${{ secrets.DOCKERHUB_USERNAME }}" --password-stdin
118+ docker compose up -d
119+ docker image prune -a -f
0 commit comments