|
10 | 10 | jobs: |
11 | 11 | deploy: |
12 | 12 | runs-on: ubuntu-latest |
| 13 | + environment: ${{ github.ref == 'refs/heads/main' && 'production' || 'alpha' }} |
| 14 | + |
13 | 15 | steps: |
14 | 16 | - name: Checkout |
15 | 17 | uses: actions/checkout@v4 |
16 | 18 |
|
17 | | - - name: Set Environment Variables |
| 19 | + - name: Set image tag and Spring profile |
18 | 20 | run: | |
19 | 21 | if [[ "${{ github.ref }}" == "refs/heads/main" ]]; then |
20 | | - echo "ENV_TYPE=PROD" >> $GITHUB_ENV |
21 | | - echo "DOCKERHUB_USERNAME=${{ secrets.PROD_DOCKERHUB_USERNAME }}" >> $GITHUB_ENV |
22 | | - echo "DOCKERHUB_TOKEN=${{ secrets.PROD_DOCKERHUB_TOKEN }}" >> $GITHUB_ENV |
23 | | - echo "EC2_KEY=${{ secrets.PROD_EC2_KEY }}" >> $GITHUB_ENV |
24 | | - echo "EC2_HOST=${{ secrets.PROD_EC2_HOST }}" >> $GITHUB_ENV |
25 | | - echo "EC2_USER=${{ secrets.PROD_EC2_USER }}" >> $GITHUB_ENV |
26 | | - echo "ENV_FILE_CONTENT=${{ secrets.PROD_AUTH_BE_ENV_FILE }}" >> $GITHUB_ENV |
27 | 22 | echo "IMAGE_TAG=latest" >> $GITHUB_ENV |
28 | 23 | echo "SPRING_PROFILE=prod" >> $GITHUB_ENV |
29 | 24 | else |
30 | | - echo "ENV_TYPE=ALPHA" >> $GITHUB_ENV |
31 | | - echo "DOCKERHUB_USERNAME=${{ secrets.ALPHA_DOCKERHUB_USERNAME }}" >> $GITHUB_ENV |
32 | | - echo "DOCKERHUB_TOKEN=${{ secrets.ALPHA_DOCKERHUB_TOKEN }}" >> $GITHUB_ENV |
33 | | - echo "EC2_KEY=${{ secrets.ALPHA_EC2_KEY }}" >> $GITHUB_ENV |
34 | | - echo "EC2_HOST=${{ secrets.ALPHA_EC2_HOST }}" >> $GITHUB_ENV |
35 | | - echo "EC2_USER=${{ secrets.ALPHA_EC2_USER }}" >> $GITHUB_ENV |
36 | | - echo "ENV_FILE_CONTENT=${{ secrets.ALPHA_AUTH_BE_ENV_FILE }}" >> $GITHUB_ENV |
37 | 25 | echo "IMAGE_TAG=alpha" >> $GITHUB_ENV |
38 | 26 | echo "SPRING_PROFILE=alpha" >> $GITHUB_ENV |
39 | 27 | fi |
40 | 28 |
|
41 | 29 | - name: Log in to Docker Hub |
42 | 30 | uses: docker/login-action@v3 |
43 | 31 | with: |
44 | | - username: ${{ env.DOCKERHUB_USERNAME }} |
45 | | - password: ${{ env.DOCKERHUB_TOKEN }} |
| 32 | + username: ${{ secrets.DOCKERHUB_USERNAME }} |
| 33 | + password: ${{ secrets.DOCKERHUB_TOKEN }} |
46 | 34 |
|
47 | 35 | - name: Build and push |
48 | 36 | uses: docker/build-push-action@v6 |
49 | 37 | with: |
50 | 38 | context: . |
51 | 39 | push: true |
52 | 40 | tags: | |
53 | | - ${{ env.DOCKERHUB_USERNAME }}/auth-server:${{ env.IMAGE_TAG }} |
54 | | - ${{ env.DOCKERHUB_USERNAME }}/auth-server:${{ github.sha }} |
| 41 | + ${{ secrets.DOCKERHUB_USERNAME }}/auth-server:${{ env.IMAGE_TAG }} |
| 42 | + ${{ secrets.DOCKERHUB_USERNAME }}/auth-server:${{ github.sha }} |
55 | 43 |
|
56 | 44 | - name: Setup SSH |
57 | 45 | run: | |
| 46 | + set -euo pipefail |
58 | 47 | mkdir -p ~/.ssh |
59 | | - echo "${{ env.EC2_KEY }}" | base64 --decode > ~/.ssh/ec2_key.pem |
| 48 | + printf '%s' "${{ secrets.EC2_KEY }}" > /tmp/ec2_key_src |
| 49 | + if [[ ! -s /tmp/ec2_key_src ]]; then |
| 50 | + echo "::error::EC2_KEY secret is empty" >&2 |
| 51 | + exit 1 |
| 52 | + fi |
| 53 | + if head -n 1 /tmp/ec2_key_src | grep -q '^[[:space:]]*-----BEGIN'; then |
| 54 | + cp /tmp/ec2_key_src ~/.ssh/ec2_key.pem |
| 55 | + else |
| 56 | + tr -d '\n\r \t' < /tmp/ec2_key_src | base64 --decode > ~/.ssh/ec2_key.pem || { |
| 57 | + echo "::error::EC2_KEY is not PEM and base64 decode failed" >&2 |
| 58 | + exit 1 |
| 59 | + } |
| 60 | + fi |
| 61 | + rm -f /tmp/ec2_key_src |
60 | 62 | chmod 600 ~/.ssh/ec2_key.pem |
61 | 63 |
|
62 | | - - name: Create env dir and Copy env file to EC2 |
| 64 | + - name: Create env file and copy to EC2 |
63 | 65 | run: | |
64 | | - echo "${{ env.ENV_FILE_CONTENT }}" > auth-be.env |
65 | | - ssh -o StrictHostKeyChecking=no -i ~/.ssh/ec2_key.pem ${{ env.EC2_USER }}@${{ env.EC2_HOST }} 'mkdir -p ~/env' |
66 | | - scp -o StrictHostKeyChecking=no -i ~/.ssh/ec2_key.pem auth-be.env ${{ env.EC2_USER }}@${{ env.EC2_HOST }}:~/env/auth-be.env |
| 66 | + printf '%s\n' "${{ secrets.AUTH_BE_ENV_FILE }}" > auth-be.env |
| 67 | + ssh -o StrictHostKeyChecking=no -i ~/.ssh/ec2_key.pem ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }} 'mkdir -p ~/env' |
| 68 | + scp -o StrictHostKeyChecking=no -i ~/.ssh/ec2_key.pem auth-be.env ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }}:~/env/auth-be.env |
67 | 69 |
|
68 | 70 | - name: Deploy to EC2 |
69 | 71 | run: | |
70 | | - ssh -o StrictHostKeyChecking=no -i ~/.ssh/ec2_key.pem ${{ env.EC2_USER }}@${{ env.EC2_HOST }} " |
| 72 | + ssh -o StrictHostKeyChecking=no -i ~/.ssh/ec2_key.pem ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }} " |
71 | 73 | set -e |
72 | | - echo '${{ env.DOCKERHUB_TOKEN }}' | docker login -u '${{ env.DOCKERHUB_USERNAME }}' --password-stdin |
73 | | - |
74 | | - docker pull ${{ env.DOCKERHUB_USERNAME }}/auth-server:${{ env.IMAGE_TAG }} |
75 | | - |
| 74 | + echo '${{ secrets.DOCKERHUB_TOKEN }}' | docker login -u '${{ secrets.DOCKERHUB_USERNAME }}' --password-stdin |
| 75 | +
|
| 76 | + docker pull ${{ secrets.DOCKERHUB_USERNAME }}/auth-server:${{ env.IMAGE_TAG }} |
| 77 | +
|
76 | 78 | docker rm -f auth-be || true |
77 | | - |
| 79 | +
|
78 | 80 | docker run -d \ |
79 | 81 | --name auth-be \ |
80 | 82 | --restart unless-stopped \ |
81 | 83 | --network app-network \ |
82 | 84 | --env-file ~/env/auth-be.env \ |
83 | 85 | -e SPRING_PROFILES_ACTIVE=${{ env.SPRING_PROFILE }} \ |
84 | | - ${{ env.DOCKERHUB_USERNAME }}/auth-server:${{ env.IMAGE_TAG }} |
85 | | - |
| 86 | + ${{ secrets.DOCKERHUB_USERNAME }}/auth-server:${{ env.IMAGE_TAG }} |
| 87 | +
|
86 | 88 | docker logout |
87 | 89 | " |
0 commit comments