Open fayeah opened 3 years ago
我们希望能根据 不同的环境拿到不同的secret,该secret会被打包混淆到最终的代码里。从安全角度依然不够安全,这个是另外一个话题,但是如何使用CI的方式在前端自动化地根据不同环境参数打不同的包,生成不同的zip文件呢?这是我们后面要介绍的。
使用Jenkins搭建pipeline有几种方式,可以参考文档,这里不做过多赘述,我主要是 用Jenkinsfile来创建。
在已有的repo里面创建一个Jenkinsfile,因为需要node环境,我们之前已经有了相应的agent,直接用即可。
Jenkinsfile
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在同一级目录 。
ci
#!/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里面:
注意到Jenkinsfile脚本里面获取环境变量的方式:credentials("AES_PASSWORD_${ENV}"):
credentials("AES_PASSWORD_${ENV}")
ENV:上一个步骤获取ENV参数,那么这个是在pipeline里面设置的,而该pipeline又需要用到Build With Parameters这个插件,所以在创建pipeline之前需要保证jenkins已经安装了该插件:
ENV
打包的服务上面没有安装zip依赖,也不想改变server的环境,所以找到了另外一个插件Pipeline Utility Steps,用于生成最后的zip文件。
但是注意在写jenkins脚本的时候,需要写在script里面,否则语法是不生效的。当然我们也可以选择在post action的时候生成,不需要用到该插件,但是可能就需要在build 脚本里面运行node相关的命令去生成zip文件,可行,但是插件更加方便。
脚本写好了,插件也准备好了,当远程代码更新之后 ,我们就可以去创建真正的pipeline了。由于Build With Parameters这个插件并不是在所有类型的pipeline里面都有选项,所以我们最终选择了Pipeline这个选项:
对新建的pipeline进行配置: params的设置:
Build Triggers:
Gitlab的设置:
目前项目上是在分枝上打包,所以 注意这里的分支换成自己的分支,默认是所有
至此,整个搭建pipeline的过程就完成了,也是有些注意事项,比如在写ci脚本的时候不要写空函数,类似于:
packge () { // zip dist/ }
当时只是想要注释执行的那部分代码,但是到jenkins上跑的时候会有语法错误,所以空函数是不行的,需要整个函数注释或者打开注释。
build之后最终的结果:
zip包就可以很方便地下载啦,点击红色框里面的zip链接即可。
Prerequisite
背景/需求
我们希望能根据 不同的环境拿到不同的secret,该secret会被打包混淆到最终的代码里。从安全角度依然不够安全,这个是另外一个话题,但是如何使用CI的方式在前端自动化地根据不同环境参数打不同的包,生成不同的zip文件呢?这是我们后面要介绍的。
搭建步骤
使用Jenkins搭建pipeline有几种方式,可以参考文档,这里不做过多赘述,我主要是 用Jenkinsfile来创建。
在已有的repo里面创建一个
Jenkinsfile
,因为需要node环境,我们之前已经有了相应的agent,直接用即可。为了代码的简洁性和可读性,将真正build的脚本放在了
ci
这个脚本里面,所以我们还需要创建一个文件ci
,跟Jenkinsfile
在同一级目录 。credentials:因为我们secret是比较敏感的信息,所以我们将不同环境的值存放在了crendential里面:
注意到
Jenkinsfile
脚本里面获取环境变量的方式:credentials("AES_PASSWORD_${ENV}")
:ENV
:上一个步骤获取ENV
参数,那么这个是在pipeline里面设置的,而该pipeline又需要用到Build With Parameters这个插件,所以在创建pipeline之前需要保证jenkins已经安装了该插件:打包的服务上面没有安装zip依赖,也不想改变server的环境,所以找到了另外一个插件Pipeline Utility Steps,用于生成最后的zip文件。
但是注意在写jenkins脚本的时候,需要写在script里面,否则语法是不生效的。当然我们也可以选择在post action的时候生成,不需要用到该插件,但是可能就需要在build 脚本里面运行node相关的命令去生成zip文件,可行,但是插件更加方便。
脚本写好了,插件也准备好了,当远程代码更新之后 ,我们就可以去创建真正的pipeline了。由于Build With Parameters这个插件并不是在所有类型的pipeline里面都有选项,所以我们最终选择了Pipeline这个选项:
对新建的pipeline进行配置: params的设置:
Build Triggers:
Gitlab的设置:
目前项目上是在分枝上打包,所以 注意这里的分支换成自己的分支,默认是所有
至此,整个搭建pipeline的过程就完成了,也是有些注意事项,比如在写ci脚本的时候不要写空函数,类似于:
当时只是想要注释执行的那部分代码,但是到jenkins上跑的时候会有语法错误,所以空函数是不行的,需要整个函数注释或者打开注释。
build之后最终的结果:
zip包就可以很方便地下载啦,点击红色框里面的zip链接即可。