pipeline { agent any options { timeout(time: 15, unit: 'MINUTES') timestamps() buildDiscarder(logRotator(numToKeepStr: '10')) disableConcurrentBuilds() } triggers { cron('H/30 * * * *') } stages { stage('Checkout Code') { steps { // Pulls the code from the repository where this Jenkinsfile lives checkout scm } } stage('Setup Python & Install Dependencies') { steps { sh ''' set -e # Exit immediately if a command exits with a non-zero status # Create a virtual environment named 'venv' python3 -m venv venv # Activate the virtual environment and install dependencies . venv/bin/activate && \ pip install --upgrade pip && \ pip install -U atproto tweety-ns playwright httpx arrow python-dotenv moviepy # Check if moviepy is installed pip list | grep moviepy || { echo 'MoviePy installation failed!'; exit 1; } # Check if FFmpeg is installed ffmpeg -version || { echo 'FFmpeg is not installed!'; exit 1; } # Verify that moviepy can be imported python3 -c "import moviepy" || { echo 'MoviePy import failed!'; exit 1; } # Install the local browser binaries for this 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_BOMBERSCAT_HANDLE', variable: 'TWITTER_BOMBERSCAT_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_BOMBERSCAT_HANDLE" \ --bsky-handle "$BSKY_CAT112_HANDLE" \ --bsky-password "$BSKY_CAT112_PASSWORD" \ --bsky-base-url https://eurosky.social ''' } } } } }