首页 > 其他分享 >实现 GitLab CI/CD 自动化发布网站至本地IIS服务器

实现 GitLab CI/CD 自动化发布网站至本地IIS服务器

时间:2023-07-02 22:12:00浏览次数:49  
标签:CI gitlab IIS runner GitLab CD Runner

下面列出我本次使用的环境:

操作系统:Windows 11 项目版本:.NET Core 6.0 脚本执行环境:PowerShell 5.1.22621.963 Web服务器:IIS 10.0 Gitlab:git.local
 

基本步骤

  1. 配置GitLab CI/CD Runner

      首先,在本地或公司内网的机器上设置一个GitLab CI/CD Runner,该Runner将用于执行CI/CD任务。确保该Runner已经正确配置和注册到GitLab服务器。

      注册流程

    1. 下载 Gitlab Runner
                    下载地址:https://docs.gitlab.com/runner/install/                 本次下载的版本为Windows amd64                 下载好后将文件改名为 gitlab-runner.exe,使用cmd管理员模式进入到该文件目录
    1. 注册 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"
    2. 将 Shell 改成 PowerShell     上面选择脚本执行环境的时候我们选了 shell,但是本次我是在 Windows 环境下运行,所以需要将它改为 PowerShell,打开 config.toml 文件,在 [[runners]] 下改成 shell = "powershell" ,然后保存文件即可。     

       

  1. 创建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:
        - deploy

     

      before_script 在整个项目 clone 到 Runner 所处的服务器时会先执行这个里面的脚本,这里我是进入到了 src 目录,你还可以在这里面做一些包还原的操作。   stages 里放的是将会执行的 job。   build 是做作业(job),这个命名你可以根据自己的情况来。build 就是上面 stages 会执行的 job 的真正配置处。
    1. stage 对应 stages 中的项,如果一个 job 没有指定 stage,那么这个任务会分配到test stage。
    2. script 就是执行的脚本,构建自动化的核心也就是在此处。作为简单的演示,我就还原了包和生成项目。
    3. only 是值该 job 会在被哪些分支 push 触发。
    4. tags 上面在我们注册时有提到过,这个 tags 对应的是我们注册 gitlab runner 时所填的 tags,表示的是该 job 会触发哪些 Runner。
      OK,我们此时已经将一个最简单的 .gitlab-ci.yml 构建好了,将配置好的文件 push(推送)到远端。回到 gitlab 中,我们点击 CI/CD 可以看到有一个流水线在运行。  
  1. 检出代码

      在CI/CD配置文件中的第一个阶段,使用Git命令或GitLab提供的CI/CD变量来检出代码库。这将确保在CI/CD Runner上获取最新的代码。   会从gitlab库中将最新代码拉至本地
  1. 构建和打包网站

      根据项目需求,执行一些构建和打包的操作,例如编译源代码、安装依赖项等。这些步骤可以在CI/CD配置文件中定义为任务。
  1. 自动化部署网站至本地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路径下文件已备份完毕,网站也可以正常访问了。

 

  1. 清理和收尾

      最后,在部署完成后,可以添加一些任务来清理临时文件、关闭连接等,以确保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. 网上搜索原因为证书签名错误,需要reconfig重新生成自签名证书 将生成的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

标签:CI,gitlab,IIS,runner,GitLab,CD,Runner
From: https://www.cnblogs.com/glostyear/p/17515951.html

相关文章

  • 企业级GitLab搭建
    企业级GitLab搭建一、简介1.GitLab概述是一个利用RubyonRails开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。RubyonRails是一个可以使你开发、部署、维护web应用程序变得简单的框架。GitLab拥有与Github类似的功能,能够浏......
  • IOS开发-设置UILabel行间距lineSpacing
    1.如何设置UILabel行间距lineSpacing UILabel是没有这么一个直接暴露的属性的,想要修改lineSpacing,我们需要借助NSAttributedString来实现。NSMutableParagraphStyle*style=[NSMutableParagraphStylenew];style.lineSpacing=15;NSMutableDictionary*attribu......
  • appassembler-maven-plugin useAllDependencies
    http://mojo.codehaus.org/appassembler/appassembler-maven-plugin/assemble-mojo.htmlThefollowingcanbeusedtouseallprojectdependenciesinsteadofthedefaultbehaviorwhichrepresentsruntimedependenciesonly.forgoal:assembleitcanaddothersc......
  • P7316 [COCI2018-2019#3] NLO
    考虑延续GDKOI普及组签到题的做法。先枚举\((x,y)\)考虑他会更新哪些节点,那么这个在GDKOI上是体现在一个差分上面。这里\(n\)很大而\(k\)很小,那么我们就可以考虑枚举\(n\)和\(k\),但是使用线段树来做。但是注意到一个事情,我们做区间赋值附的不是简单的$0/1$......
  • loan deal/loan facility
    loandeal:bankgivealoantoborrowerLOANDEALIDVERSIONLDRDEALIDLDRVERSIONDEALSNPCUSIPDEALTYPEDEALNAMEDEALDESCDEALSTATUSCRAGREEMENTDATECRAGREEMENTCLSDATECRAGREEMENTEFFDATECRAGREEMENTMATDATEGLOBALSIZEGLOBALCCYSYNDCOUNTRYREFINANCEFLAGAMENDFLAGRESTATEFLAGIS......
  • gitlab--缓存 cache
    缓存cache介绍使用 cache 指定要在作业之间缓存的文件和目录列表。您只能使用本地工作副本中的路径。缓存在流水线和作业之间共享。缓存在产物之前恢复。cache:paths使用cache:paths关键字来选择要缓存的文件或目录,路径是相对于项目目录,不能直接链接到项目目录之外例如......
  • PyTorch项目实战09——CIFAR10数据的读取和展示
    1CIFAR10cifar10的官方网址:<http://www.cs.toronto.edu/~kriz/cifar.html>是由32\*32像素的60000张图片组成的数据集,50000张图片用于训练,10000张图片用于测试,其中有10个类别,每个类别有6000张图片,分类之间彼此独立,不会重叠,因此是一个单标签多分类的问题。2读取CIFAR10数据首先在......
  • [ GitLab ] GitLab CE 中各个参数对应的服务和功能,以及是否可以关闭
    https://www.cnblogs.com/yeungchie/ChatGPT说的。nginx:作为Web服务器和反向代理,用于访问GitLab的Web界面。可以关闭,但会导致无法通过Web界面访问GitLab。prometheus_monitoring:提供监控和报警功能,收集和分析GitLab的性能指标。可以关闭,不影响基本代码存放功能。registry:......
  • Scipy -- 科学计算库
    Scipy--科学计算库目录:文件输入/输出:scipy.io特殊函数:scipy.special线性代数运算:scipy.linalg插值:scipy.interpolate优化和拟合:scipy.optimize统计和随机数:scipy.stats数值积分:scipy.integrate快速傅里叶变换:scipy.fftpack信号处理:scipy.signal图像处理:sc......
  • javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabl
    一、问题现场二、处理方案VMoptions"-Djdk.tls.disabledAlgorithms=SSLv3,TLSv1.1,RC4,DES,MD5withRSA,DHkeySize<1024,ECkeySize<224,3DES_EDE_CBC,anon,NULL,includejdk.disabled.namedCurves"Workingdirectory$ProjectFileDir$ 三、处理结果......