modified: cogs/dvp.py #55
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 # Runs directly on your Raspberry Pi | |
steps: | |
# 1. Checkout Repository | |
- name: Checkout Repository | |
uses: actions/checkout@v3 | |
# 2. Create and Activate Virtual Environment, then Install Dependencies | |
- name: Set up Python Virtual Environment and Install Dependencies | |
run: | | |
# Create a virtual environment if it doesn't exist | |
if [ ! -d "venv" ] && [ ! -d "env" ]; then | |
python3.11 -m venv venv # Adjust to python3.10 if necessary | |
fi | |
# Activate the virtual environment | |
if [ -d "venv" ]; then | |
source venv/bin/activate | |
elif [ -d "env" ]; then | |
source env/bin/activate | |
fi | |
# Upgrade pip inside the virtual environment | |
python -m pip install --upgrade pip | |
# Install the required dependencies inside the virtual environment | |
pip install -r requirements.txt | |
deploy: | |
runs-on: self-hosted # Use the self-hosted runner for deployment too | |
needs: build | |
steps: | |
- name: Deploy to Raspberry Pi | |
env: | |
GOOGLE_CREDENTIALS_JSON: ${{ secrets.GOOGLE_CREDENTIALS_JSON }} | |
run: | | |
set -e # Exit immediately if a command exits with a non-zero status | |
REVUBOT_DIR=~/revbot | |
REPO_URL=https://github.com/Revulate/revbot.git | |
# Create revbot directory if it doesn't exist | |
mkdir -p $REVUBOT_DIR | |
cd $REVUBOT_DIR | |
# If .git exists, pull; else, clone the repository | |
if [ -d ".git" ]; then | |
git fetch origin | |
git checkout main | |
git reset --hard origin/main | |
else | |
git clone --branch main $REPO_URL . | |
fi | |
# Use the existing virtual environment or create one if necessary | |
if [ ! -d "venv" ] && [ ! -d "env" ]; then | |
python3.11 -m venv venv # Adjust to python3.10 if necessary | |
fi | |
# Activate the virtual environment | |
if [ -d "venv" ]; then | |
source venv/bin/activate | |
elif [ -d "env" ]; then | |
source env/bin/activate | |
fi | |
# Install dependencies within the virtual environment | |
pip install -r requirements.txt | |
# Create or update the .env file | |
cat <<EOF > .env | |
TWITCH_CLIENT_ID=${{ secrets.TWITCH_CLIENT_ID }} | |
TWITCH_CLIENT_SECRET=${{ secrets.TWITCH_CLIENT_SECRET }} | |
ACCESS_TOKEN=${{ secrets.ACCESS_TOKEN }} | |
REFRESH_TOKEN=${{ secrets.REFRESH_TOKEN }} | |
BOT_NICK=${{ secrets.BOT_NICK }} | |
TWITCH_CHANNELS=${{ secrets.TWITCH_CHANNELS }} | |
COMMAND_PREFIX=${{ secrets.COMMAND_PREFIX }} | |
ADMIN_USERS=${{ secrets.ADMIN_USERS }} | |
BOT_USER_ID=${{ secrets.BOT_USER_ID }} | |
BROADCASTER_USER_ID=${{ secrets.BROADCASTER_USER_ID }} | |
LOG_LEVEL=${{ secrets.LOG_LEVEL }} | |
LOG_FILE=${{ secrets.LOG_FILE }} | |
LOG_MAX_BYTES=${{ secrets.LOG_MAX_BYTES }} | |
LOG_BACKUP_COUNT=${{ secrets.LOG_BACKUP_COUNT }} | |
API_STEAM_KEY=${{ secrets.API_STEAM_KEY }} | |
LOGDNA_INGESTION_KEY=${{ secrets.LOGDNA_INGESTION_KEY }} | |
OPENAI_API_KEY=${{ secrets.OPENAI_API_KEY }} | |
WEATHER_API_KEY=${{ secrets.WEATHER_API_KEY }} | |
NUULS_API_KEY=${{ secrets.NUULS_API_KEY }} | |
GOOGLE_SHEET_ID=${{ secrets.GOOGLE_SHEET_ID }} | |
GOOGLE_CREDENTIALS_FILE=credentials.json | |
EOF | |
# Create the credentials.json file from the secret | |
echo "$GOOGLE_CREDENTIALS_JSON" > credentials.json | |
# Set appropriate permissions for credentials.json | |
chmod 600 credentials.json | |
# Install Node.js and npm if not already installed | |
if ! command -v node &> /dev/null; then | |
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - | |
sudo apt-get install -y nodejs | |
fi | |
# Install PM2 globally if not already installed | |
if ! command -v pm2 &> /dev/null; then | |
sudo npm install -g pm2 | |
fi | |
# Create ecosystem.config.js file | |
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 | |
# Start or restart the bot using PM2 | |
pm2 start ecosystem.config.js --update-env | |
# Save PM2 process list and environment | |
pm2 save | |
# Ensure PM2 starts on system boot | |
sudo pm2 startup systemd -u $USER --hp $HOME | |
# Add a simple health check | |
sleep 10 # Give the bot some time to start up | |
if ! pm2 list | grep -q "online"; then | |
echo "Error: twitch-bot is not running after restart" | |
exit 1 | |
fi | |
echo "Deployment completed successfully" |