持续集成(CI)是指开发人员频繁地将代码变更合并到共享主干的实践,每次合并都会触发自动构建和测试。持续部署(CD)则是将通过测试的代码自动部署到生产环境的过程。
# 在Ubuntu/Debian上
wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt update
sudo apt install jenkins openjdk-11-jdk
# 启动Jenkins
sudo systemctl start jenkins
sudo systemctl enable jenkins
http://your-server-ip:8080
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'echo "Building..."'
}
}
stage('Test') {
steps {
sh 'echo "Testing..."'
}
}
stage('Deploy') {
steps {
sh 'echo "Deploying..."'
}
}
}
}
stages:
- build
- test
- deploy
build_job:
stage: build
script:
- echo "Building the application"
- make build
test_job:
stage: test
script:
- echo "Running tests"
- make test
deploy_job:
stage: deploy
script:
- echo "Deploying to production"
- make deploy
only:
- master
在项目根目录创建 .github/workflows/main.yml
:
name: CI/CD Pipeline
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up JDK
uses: actions/setup-java@v1
with:
java-version: '11'
- name: Build with Maven
run: mvn -B package --file pom.xml
- name: Run Tests
run: mvn test
- name: Deploy to Production
if: github.ref == 'refs/heads/main'
run: |
echo "Deploying to production..."
# 添加部署脚本
# 安装Docker
sudo apt update
sudo apt install docker.io
sudo systemctl enable --now docker
# 创建Dockerfile
echo "FROM nginx:alpine
COPY . /usr/share/nginx/html" > Dockerfile
# 在CI流水线中添加构建和推送步骤
docker build -t myapp:$CI_COMMIT_SHA .
docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
docker push myapp:$CI_COMMIT_SHA
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:latest
ports:
- containerPort: 80
使用Argo CD进行GitOps风格的持续部署:
# 安装Argo CD
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
# 创建应用
argocd app create myapp \
--repo https://github.com/example/myapp.git \
--path k8s \
--dest-server https://kubernetes.default.svc \
--dest-namespace default
通过以上步骤,您可以在Linux服务器上建立一个完整的CI/CD流水线,实现从代码提交到生产部署的自动化流程。