Jenkins 构建自动化.NET C ore 发布镜像

简介: Jenkins 构建自动化.NET C ore 发布镜像

导读


在本章中,将介绍如何在 Linux 下使用 Docker 部署、启动 Jenkins,编写脚本,自动化构建 .NET Core 应用,最终将 .NET Core 应用打包为 Docker 镜像。


部署 Jenkins


请提前在 Linux 上安装 Docker,在 Linux 中,我们使用 Docker 启动 Jenkins,这样可以避免手动安装大量依赖以及污染本地环境,也便于快速启动和故障恢复。


安装 Docker 完毕后,使用 docker version 检查 Docker 版本,Docker 版本不能为 1.x、3.x 这种版本,请升级到 18.x 以上版本。一般在 Ubuntu 系统中,下载安装的是最新版本,但是在 Centos 中因为默认镜像源中的版本比较旧, 安装 Doker 版本较低,需要手动添加新版本的镜像源再升级。

请参考:https://www.cnblogs.com/harlanzhang/p/9965534.html


因为会使用到容器提供环境,以及使用 Docker 打包 .NET Core 程序为 Docker 镜像,所以需要在 Jenkins 容器中映射 Docker 的 .sock 文件,以便在容器中,还能使用 Docker 命令。


在宿主机中创建 /var/jenkins_home 目录,用于备份 Jenkins 中的数据。

在 Linux 中使用 Docker 启动 Jenkins ,其命令如下:


docker run \
  -u root \
  -itd \
  -p 8080:8080 \
  -p 50000:50000 \
  -v /var/jenkins_home:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  jenkinsci/blueocean


启动后,使用 docker logs {容器ID} 查看日志获取 Jenkins 登录密码,其密码是一串哈希字符串,例如:1abc12445adcf

最后打开 8080 端口,即可访问 Jenkins。


安装插件


登录 Jenkins 后,会提示安装推荐的插件,请根据提示安装推荐的插件,推荐安装的插件列表如下:

Folders Plugin
OWASP Markup Formatter Plugin
Build Timeout
Credentials Binding Plugin
Timestamper
Workspace Cleanup
Ant
Gradle
Pipeline
GitHub Branch Source Plugin
Pipeline: GitHub Groovy Libraries
Pipeline: Stage View
Git plugin
SSH Build Agents
Matrix Authorization Strategy Plugin
PAM Authentication
LDAP
Email Extension
Mailer Plugin
Localization: Chinese (Simplified)


另外为了提供容器打包支持等,需要另外手工安装以下插件。


微信图片_20220505152103.png


# 提供 Docker 支持(必装)
docker
Docker Pipeline
docker-build-step
# 可视化设计流水线脚本的工具(必装)
Blue Ocean
# 提供对 gitlab 支持,如果不使用可以不安装
gitlab
# 提供 Git 参数化和钩子触发构建支持,不需要可以不安装
Git Parameter
Generic Webhook Trigger


拉取镜像


这里介绍一下我们后面要用到的两个镜像。

拉取一个 .NET Core SDK,每次启动流水线时,都会启动一个 .NET Core SDK 容器,为我们提供构编译、发布 .NET Core 程序的环境。


docker pull mcr.microsoft.com/dotnet/sdk:3.1


拉取一个 ASP.NET Core Runtime,用于制作应用镜像的基础镜像。

docker pull mcr.microsoft.com/dotnet/aspnet:3.1


镜像列表:

mcr.microsoft.com/dotnet/aspnet   3.1          ac199e8d6dff   2 weeks ago   208MB
mcr.microsoft.com/dotnet/sdk      3.1          82e2a34647f0   2 weeks ago   710MB


制作 Jenkinsfile 脚本


笔者贴心地给各位同学准备了 Demo 项目,请到 https://github.com/whuanle/DotNetCoreJenkinsDemo 仓库,fork 到你的仓库,后续我们使用这个 ASP.NET Core 的 Demo 程序实践流程。


在项目文件中,可以找到一个 Jenkinsfile 文件,此文件为我们定义流水线的步骤。


我们看一下简单的 Jenkinsfile 模板:

pipeline {
    stages {
        stage('Build') {
            steps {
                echo 'Building..'
            }
        }
        stage('Test') {
            steps {
                echo 'Testing..'
            }
        }
        stage('Deploy') {
            steps {
                echo 'Deploying....'
            }
        }
    }
}


stages 中,定义流水线的阶段,在模板中,一个定义了三个阶段,分别是 BuildTestDeploy


每个阶段都可以定义多个步骤(steps),每个步骤中都可以执行多个不同类型的 step。


stage('Test') {
        steps {
            echo 'Testing..'
        }
    }


demo 中的 Jenkinsfile 比较简单,我们可以找个 Publish 阶段的内容看一下:

