pipeline { agent any environment { // Non-secret config injected from Jenkins Credentials (Secret Text) AWS_REGION = credentials('AWS_REGION') AWS_ACCOUNT_ID = credentials('AWS_ACCOUNT_ID') CODEART_DOMAIN = credentials('CODEART_DOMAIN') CODEART_REPO = credentials('CODEART_REPO') } stages { stage('Checkout') { steps { checkout scm } } stage('Authenticate & Configure') { steps { // Use AWS credentials directly with withCredentials withCredentials([ [$class: 'AmazonWebServicesCredentialsBinding', credentialsId: 'jenkins-codeartifact', accessKeyVariable: 'AWS_ACCESS_KEY_ID', secretKeyVariable: 'AWS_SECRET_ACCESS_KEY'] ]) { script { // Fetch a short-lived CodeArtifact token env.CODEART_TOKEN = sh( script: """ aws codeartifact get-authorization-token \\ --region ${AWS_REGION} \\ --domain ${CODEART_DOMAIN} \\ --domain-owner ${AWS_ACCOUNT_ID} \\ --query authorizationToken --output text """, returnStdout: true ).trim() } // Point pip and twine at your CodeArtifact repo sh ''' pip config set global.index-url \ "https://aws:${CODEART_TOKEN}@${CODEART_DOMAIN}-${AWS_ACCOUNT_ID}.d.codeartifact.${AWS_REGION}.amazonaws.com/pypi/${CODEART_REPO}/simple/" cat > ~/.pypirc <