-
Notifications
You must be signed in to change notification settings - Fork 0
115 lines (90 loc) · 3.99 KB
/
Copy pathpython-app.yml
File metadata and controls
115 lines (90 loc) · 3.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
name: Deploy to GCP
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up GCP SSH key and known hosts
run: |
mkdir -p ~/.ssh/
echo "${{ secrets.GCP_SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa
echo "${{ secrets.GCP_SSH_PUBLIC_KEY }}" > ~/.ssh/id_rsa.pub
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
echo "${{ secrets.GCP_HOST_SERVER }} $(ssh-keyscan ${{ secrets.GCP_HOST_SERVER }} 2>/dev/null)" >> ~/.ssh/known_hosts
- name: Copy source code to GCP
run: |
scp -r ./* ${{ secrets.GCP_HOST_NAME }}@${{ secrets.GCP_HOST_SERVER }}:/home/${{ secrets.GCP_HOST_NAME }}/app/
- name: Deploy to GCP
env:
GCP_HOST_SERVER: ${{ secrets.GCP_HOST_SERVER }}
GCP_HOST_NAME: ${{ secrets.GCP_HOST_NAME }}
ENV_FILE_CONTENT: ${{ secrets.ENV_FILE }}
run: |
ssh -o StrictHostKeyChecking=no ${{ secrets.GCP_HOST_NAME }}@${{ secrets.GCP_HOST_SERVER }} << EOF
set -e
echo "Changing to app directory..."
cd /home/${{ secrets.GCP_HOST_NAME }}/app
echo "Creating .env file..."
echo "$ENV_FILE_CONTENT" > .env
chmod 600 .env
echo "Updating Python..."
sudo apt-get update
sudo apt-get install -y python3-pip python3-venv
echo "Upgrading pip..."
python3 -m pip install --upgrade pip
echo "Installing Poetry..."
curl -sSL https://install.python-poetry.org | python3 -
export PATH="/home/${{ secrets.GCP_HOST_NAME }}/.local/bin:$PATH"
echo "Upgrading Poetry..."
poetry self update
echo "Installing platformdirs..."
pip install platformdirs
echo "Configuring Poetry..."
poetry config virtualenvs.create true
poetry config virtualenvs.in-project true
echo "Poetry version:"
poetry --version
echo "Removing existing virtual environment..."
rm -rf .venv
echo "Creating new virtual environment..."
python3 -m venv .venv
echo "Activating virtual environment..."
source .venv/bin/activate
echo "Updating poetry lock file..."
poetry lock --no-update
echo "Installing dependencies..."
poetry install --no-interaction --no-root
echo "Checking virtual environment path:"
poetry env info --path
echo "Listing installed packages:"
poetry show
echo "Running database migrations..."
poetry run alembic upgrade head
echo "Checking for existing process on port 8000..."
existing_pid=\$(lsof -ti:8000)
if [ ! -z "\$existing_pid" ]; then
echo "Killing existing process on port 8000 (PID: \$existing_pid)"
kill -9 \$existing_pid
sleep 2
fi
echo "Starting application in background..."
nohup poetry run uvicorn main:app --host 0.0.0.0 --port 8000 --reload > app.log 2>&1 &
echo "Waiting for application to start..."
sleep 5
echo "Checking if application is running..."
if pgrep -f "uvicorn main:app" > /dev/null; then
echo "Application is running."
echo "Recent log entries:"
tail -n 5 app.log
else
echo "Application failed to start."
echo "Log contents:"
cat app.log
fi
echo "Deployment completed successfully."
EOF