jenkins 编译.net 结合 ansible 操作 windows 进行发布

本贴最后更新于 1736 天前,其中的信息可能已经时移俗易

使用 Jenkins 编译.net 项目需要用到 windows 的 slave 节点,安装依赖的工具:如 MSBuild 和.NET Framework, winrar 等

MSBuild 可以直接安装和开发使用一致版本的 Visual Studio,使用其自带的 MSBuild.exe,比如我这里安装了 Visual Studio 2019 对应的路径为 C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\amd64\MSBuild.exe
把用到的工具的路径加入到 windows slave 配置环境变量 path 中
image.png

jenkins pipeline

pipeline {
    agent { label 'windows-slave' }
    parameters{
        gitParameter branchFilter: '.*', tagFilter: '.*', defaultValue: 'dev', name: 'TAG', type: 'PT_BRANCH_TAG', selectedValue: 'TOP', sortMode: 'DESCENDING_SMART'
        choice(name: 'PLAYBOOK', choices: 'net\nnet-rollback', description: 'net 部署\nnet-rollback 回滚')
        choice(name: 'HOSTS', choices: 'test-pms-group', description: '选择发布的主机组:\ntest-pms-group 测试环境')
    }
    
    environment {
        GIT = 'http://example.com/mgpms/MG_HuiZhu.git'
        PROJECT = 'MG_HuiZhu'
        APP_PATH = 'D:\\data\\apps\\MG_HuiZhu\\'
        BUILDFILE = 'MG_HuiZhu2.0\\Huazhu.PMS.WebSite\\Huazhu.PMS.WebSite.csproj'
        SOLUTIONDIR = "${WORKSPACE}\\MG_HuiZhu2.0\\"
        PACKAGE = "${WORKSPACE}\\MG_HuiZhu2.0\\Huazhu.PMS.WebSite\\obj\\Release\\Package\\PackageTmp\\"
        CONFIGURATION = 'Release'
        PLAYBOOK = "$PLAYBOOK" // ansible的的的palybook
        MAIL_TO = "yunwei@hhotel.com"
        ZIP = "target"
        CHECK_TAG = "${TAG}" // 分支或tag
    }
    
    stages {
        stage ('克隆代码') {
            steps {
                deleteDir() // 清理工作目录
                git credentialsId: '9c9b7b17-04d5-47de-9b8f-6207a78e6973', url: "${GIT}" 
                bat 'git checkout %CHECK_TAG%'
            }
        }

        stage ('编译打包') {
            steps {
                script {
                    bat 'echo %TIME%'
                    bat 'MSBuild %BUILDFILE% /p:Configuration=%CONFIGURATION% /p:SolutionDir=%SOLUTIONDIR% /t:Rebuild /p:DeployOnBuild=true /p:AllowUntrustedCertificate=True' 
                    bat 'rd /s/q D:\\jenkins\\workspace\\test-MG_HuiZhu\\MG_HuiZhu2.0\\Huazhu.PMS.WebSite\\Scripts\\Plugin\\My97DatePicker\\'
                    bat 'winrar a -ep1 -r target.zip %PACKAGE%'
                    stash(name: "target", includes: "target.zip")
                }
            }
        }
        
        stage ('部署') {
            agent { label "master" }
            environment {
                TIME = sh(script: "date '+%Y%m%d%H%M%S'", returnStdout: true).trim()
            }
            steps {
                deleteDir() // 清理工作目录
                unstash("target")
                ansiblePlaybook(
                    playbook: "/data/ansible/playbook/${PLAYBOOK}.yml",
                    extraVars: [
                        APP_PATH:"${APP_PATH}",
                        HOSTS:"${HOSTS}",
                        PROJECT:"${PROJECT}",
                        WORKSPACE:"${WORKSPACE}",
                        ZIP:"${ZIP}",
                        TIME:"${TIME}"
                    ]
                )
            }
        }      
    }
    

}

playbook.yml

