在Debian中实现持续集成(CI)与持续交付(CD)的常见方案
持续集成(CI)通过自动化代码构建、测试确保代码质量,持续交付(CD)则将通过测试的代码自动部署到目标环境(如测试/生产环境)。Debian作为服务器常用系统,可通过以下工具链实现高效的CI/CD流程:
在Debian上实现CI/CD前,需安装以下基础工具:
sudo apt update && sudo apt install -y openjdk-11-jdk
java -version # 验证安装
Jenkins是Debian上最流行的开源CI/CD工具,支持自定义Pipeline流程:
wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
echo "deb http://pkg.jenkins.io/debian-stable binary/" | sudo tee /etc/apt/sources.list.d/jenkins.list
sudo apt update && sudo apt install -y jenkins
sudo systemctl start jenkins && sudo systemctl enable jenkins
访问http://<服务器IP>:8080,输入/var/lib/jenkins/secrets/initialAdminPassword中的初始密码完成解锁,安装推荐插件(如Pipeline、Git)。Jenkinsfile定义流程(以Python项目为例):pipeline {
agent any
stages {
stage('Checkout') {
steps { git 'https://github.com/example/my-python-app.git' }
}
stage('Build') {
steps { sh 'python setup.py build' }
}
stage('Test') {
steps { sh 'python -m pytest' }
}
stage('Deploy') {
steps { sh 'ansible-playbook deploy.yml' } // 使用Ansible自动化部署
}
}
}
触发方式可选择“Git钩子”(代码推送自动触发)或“定时构建”。若使用GitLab托管代码,可通过GitLab Runner实现CI/CD,无需额外配置代码托管库:
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
sudo apt install -y gitlab-runner
sudo gitlab-runner register # 输入GitLab URL、项目Token等信息
.gitlab-ci.yml:.gitlab-ci.yml,定义流程(以Laravel项目为例):stages:
- test
- deploy
test:
stage: test
script:
- composer install
- php artisan test # Laravel测试命令
deploy:
stage: deploy
script:
- ssh -o StrictHostKeyChecking=no deploy@server "cd /path/to/project && git pull && composer install && php artisan migrate"
only:
- master # 仅master分支触发部署
GitLab Runner会自动监听代码变化,执行对应任务。若代码托管在GitHub,可通过GitHub Actions实现云端CI/CD,无需维护本地服务器:
.github/workflows/main.yml,定义流程(以Python项目为例):name: Python CI/CD
on: [push] # 代码推送触发
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2 # 拉取代码
- name: Set up Python
uses: actions/setup-python@v2
with: { python-version: '3.8' }
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Run tests
run: pytest
- name: Deploy to server
uses: appleboy/scp-action@master # 通过SCP部署到服务器
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SERVER_SSH_KEY }}
source: '.'
target: '/path/to/project'
GitHub Actions会自动执行流程,支持多平台(Linux、Windows、macOS)。CI流程完成后,需通过自动化工具将代码部署到目标环境:
deploy.yml):- hosts: webservers
become: yes
tasks:
- name: Pull latest code
git: repo=https://github.com/example/my-app.git dest=/var/www/html version=master
- name: Install PHP dependencies
command: composer install chdir=/var/www/html
- name: Run database migrations
command: php artisan migrate chdir=/var/www/html
通过ansible-playbook deploy.yml执行部署。Jenkinsfile或.gitlab-ci.yml中添加Docker构建步骤:stage('Build Docker Image') {
steps { sh 'docker build -t my-app:${BUILD_NUMBER} .' }
}
stage('Push to Registry') {
steps { sh 'docker push my-registry/my-app:${BUILD_NUMBER}' }
}
部署时拉取最新镜像并启动容器。