@@ -113,83 +113,120 @@ jobs:
113113 - name : Checkout repository
114114 uses : actions/checkout@v4
115115
116- # 2. SSH Agent 액션 추가
117- - name : Set up SSH agent
118- uses : webfactory/ssh-agent@v0.9.0
119- with :
120- ssh-private-key : |
121- ${{ github.ref == 'refs/heads/dev' && secrets.DEV_EC2_SSH_KEY || secrets.EC2_SSH_KEY }}
122-
123- # 3. 환경에 따라 SSH 연결 정보 및 경로 설정
124- - name : Set Deploy Environment
125- id : set-env
116+ # 2. SSH 접속에 필요한 환경 변수 설정
117+ - name : Set Environment Variables
118+ id : set-env-vars
126119 shell : bash
127120 run : |
128121 if [[ "${{ github.ref }}" == "refs/heads/dev" ]]; then
129122 echo "HOST=${{ secrets.DEV_EC2_SSH_HOST }}" >> $GITHUB_ENV
130123 echo "USERNAME=${{ secrets.DEV_EC2_SSH_USERNAME }}" >> $GITHUB_ENV
131- {
132- echo 'SSH_KEY<<EOF'
133- echo '${{ secrets.DEV_EC2_SSH_KEY }}'
134- echo 'EOF'
135- } >> "$GITHUB_ENV"
136124 echo "DEPLOY_DIR=/home/ubuntu/pinback-dev" >> $GITHUB_ENV
125+ echo "ENV_SECRET_NAME=DEV_ENV_CONTENT" >> $GITHUB_ENV
137126 elif [[ "${{ github.ref }}" == "refs/heads/main" ]]; then
138127 echo "HOST=${{ secrets.EC2_SSH_HOST }}" >> $GITHUB_ENV
139128 echo "USERNAME=${{ secrets.EC2_SSH_USERNAME }}" >> $GITHUB_ENV
140- {
141- echo 'SSH_KEY<<EOF'
142- echo '${{ secrets.EC2_SSH_KEY }}'
143- echo 'EOF'
144- } >> "$GITHUB_ENV"
145129 echo "DEPLOY_DIR=/home/ubuntu/pinback" >> $GITHUB_ENV
130+ echo "ENV_SECRET_NAME=PROD_ENV_CONTENT" >> $GITHUB_ENV
146131 fi
147132
148- # 비대화형 접속 위해 known_hosts 등록
133+ # 3. known_hosts 등록
149134 - name : Add host to known_hosts
150135 run : |
151136 mkdir -p ~/.ssh
152137 ssh-keyscan -p 22 ${{ env.HOST }} >> ~/.ssh/known_hosts
153138
154- # 4. docker-compose.yml 파일을 EC2로 복사
139+ # 4. 원격 서버 초기화
140+ - name : Initialize remote server (Force Init)
141+ uses : appleboy/ssh-action@master
142+ with :
143+ host : ${{ env.HOST }}
144+ username : ${{ env.USERNAME }}
145+ key : ${{ github.ref == 'refs/heads/dev' && secrets.DEV_EC2_SSH_KEY || secrets.EC2_SSH_KEY }}
146+ debug : true
147+ script : |
148+ # 1. 배포 디렉토리 생성
149+ mkdir -p ${{ env.DEPLOY_DIR }}
150+
151+ # 2. 디렉토리 소유권 및 권한 강제 변경
152+ sudo chown -R ${{ env.USERNAME }}:${{ env.USERNAME }} ${{ env.DEPLOY_DIR }}
153+
154+ # 3. 기존 파일 강제 삭제
155+ sudo rm -f ${{ env.DEPLOY_DIR }}/docker-compose.yml || true
156+ sudo rm -f ${{ env.DEPLOY_DIR }}/pinback.env || true
157+
158+ # 5. docker-compose.yml 파일 복사
155159 - name : Copy docker-compose.yml to EC2
156160 uses : appleboy/scp-action@master
157161 with :
158162 host : ${{ env.HOST }}
159163 username : ${{ env.USERNAME }}
160- key : ${{ env.SSH_KEY }}
164+ key : ${{ github.ref == 'refs/heads/dev' && secrets.DEV_EC2_SSH_KEY || secrets.EC2_SSH_KEY }}
161165 source : " docker-compose.yml"
162- target : " ${{ env.DEPLOY_DIR }}"
166+ target : ${{ env.DEPLOY_DIR }}
163167 debug : true
168+ overwrite : true
164169
165- # 5. 배포 (docker composee(v2))
170+ # 6. pinback.env 파일을 Runner에 임시 생성 후 복사
171+ - name : Create & Copy pinback.env to EC2
172+ run : |
173+ # 환경 변수 이름으로 Secret 값을 가져와 파일 생성
174+
175+ if [[ "${{ env.ENV_SECRET_NAME }}" == "DEV_ENV_CONTENT" ]]; then
176+ echo "${{ secrets.DEV_ENV_CONTENT }}" > pinback.env
177+ elif [[ "${{ env.ENV_SECRET_NAME }}" == "PROD_ENV_CONTENT" ]]; then
178+ echo "${{ secrets.PROD_ENV_CONTENT }}" > pinback.env
179+ fi
180+
181+ # 6 - 1
182+ - name : Copy pinback.env file
183+ uses : appleboy/scp-action@master
184+ with :
185+ host : ${{ env.HOST }}
186+ username : ${{ env.USERNAME }}
187+ key : ${{ github.ref == 'refs/heads/dev' && secrets.DEV_EC2_SSH_KEY || secrets.EC2_SSH_KEY }}
188+ source : " pinback.env"
189+ target : ${{ env.DEPLOY_DIR }}
190+ debug : true
191+ overwrite : true
192+
193+ # 7. 배포 (docker composee(v2))
166194 - name : Deploy with Docker Compose to EC2
167195 uses : appleboy/ssh-action@master
168196 with :
169197 host : ${{ env.HOST }}
170198 username : ${{ env.USERNAME }}
171- key : ${{ env.SSH_KEY }}
199+ key : ${{ github.ref == 'refs/heads/dev' && secrets.DEV_EC2_SSH_KEY || secrets.EC2_SSH_KEY }}
172200 debug : true
173201 script : |
202+ # DEPLOY_DIR 변수를 사용하기 위해 Bash 변수로 재선언
203+ DEPLOY_DIR=${{ env.DEPLOY_DIR }}
204+
174205 # 1) 배포 디렉터리로 이동
175- mkdir -p "${{ env.DEPLOY_DIR }}" # 디렉토리가 없으면 생성 (최초 배포 시)
176- cd "${{ env.DEPLOY_DIR }}"
206+ cd "$DEPLOY_DIR"
177207
178208 # 2) EC2에 미리 만들어둔 pinback.env 파일의 환경 변수 로드
179- if [ ! -f "${{ env. DEPLOY_DIR }} /pinback.env" ]; then
180- echo "ERROR: .env file not found at ${{ env. DEPLOY_DIR }} /pinback.env"
209+ if [ ! -f "$DEPLOY_DIR/pinback.env" ]; then
210+ echo "ERROR: .env file not found at $DEPLOY_DIR/pinback.env"
181211 exit 1
182212 fi
183- export $(cat "${{ env.DEPLOY_DIR }}/pinback.env" | xargs) && \
213+ while IFS='=' read -r name value; do
214+ # 주석 및 빈 줄 무시
215+ if [[ "$name" =~ ^# ]] || [ -z "$name" ]; then
216+ continue
217+ fi
218+ # 공백 제거 및 export
219+ export "$name"="$(echo "$value" | xargs)"
220+ done < "$DEPLOY_DIR/pinback.env"
184221
185- # 3) 기존 Docker Compose 스택 중지 및 삭제 (있다면)
186- docker compose -f "${{ env. DEPLOY_DIR }} /docker-compose.yml" down || true && \
222+ # 3) 기존 Docker Compose 스택 중지 및 삭제
223+ docker- compose --file "$DEPLOY_DIR/docker-compose.yml" down || true && \
187224
188225 # Docker Hub에서 최신 이미지 pull
189- docker compose -f "${{ env. DEPLOY_DIR }} /docker-compose.yml" pull && \
226+ docker- compose --file "$DEPLOY_DIR/docker-compose.yml" pull && \
190227
191228 # 5) Docker Compose로 서비스 시작
192- docker compose -f "${{ env. DEPLOY_DIR }} /docker-compose.yml" up -d --remove-orphans && \
229+ docker- compose --file "$DEPLOY_DIR/docker-compose.yml" up -d --remove-orphans && \
193230
194231 # 6) 사용하지 않는 Docker 이미지 정리
195232 docker image prune -f
0 commit comments