1
头图

背景

经过《自动产出changelog-第一节:规范提交代码》《自动产出changelog-第二节:自动产出》两节内容的记录后,日志能实现一键产出。在小项目中未接入持续部署的,本地跑release-it命令就能简单实现版本标记、产出日志、推送git与npm的流程,可说是一步到位。公司项目基于Drone持续部署工具的研发流程下,需要将上面提及的步骤结合到持续部署工具进行。

简单说明一下我现在基于Drone打造的开发流程:

分支情况:

  • master分支作为代码汇总的分支,PR/MR后触发持续部署自动部署到测试服务。
  • production分支作为生产分支,push代码后触发持续部署自动部署到线上服务。

研发至发布操作过程:

  1. fork一份代码至自己名下,然后本地开发。
  2. 完成开发需提测时,发起PR/MR推到主仓库,组长或组员code review通过后合并至主仓master分支
  3. 合并master至production,更新日志与版本号后提交production分支进行发布操作

在上面流程中人工更新版本的环节在多人协作的过程中会存在比较大误操作风险,所以才打算用工具实现自动更新版本的工作。这就是《自动产出changelog》文章三节内容的最终目的。

本文提及的内容与我司现在使用Drone持续交付工具与工作流程高度绑定不建议生搬硬套,整体参考思路大致相同建议借鉴学习。

下面讲解持续部署中release-it在持续部署工具Drone使用的细节部分。

结合使用的细节

持续部署中的流程分为:拉取仓库、构建代码、部署推送,三个部分。现在需要在这个流程中增加“版本更新”这一环节,下面是drone部署配置参考例子:

kind: pipeline
name: releases

steps:
- name: release
  image: tarampampam/node:12.13-alpine
  environment:
    SSH_KEY:
       from_secret: ssh_key
  commands:
  - GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i $SSH_KEY"
  - git config --global user.email "in_boot@uxfeel.com"
  - git config --global user.name "in_boot"
  - npm ci
  - npm run build
  - npm run test:unit
  - npm run release -- --ci --no-git.requireUpstream --git.pushRepo=origin
- name: release2npm
  image: plugins/npm
  settings:
    username: in_boot
    email: in_boot@uxfeel.com
    password:
      from_secret: npm_password
    registry: http://self.uxfeel.com/

trigger:
  branch:
  - production
  event:
  - push

代码虽然是简单几行,背后细节及思路却比较繁杂的,需要详细地提及一下。

流程

release-it默认会做以下行为:

Git部分:

  • 根据上一个版本标签(Tag)与最新历史进行对比并产出日志到日志文件;
  • 解析日志内容更新版本号;
  • 提交内容变化并打上版本标签;
  • 推送至远端;

npm:

  • 推送至npm服务;

推送npm服务显然是不需要的,这里我在release-it配置关闭其功能。但是是git部分遇到了比较多的问题。

问题

遭遇问题1:没有Git

在持续部署工具中使用,第一步关于Git的部分就卡住了,提示没有git。由于node官方提供的docker镜像内并没有git,要用上git我换成了这个镜像:tarampampam/node:12.13-alpine。

遭遇问题2:ssh没有授权

如何在容器中提供凭证给git推送代码呢?存在两种情况http与ssh有所不同:

http的情况将账号密码写在Drone的secret中,并作为系统变量使用。然后关闭release-it的git-push环节,推送git部分手动进行才能支持账号密码。

  environment:
    USERNAME:
       from_secret: username
    PASSWORD:
       from_secret: password
  commands:
  - git config --global user.email "in_boot@uxfeel.com"
  - git config --global user.name "in_boot"
  - npm ci
  - npm run release -- --ci --no-git.requireUpstream --git.pushRepo=origin
  - git push "https://$USERNAME:$PASSWORD@myrepository.biz/file.git"
  

ssh的情况需要修改GIT_SSH_COMMAND(git版本高于2.7.0),在Drone的secret中添加ssh_key(私钥),并作为系统变量使用,在GIT_SSH_COMMAND设置就能增加进去。

  environment:
    SSH_KEY:
       from_secret: ssh_key
  commands:
  - GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i $SSH_KEY"
  - git config --global user.email "in_boot@uxfeel.com"
  - git config --global user.name "in_boot"
  - npm ci
  - npm run release -- --ci --no-git.requireUpstream --git.pushRepo=origin

遭遇问题3:release-it提示没有设置upstream branch

ERROR No upstream configured for current branch.
Please set an upstream branch.
Documentation: https://git.io/release-it-git

这种情况直接使用--no-git.requireUpstream --git.pushRepo=origin就避免了release-it的检查。

遭遇问题4:npm install 后会改变package-lock.json文件

改变了package-lock.json文件Git状态就受到影响,releaset-it后续操作就无法进行。这里可以使用npm的另一个命令解决此问题:

$ npm ci 

yarn的用户可以使用下面命令获得同样的效果:

$ yarn install --frozen-lockfile

结语

最后感谢一下我们的前端小伙伴能陪着我折腾这套东西,从2019年年末开始至今研发流程迭代了好几个版本,从刚开始的git-flow到现在gitlab-flow,从不懂得为何要用持续部署工具到学习devops、持续交付与精益思想,一路走到现在共同学习共同进步。还得感谢运维小哥的支持与技术总监的放行,才有机会部署上云和有时间与精力执行至今。

引用

https://stackoverflow.com/que...


帕奇式
924 声望71 粉丝

设计和管理是毕生的课题👨‍💻