前端项目接入gitlab CI/CD实现自动化发布

背景:

目前公司前端项目比较多,发布多是用手动打包的形式实现,当然后期我们基于portainer实现了自己的depoly脚本,但本质上还不够自动化。

gitlab ci/cd是gitlab 自身集成的功能,理论上我们只需要增加一个配置文件即可。

实现步骤:

1、增加gitlab-ci.yml 文件到项目根目录(纯前后端分离项目,这一步就够了)

2、将项目打包镜像所需要的文件,拷贝到项目输出目录里,参考下述copy.js

3、Rancher 上增加应用,导入文件里增加

配置文件:

1、gitlab-ci.yml  

variables:
  package_cmd: 'npm run public'
  npm_install: 'npm --registry https://nexus.sxftwork.com/repository/westmoney-npm-group/ install && npm ls'
  node_version: '16.15.1'
  GIT_STRATEGY: clone

cache:
  paths:
    - $CI_PROJECT_DIR/dist/*
stages:
  - package
  - build
  - push
  - update
 
  
build-code-job:
  stage: build

  only:
    - test
    - pre
  tags:
    - gitlab-runner-share1
  script:
    - echo "begin build images"
    - pwd && ls -al
    - set +e
    - if [[ $CI_COMMIT_TAG ]];then harbor_path="online";image_tag=$CI_COMMIT_TAG; else harbor_path="offline";image_tag=$CI_COMMIT_BRANCH;fi
    - set -e
    - cd dist && docker build -t harbor.saxofintech.com/$harbor_path/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME:$image_tag .


push-code-job:
  stage: push
  only:
    - test
    - pre
  tags:
    - gitlab-runner-share1
  script:
    - echo "begin push images"
    - set +e
    - if [[ $CI_COMMIT_TAG ]];then harbor_path="online";image_tag=$CI_COMMIT_TAG; else harbor_path="offline";image_tag=$CI_COMMIT_BRANCH;fi
    - set -e
    - docker push harbor.saxofintech.com/$harbor_path/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME:$image_tag
    - docker rmi harbor.saxofintech.com/$harbor_path/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME:$image_tag
    - rm -rf $CI_PROJECT_DIR/dist

package-code-job:
  stage: package

  only:
    - test 
    - pre  
  tags:
    - gitlab-runner-share1
  script:
    - echo "begin to package $CI_PROJECT_DIR"
    - echo "$npm_install && $package_cmd" > start_build.sh
    - pwd && ls -al
    - set +e 
    # if you change docker run cmd,you must delete docker container
    #- docker stop $CI_PROJECT_NAME && docker rm $CI_PROJECT_NAME
    - if  docker ps -a | grep $CI_PROJECT_NAME; then docker start $CI_PROJECT_NAME;  else docker run --add-host nexus.sxftwork.com:10.72.88.107 --name $CI_PROJECT_NAME -v $CI_PROJECT_DIR:/usr/src/app -w /usr/src/app node:$node_version sh start_build.sh; fi
    - set -e
    - /data/gitrunner-src/check_build.sh $CI_PROJECT_NAME
    - pwd && ls -al

update-code-job:
  stage: update

  only:
    - test
    - pre
  tags:
    - gitlab-runner-share1
  script:
    - echo "begin update K8S app image"
    - set +e
    - if [[ $CI_COMMIT_TAG ]];then harbor_path="online";image_tag=$CI_COMMIT_TAG; else harbor_path="offline";image_tag=$CI_COMMIT_BRANCH;fi
    - set -e
    - /sbin/kubectl --kubeconfig /root/.kube/wm-fat-config -n westmoney set image deployment/$CI_PROJECT_NAME app=harbor.saxofintech.com/$harbor_path/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME:$image_tag
    - /sbin/kubectl --kubeconfig /root/.kube/wm-fat-config -n westmoney rollout restart deployment $CI_PROJECT_NAME
    - echo "please check K8S status"

2、 copy.js脚本文件:

const fs = require('fs');
const path = require('path');
 
const resolve = (dir) =>{
    return path.resolve(__dirname,dir)
}
const dirs = ['./.nuxt','./static','./router'];
const files = ['./nuxt.config.js','./package.json','./Dockerfile','./env.js'];

const copyFile = (src,dest)=>{
    fs.cp(src,dest,function(err){
        if (err) { 
            return console.error(err); 
        } 
    })
}
 
const filesFromDir = (path)=>{
    return fs.readdirSync(resolve(path))
}

const copyFileSys = (src,dest)=>{
    let fullpath = resolve(src)
    let stat = fs.lstatSync(fullpath);
    let isDirectory = stat.isDirectory();
    // console.log(`${fileFullPath}是否是文件夹:`+stat.isDirectory()) //是文件夹吗
    if(isDirectory){
        console.log('文件夹路径:',fullpath)
        let curLevelFiles =  filesFromDir(fullpath);
        curLevelFiles.forEach((name,j)=>{
        let curLevelDestFileFullPaths =  resolve(`${fullpath}/${name}`);
        copyFileSys(curLevelDestFileFullPaths,curLevelDestFileFullPaths.replace(__dirname,`${__dirname}/dist`));
       })
    }else{
        console.log('文件路径:',fullpath);
        copyFile(src,dest);
    }
}


fs.mkdir(resolve('./dist'),function(err){
    files.forEach((item,index)=>{
        fs.copyFile(resolve(item),resolve(`./dist/${item}`),function(err){
            if (err) { 
                return console.error(err); 
            } 
        })
    })
    dirs.forEach((item,index)=>{
        copyFileSys(item,resolve('./dist'));
    })
 
});

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前端CI/CD是指通过自动化的流程来实现前端应用的持续集成和持续交付。在使用GitLab CI/CD部署前端项目时,可以通过一系列的步骤来实现自动打包UniApp应用。 首先,可以使用Docker镜像部署的方式来搭建CI/CD环境。Docker容器可以提供一个隔离的运行环境,方便管理和部署应用。 接下来,需要设置远程服务器或云服务(如阿里云OSS、华为云OBS)的相关配置。远程服务器可以作为打包后应用的存储位置,可以通过配置文件或环境变量的方式将相关信息传递给CI/CD流水线。 然后,需要编写部署脚本来实现自动打包并将应用部署到指定路径。部署脚本可以包括删除原有的dist文件、创建新的dist文件夹、解压压缩包到指定目录等操作。 最后,可以通过流水线来触发CI/CD流程。流水线可以根据代码仓库的变动触发执行,自动拉取最新代码,自动构建打包,并自动生成dist文件并部署到指定路径。 如果遇到问题,可以查看CI/CD的执行日志,以便更好地定位问题和进行排查。通过日志可以了解每个步骤的执行情况,帮助解决可能出现的错误或异常情况。 综上所述,使用GitLab CI/CD可以实现前端UniApp应用的自动打包和部署,通过配置远程服务器或云服务,并编写部署脚本,可以实现持续集成和持续交付的自动化流程。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值