pipeline { agent any triggers { // 'H' balances the load on Jenkins, running roughly every 30 minutes cron('H/30 * * * *') } stages { stage('Checkout Code') { steps { checkout scm } } stage('Setup Python & Install Dependencies') { steps { sh ''' # Create a virtual environment named 'venv' python3 -m venv venv # Activate it and install the required packages . venv/bin/activate pip install -U atproto tweety-ns playwright httpx arrow python-dotenv -q # Install the local browser binaries for this specific environment playwright install chromium ''' } } stage('Run Script') { steps { // Securely inject Jenkins credentials as environment variables withCredentials([ string(credentialsId: 'TWITTER_USERNAME', variable: 'TWITTER_USERNAME'), string(credentialsId: 'TWITTER_PASSWORD', variable: 'TWITTER_PASSWORD'), string(credentialsId: 'TWITTER_CAT112_EMAIL', variable: 'TWITTER_CAT112_EMAIL'), string(credentialsId: 'TWITTER_TRANSIT_HANDLE', variable: 'TWITTER_TRANSIT_HANDLE'), string(credentialsId: 'BSKY_CAT112_HANDLE', variable: 'BSKY_CAT112_HANDLE'), string(credentialsId: 'BSKY_CAT112_PASSWORD', variable: 'BSKY_CAT112_PASSWORD') ]) { sh ''' # Activate the exact same virtual environment so Python finds Playwright and Arrow . venv/bin/activate # Run the daemon with the injected credentials python3 twitter2bsky_daemon.py \ --twitter-username "$TWITTER_USERNAME" \ --twitter-password "$TWITTER_PASSWORD" \ --twitter-email "$TWITTER_CAT112_EMAIL" \ --twitter-handle "$TWITTER_TRANSIT_HANDLE" \ --bsky-handle "$BSKY_CAT112_HANDLE" \ --bsky-password "$BSKY_CAT112_PASSWORD" ''' } } } } }