pipeline { agent any options { timeout(time: 15, unit: 'MINUTES') timestamps() buildDiscarder(logRotator(numToKeepStr: '10')) disableConcurrentBuilds() } 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 for the RSS script . venv/bin/activate pip install atproto fastfeedparser beautifulsoup4 httpx arrow charset-normalizer Pillow ''' } } stage('Run Script') { steps { // Securely inject Jenkins credentials as environment variables withCredentials([ string(credentialsId: 'BSKY_CRUNCHYROLL_HANDLE', variable: 'BSKY_CRUNCHYROLL_HANDLE'), string(credentialsId: 'TWITTER_CRUNCHY_EMAIL', variable: 'TWITTER_CRUNCHY_EMAIL'), string(credentialsId: 'BSKY_CRUNCHYROLL_APP_PASSWORD', variable: 'BSKY_CRUNCHYROLL_APP_PASSWORD') ]) { sh ''' # Activate the virtual environment . venv/bin/activate # Run the RSS script with positional arguments python3 rss2bsky.py \ "https://cr-news-api-service.prd.crunchyrollsvc.com/v1/es-ES/rss" \ "$BSKY_CRUNCHYROLL_HANDLE" \ "$TWITTER_CRUNCHY_EMAIL" \ "$BSKY_CRUNCHYROLL_APP_PASSWORD" \ --service "https://eurosky.social" ''' } } } } }