使用Docker实现自动化构建及部署,需要配置GitHub仓库,设置Secrets,编写CI/CD工作流文件,处理构建、测试、推送、部署的各个阶段,最后验证自动化流程是否生效。还有需要考虑到GitHub Actions的YAML文件格式是否正确,命令是否正确,比如在部署阶段使用ssh连接到服务器执行命令是否正确,是否需要安装特定插件或配置免密登录等。
mermaid
graph LR A[代码仓库] -->|Push 代码| B(CI/CD 工具) B --> C{构建镜像} C -->|成功| D[运行测试] C -->|失败| E[通知开发者] D -->|测试通过| F[推送镜像到仓库] D -->|测试失败| E F --> G[自动部署到测试环境]
# 前端示例(Node.js)FROM node:18-alpine as builderWORKDIR /appCOPY package*.json ./RUN npm installCOPY . .RUN npm run buildFROM nginx:alpineCOPY --from=builder /app/dist /usr/share/nginx/htmlEXPOSE 80
创建 .github/workflows/deploy.yml:
name: Auto Build & Deployon: push: branches: [ "main" ]jobs: build-test-deploy: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Build Docker image run: | docker build -t ${{ secrets.DOCKER_USERNAME }}/myapp:${{ github.sha }} . - name: Run Unit Tests run: | docker run ${{ secrets.DOCKER_USERNAME }}/myapp:${{ github.sha }} npm test - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Push Docker Image run: | docker push ${{ secrets.DOCKER_USERNAME }}/myapp:${{ github.sha }} - name: Deploy to Test Server uses: appleboy/ssh-action@v1 with: host: ${{ secrets.TEST_SERVER_IP }} username: ${{ secrets.SSH_USERNAME }} key: ${{ secrets.SSH_PRIVATE_KEY }} script: | docker pull ${{ secrets.DOCKER_USERNAME }}/myapp:${{ github.sha }} docker stop test-app || true docker rm test-app || true docker run -d --name test-app -p 80:80 \ ${{ secrets.DOCKER_USERNAME }}/myapp:${{ github.sha }}
在 GitHub 仓库设置中配置:
DOCKER_USERNAME:Docker Hub 用户名DOCKER_PASSWORD:Docker Hub 密码/TokenTEST_SERVER_IP:测试服务器IPSSH_USERNAME:服务器SSH用户名SSH_PRIVATE_KEY:服务器SSH私钥
# 使用提交哈希和日期组合标签TAG=${{ github.sha }}-$(date +%Y%m%d)docker build -t myapp:$TAG .
在 Dockerfile 中添加:
HEALTHCHECK --interval=30s --timeout=3s \ CMD curl -f http://localhost/health || exit 1
在部署脚本中添加:
# 保留最近3个镜像docker images | grep myapp | awk '{print $3}' | tail -n +4 | xargs docker rmi
在 GitHub Actions 中添加:
- name: Send Notification if: always() uses: dawidd6/action-send-mail@v3 with: server: smtp.example.com username: ${{ secrets.MAIL_USER }} password: ${{ secrets.MAIL_PASSWORD }} to: dev-team@company.com subject: "Deploy Status: ${{ job.status }}" body: "Build ${{ github.sha }} completed. View details: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}"
提交代码到 main 分支
自动触发 GitHub Actions
查看构建日志:
https://github.com/<用户名>/<仓库>/actions
检查测试环境:
curl http://测试服务器IP
使用多阶段构建:减小最终镜像体积
镜像分层优化:将频繁变化的层放在 Dockerfile 下方
使用缓存镜像:在 CI/CD 中配置缓存目录
- name: Cache Docker layers uses: actions/cache@v3 with: path: /tmp/.buildx-cache key: ${{ runner.os }}-buildx-${{ github.sha }}
选择合适的基础镜像:优先使用 Alpine 等精简版本
阅读后若有收获,不吝关注,分享等操作!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。