C'est mon fichier Jenkins.
pipeline {
agent none
stages {
stage('Build') {
agent {
docker {
image 'python:3-Alpine'
}
}
steps {
sh 'pip install --user -r requirements.txt'
sh 'python WebChecker.py'
}
post {
always {
junit 'output.xml'
}
}
}
}
}
Quand je l'exécute à Jenkins, je reçois ce qui suit
[urltester] Running Shell script
+ pip install --user -r requirements.txt
The directory '/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with Sudo, you may want Sudo's -H flag.
The directory '/.cache/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with Sudo, you may want Sudo's -H flag.
Collecting beautifulsoup4==4.6.0 (from -r requirements.txt (line 1))
Downloading https://files.pythonhosted.org/packages/9e/d4/10f46e5cfac773e22707237bfcd51bbffeaf0a576b0a847ec7ab15bd7ace/beautifulsoup4-4.6.0-py3-none-any.whl (86kB)
Collecting requests==2.18.4 (from -r requirements.txt (line 2))
Downloading https://files.pythonhosted.org/packages/49/df/50aa1999ab9bde74656c2919d9c0c085fd2b3775fd3eca826012bef76d8c/requests-2.18.4-py2.py3-none-any.whl (88kB)
Collecting junit-xml==1.8 (from -r requirements.txt (line 3))
Downloading https://files.pythonhosted.org/packages/a6/2a/f8d5aab80bb31fcc789d0f2b34b49f08bd6121cd8798d2e37f416df2b9f8/junit-xml-1.8.tar.gz
Collecting urllib3<1.23,>=1.21.1 (from requests==2.18.4->-r requirements.txt (line 2))
Downloading https://files.pythonhosted.org/packages/63/cb/6965947c13a94236f6d4b8223e21beb4d576dc72e8130bd7880f600839b8/urllib3-1.22-py2.py3-none-any.whl (132kB)
Collecting idna<2.7,>=2.5 (from requests==2.18.4->-r requirements.txt (line 2))
Downloading https://files.pythonhosted.org/packages/27/cc/6dd9a3869f15c2edfab863b992838277279ce92663d334df9ecf5106f5c6/idna-2.6-py2.py3-none-any.whl (56kB)
Collecting certifi>=2017.4.17 (from requests==2.18.4->-r requirements.txt (line 2))
Downloading https://files.pythonhosted.org/packages/7c/e6/92ad559b7192d846975fc916b65f667c7b8c3a32bea7372340bfe9a15fa5/certifi-2018.4.16-py2.py3-none-any.whl (150kB)
Collecting chardet<3.1.0,>=3.0.2 (from requests==2.18.4->-r requirements.txt (line 2))
Downloading https://files.pythonhosted.org/packages/bc/a9/01ffebfb562e4274b6487b4bb1ddec7ca55ec7510b22e4c51f14098443b8/chardet-3.0.4-py2.py3-none-any.whl (133kB)
Collecting six (from junit-xml==1.8->-r requirements.txt (line 3))
Downloading https://files.pythonhosted.org/packages/67/4b/141a581104b1f6397bfa78ac9d43d8ad29a7ca43ea90a2d863fe3056e86a/six-1.11.0-py2.py3-none-any.whl
Installing collected packages: beautifulsoup4, urllib3, idna, certifi, chardet, requests, six, junit-xml
Could not install packages due to an EnvironmentError: [Errno 13] Permission denied: '/.local'
Check the permissions.
script returned exit code 1
Alors je fais l'installation de pip Sudo ....
Et j'obtiens l'erreur suivante:
[urltester] Running Shell script
+ Sudo python -m pip install --user -r requirements.txt
/Users/me/.jenkins/workspace/urltester@tmp/durable-e36d9731/script.sh: line 1: Sudo: not found
script returned exit code 127
J'ai ensuite supprimé le Sudo et essayé d'utiliser un env virtuel:
pipeline {
agent none
stages {
stage('Build') {
agent {
docker {
image 'python:3-Alpine'
}
}
steps {
sh 'virtualenv venv --distribute'
sh 'source venv/bin/activate '
sh 'pip install --user -r requirements.txt'
sh 'python WebChecker.py'
}
post {
always {
junit 'output.xml'
}
}
}
}
}
Mais j'ai eu la même chose que lorsque j'ai essayé Sudo, mais cette fois virtualenv n'a pas été trouvé.
Mon objectif final est de pouvoir exécuter mon script python. Ce script python générera un fichier xml dans son même répertoire. Jenkins devrait alors lire ce xml J'ai essayé d'utiliser Docker, mais je ne suis pas allé bien loin. Alors, que dois-je faire?
Comme l'a écrit tftd, changez HOME en répertoire accessible en écriture comme:
pipeline {
agent none
stages {
stage('Build') {
agent {
docker {
image 'python:3-Alpine'
}
}
steps {
withEnv(["HOME=${env.WORKSPACE}"]) {
sh 'pip install --user -r requirements.txt'
sh 'python WebChecker.py'
}
}
post {
always {
junit 'output.xml'
}
}
}
}
}
Vous devez ajouter virtualenv à la variable PATH.
Si vous l'avez installé à l'aide de pip install virtualenv
, ce sera dans pythonX.X/Lib/site-packages/
Sudo
doit également être ajouté à la variable PATH.
L'erreur dans le premier extrait de code est due au fait que vous n'aviez pas l'autorisation d'écrire dans '/.local'
. Essayez de l'exécuter en tant que administrateur
Je rencontre ça maintenant. Ce qui n'apparaît pas dans la publication d'origine OPs est la commande que Jenkins utilise pour exécuter Docker. Il se révèle être:
docker run -t -d -u XXX: YYY -w/var/lib/jenkins/workspace /
où XXX est l'UID de l'utilisateur exécutant jenkins et YYY est l'ID de groupe. Dans le conteneur python, cet UID n'est pas reconnu, donc il n'y a pas de répertoire personnel. Lorsque 'pip install --user' essaie de s'exécuter, puisqu'il n'y a pas de répertoire personnel, il est par défaut '/ 'qui n'est pas inscriptible.
Je pense que c'est une erreur de Jenkins (voir https://issues.jenkins-ci.org/browse/JENKINS-47026 ). Les autres services du CICD semblent bien gérer cela.
La réponse de Yoichi Nakayama a fonctionné pour moi, et je la vote positivement.
Essayez d'ajouter un argument - u root: root comme ceci:
withDockerContainer(image: 'python:3.6', args:'-u root:root'){
sh """
pip install --user -r requirements.txt
python WebChecker.py
"""
}