Linux/CentOS 安装 flutter 与 jenkins 构建 (踩坑)
不论在Ubuntu 还是 CentOS,强烈推荐使用snapd 安装,因为不用额外安装 Linux toolchain!
由于我在Linux和Flutter还是小白,又在CentOS 7上有采用了手动安装Flutter,导致安装 Linux toolchain 时可把我坑惨了。官方的toolchain 在Ubuntu 上很方便,但在CentOS上 ninja,pkgconfig,libgtk-3-dev 没有直接的源,导致安装起来非常麻烦:
apt-get install clang cmake ninja-build pkg-config libgtk-3-dev liblzma-dev
使用 snapd 安装则不需要这个步骤。
一、安装snap
Installing snap on CentOS | Snapcraft documentation
sudo yum install epel-release
sudo yum install snapd
sudo systemctl enable --now snapd.socket
sudo ln -s /var/lib/snapd/snap /snap
二、snap 安装 flutter:
snap install flutter --classic
source /etc/profile,或重启系统后,flutter可被识别到。而后执行
flutter doctor
注意,jenkins因为各种环境问题,可能会找不到 flutter,因此在脚本执行flutter前,PATH添加 snap路径:
export PATH=$PATH:/var/lib/snapd/snap/bin
三、升级 git
- CentOS 7默认git版本是1.8.3
- 此版本git存在BUG会导致Flutter识别的版本变为0.0.0-unknown
yum -y install http://opensource.wandisco.com/centos/7/git/x86_64/wandisco-git-release-7-2.noarch.rpm
yum -y update git
或者使用snap 安装(还未尝试过)
sudo snap install git-ubuntu --classic
四、flutter的 git依赖组件(可选)
flutter pub 可以使用 git,但对于需要密码的git,如果使用http或https方式,用户名和秘密会有暴露的风险,建议使用SSH。如果是http或https,在jenkins flutter build 之前,将 pubspec.yaml 内的链接替换为git@xxx: :
sed -i 's|https://xxxxxxx/|git@xxxxxxxx:|g' pubspec.yaml
在打包机上生成ssh key:
cd ~/.ssh
# 没有 .ssh 则新建一个
# xxxx 随意,key的名称
ssh-keygen -t rsa -C "xxxx"
注意:回车后,不要填任何东西,直接回车,不然flutter 的 git找不到 ssh 密钥
Enter file in which to save the key (/xxx) (回车)
Enter passphrase (回车)
Enter same passphrase again: (回车)
而后 把 id_rsa.pub 内容贴到 git 仓库的 ssh 授权中(不同仓库操作不一样,请自行搜索)
最后验证 git 联通性:
ssh -T git@xxxx
当有提示 welcome 等信息时,就说明链接成功,有错误自行搜索下
六、repositories 覆盖
由于在app 的build.gradle中,flutter 要求添加以下脚本,导致我们自定义替换的repositories 无法替换掉它里面的 google 源:
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
flutter SDK 的 flutter.gradle中有以下强制配置:
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
/* When bumping, also update ndkVersion above. */
classpath 'com.android.tools.build:gradle:4.1.0'
}
}
导致如果google连不上,会出现很奇怪的 com.android.tools.build:gradle:4.1.0 找不到,google 仓库无法连接的编译bug。
此时,只能对flutter.gradle 进行强制修改:
buildscript {
repositories {
maven {
try {allowInsecureProtocol = true} catch (Throwable e) {}
url "xxxxxxx" // 使用我们自己的 maven 或者国内源,例如 aliyun 的
}
// google()
// mavenCentral()
}
dependencies {
/* When bumping, also update ndkVersion above. */
classpath 'com.android.tools.build:gradle:4.1.0'
}
}
此外,还有第三方插件也有类似的问题,也会出现各中 com.android.tools.build:gradle 找不到。此时需要在 rootProject 的build.gradle 添加以下脚本,以在依赖的子工程脚本执行前添加 我们的repositories覆盖顺序:
subprojects {
repositories {
maven {
url = "xxxx" // 要替换的 url
}
}
buildscript.repositories {
maven {
url = "xxxx" // 要替换的 url
}
}
}
七、替换 pub 源:
环境变量添加 PUB_HOSTED_URL 和 FLUTTER_STORAGE_BASE_URL,jenkins脚本增加:
export PUB_HOSTED_URL=https://pub.flutter-io.cn
export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn
八、执行gradle task:
# 先在工程目录下执行 packages get
flutter packages get
#同步完成后,cd到 Android目录执行 gradlew
cd android
chmod 777 gradlew
./gradlew xxxxTask
cd ..
flutter build xxxxxx
总结:
1、使用snap 安装flutter,升级git
2、repositories 覆盖
3、Jenkins脚本要修改环境变量,大致为:
export PUB_HOSTED_URL=https://pub.flutter-io.cn
export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn
export PATH=$PATH:/var/lib/snapd/snap/bin
# git 替换 ssh访问
sed -i 's|https://xxx/|git@xxx:|g' pubspec.yaml
flutter packages get
cd android
chmod 777 gradlew
./gradlew xxxTask
cd ..
flutter build appbundle --obfuscate --split-debug-info=./debug_info
参考:
如何在 Linux 上安装和设置 Flutter 开发环境-51CTO.COM
linux部署flutter环境__Leo的博客-CSDN博客_centos flutter