miniprogram-ci
详细sop请参考下面的官方说明,非常详细
npm www.npmjs.com/package/min…
微信开放文档 developers.weixin.qq.com/miniprogram…
安装
npm install miniprogram-ci --save
详细配置
const ci = require('miniprogram-ci')
const printQrcode = require('./prview.js')
const version = '2.5.0'
const desc = `ci自动上传-${new Date()}`
const configENV = process.argv[2]
const uploadType = process.argv[3] //对应package.json;node config/ci.wx.js test preview",取preview
const cwd = process.cwd()
let appId = 'XXXX'
const project = new ci.Project({
appid: appId,
type: 'miniProgram',
projectPath: `${cwd}/dist`,
privateKeyPath: `${cwd}/key/private.${appId}.key`,
ignores: ['node_modules/**/*'],
})
if(uploadType === 'preview') {
const previewResult = ci.preview({
project,
version,
desc,
setting: {
minify: true,
},
qrcodeFormat: 'image',
qrcodeOutputDest: `${cwd}/qrcode/qrcode.jpg`, // 生成的二维码存放的本地绝对路径
onProgressUpdate: console.log,
// pagePath: 'pages/index/index', // 预览页面
// searchQuery: 'a=1&b=2', // 预览参数 [注意!]这里的`&`字符在命令行中应写成转义字符`\&`
}).then(res => {
console.log('%c预览成功', 'color: green')
}).catch(error => {
console.log('%c预览失败', 'color: red')
})
}else {
const uploadResult = ci.upload({ project, version, desc,
setting: {
minify: true,
},
}).then(res => {
console.log('%c上传成功', 'color: green')
}).catch(error => {
console.log('%c上传失败', 'color: red')
})
}
package.jsonp配置
"test-preview": "cross-env NODE_ENV=production CONFIG_ENV=test taro build --type weapp && node config/ci.wx.js test preview",
执行: npm run test-preview
此时在根目录下同时也是生成了二维码,
个人小建议:小程序类的其实没必要花精力和时间在CI方面,因为微信的开发者工具足够可视化,足够便捷。。。 尤其win下运行的时间足够挑战你耐心,但技术上还是可以折腾玩玩!
@tarojs/plugin-mini-ci插件
官方说明:
独立使用命令必须升级taro至3.6.0版本,整体配置比minci更简单,所以就就把旧项目做了升级
先说结论:
各种依赖不支持,插件废弃等等,尤其taro-ui本身配置的是 "taro-ui": "^3.0.0-alpha.3" 结果报calc($w / 2) sass2.0不支持/计算等等,github issues 也是非常多的,毫无疑问升级失败,所以选择稳定版,不要轻易升级新版,之前的项目是从2.2.7升级至3.3.2版,项目从开始到目前线上2年多,基本稳定
继续折腾
重新初始化一个新版的taro,指定版本为3.6.0
npx @tarojs/ci@3.6.0 init myapp
选择redux-hooks模板后续介绍
配置从官方直接copy
const CIPluginOpt = {
weapp: {
appid: "wxf1713274ca8ca4e9",
privateKeyPath: "key/private.wx2c507a1f1a20e4a8.key"
},
// 版本号
version: "1.0.0",
// 版本发布描述
desc: "版本描述"
}
const config = {
plugins: [
[ "@tarojs/plugin-mini-ci", CIPluginOpt ],
// 应用自己写的插件
require('path').join(__dirname, './test'),
]
}
package.json 配置
"scripts": {
"build:weapp": "cross-env NODE_ENV=development CONFIG_ENV=dev taro build --type weapp --open",
"build:weapp:preview": " cross-env NODE_ENV=production CONFIG_ENV=test taro build --type weapp --preview",
"build:weapp:upload": "cross-env NODE_ENV=production CONFIG_ENV=stage --type weapp --upload",
"build:weapp:upload": "cross-env NODE_ENV=production CONFIG_ENV=stage --type weapp --upload --projectPath dist/app.json"
}
执行预览:build:weapp:preview
结合Docker和runner服务的自动化CI
配置DockerFile
FROM XXX镜像
ENV PRO_LOCAL false
RUN echo "Asia/shanghai" > /etc/timezone;
WORKDIR /usr/share/nginx/html
ADD enterpoint.sh /usr/bin/
ENTRYPOINT ["/usr/bin/enterpoint.sh"]
RUN chmod +x /usr/bin/enterpoint.sh
ADD dist/h5 /usr/share/nginx/html
CMD ["nginx", "-g", "daemon off;"]
EXPOSE 80
.gitlab-ci.yml文件配置
image: xxx镜像
stages:
- dev_build //定义各种环境的构建场景,一般对应分支
- test_build
- stage-build
- prod_build
dev_build:
tags:
- i-ce
stage: dev_build
only:
- tags
- ci
- /^release-dev.*$/ //触发stage的条件,关联分支名
script:
- npm config set sass-binary-site http://npm.taobao.org/mirrors/node-sass
- npm config set registry https://repo.dtyunxi.cn/nexus/repository/npm/
- npm install node-sass
- npm install @tarojs/cli@2.2.7
- npm install --registry https://repo.dtyunxi.cn/nexus/repository/npm/
- chmod -R 777 node_modules
- npm run build:h5Dev
- mkdir -p /cache/${CI_PROJECT_NAME}-${CI_PROJECT_ID}-${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHA}/dist
- cp -r dist/h5 /cache/${CI_PROJECT_NAME}-${CI_PROJECT_ID}-${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHA}/dist
- zip -q -r dist.zip dist/
- cp -r dist/h5 $CI_PROJECT_DIR/docker/dist
- kaniko --skip-tls-verify -c $CI_PROJECT_DIR/docker -f $CI_PROJECT_DIR/docker/Dockerfile -d ${DOCKER_REGISTRY}/${GROUP_NAME}/${PROJECT_NAME}:${CI_COMMIT_TAG}
- chart_build
.auto_devops: &auto_devops |
http_status_code=`curl -o .auto_devops.sh -s -m 10 --connect-timeout 10 -w %{http_code} "${CHOERODON_URL}/devops/ci?token=${Token}&type=front"`
if [ "$http_status_code" != "200" ]; then
cat .auto_devops.sh
exit 1
fi
source .auto_devops.sh
before_script:
- *auto_devops
更多详解可前往:www.yuque.com/lufeilizhix…
redux-hooks
官方说明:taro-docs.jd.com/docs/redux#…
store 配置
import { createStore, applyMiddleware } from 'redux'
import thunkMiddleware from 'redux-thunk'
import { createLogger } from 'redux-logger'
import rootReducer from './reducers'
const middlewares = [
thunkMiddleware,
createLogger()
]
export default function configStore () {
const store = createStore(rootReducer, applyMiddleware(...middlewares))
return store
}
reducers
import { combineReducers } from 'redux'
import userInfo from './userInfo'
//...
export default combineReducers({
userInfo,
// ...
})
userInfo.js
const defaultState = {
customerInfo: {}
}
export default function userInfo(state = defaultState, action) {
switch (action.type) {
case 'setCustomerInfo':
return {
customerInfo: action.value
}
default:
return state
}
}
页面中使用 1:useDispatch&useSelector
import { useSelector, useDispatch } from 'react-redux';
export default function myPage() {
const purchaseNum = useSelector(state => state.purchaseNum.num) // 从store中取数据
const dispatch = useDispatch()
//初始化
useEffect(() => {
Taro.getStorage({
key: 'customerInfo',
success: function (res) {
if (!res.data) {
Request({ url: "v1/user/user-info" }).then(res => {
if (res.resultCode === '0') {
dispatch({ type: "setCustomerInfo", value: res.data })
Taro.setStorage({ key: "customerInfo", data: res.data })
}
})
} else {
dispatch({ type: "setCustomerInfo", value: res.data }) //缓存数据
}
}
})
getCustomerList(); // 获取授权客户列表
}, []);
整体配置及使用上相比之前非常简单
客官既然来了,点个赞吧!