Update ci.yml #76
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Twitch Bot CI/CD Pipeline | |
on: | |
push: | |
branches: | |
- main | |
pull_request: | |
branches: | |
- main | |
workflow_dispatch: | |
jobs: | |
build: | |
runs-on: self-hosted | |
steps: | |
- name: Checkout Repository | |
uses: actions/checkout@v3 | |
- name: Cache pip packages | |
uses: actions/cache@v3 | |
with: | |
path: ~/.cache/pip | |
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} | |
restore-keys: | | |
${{ runner.os }}-pip- | |
- name: Set up Python Virtual Environment and Install Dependencies | |
run: | | |
if [ ! -d "venv" ]; then | |
python3.11 -m venv venv | |
fi | |
source venv/bin/activate | |
if [ ! -f "venv/.requirements_installed" ] || ! cmp -s requirements.txt venv/.requirements_installed; then | |
python -m pip install --upgrade pip | |
pip install -r requirements.txt | |
cp requirements.txt venv/.requirements_installed | |
fi | |
deploy: | |
runs-on: self-hosted | |
needs: build | |
if: github.ref == 'refs/heads/main' && github.event_name == 'push' | |
steps: | |
- name: Check current user | |
run: | | |
echo "Current user: $(whoami)" | |
echo "User ID: $(id -u)" | |
echo "Groups: $(groups)" | |
- name: Set up environment | |
run: | | |
echo "Setting up environment..." | |
export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$PATH" | |
echo $PATH | |
# Add any other necessary environment variables here | |
- name: Debug output | |
run: | | |
echo "Debug: Checking sudo configuration" | |
sudo -n -l | |
echo "Debug: PM2 version" | |
pm2 -v || echo "PM2 not found" | |
echo "Debug: Node.js version" | |
node -v || echo "Node.js not found" | |
- name: Deploy to Raspberry Pi | |
env: | |
GOOGLE_CREDENTIALS_JSON: ${{ secrets.GOOGLE_CREDENTIALS_JSON }} | |
run: | | |
set -e | |
REVUBOT_DIR=~/revbot | |
REPO_URL=https://github.com/Revulate/revbot.git | |
BACKUP_DIR=~/revbot_backup_$(date +%Y%m%d_%H%M%S) | |
# Backup current version | |
if [ -d "$REVUBOT_DIR" ]; then | |
cp -r $REVUBOT_DIR $BACKUP_DIR | |
fi | |
mkdir -p $REVUBOT_DIR | |
cd $REVUBOT_DIR | |
if [ -d ".git" ]; then | |
git fetch origin | |
git checkout main | |
git reset --hard origin/main | |
else | |
git clone --branch main $REPO_URL . | |
fi | |
if [ ! -d "venv" ]; then | |
python3.11 -m venv venv | |
fi | |
source venv/bin/activate | |
if [ ! -f "venv/.requirements_installed" ] || ! cmp -s requirements.txt venv/.requirements_installed; then | |
pip install -r requirements.txt | |
cp requirements.txt venv/.requirements_installed | |
fi | |
# Ensure correct file permissions for credentials.json | |
echo "$GOOGLE_CREDENTIALS_JSON" > credentials.json | |
chmod 600 credentials.json | |
# Install Node.js and PM2 if not present | |
if ! sudo -n command -v node &> /dev/null; then | |
sudo -n curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -n bash - | |
sudo -n apt-get install -y nodejs | |
fi | |
if ! sudo -n command -v pm2 &> /dev/null; then | |
sudo -n npm install -g pm2 | |
fi | |
# Create or update PM2 ecosystem config | |
cat <<EOF > ecosystem.config.js | |
module.exports = { | |
apps: [{ | |
name: "twitch-bot", | |
script: "bot.py", | |
interpreter: "$(which python)", | |
watch: true, | |
ignore_watch: ["node_modules", "logs"], | |
max_memory_restart: "1G", | |
env: { | |
NODE_ENV: "development", | |
PYTHONUNBUFFERED: "1" | |
}, | |
env_production: { | |
NODE_ENV: "production", | |
PYTHONUNBUFFERED: "1" | |
} | |
}] | |
} | |
EOF | |
# Set up the database to ensure all tables exist | |
python -c 'from utils import setup_database; setup_database()' | |
# Run database migrations if any | |
if [ -f "migrate.py" ]; then | |
python migrate.py | |
fi | |
# Start or restart the bot using PM2 | |
sudo -u $USER pm2 start ecosystem.config.js --update-env || sudo -u $USER pm2 delete twitch-bot && sudo -u $USER pm2 start ecosystem.config.js --update-env | |
sudo -u $USER pm2 save | |
sudo -n pm2 startup systemd -u $USER --hp $HOME | |
# Health check | |
sleep 10 | |
if ! sudo -u $USER pm2 list | grep -q "online"; then | |
echo "Error: twitch-bot is not running after restart" | |
# Rollback | |
echo "Rolling back to previous version..." | |
rm -rf $REVUBOT_DIR | |
mv $BACKUP_DIR $REVUBOT_DIR | |
cd $REVUBOT_DIR | |
sudo -u $USER pm2 start ecosystem.config.js --update-env | |
exit 1 | |
fi | |
echo "Deployment completed successfully" | |
- name: Cleanup old backups | |
run: | | |
find ~/revbot_backup_* -maxdepth 0 -type d -mtime +7 -exec rm -rf {} + | |
- name: Notify on success | |
if: success() | |
run: echo "Deployment successful" # Replace with your notification method | |
- name: Notify on failure | |
if: failure() | |
run: echo "Deployment failed" # Replace with your notification method |