CentOS 上搭建 Python 持续集成
一 方案总览与选型
二 方案一 Jenkins 在 CentOS 自建
三 方案二 GitLab CI 或 GitHub Actions
四 关键实践与常见问题
五 最小可用示例
pipeline {
agent any
environment {
PYTHON = 'python3'
VENV = '.venv'
}
stages {
stage('Checkout') {
steps { git branch: 'main', url: 'git@your-gitlab.com:group/project.git' }
}
stage('Setup') {
steps {
sh '''
${PYTHON} -m venv ${VENV}
. ${VENV}/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
'''
}
}
stage('Test & Quality') {
steps {
sh '''
. ${VENV}/bin/activate
pytest --junitxml=reports/pytest.xml --maxfail=1
pylint --output-format=parseable src/ || true
'''
}
post {
always {
junit 'reports/pytest.xml'
warnings canComputeNew: false, defaultEncoding: '', excludePattern: '', healthy: '', includePattern: '**/pylint*.xml', messagesPattern: '', parserConfigurations: [[parserName: 'PyLint', pattern: '**/pylint*.xml']], unHealthy: ''
}
}
}
stage('Package') {
steps {
sh '''
. ${VENV}/bin/activate
python setup.py sdist bdist_wheel
'''
}
}
stage('Deploy') {
when { branch 'main' }
steps {
sh '''
. ${VENV}/bin/activate
pip install scp
python - <<'PY'
import os, scp, paramiko src=os.path.expanduser(“dist/.whl") dst=“/opt/pkgs/” key=paramiko.RSAKey.from_private_key_file(“/var/lib/jenkins/.ssh/id_rsa”) with paramiko.SSHClient() as c: c.set_missing_host_key_policy(paramiko.AutoAddPolicy()) c.connect(“prod.example.com”, username=“deploy”, pkey=key) with scp.SCPClient(c.get_transport()) as s: s.put(src, dst) PY ssh deploy@prod.example.com "pip install /opt/pkgs/.whl && systemctl restart myapp” ‘’’ } } } } ```
stages:
- build
- test
- deploy
variables:
PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"
cache:
paths:
- .cache/pip
- .venv
build:
stage: build
image: python:3.11
script:
- python -m venv .venv
- . .venv/bin/activate
- pip install --upgrade pip
- pip install -r requirements.txt
- python setup.py sdist bdist_wheel
test:
stage: test
image: python:3.11
script:
- . .venv/bin/activate
- pytest --junitxml=reports/pytest.xml --maxfail=1
- pylint --output-format=parseable src/ || true
artifacts:
when: always
reports:
junit: reports/pytest.xml
deploy:
stage: deploy
image: python:3.11
script:
- . .venv/bin/activate
- pip install scp
- python - <<'PY'
import os, scp, paramiko src=os.path.expanduser(“dist/.whl") dst=“/opt/pkgs/” key=paramiko.RSAKey.from_private_key_file(“/builds/.ssh/id_rsa”) with paramiko.SSHClient() as c: c.set_missing_host_key_policy(paramiko.AutoAddPolicy()) c.connect(“prod.example.com”, username=“deploy”, pkey=key) with scp.SCPClient(c.get_transport()) as s: s.put(src, dst) PY - ssh deploy@prod.example.com "pip install /opt/pkgs/.whl && systemctl restart myapp” only: - main ```