-
Notifications
You must be signed in to change notification settings - Fork 35
154 lines (140 loc) · 7.12 KB
/
dev.yml
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# Name of the workflow
name: DEV | Deploy AugmentOS Cloud 🚀☁️
# Trigger on pushes to dev branch
on:
push:
branches: [ "dev" ]
# Optionally, filter paths if you only want to deploy on changes to augmentos_cloud
paths:
- 'augmentos_cloud/**'
# We use two jobs: build and deploy, for modularity and future scalability
jobs:
build_and_test:
name: Build & Test
runs-on: ubuntu-latest
env:
# (Optional) Specify Node environment, could also set BUN_ENV if needed.
NODE_ENV: development
# If Bun version is to be pinned, we can specify it here.
BUN_VERSION: # e.g. "1.2.0" or leave blank for latest
steps:
# 1. Checkout the repository
- name: Checkout code
uses: actions/checkout@v4
with:
# Fetch only the last commit for efficiency
fetch-depth: 1
# 2. Set up Bun runtime on the CI runner
- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: ${{ env.BUN_VERSION || 'latest' }}
# ^ This installs Bun on the runner, allowing us to use the `bun` command​:contentReference[oaicite:15]{index=15}.
# 3. Restore cached dependencies to speed up build if possible
- name: Cache Bun dependencies
uses: actions/cache@v4
with:
# Path to Bun's global package cache on the runner
path: ~/.bun/install/cache
# Key includes OS and lockfile hash. If bun.lockb (lockfile) hasn't changed, cache hits.
key: ${{ runner.os }}-bun-${{ hashFiles('augmentos_cloud/bun.lockb') }}
# In case of partial match, allow restore with just OS identifier (fallback).
restore-keys: |
${{ runner.os }}-bun-
# ^ Uses GitHub cache to store Bun's package cache for faster installs​:contentReference[oaicite:16]{index=16}.
# 4. Install project dependencies using Bun
- name: Install Dependencies
working-directory: augmentos_cloud
run: bun install
# ^ Installs NPM packages. Bun uses its lockfile to ensure deterministic installs.
# If cache was restored, this will be fast as packages are already downloaded.
# 5. Run linter to ensure code quality
# - name: Lint code
# working-directory: augmentos_cloud
# run: bun run lint
# ^ Runs the lint script (assumes package.json has a "lint" script or use bunx directly for ESLint).
# Linting is done before tests to fail fast on syntax/style issues​:contentReference[oaicite:17]{index=17}.
# 6. Run tests to verify functionality
# - name: Run tests
# working-directory: augmentos_cloud
# run: bun run test
# ^ Executes the test suite (e.g., via Jest, Bun's built-in test runner, or another framework).
# If any tests fail, the job (and workflow) will fail, preventing deployment.
# 7. (Optional) Build step for production
# - name: Build project
# working-directory: augmentos_cloud
# run: bun run dev
# ^ If the server requires a build (e.g., TypeScript compilation or bundling), do it here.
# If not needed, this step can be removed or left as a no-op.
# (Optional) You could add a step to upload build artifacts if you plan to use them in deploy job.
# - name: Upload artifact
# uses: actions/upload-artifact@v3
# with:
# name: augmentos_build
# path: augmentos_cloud/**
deploy:
name: Deploy to Azure VM
needs: build_and_test # Only run if build_and_test job succeeded
runs-on: ubuntu-latest
# We don't set env here to avoid exposing secrets via env. We'll pass secrets directly.
steps:
# 1. (Optional) Checkout code again, if we need the files in this job
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 1
# We could also use the artifact from previous job instead of checking out again.
# In a monorepo, checkout ensures we have the latest from main for this job.
# 2. Copy files to Azure VM via SCP (Secure Copy over SSH)
- name: Copy files to VM
uses: appleboy/[email protected]
with:
host: ${{ secrets.AZURE_HOST }} # Azure VM IP or hostname
username: ${{ secrets.AZURE_USERNAME }} # SSH username on Azure VM
key: ${{ secrets.AZURE_DEV_RSA_KEY}} # Private SSH key for the VM (from secrets)
port: 22 # SSH port (default 22)
source: "augmentos_cloud/*" # What to copy (all files in server folder)
target: "~/augmentos_cloud/" # Where to copy on the VM (adjust path as needed)
rm: "true"
# ^ This uses a community action to securely copy the latest build files to the VM​:contentReference[oaicite:18]{index=18}.
# It removes existing files in target (rm: true) to ensure old files are cleaned up.
# Ensure the target directory exists on the VM. You might want to exclude certain files (like .env).
# 3. Run remote commands on the VM via SSH
- name: Install and Restart Server on VM
uses: appleboy/[email protected]
with:
host: ${{ secrets.AZURE_HOST }}
username: ${{ secrets.AZURE_USERNAME }}
key: ${{ secrets.AZURE_DEV_RSA_KEY }}
script: |
set -e # stop on error
cd ~/augmentos_cloud/
# Install production dependencies on VM (if needed, e.g., in case node_modules was not copied)
bun install --production
# (If using a package manager other than bun for install on VM, adjust accordingly, e.g., npm ci --only=production)
# Restart the Bun server process
# If managed by PM2:
bun run dev
# pm2 restart augmentos-cloud || pm2 start index.js --name augmentos-cloud
# If managed by systemd:
# sudo systemctl restart augmentos.service
# If no manager (not recommended for prod), run in background:
# pkill -f \"bun run start\" || true # ignore if not running
# nohup bun run start &>/dev/null &
# ^ Logs into the VM via SSH and runs the commands​:contentReference[oaicite:19]{index=19}:
# - Navigates to the app directory on the VM.
# - Installs dependencies (using bun) in production mode.
# - Restarts the application. (The example shows placeholders for PM2 or systemd; adapt to your setup.)
# Ensure your VM user has permission to restart the service (if using sudo, the user must be in sudoers).
# The bun server will be back up and running with the new code after this step.
# 4. (Optional) Post-deployment verification or notifications
- name: Slack Trigger
run: curl -f ${{ secrets.SLACK_DEV_DEPLOY_WEBHOOK }} || exit 1
# - name: Health check
# run: curl -f http://your-app-url/health || exit 1
# - name: Notify Slack
# uses: slackapi/[email protected]
# with:
# channel-id: C12345678
# slack-message: "Deployed Bun server to Azure VM successfully."
# slack-bot-token: ${{ secrets.SLACK_TOKEN }}