Bartek Malysz
Bartek Malysz

Reputation: 1032

How to use global credentials in python script invoked by jenkins pipeline

I'm very new to working with jenkins, so far I was able to run simple pipeline with simple pip install, but I need to pass global credentials from Jenkins into python script test.py invoked by jenkinsfile.

Credentials

pipeline {
    options { timeout(time: 30, unit: 'MINUTES')
            buildDiscarder(logRotator(numToKeepStr: '30', artifactNumToKeepStr: '30')) }
    agent { label 'ops_slave' }
    stages {
        stage('Environment  Build') {
            steps {
                echo "Hello World!"
                sh "echo Hello from the shell"
                sh "hostname"
                sh "uptime"
                sh "python3 -m venv test_env"
                sh "source ./test_env/bin/activate"
                sh "pip3 install pandas psycopg2"
                sh """echo the script is working"""
                withCredentials([[
                    $class: 'UsernamePasswordMultiBinding',
                    credentialsId: 98,
                    usernameVariable: 'user',
                    passwordVariable: 'pw',
                ]])
                sh """python3 bartek-jenkins-testing/python/test.py"""
            }
        }
    }
}

I've seen implementation where you use argparse, but it's way above my level at this point, and I believe there is a way to reference it from python script or jenkins directly to pass to python script. I was googling for some time now, but I'm not sure questions I'm asking are correct.

My python script should be able to get username and password from Jenkins global credentials ID98:

print('Hello World this is python')
import pandas as pd
print(pd.__version__)
import pyodbc
import psycopg2
# can pass environemtn variables

connection = psycopg2.connect(
    host="saturn-dv",
    database="saturn_dv",
    port='8080',
    user='saturn_user_bartek_malysz',
    password='')
connection.set_session(readonly=True)
query = """
SELECT table_name FROM information_schema.tables
WHERE table_schema = 'public'
ORDER BY table_schema,table_name;"""
data = pd.read_sql(query, connection)
print(data)

Upvotes: 0

Views: 5446

Answers (1)

yong
yong

Reputation: 13722

A straightforward way is to leverage environment variable as following

// Jenkinsfile

withCredentials([[
    $class: 'UsernamePasswordMultiBinding',
    credentialsId: 98,
    usernameVariable: 'user',
    passwordVariable: 'pw',
]]) {
    sh """
       export DB_USERNAME="${user}"
       export DB_PASSWORD="${pw}"
       python3 bartek-jenkins-testing/python/test.py
    """
}

// test.py
connection = psycopg2.connect(
    host="saturn-dv",
    database="saturn_dv",
    port='8080',
    user=os.getenv('DB_USERNAME'),
    password=os.getenv('DB_PASSWORD'))

Upvotes: 3

Related Questions