Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

15分钟手把手带你搭建一个可archive一个zip包的pipeline #42

Open
fayeah opened this issue Nov 11, 2020 · 0 comments
Open

Comments

@fayeah
Copy link
Owner

fayeah commented Nov 11, 2020

Prerequisite

  • 可运行的Jenkins环境
  • 一个git仓库

背景/需求

我们希望能根据 不同的环境拿到不同的secret,该secret会被打包混淆到最终的代码里。从安全角度依然不够安全,这个是另外一个话题,但是如何使用CI的方式在前端自动化地根据不同环境参数打不同的包,生成不同的zip文件呢?这是我们后面要介绍的。

搭建步骤

使用Jenkins搭建pipeline有几种方式,可以参考文档,这里不做过多赘述,我主要是 用Jenkinsfile来创建。

  • 在已有的repo里面创建一个Jenkinsfile,因为需要node环境,我们之前已经有了相应的agent,直接用即可。

    pipeline {
     agent none
     triggers {
       pollSCM 'H/5 * * * *'
     }
     options {
       buildDiscarder logRotator(artifactDaysToKeepStr: '', artifactNumToKeepStr: '', daysToKeepStr: '', numToKeepStr: '5')
       timeout(time: 1, unit: 'DAYS')
     }
     stages {
       stage('Package') {
         environment {
           CREDENTIALS_PSW = credentials("AES_PASSWORD_${ENV}")
           CREDENTIALS_SALT = credentials("AES_SALT_${ENV}")
         }
         agent {
           label 'docker-slave'
         }
         steps {
           sh 'chmod a+x ./ci'
           sh './ci build'
           script{
             zip zipFile: "roulette_${ENV}.zip", dir: 'dist/', archive: true
           }
         }
       }
     }
    }
    
  • 为了代码的简洁性和可读性,将真正build的脚本放在了ci这个脚本里面,所以我们还需要创建一个文件ci,跟 Jenkinsfile在同一级目录 。

    #!/bin/sh
    set -e
    
    BASEDIR=$(dirname "$0")
    cd $BASEDIR
    
    build() {
      yarn install --prefer-offline --registry=https://registry.npm.taobao.org
      AES_PASSWORD=$CREDENTIALS_PSW_PSW AES_SALT=$CREDENTIALS_SALT_PSW yarn build
    }
    
    case $1 in
    build )
      $1;;
    * )
      echo "not support!!! example: go <build>"
      exit 1;;
    esac
    
  • credentials:因为我们secret是比较敏感的信息,所以我们将不同环境的值存放在了crendential里面:

    image

注意到Jenkinsfile脚本里面获取环境变量的方式:credentials("AES_PASSWORD_${ENV}")

  1. 参数值必须是 string,否则不正确;
  2. 使用双引号获取变量,而不是单引号,因为shell到了jenkins环境里面语法可能会有变化
  • ENV:上一个步骤获取ENV参数,那么这个是在pipeline里面设置的,而该pipeline又需要用到Build With Parameters这个插件,所以在创建pipeline之前需要保证jenkins已经安装了该插件:

    image

  • 打包的服务上面没有安装zip依赖,也不想改变server的环境,所以找到了另外一个插件Pipeline Utility Steps,用于生成最后的zip文件。

  • 但是注意在写jenkins脚本的时候,需要写在script里面,否则语法是不生效的。当然我们也可以选择在post action的时候生成,不需要用到该插件,但是可能就需要在build 脚本里面运行node相关的命令去生成zip文件,可行,但是插件更加方便。

  • 脚本写好了,插件也准备好了,当远程代码更新之后 ,我们就可以去创建真正的pipeline了。由于Build With Parameters这个插件并不是在所有类型的pipeline里面都有选项,所以我们最终选择了Pipeline这个选项:

    image

  • 对新建的pipeline进行配置:
    params的设置:

    image

    Build Triggers:

    image

    Gitlab的设置:

    image

  • 目前项目上是在分枝上打包,所以 注意这里的分支换成自己的分支,默认是所有

  • 至此,整个搭建pipeline的过程就完成了,也是有些注意事项,比如在写ci脚本的时候不要写空函数,类似于:

     packge () {
         // zip dist/
     }
    

当时只是想要注释执行的那部分代码,但是到jenkins上跑的时候会有语法错误,所以空函数是不行的,需要整个函数注释或者打开注释。

build之后最终的结果:

image

zip包就可以很方便地下载啦,点击红色框里面的zip链接即可。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant