实现 GitLab CI/CD 自动化发布网站至本地IIS服务器
下面列出我本次使用的环境:
操作系统:Windows 11项目版本:.NET Core 6.0脚本执行环境:PowerShell 5.1.22621.963Web服务器:IIS 10.0Gitlab:git.local
基本步骤
-
配置GitLab CI/CD Runner
首先,在本地或公司内网的机器上设置一个GitLab CI/CD Runner,该Runner将用于执行CI/CD任务。确保该Runner已经正确配置和注册到GitLab服务器。注册流程
- 下载 Gitlab Runner
下载地址:https://docs.gitlab.com/runner/install/本次下载的版本为Windows amd64下载好后将文件改名为gitlab-runner.exe,使用cmd管理员模式进入到该文件目录-
注册 Gitlab Runner命令行输入
.\gitlab-runner register出现提示Enter the GitLab instance URL (for example,https://gitlab.com/):此时需要输入协调器的地址,这个地址是在你 gitlab 项目的左侧导航栏,设置下的CI/CD中,找到Runner点击展开,就会看到指定Runner和共享Runner,这里我们使用指定Runner做演示说明。
复制URL至刚才的命令中回车。出现提示:Enter the registration token:,此时输入CI/CD下的 注册令牌,然后需要输入描述,根据需求填。之后提示:Enter tags for the runner (comma-separated):,需要我们输入 Runner 的标签,这里我使用 deploy。输入后回车提示Enter optional maintenance note for the runner:也根据需求填。回车后正常提示:(如报错请见注册Gitlab Runner时报错)
最后一个提示:Enter an executor: parallels, virtualbox, docker+machine, instance, kubernetes, docker-windows, docker-ssh, shell, ssh, docker-autoscaler, docker-ssh+machine, custom, docker:,需要我们填入脚本的执行环境,这里先填shell,这时你的 gitlab-runner.exe 下会生成一个config.toml文件,里面保存着我们刚刚输入的信息。
完整命令
也可尝试用参数一次性输入./gitlab-runner.exe register --non-interactive --tls-ca-file=/etc/gitlab/ssl/git.local.crt --url "https://git.local/" --registration-token "你的Runner注册令牌" --executor "shell" --description "runner" --tag-list "deploy" --run-untagged --locked="false"
-
将 Shell 改成 PowerShell上面选择脚本执行环境的时候我们选了
shell,但是本次我是在 Windows 环境下运行,所以需要将它改为 PowerShell,打开config.toml文件,在[[runners]]下改成shell = "powershell",然后保存文件即可。
-
创建CI/CD配置文件
在你的项目中创建一个名为.gitlab-ci.yml的文件,该文件定义了CI/CD的工作流程。在该文件中,需要定义一系列的阶段和任务,以完成自动化发布网站至本地IIS的过程。以下为示例代码:before_script: - cd src stages: - build # job test: stage: build # 将会执行的脚本 script: - dotnet restore - dotnet build # 哪个分支会执行 only: - main #runner 注册时的 tag,这里指会触发的 runner tags: - deploy以上代码在使用runner运行时会出现以下错误:
原因可能为项目未restore完成就开始build,所以还是需要在脚本上对每个步骤进行细分,以下为修改后的脚本:before_script: #解决powershell中文乱码问题 - chcp 65001 #进入项目工作目录 - cd src # 执行的 job stages: - restore - build - deploy # 校验代码 restore: stage: restore # 将会执行的脚本 script: - dotnet restore # 哪个分支会执行 only: - main #runner 注册时的 tag,这里指会触发的 runner tags: - deploy build: stage: build # 将会执行的脚本 script: - dotnet build # 哪个分支会执行 only: - main #runner 注册时的 tag,这里指会触发的 runner tags: - deploybefore_script在整个项目 clone 到 Runner 所处的服务器时会先执行这个里面的脚本,这里我是进入到了 src 目录,你还可以在这里面做一些包还原的操作。stages里放的是将会执行的 job。build是做作业(job),这个命名你可以根据自己的情况来。build就是上面stages会执行的 job 的真正配置处。stage对应stages中的项,如果一个 job 没有指定 stage,那么这个任务会分配到test stage。script就是执行的脚本,构建自动化的核心也就是在此处。作为简单的演示,我就还原了包和生成项目。only是值该 job 会在被哪些分支 push 触发。tags上面在我们注册时有提到过,这个tags对应的是我们注册gitlab runner时所填的tags,表示的是该 job 会触发哪些 Runner。
OK,我们此时已经将一个最简单的.gitlab-ci.yml构建好了,将配置好的文件 push(推送)到远端。回到 gitlab 中,我们点击CI/CD可以看到有一个流水线在运行。
-
检出代码
在CI/CD配置文件中的第一个阶段,使用Git命令或GitLab提供的CI/CD变量来检出代码库。这将确保在CI/CD Runner上获取最新的代码。会从gitlab库中将最新代码拉至本地
-
构建和打包网站
根据项目需求,执行一些构建和打包的操作,例如编译源代码、安装依赖项等。这些步骤可以在CI/CD配置文件中定义为任务。
-
自动化部署网站至本地IIS
编写脚本或命令来将打包好的网站部署至本地IIS。包括将文件复制到IIS的网站目录、配置IIS站点和应用程序池等。可以使用PowerShell脚本或其他适合的工具来执行这些操作。在进行编写剩下的脚本之前需要定义几个变量:
WebsiteName:站点名称,用户关闭 IIS 站点和 IIS 对应进程池的,如果你的进程池和站点的名称不一致 请再声明一个变量。WebsitePath:站点的路径,用于备份、删除原有站点、新的项目复制到该路径下。before_script:
#中文乱码问题
- chcp 65001
- cd src
# 执行的 job
stages:
- restore
- build
- deploy
# 校验代码
restore:
stage: restore
# 将会执行的脚本
script:
# 使用NuGet还原project.json文件中被指定的依赖项,以及特定于项目的工具。
- dotnet restore
# 哪个分支会执行
only:
- main
#runner 注册时的 tag,这里指会触发的 runner
tags:
- deploy
build:
stage: build
# 将会执行的脚本
script:
# 生成项目及其所有依赖项
- dotnet build
# 哪个分支会执行
only:
- main
#runner 注册时的 tag,这里指会触发的 runner
tags:
- deploy
deploy:
stage: deploy
script:
# 声明一个变量保存当前时间,用作备份数据文件夹名称
- $datetime=Get-Date -Format 'yyyy-MM-dd-HH-mm'
- |#当站点未停止时才执行停止站点指令
if ((C:\Windows\System32\inetsrv\appcmd.exe list site $env:WebsiteName | Select-String -Pattern 'STOPPED') -eq $null) {
C:\Windows\System32\inetsrv\appcmd.exe stop site $env:WebsiteName
}
- | # 当进程池未停止时才执行停止进程池指令
if ((C:\Windows\System32\inetsrv\appcmd.exe list apppool /apppool.name:$env:WebsiteName | Select-String -Pattern 'STOPPED') -eq $null) {
C:\Windows\System32\inetsrv\appcmd.exe stop apppool /apppool.name:$env:WebsiteName
}
- |
if (Test-Path $env:WebsitePath) { # 检查原有项目文件是否存在
# 备份原有项目文件
cp $env:WebsitePath "$env:WebsitePath$datetime" -Recurse
}
# 编译打包项目至iis目录
- dotnet publish -c debug --no-self-contained -o E:\IIS_Server\AlgoDisplay\publish
# 启动进程池
- C:\Windows\System32\inetsrv\appcmd.exe start apppool /apppool.name:"$env:WebsiteName"
# 启动 IIS 站点
- C:\Windows\System32\inetsrv\appcmd.exe start site $env:WebsiteName
only:
- main
tags:
- deploy
到这一步整个自动化发布已经完成了,我们只要 push 代码到远端就会自动部署我们的项目到 IIS 中,但是需要注意必须确保你的 IIS 中已经配置好这个站点了。
回到 gitlab 中查看
CI/CD 可以看到这次我们的阶段有三个,因为我配置了三个作业(job),一个 restore一个 build和一个 deploy。

IIS路径下文件已备份完毕,网站也可以正常访问了。

-
清理和收尾
最后,在部署完成后,可以添加一些任务来清理临时文件、关闭连接等,以确保CI/CD环境保持干净和可靠。
遇到的坑
注册Gitlab Runner时报错
ERROR: Registering runner... failed runner=GR1348941ZNHLJa9w status=couldn't execute POST against https://git.local/api/v4/runners: Post "https://git.local/api/v4/runners": x509: certificate signed by unknown authority PANIC: Failed to register the runner.

将生成的
git.local.crt 按步骤:控制台1-收信人的根证书颁发机构-证书-右键-导入
作业挂起中,等待进入队列,没有执行流水线
先清除runner缓存
用管理员模式打开cmd,进入runner目录下,输入命令:
./gitlab-runner stop ./gitlab-runner start./gitlab-runner run / ./gitlab-runner --debug run 接着按上方向键?
runner开始运行
解决
参考资料:
1. GitLab CI/CD官方文档
https://docs.gitlab.com/ee/ci/introduction/
2. 敏捷开发、持续集成/交付(CI/CD)、DevOps学习笔记
https://blog.csdn.net/CrankZ/article/details/81545439
3. 什么是CI/CD
https://github.com/moxi624/LearningNotes/blob/master/%E6%9D%82%E8%AE%B0/%E4%BB%80%E4%B9%88%E6%98%AFCICD/README.md
4. 使用Gitlab CI/CD 实现自动化发布站点到 IIS
https://www.cnblogs.com/AMortal/p/10845783.html

浙公网安备 33010602011771号