stage('Publish') { 
            steps {
                sh 'dotnet publish src/WebDemo -c Release'
            }
        }


其实很简单,每个步骤执行 shell 命令就行,我们可以使用 sh '...' 表示此步骤要执行的 shell 命令。


接着我们看一下 Jenkinsfile 开头的两部分内容。

// 全局环境变量
    environment {
        IMAGENAME     = 'webdemo'       // 镜像名称
        IMAGETAG      = '1.0.0'         // 镜像标签
        APPPORT       = '8089'          // 应用占用的端口
        APPDIR        = '/opt/app'      // 应用工作的目录
    }
    agent {
        docker {
            image 'mcr.microsoft.com/dotnet/sdk:3.1' 
            args '-v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker'
        }
    }


environment 中,可以定义此次构建过程的环境变量。

agent 则是节点选择器,可以选择在何种环境下启动流水线,有 nodedocker 等类型。


构建流水线


登录到 Jenkins 网页后台,在左侧菜单栏中点击 New Item,开始创建流水线。

Jenkins 有多种流水线风格,还可以通过添加插件,来加入更多的流水线类型,我们主要了解 Freestyle project 、Pipeline、Multibranch Pipeline 即可。


  • Freestyle project
    Freestyle project流水线 使用上比较自由,不需要对项目做更改即可创建流水线,可以添加很多选择、配置。如果流程需要变化,改动比较麻烦。
  • Pineline、Multibranch Pipeline
    他们都可以同时处理多个分支,这两种都是依赖于项目中的 Jenkinsfile 文件。Multibranch Pipeline 好处是可以同时检查多个分支,为每个分支创建构建Job,而 Pipeline 会把多个分支放到一个 Job 中。

点击 New Item ,创建流水线,选择 Mutibranch Pipline。

添加 Git 源代码 仓库方式,我们可以自由选择一种类型,建议使用 Single repository & branch


微信图片_20220505152111.png

由于我们没有添加密钥,所以 Jenkins 无法访问你的 Github 仓库,所以需要添加一个可访问的密钥。

微信图片_20220505152115.png


找一台已经安装了 git 的电脑,生成公钥私钥,为 Jenkins 和 GitHub 之间提供加密连接。

执行命令:


ssh-keygen -t rsa -b 2048 -C "email@example.com"


根据提示,填写要存放密钥的路径,如 D:/id_rsa

执行命令后,会生成两个文件, id_rsaid_rsa.pub,复制 id_rsa (私钥)中的内容到 Jenkins 中。

然后把 id_rsa.pub (公钥)的内容添加到 Github 你的账号中。


你可以使用多种方式添加认证方式,最简单、安全的是密钥,我们可以选择 Secret file,然后上传私钥,或者使用别的方式,这里就不赘述了。

微信图片_20220505152122.png


然后选择要发布的分支,最后直接保存即可。

微信图片_20220505152125.png

然后回到主界面,打开 我们创建的流水线,点击 Build Now,即可启动流水线。

微信图片_20220505152325.png


构建成功截图:

微信图片_20220505152329.png


在 Linux 服务器上,查看镜像列表:

root@localhost ~ 19:54:20 # docker images
REPOSITORY                        TAG          IMAGE ID       CREATED         SIZE
webdemo                           1.0.0        79b636ddef73   2 minutes ago   208MB


可以看到,已经自动打包应用为镜像,其镜像名称和版本号,都可以在 Jenkinsfile 中设置。


观察


我们可以在构建界面中,观察每个步骤的日志。


微信图片_20220505152333.png


微信图片_20220505152338.png


在 Open Blue Ocean 中,有更加好看的 UI 和方便的工具。

微信图片_20220505152342.png


可视化设计流水线步骤。


微信图片_20220505152346.png

微信图片_20220505152409.png

观察构建过程。


微信图片_20220505152417.png

微信图片_20220505152422.png

