当前位置: 首页 > article >正文

FlutterWeb实战:07-自动化部署

Flutter Web 开发打包后,可以手动发布到服务器上,通过 nginx 来托管静态页面。本文将介绍如何将这一过程自动化。

整体思路

使用脚本自动化构建,然后使用 Docker 打包成镜像,最后部署在服务器上。

自动化构建

这里使用 GitLab-CI 来自动化构建。

整个流水线分为四步,分别是前端构建、Flutter Web 构建、Docker 镜像打包、以及部署。

前端构建

build-js:
  image: zacksleo/node:19
  stage: .pre
  script: |-
    CI_COMMIT_TAG=${CI_COMMIT_TAG:-latest}
    cd packages/apps/web
    yarn install
    sed -i "s/main.dart.js/main.dart.js?v=$CI_COMMIT_SHORT_SHA/g" src/index.js
    sed -i "s/flutter.js/flutter.js?v=$CI_COMMIT_SHORT_SHA/g" public/index.html
    yarn build
  artifacts:
    paths:
      - packages/apps/web/web
    expire_in: 60 mins

Flutter Web 构建

这里使用了 flutter build web 命令来构建 Flutter Web 应用,构建后批量对文件重命名,统一增加 Commit Hash 后缀,以解决缓存问题。

build-web:
  stage: build
  script: |-
    CI_COMMIT_TAG=${CI_COMMIT_TAG:-latest}
    echo $(git log -1 --pretty=%s | tail -1) > ./release.log
    cd packages/apps/web
    echo -e '\nHIDE_APP_BAR=true' >> env
    flutter build web --pwa-strategy none --build-number=$VERSION_CODE --build-name=$TAG --web-renderer html --base-href /webapp/
    cp .deploy/flutter.js build/web
    # 对part文件重命名,以解决缓存问题
    sed -i  "s/.part.js/.$CI_COMMIT_SHORT_SHA.part.js/g" build/web/main.dart.js
    sed -i  "s/.part.js/.$CI_COMMIT_SHORT_SHA.part.js/g" build/web/flutter_service_worker.js
    for file in build/web/main.dart.js_* ; do mv $file ${file//part/$CI_COMMIT_SHORT_SHA.part} ; done
  needs: ["build-js"]
  dependencies:
    - build-js
  artifacts:
    paths:
      - packages/apps/web/build/web
      - ./release.log
    expire_in: 120 mins

Docker 镜像打包

这里使用 Docker 来打包镜像,然后推送到 Docker 镜像仓库。打包时,替换了压缩版本的字体图标文件。

Dockerfile 文件配置

FROM nginx:alpine
COPY .deploy/nginx.conf /etc/nginx/nginx.conf
COPY build/web /usr/share/nginx/html

GitLab-CI 文件配置

dockerize:
  stage: dockerize
  image: docker:latest
  needs: ["build-web"]
  dependencies:
    - build-web
  before_script: []
  script:
    - if [[ -z "$CI_COMMIT_TAG" ]];then
    -   CI_COMMIT_TAG="latest"
    - fi
    - cd packages/apps/web
    - cp build/web/fonts/MaterialIcons-Regular.otf build/web/assets/fonts
    - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
    - docker build --build-arg DEPLOY_ENV=$DEPLOY_ENV -t $CI_REGISTRY_IMAGE:$CI_COMMIT_TAG .
    - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_TAG
    - docker rmi $CI_REGISTRY_IMAGE:$CI_COMMIT_TAG || true

部署

这里使用了 rsync 来同步部署文件到服务器上,然后使用 docker-compose 拉取镜像和来启动服务。

prod-web:
  image: zacksleo/node
  stage: release
  needs: ["dockerize"]
  variables:
    DEPLOY_SERVER: "10.10.10.10"
    SSH_PORT: 22
  script:
    - cd packages/apps/web/.deploy
    - CI_COMMIT_TAG=${CI_COMMIT_TAG:-latest}
    - SSH_PORT=${SSH_PORT:-22}
    - rsync -rtvhze "ssh -p $SSH_PORT" . root@$DEPLOY_SERVER:/data/$CI_PROJECT_NAME   --stats
    - ssh -p $SSH_PORT root@$DEPLOY_SERVER "docker login -u gitlab-ci-token -p   $CI_JOB_TOKEN $CI_REGISTRY"
    - ssh -p $SSH_PORT root@$DEPLOY_SERVER "export COMPOSE_HTTP_TIMEOUT=120 && export   DOCKER_CLIENT_TIMEOUT=120 && cd /data/$CI_PROJECT_NAME && echo -e '\nTAG=$CI_COMMIT_TAG' >> .env && docker-compose pull $MODULE && docker-compose   stop $MODULE && docker-compose rm -f $MODULE && docker-compose up -d $MODULE"
  needs: ["dockerize"]

nginx 配置

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    keepalive_timeout  65;

    gzip  on;
    gzip_min_length 1k;
    gzip_comp_level 5;
    gzip_vary on;
    gzip_static on;
    gzip_types text/plain text/html text/css application/javascript application/x-javascript text/xml application/xml application/xml application/json;

    client_max_body_size 2M;

    server {
      listen 80;
      root /usr/share/nginx/html;
      location /webapp/ {
          rewrite ^/webapp(/.*)$ $1 last;
          index index.html index.htm
          try_files $uri $uri/index.html $uri/ =404;
      }
    }
}

  • GitLab CI/CD 入门

http://www.kler.cn/a/544054.html

相关文章:

  • DedeBIZ系统审计小结
  • 第二天:工具的使用
  • Linux第106步_Linux内核RTC驱动实验
  • STM32 裸机 C编程 vs micropython编程 vs linux python
  • 性格测评小程序04题库管理
  • git 提示 fatal: The remote end hung up unexpectedly
  • Spring Boot + ShardingSphere 踩坑记
  • 华为云函数计算FunctionGraph部署ollma+deepseek
  • Java进阶阶段的学习要点
  • 联想电脑如何进入BIOS?
  • 汽车ADAS
  • Python基于Django的微博热搜、微博舆论可视化系统(V3.0)【附源码】
  • Ansible的主机清单
  • c/c++蓝桥杯经典编程题100道(21)背包问题
  • 【网络安全】常见网络协议
  • 【工业安全】-CVE-2019-17621-D-Link Dir-859L 路由器远程代码执行漏洞
  • JAVA安全—Shiro反序列化DNS利用链CC利用链AES动态调试
  • 23页PDF | 国标《GB/T 44109-2024 信息技术 大数据 数据治理实施指南 》发布
  • ASP.NET Core SignalR的协议协商
  • 在vivado中对数据进行延时,时序对齐问题上的理清
  • Web应用项目开发 ——Spring Boot邮件发送
  • 游戏引擎学习第100天
  • 【狂热算法篇】并查集:探秘图论中的 “连通神器”,解锁动态连通性的神秘力量(通俗易懂版)
  • esxi添加内存条因为资源不足虚拟机无法开机——避坑
  • 尚硅谷爬虫note002
  • Android Studio 打包App问题