如何在阿里云环境中通过 Jenkins 实现 .NET Core 应用的 Docker 化部署:从 GitLab 拉取代码到自动化 CI/CD 流程的完整指南

在开发应用时最头疼的就是发布问题,如果能在开发完成后,通过一个按钮就能实现自动编译源码并打包上传到阿里云服务器自动部署成功,那对于开发工程师来讲,效率将大大的提升,下面我结合自己的经验,梳理出一份步骤,分享给还在奋斗的你!希望对你有所帮助!

完整的 CI/CD 流程。以下是详细的步骤和潜在问题的处理方法,以确保在从 GitLab 拉取代码、构建 Docker 镜像、推送到阿里云镜像仓库以及在生产环境中部署时,能够顺利完成。

1. 使用 Docker 部署 .NET Core 应用

1.1 创建 .NET Core 应用

创建 .NET Core Web 应用:

bash 复制代码
dotnet new webapi -n MyApi
cd MyApi
1.2 编写 Dockerfile

在项目根目录下创建 Dockerfile,定义如何构建 Docker 镜像:

dockerfile 复制代码
# 使用官方 .NET Core SDK 镜像作为构建环境
FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build

WORKDIR /app
COPY *.csproj ./
RUN dotnet restore
COPY . ./
RUN dotnet publish -c Release -o out

# 使用官方 .NET Core 运行时镜像作为运行环境
FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS runtime

WORKDIR /app
COPY --from=build /app/out .

EXPOSE 80
ENTRYPOINT ["dotnet", "MyApi.dll"]
1.3 构建 Docker 镜像

在阿里云服务器上构建镜像:

bash 复制代码
docker build -t myapi:latest .
1.4 登录阿里云镜像仓库

登录阿里云镜像仓库(确保你已经创建了阿里云镜像仓库并获取了凭据):

bash 复制代码
docker login --username=<your-username> registry.cn-hangzhou.aliyuncs.com
1.5 推送镜像到阿里云

将镜像推送到阿里云镜像仓库:

bash 复制代码
docker tag myapi:latest registry.cn-hangzhou.aliyuncs.com/<your-repo>/myapi:latest
docker push registry.cn-hangzhou.aliyuncs.com/<your-repo>/myapi:latest
1.6 运行 Docker 容器

使用阿里云服务器上的镜像运行容器:

bash 复制代码
docker run -d -p 8080:80 --name myapi_container registry.cn-hangzhou.aliyuncs.com/<your-repo>/myapi:latest

2. Jenkins CI/CD 配置

2.1 安装 Jenkins

在阿里云服务器上运行 Jenkins:

bash 复制代码
docker run -d -p 8080:8080 -p 50000:50000 --name jenkins jenkins/jenkins:lts
2.2 配置 Jenkins
  1. 安装插件

    • 进入 Jenkins,点击"管理 Jenkins" -> "管理插件"。
    • 搜索并安装 Docker Pipeline 插件和 GitLab Plugin
  2. 配置 Docker 主机

    • 在"管理 Jenkins" -> "系统设置"中,找到 Docker 部分,添加 Docker 主机信息。通常主机名为 unix:///var/run/docker.sock,或 tcp://localhost:2375(如果启用了 TCP 端口)。
2.3 创建 Jenkins Pipeline

在 Jenkins 中创建一个新的 Pipeline 项目,使用以下 Jenkinsfile

groovy 复制代码
pipeline {
    agent any
    environment {
        DOCKER_IMAGE = 'registry.cn-hangzhou.aliyuncs.com/<your-repo>/myapi:latest'
        REGISTRY_URL = 'https://registry.cn-hangzhou.aliyuncs.com'
        GITLAB_REPO = 'https://gitlab.com/your-repo/MyApi.git'
    }
    stages {
        stage('Checkout') {
            steps {
                script {
                    // 从 GitLab 拉取最新代码
                    git url: "${GITLAB_REPO}", credentialsId: 'gitlab-credentials'
                }
            }
        }
        stage('Build') {
            steps {
                script {
                    // 使用 Docker 构建镜像
                    docker.build("${DOCKER_IMAGE}")
                }
            }
        }
        stage('Test') {
            steps {
                script {
                    // 在 Docker 容器中运行测试
                    docker.image("${DOCKER_IMAGE}").inside {
                        sh 'dotnet test'
                    }
                }
            }
        }
        stage('Push') {
            steps {
                script {
                    // 登录到阿里云镜像仓库
                    docker.withRegistry('https://registry.cn-hangzhou.aliyuncs.com', 'ali-cloud-credentials') {
                        // 推送镜像到阿里云镜像仓库
                        docker.image("${DOCKER_IMAGE}").push('latest')
                    }
                }
            }
        }
        stage('Deploy') {
            steps {
                script {
                    // 部署到生产环境(示例使用 Docker 运行命令)
                    sh '''
                    docker run -d -p 80:80 --name myapi_container ${DOCKER_IMAGE}
                    '''
                }
            }
        }
    }
}
2.4 配置 Jenkins Credentials
  • GitLab 凭据

    • 转到"管理 Jenkins" -> "管理凭据" -> "全局凭据"。
    • 添加 GitLab 的凭据(选择 Username with passwordSecret text,根据你的 GitLab 设置进行配置)。
  • 阿里云凭据

    • 添加阿里云镜像仓库的凭据(选择 Username with password)。
