美文网首页全新框架开发应用gitlab
使用Gitlab Runner进行CICD实例

使用Gitlab Runner进行CICD实例

作者: 文景大大 | 来源:发表于2022-09-20 11:21 被阅读0次

    上一篇文章只是介绍了Gitlab Runner的入门案例,并没有涉及到真正的CICD流程,本文主要通过如下案例来举例说明CICD的一个简单过程:

    • 案例一:通过nginx部署一个前端单页面应用;
    • 案例二:通过nginx部署一个前端Vue应用;
    • 案例三:通过tomcat部署一个后端Java应用;

    建议阅读完上一篇文章后,再进行本文的实验,如果已经完全掌握Gitlab Runner,可以继续。

    案例一:Nginx部署前端单页应用

    1.1 案例目标

    我们有一个cicd-test项目,里面只有一个html页面,我们使用windows gitlab runner将该页面部署到本地windows的nginx上,实现通过浏览器能访问到该页面的目标。

    1.2 准备工作

    • 安装windows版本的gitlab runner;

      PS C:\Windows\system32> cd D:\gitlab-runner
      PS D:\gitlab-runner> .\gitlab-runner-windows-amd64.exe register
      Runtime platform                                    arch=amd64 os=windows pid=18096 revision=bbcb5aba version=15.3.0
      Enter the GitLab instance URL (for example, https://gitlab.com/):
      http://10.96.12.149/
      Enter the registration token:
      cXVdLXP2feFe8WYVA4c-
      Enter a description for the runner:
      [GLIC-IT-ZX02]: win-runner-01
      Enter tags for the runner (comma-separated):
      
      Enter optional maintenance note for the runner:
      
      Registering runner... succeeded                     runner=cXVdLXP2
      Enter an executor: virtualbox, docker+machine, kubernetes, custom, docker-windows, docker-ssh, ssh, docker-ssh+machine, docker, parallels, shell:
      shell
      Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
      
      Configuration (with the authentication token) was saved in "D:\\gitlab-runner\\config.toml"
      PS D:\gitlab-runner> .\gitlab-runner-windows-amd64.exe install
      Runtime platform                                    arch=amd64 os=windows pid=21068 revision=bbcb5aba version=15.3.0
      PS D:\gitlab-runner> .\gitlab-runner-windows-amd64.exe start
      Runtime platform                                    arch=amd64 os=windows pid=17352 revision=bbcb5aba version=15.3.0
      
    • 修改本地gitlab runner的shell启动命令;

      该步骤是必须的,不然部署任务在启动shell脚本时会报错:

      ERROR: Job failed (system failure): prepare environment: failed to start process: exec: "pwsh": executable file not found in %PATH%.
      

      这是因为gitlab runner默认会使用pwsh.exe来打开shell,但是win10默认没有安装这个工具,只有powershell.exe,因此我们需要修改gitlab runner的配置文件,地址为"D:\\gitlab-runner\\config.toml",在上一步gitlab runner注册成功的时候有显示。

      [[runners]]
        name = "win-runner-01"
        url = "http://10.96.12.149/"
        id = 6
        token = "-9aDynfbhK2Gr2v5jFJ7"
        token_obtained_at = 2022-09-16T08:19:42Z
        token_expires_at = 0001-01-01T00:00:00Z
        executor = "shell"
        #注释:将下行内容的pwsh修改为powershell 
        # shell = "pwsh"
        shell = "powershell"
        [runners.custom_build_dir]
        [runners.cache]
          [runners.cache.s3]
          [runners.cache.gcs]
          [runners.cache.azure]
      

      该问题的详细解释可以参考:gitlab-runner: prepare environment failed to start process pwsh in windows - Stack Overflow

    • 准备nginx环境;

      下载windows版本的nginx,并解压到自定义目录下,我这边是D:\nginx-1.20.2,nginx默认启动是80端口,如果80端口已被占用,可自行修改nginx.conf中的端口内容。

    1.3 项目内容

    • 定义CICD流程;

      如下是项目中.gitlab-ci.yml的配置内容,我们当前案例比较简单,只有一个部署操作。

      # 定义pipeline的阶段
      stages:
        - deploy
      
      deploy-job:
        stage: deploy
        script:
          # 将当前代码库目录下的文件拷贝到nginx的默认html目录下
          - cp .\hello.html D:\nginx-1.20.2\html\
      
    • 提交推送代码触发流水线;

      准备html文件,内容如下:

      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>CICD测试</title>
      </head>
      <body>
      <h1>Gitlab CICD 测试!!!</h1>
      </body>
      </html>
      

      然后将本地代码内容推送到远程代码仓库上,会自动触发流水线的运行。

    1.4 结果验证

    此时可以查看流水线的运行情况,我这里显示运行成功:

    Running with gitlab-runner 15.3.0 (bbcb5aba)
      on win-runner-01 -9aDynfb
    Preparing the "shell" executor
    00:00
    Using Shell executor...
    Preparing environment
    00:01
    Running on IT-ZX02...
    Getting source from Git repository
    00:15
    Fetching changes with git depth set to 20...
    Initialized empty Git repository in D:/gitlab-runner/builds/-9aDynfb/0/gitlab-instance-9a531526/cicd-test/.git/
    Created fresh repository.
    Checking out 337f4901 as main...
    git-lfs/2.13.3 (GitHub; windows amd64; go 1.16.2; git a5e65851)
    Skipping Git submodules setup
    Executing "step_script" stage of the job script
    00:01
    $ cp .\hello.html D:\nginx-1.20.2\html\
    Job succeeded
    

    然后检查下nginx的目录下D:\nginx-1.20.2\html\确实多了hello.html,此时访问localhost:80/hello.html,就能访问到新的页面了。

    至此,案例一CICD流程成功。

    案例二:Nginx部署前端Vue应用

    2.1 案例目标

    我们按照Vue官方指引新建一个初始化应用,然后使用windows gitlab runner将该项目打包后部署到本地windows的nginx上,实现通过浏览器能访问到该页面的目标。

    2.2 准备工作

    需要安装最新版本的Node.js运行环境,这个可以参考Vue官方指引

    然后其它步骤,比如gitlab runner的注册,nginx的安装同1.2中的内容。

    2.3 项目内容

    按照Vue的官方指引,在本地某个目录下生成一个初始化应用,确保如下命令成功后再往下继续。

    npm install
    npm run dev
    

    访问改项目主页能成功后再往下继续。

    然后,我们再定义我们的CICD流程,.gitlab-ci.yml内容如下:

    stages:
      - install
      - build
      - deploy
    
    # 定义需要缓存的目录
    cache:
      paths:
        - node_modules
        - dist
    
    install-job:
      stage: install
      script:
        - npm install
    
    build-job:
      stage: build
      script:
        - npm run build
      # 可在流水线上下载本阶段作业的制品
      artifacts:
        name: "dist"
        paths:
          - dist 
    
    deploy-job:
      stage: deploy
      script:
        - cp -r .\dist\* D:\nginx-1.20.2\html\
    

    其中需要注意的是,我们使用了cache关键字,然后指定了需要缓存的路径,这是为什么呢?

    因为gitlab每个作业在进行的时候,都会删除上一个作业新增的内容,比如install阶段,会新增node_modules目录资源,那么在接下来的build阶段,会删除该目录再执行作业,同理,在deploy阶段会删除build阶段新增的dist目录资源。因此,如果不配置缓存,那么build和deploy肯定就不能成功了,所以我们才需要将这两个目录缓存下来。

    在执行build和deploy作业的时候,虽说还会删除上一个作业的新增目录资源,但是声明需要被缓存的目录会在下一个作业开始的时候被恢复的。如下是deploy阶段作业的执行记录:

    Running with gitlab-runner 15.3.0 (bbcb5aba)
      on win-runner-01 imSTjF34
    *******
    # 删除上一步作业新增的目录
    Removing dist/
    Removing node_modules/
    git-lfs/2.13.3 (GitHub; windows amd64; go 1.16.2; git a5e65851)
    Skipping Git submodules setup
    # 开始恢复缓存内容
    Restoring cache
    00:03
    Version:      15.3.0
    Git revision: bbcb5aba
    Git branch:   15-3-stable
    GO version:   go1.17.9
    Built:        2022-08-19T22:41:07+0000
    OS/Arch:      windows/amd64
    Checking cache for default-protected...
    Runtime platform                                    arch=amd64 os=windows pid=19504 revision=bbcb5aba version=15.3.0
    No URL provided, cache will not be downloaded from shared cache server. Instead a local version of cache will be extracted. 
    # 恢复缓存成功
    Successfully extracted cache
    # 执行脚本
    Executing "step_script" stage of the job script
    00:01
    $ cp -r .\dist\* D:\nginx-1.20.2\html\
    Saving cache for successful job
    00:01
    Version:      15.3.0
    Git revision: bbcb5aba
    Git branch:   15-3-stable
    GO version:   go1.17.9
    Built:        2022-08-19T22:41:07+0000
    OS/Arch:      windows/amd64
    Creating cache default-protected...
    Runtime platform                                    arch=amd64 os=windows pid=19240 revision=bbcb5aba version=15.3.0
    node_modules: found 673 matching files and directories 
    dist: found 7 matching files and directories       
    Archive is up to date!                             
    Created cache
    

    2.4 结果验证

    推送如上项目内容到git仓库后,就会自动触发流水线执行上述CICD流程,可以看到本地nginx的目录下多了项目内容,并且启动nginx后可以访问到项目了。

    案例三:Tomcat部署后端Java应用

    3.1 案例目标

    我们使用start.spring.io创建一个入门Spring Boot应用,然后使用windows gitlab runner将该项目打包后部署到本地windows的tomcat上,实现通过浏览器能访问到该应用接口的目标。

    3.2 准备工作

    需要下载并安装jdk运行环境环境,需要下载并安装maven工具,这两个的教程比较多,此处不再赘述。

    然后其它步骤,比如gitlab runner的注册同1.2中的内容。

    3.3 项目内容

    start.spring.io创建一个SpringBoot应用如下:

    java-cicd项目创建

    然后用idea打开项目后,随意编写一个测试接口:

    @Slf4j
    @RestController
    public class HelloController {
    
        @RequestMapping("/hello")
        public String getHello(){
            return "hello!";
        }
    }
    

    本地启动项目,确保项目和如上接口能正常运行。

    然后新增.gitlab-ci.yml文件内容如下:

    stages:
      - build
      - deploy
    
    # 定义需要缓存的目录
    cache:
      paths:
        - target
    
    build-job:
      stage: build
      script:
        - mvn -DskipTests=true clean package
      # 可在流水线上下载本阶段作业的制品
      artifacts:
        name: "jar"
        paths:
          - target\java-cicd-test-0.0.1-SNAPSHOT.jar
    
    deploy-job:
      stage: deploy
      script:
        - cp target\java-cicd-test-0.0.1-SNAPSHOT.jar D:\java\
        - cd D:\java\
        - java -jar java-cicd-test-0.0.1-SNAPSHOT.jar
    

    然后提交代码到gitlab仓库,就触发流水线运行。

    3.4 结果验证

    浏览器访问http://localhost:8080/hello,能够正常访问该应用的接口。

    相关文章

      网友评论

        本文标题:使用Gitlab Runner进行CICD实例

        本文链接:https://www.haomeiwen.com/subject/siamortx.html