---
- hosts: "test-pms-all"
  serial: "50%"
  tasks:
    - name: create app dir
      win_command: CMD /C "md D:\data\apps\{{PROJECT}}"
      ignore_errors: True
    - name: create backup dir
      win_command: CMD /C "md D:\data\backup\{{TIME}}"
      ignore_errors: True
    - name: backup website
      win_copy:
        src: D:\data\apps\{{PROJECT}}
        dest: D:\data\backup\{{TIME}}
        remote_src: True
      ignore_errors: True
    - name: transfer artifacts to target hosts
      win_copy:
        src: "{{WORKSPACE}}/{{ZIP}}.zip"
        dest: D:\data\apps\{{PROJECT}}\
    - name: unzip artifacts
      win_unzip:
        src: D:\data\apps\{{PROJECT}}\target.zip
        dest: D:\data\apps\{{PROJECT}}
        creates: no
        delete_archive: yes
    - name: restart website
      win_iis_website: name={{PROJECT}} state=restarted

ansible 使用 wrm 来对 windows 服务器进行操作。
要求:
.NET Framework 3.0 以上
Powershell 3.0 以上
开启 winrm
image.png
image.png
image.png

使用管理员权限打开 Powershell
查看版本

get-host

更改 powershell 策略为 remotesigned

set-executionpolicy remotesigned
get-executionpolicy

查看 winrm service listener
https 方式的使用 5986,http 使用 5985

winrm enumerate winrm/config/listener

配置 winrm 服务

winrm quickconfig

配置 auth 为 true(默认为 false)

winrm set winrm/config/service/auth '@{Basic="true"}'

配置允许非加密方式

winrm set winrm/config/service '@{AllowUnencrypted="true"}'

安装 ansible 依赖包 pywinrm 模块

pip install pywinrm

模块路径
image.png
常用模块

win_acl 设置文件/目录属主属组权限;
win_copy 拷贝文件到远程Windows主机;
win_file 创建,删除文件或目录;
win_lineinfile 匹配替换文件内容;
win_package 安装/卸载本地或网络软件包;
win_ping Windows系统下的ping模块,常用来测试主机是否存活;
win_service 管理Windows Services服务;
win_user 管理Windows本地用户。

使用方法可以直接阅读源码中的说明

/usr/lib/python2.7/site-packages/ansible-2.4.1.0-py2.7.egg/ansible/modules/windows/

ansible 配置 inventory
用户名密码使用 windows 普通用户账号即可,端口使用之前查到的 5985,注意不是 3389

[test-group]
test-01 ansible_host=IP ansible_ssh_port=5985 ansible_ssh_user=USER ansible_ssh_pass=PASSWD ansible_connection=winrm ansible_winrm_server_cert_validation=ignore ansible_winrm_transport=ssl

测试一下

ansbile test-group -m win_ping
返回如下信息则成功
test-group | SUCCESS => {
    "changed": false, 
    "failed": false, 
    "ping": "pong"
}
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    51 引用 • 37 回帖
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    40 引用 • 24 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖 • 1 关注
  • abitmean

    有点意思就行了

    23 关注
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    106 引用 • 152 回帖
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    89 引用 • 113 回帖
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    313 引用 • 1667 回帖 • 1 关注
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 594 关注
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    124 引用 • 580 回帖
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    43 引用 • 208 回帖 • 1 关注
  • 博客

    记录并分享人生的经历。

    270 引用 • 2386 回帖
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 559 关注
  • 倾城之链
    23 引用 • 66 回帖 • 102 关注
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 245 关注
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 589 关注
  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 635 关注
  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    1 引用 • 11 回帖 • 2 关注
  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用 • 25 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 45 关注
  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    84 引用 • 139 回帖
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 383 回帖 • 5 关注
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    25 引用 • 191 回帖 • 21 关注
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 609 关注
  • 负能量

    上帝为你关上了一扇门,然后就去睡觉了....努力不一定能成功,但不努力一定很轻松 (° ー °〃)

    85 引用 • 1201 回帖 • 449 关注
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    91 引用 • 751 回帖
  • Bootstrap

    Bootstrap 是 Twitter 推出的一个用于前端开发的开源工具包。它由 Twitter 的设计师 Mark Otto 和 Jacob Thornton 合作开发,是一个 CSS / HTML 框架。

    18 引用 • 33 回帖 • 684 关注
  • Ubuntu

    Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。

    123 引用 • 168 回帖
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 455 关注