相关文章
|
2天前
|
机器学习/深度学习 运维 持续交付
构建高效自动化运维体系:Ansible与Docker的完美结合构建高效机器学习模型的五大技巧
【4月更文挑战第30天】 在当今快速发展的云计算和微服务架构时代,自动化运维已成为维持系统稳定性和提高效率的关键。本文将探讨如何通过结合Ansible和Docker技术构建一个高效的自动化运维体系。文章不仅介绍了Ansible与Docker的基本原理和优势,还详细阐述了如何整合这两种技术以简化部署流程、加强版本控制,并提高整体运维效率。通过案例分析,我们将展示这一组合在实际环境中的应用效果,以及它如何帮助企业实现持续集成和持续部署(CI/CD)的目标。 【4月更文挑战第30天】 在数据驱动的时代,构建一个高效的机器学习模型是获取洞察力和预测未来趋势的关键步骤。本文将分享五种实用的技巧,帮助数
|
2天前
|
敏捷开发 运维 测试技术
构建高效自动化运维体系:基于容器技术的持续集成与持续部署实践
【4月更文挑战第30天】在数字化转型的浪潮中,企业对软件交付速度和质量的要求日益提高。自动化运维作为提升效率、确保稳定性的关键手段,其重要性不言而喻。本文将探讨如何利用容器技术构建一个高效的自动化运维体系,实现从代码提交到产品上线的持续集成(CI)与持续部署(CD)。通过分析现代容器技术与传统虚拟化的差异,阐述容器化带来的轻量化、快速部署及易于管理的优势,并结合实例讲解如何在实际环境中搭建起一套完善的CI/CD流程。
|
2天前
|
人工智能 运维 自然语言处理
构建高效自动化运维体系:DevOps与AI的融合之路
【4月更文挑战第30天】在数字化转型的大潮中,企业IT基础设施的复杂性日益增加,传统的运维模式已难以满足快速变化的业务需求。本文深入探讨了如何通过融合DevOps和人工智能(AI)技术构建一个高效、自动化的运维体系。文章首先概述了现代运维面临的挑战,接着分析了DevOps的核心理念以及AI如何在故障预测、智能决策支持等方面提升运维效率。最后,本文提出了一个具体的实施框架,并讨论了在推进过程中可能遇到的挑战及应对策略。
|
2天前
|
运维 Kubernetes 持续交付
构建高效自动化运维系统:基于容器技术的持续集成与持续部署实践
【4月更文挑战第30天】 在快速发展的云计算时代,传统的运维模式已无法满足敏捷开发和快速迭代的需求。本文将介绍如何利用容器技术搭建一套高效自动化运维系统,实现软件的持续集成(CI)与持续部署(CD)。文章首先探讨了现代运维面临的挑战,接着详细阐述了容器技术的核心组件和工作原理,最后通过实际案例展示了如何整合这些组件来构建一个可靠、可扩展的自动化运维平台。
|
2天前
|
机器学习/深度学习 运维 监控
构建高效自动化运维体系:从理论到实践
【4月更文挑战第30天】 在信息技术日益发展的今天,自动化运维已经成为提高系统稳定性、优化资源配置和降低人力成本的关键。本文旨在探讨如何构建一个高效的自动化运维体系,涵盖从初步规划到具体实施的全过程。文章首先分析了自动化运维的必要性,接着提出一套完整的构建方案,并详细阐述了关键技术与工具的选择和应用。通过案例分析,验证了所提方案的有效性,并对自动化运维的未来趋势进行了展望。
|
2天前
|
弹性计算 Shell 数据安全/隐私保护
自动化构建和部署Docker容器
【4月更文挑战第30天】
6 0
|
2天前
|
弹性计算 运维 Shell
自动化构建与部署工具链
【4月更文挑战第30天】
11 0
|
2天前
|
运维 监控 安全
构建高效自动化运维系统:策略与实践
【4月更文挑战第30天】 在现代IT基础设施管理中,自动化运维不再是可选项而是必需品。随着复杂性的增加和变更的频繁性,自动化可以提高效率、减少错误并释放人员专注于更有价值的任务。本文将探讨构建一个高效的自动化运维系统的关键环节,包括工具选择、流程设计以及监控和优化策略。通过案例分析和最佳实践分享,读者可以获得实施自动化运维的实用指导和启发。
|
2天前
|
人工智能 运维 监控
构建高效自动化运维体系:DevOps与AI的融合实践
【4月更文挑战第30天】 在当今快速迭代的软件开发环境中,高效的自动化运维体系成为确保交付速度和服务质量的关键。本文探讨了如何通过整合DevOps理念和人工智能(AI)技术来构建一个更加智能、高效的运维体系。文章将详细阐述自动化运维的核心组件,以及如何利用AI技术优化这些组件的性能和决策过程。通过实际案例分析,本文展示了这种融合实践在提高运维效率、降低错误率以及提升系统稳定性方面的显著成效。
|
3天前
|
存储 运维 Kubernetes
构建高效自动化运维体系:Ansible与Kubernetes的协同策略
【4月更文挑战第29天】 在当今快速迭代的软件开发环境中,自动化运维成为了确保部署效率和稳定性的关键。本文深入探讨了如何通过Ansible和Kubernetes的集成来实现高效的自动化配置管理与容器编排。文章首先介绍了Ansible与Kubernetes各自的特点及优势,随后详细阐述了它们在自动化运维中的互补作用,并提供了一个实用的集成方案。通过案例分析,验证了该策略在提高部署速度、降低人为错误以及增强系统可靠性方面的有效性。最后,讨论了实施过程中可能遇到的挑战和解决思路。