Debian Docker集成CI/CD流程指南
在Debian系统上集成Docker与CI/CD流程,核心是通过自动化工具(如Jenkins、GitLab CI/CD、GitHub Actions)串联代码管理、Docker镜像构建、测试验证、部署发布等环节,实现代码从提交到生产的全流程自动化。以下是具体实现步骤:
在Debian系统上,首先需要安装Docker和CI/CD工具的基础组件:
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
sudo systemctl start docker && sudo systemctl enable docker # 启动并设置开机自启
sudo apt install -y openjdk-17-jdk # Jenkins依赖Java 17+
wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt update
sudo apt install -y jenkins
sudo systemctl start jenkins && sudo systemctl enable jenkins
访问http://<Debian服务器IP>:8080,输入初始管理员密码(位于/var/lib/jenkins/secrets/initialAdminPassword)完成初始化,并安装建议插件(如Docker、Git)。Jenkins需安装Docker Pipeline插件(在“Manage Jenkins → Manage Plugins”中搜索安装),以便在Pipeline中调用Docker命令。
创建Pipeline项目,编写Jenkinsfile定义流程(以构建、测试、部署Docker镜像为例):
pipeline {
agent any
environment {
IMAGE_NAME = "my-debian-app:latest"
DOCKER_HUB_CREDENTIALS = credentials('dockerhub-creds') // Jenkins中配置的Docker Hub凭据ID
}
stages {
stage('Checkout') {
steps {
git 'https://github.com/your-repo/your-debian-app.git' // 替换为你的代码仓库
}
}
stage('Build Docker Image') {
steps {
script {
docker.build(IMAGE_NAME)
}
}
}
stage('Run Tests') {
steps {
script {
docker.image(IMAGE_NAME).inside() {
sh 'npm test' // 替换为你的测试命令(如Python的pytest、Java的JUnit)
}
}
}
}
stage('Push to Docker Hub') {
steps {
script {
docker.withRegistry('https://registry.hub.docker.com', DOCKER_HUB_CREDENTIALS) {
docker.image(IMAGE_NAME).push()
}
}
}
}
stage('Deploy to Production') {
steps {
sshagent(['production-server-ssh-key']) { // Jenkins中配置的SSH私钥ID
sh 'ssh user@your-production-server "docker pull ${IMAGE_NAME} && docker stop my-app || true && docker rm my-app || true && docker run -d --name my-app -p 80:80 ${IMAGE_NAME}"'
}
}
}
}
}
上述Jenkinsfile实现了代码拉取→Docker镜像构建→测试→推送至Docker Hub→部署至生产服务器的全流程。
若使用GitLab作为代码托管平台,可通过.gitlab-ci.yml文件定义CI/CD流程,结合GitLab Runner(执行任务的代理)实现自动化。
REGISTRATION_TOKEN):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
注册时选择Docker Executor(推荐,避免环境冲突),并指定镜像(如node:14、debian:bullseye)。.gitlab-ci.yml:stages:
- build
- test
- deploy
variables:
IMAGE_NAME: "my-debian-app:latest"
build_job:
stage: build
image: debian:bullseye # 使用Debian基础镜像
script:
- apt update && apt install -y docker.io
- docker build -t $IMAGE_NAME .
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD registry.gitlab.com # 使用GitLab Container Registry
- docker push $IMAGE_NAME
test_job:
stage: test
image: $IMAGE_NAME
script:
- npm install # 替换为你的依赖安装命令
- npm test # 替换为你的测试命令
deploy_job:
stage: deploy
script:
- 'which ssh-agent || ( apt update -y && apt install -y openssh-client )'
- eval $(ssh-agent -s)
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - # 使用GitLab CI变量存储的SSH私钥
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- ssh-keyscan your-production-server >> ~/.ssh/known_hosts
- chmod 644 ~/.ssh/known_hosts
- ssh user@your-production-server "docker pull $IMAGE_NAME && docker stop my-app || true && docker rm my-app || true && docker run -d --name my-app -p 80:80 $IMAGE_NAME"
only:
- main # 仅在main分支提交时触发
该配置利用GitLab的Container Registry存储镜像,通过SSH实现生产服务器部署。docker-compose.yml中定义服务,CI/CD流程中通过docker-compose up -d启动:version: '3'
services:
web:
build: .
ports:
- "80:80"
db:
image: postgres:13
environment:
POSTGRES_PASSWORD: mypassword
在Jenkinsfile或.gitlab-ci.yml中添加步骤:docker-compose up -d --build
docker build命令中添加--cache-from参数,复用之前构建的镜像层,减少重复构建时间:docker build --cache-from $IMAGE_NAME -t $IMAGE_NAME .
stage('Security Scan') {
steps {
script {
sh 'trivy image --exit-code 1 --severity HIGH $IMAGE_NAME' # Trivy扫描
}
}
}
post {
success {
slackSend channel: '#ci-cd', message: "Build succeeded: ${env.BUILD_NUMBER}"
}
failure {
slackSend channel: '#ci-cd', message: "Build failed: ${env.BUILD_NUMBER}"
}
}
docker组)和代码仓库(配置SSH密钥或访问令牌)。通过以上步骤,可实现Debian Docker与CI/CD流程的无缝集成,提升开发效率和应用可靠性。