2.5 配置 GitLab Webhook

在 GitLab 仓库中设置 Webhook,以触发 Jenkins 构建。配置 Webhook 的 URL 为 Jenkins 的触发 URL,例如 http://<your-aliyun-server-ip>:8080/gitlab-webhook/。确保使用 GitLab Webhook 插件来处理触发请求。

3. 常见问题及解决方案

3.1 Jenkins 无法从 GitLab 拉取代码
  • 问题:Jenkins 拉取代码失败,可能是凭据问题或网络问题。
  • 解决方案
    • 确保在 Jenkins 中配置了正确的 GitLab 凭据,并且这些凭据有足够的权限访问 GitLab 仓库。
    • 检查 Jenkins 服务器的网络设置,确保可以访问 GitLab。
3.2 Docker 镜像构建失败
  • 问题:Docker 镜像构建失败,可能是 Dockerfile 配置错误或依赖问题。
  • 解决方案
    • 确认 Dockerfile 配置正确,检查日志输出,修复任何错误或缺失的依赖。
    • 在本地环境中先测试 Dockerfile 是否能够成功构建镜像。
3.3 推送镜像到阿里云失败
  • 问题:推送镜像到阿里云镜像仓库失败,可能是凭据错误或网络问题。
  • 解决方案
    • 确保阿里云镜像仓库凭据正确,并且有权限推送镜像。
    • 检查网络设置和镜像仓库的访问权限。
3.4 部署失败
  • 问题:在生产环境中部署 Docker 容器失败,可能是容器配置错误或端口冲突。
  • 解决方案
    • 检查部署命令和容器配置,确保没有端口冲突。
    • 查看容器日志以获取详细错误信息,并进行调试。

4. 总结

通过这些详细的步骤,你可以在阿里云服务器上配置 Docker 和 Jenkins,实现从 GitLab 获取代码、构建和测试 Docker 镜像、将镜像推送到阿里云镜像仓库,并最终在生产环境中部署 Docker 容器。Jenkins 自动化了构建、测试、推送和部署的过程,同时提供了处理常见问题的解决方案,确保 CI/CD 流程的顺利进行。

相关推荐
bug管理者37 分钟前
UI自动化测试中公认最佳的设计模式-POM
jenkins·策略模式
梅见十柒1 小时前
wsl2中kali linux下的docker使用教程(教程总结)
linux·经验分享·docker·云原生
小曲曲7 小时前
接口上传视频和oss直传视频到阿里云组件
javascript·阿里云·音视频
为什么每天的风都这么大13 小时前
Vscode/Code-server无网环境安装通义灵码
ide·vscode·阿里云·编辑器·ai编程·code-server
Kkooe15 小时前
GitLab|GitLab报错:Restoring PostgreSQL database gitlabhq_production...
gitlab
意疏15 小时前
【Linux 篇】Docker 的容器之海与镜像之岛:于 Linux 系统内探索容器化的奇妙航行
linux·docker
墨鸦_Cormorant15 小时前
使用docker快速部署Nginx、Redis、MySQL、Tomcat以及制作镜像
redis·nginx·docker
Code_Artist15 小时前
Docker镜像加速解决方案:配置HTTP代理,让Docker学会科学上网!
docker·云原生·容器
007php00716 小时前
GoZero 上传文件File到阿里云 OSS 报错及优化方案
服务器·开发语言·数据库·python·阿里云·架构·golang
wanmei00217 小时前
Dockerfile复制目录进入镜像里
docker