从QA到DEV到DEVOPS,码字五年有哪些收获

在写博客和公众号这件事上,不知不觉已经是我的第五个年头了,没想过能这么久。

借此分享一下这些年我的职业线路的变化,以及写博客&公众号有什么收获,算是自己过去的一个总结,如果能有点共鸣和帮助就更好了。

从QA到DEV到DEVOPS

最早关注我公众号读者朋友大概都是因为软件测试而结缘的。是的,我做了近 10 的软件测试工作,先后在 SIMcom、东软、京东商城、外企从事过功能&自动化&性能测试工作。

从功能测试入行开始,我慢慢地感受到编程不是开发的独门武功,它也是测试工程师的必备技能,只有具备良好的编码能力,才能去做自动化、Unittest、以及测试开发等工作。

当我做了自动化测试工程师,我又发现相对于“发现”问题,“解决”问题更令我愉悦。我开始梦想有机会能去做开发,这样不但可以提高自己的编程能力,另外开发、测试都懂也能为自己今后的职业发展找到更多可能性。

最终是因为有这样的机会+自己的主动+编码过得去,我从测试转到了开发。起初的艰难和压力都是我工作近 10 年来前所未有的,白天看代码、晚上看代码、周末看代码… 天天如此。经过了半年多的努力,才终于上岸,可以做 C/C++ 项目的 Bugfix 了。

也正是因为有开发、自动化、持续集成的经验,在团队需要一名 Build/Release 工程师的时候,我知道这就是我最适合的岗位,负责产品的自动化构建、发布、基础设施建设、CI/CD 以及提高研发效能的相关开发工作。

就这样我从 QA 到 DEV 到 DEVOPS。公众号的更名记录也记录了我的职业路线变化:

  • 2019年07月28日 “软件测试与开发”改名“DevOps攻城狮”
  • 2018年12月29日 “DevQA”改名“软件测试与开发”
  • 2018年12月26日 “软件测试QA”改名“DevQA”
  • 2017年08月01日 注册“软件测试QA”

写作五年有哪些收获

写作是一项长期收益远超短期收益的事情

对于绝大多数人在短期内几乎不会有什么实质性的收益,还会花费大量的业余时间,妥妥的是用爱在发电。从金钱角度来衡量这件事,这是一件投入和产出完全不成比例的事情,很难坚持。

如果从长期来看,坚持写作一定会带来价值的,我总结有以五个方面的好处:

  1. 好记性不如烂笔头 - 当我们弄明白了一个技术难题,虽然当时明白了,但如果没记录下来,很有可能以后遇到同样的问题又不知道该如何解决。
  2. 让别人听懂才是真的懂 - 有时候对于一个问题我们认为自己明白了,当分享给别人的时候,才发现其中有的逻辑说不通,因此不得不继续思考并彻底搞清楚。
  3. 打造学习飞轮 - 当你坚持分享并有人关注到你并与你互动的时候,你就会有动力继续分享,学习新的知识然后再分享,一旦学习的飞轮造好了,坚持下去就变得容易。
  4. 间接收益 - 但凡坚持写点东西,对于以后找工作都或多或少会有些帮助,至少说明你是一个爱学习的人。如果你的分享让同行、未来你的面试官觉得很不错,很可能会给你带来一次新的工作机会。
  5. 直接收益 - 直接利益包括平台流量和广告收益、以及卖专栏、做咨询等。这要求就很高了,不但需要会自媒体运营,还有要超强的输出功力,这背后就是比别人更多的付出。

Read More

Vagrant 和 Docker 的区别,该如何选?

关于 Vagrant 的介绍,可以参看前一篇文章:什么是 Vagrant? Vagrant 和 VirtualBox 的区别

什么是 Vagrant

关于 Vagrant 的介绍,可以参看前一篇文章:什么是 Vagrant? Vagrant 和 VirtualBox 的区别

Vagrant 和 Docker 区别

关于 Vagrant 被问到最多的问题:Vagrant 和 Docker 之间有什么区别。

如果不分场景的直接比对 Vagrant 和 Docker 是不恰当的。在一些简单场景中,它们的作用是重复的,但在更多场景中,它们是无法相互替代的。

那么什么情况下应该用 Vagrant,什么情况下用 Docker 呢?

所以如果你仅仅是想管理虚拟机,那么你应该使用 Vagrant;如果你想快速开发和部署应用,那么应该使用 Docker。

下面具体来说说为什么。

Read More

什么是 Vagrant? Vagrant 和 VirtualBox 的区别

什么是 Vagrant

Vagrant 是一种开源软件产品,用来方便构建和维护虚拟软件开发环境。

例如,它可以基于 VirtualBox、VMware、KVM、Hyper-V 和 AWS 甚至是 Docker 等提供商来构建开发环境。它通过简化虚拟化的软件配置管理,来提高开发效率。

Vagrant 是用 Ruby 语言开发的,但它的生态系统支持使用其他几种语言进行开发。

简单来说 Vagrant 是对传统虚拟机的一层封装,能够让你更方便的使用虚拟开发环境。

Vagrant 的发展史

Read More

什么是 Go ?Go 的优势和现状。初学者应该学习 Python 还是 Go?

Go 是一种开源编程语言,可以轻松构建简单、可靠和高效的软件。

Go 还是 Golang

先问一个大多数人可能会忽略的问题:Google 的这门开源编程语言叫 Go 还是 Golang?还是两个都行?给你三秒钟想一下 …

Google 说:它叫 Go。之所以有人称它为 Golang 是由于之前的 Go 语言官网是 golang.org(因为 go.org 已经被别人用了),因此有人将 Golang 和 Go 混用了。

现在输入 golang.org 会直接跳转到 go.dev 这个网址,这也算是彻底给自家孩子正个名。

Go 语言有哪些优势

官网是这样介绍 Go 语言的:

  • Go 适合大规模快速构建,可靠、高效的软件
  • Go 是 Google 在背后支持的一门开源编程语言
  • 易于学习和入门
  • 内置并发和强大的标准库
  • 不断发展的合作伙伴、社区和工具生态系统

今天,Go 被用于各种应用程序:

Read More

你一定要了解这 17 条 Docker 最佳实践!

本篇分享在编写 Dockerfiles 和使用 Docker 时应遵循的一些最佳实践。篇幅较长,建议先收藏慢慢看,保证看完会很有收获。

文章目录

Dockerfile 最佳实践

  1. 使用多阶段的构建
  2. 调整 Dockerfile 命令的顺序
  3. 使用小型 Docker 基础镜像
  4. 尽量减少层的数量
  5. 使用无特权的容器
  6. 优先选择 COPY 而不是 ADD
  7. Python 包缓存到 Docker 主机上
  8. 每个容器只运行一个进程
  9. 优先选择数组而不是字符串语法
  10. 理解 ENTRYPOINTCMD 之间的区别
  11. 添加健康检查 HEALTHCHECK

Docker 镜像最佳实践

  1. Docker 镜像的版本
  2. 不要在镜像中存储密钥
  3. 使用 .dockerignore 文件
  4. 检查和扫描你的 Docker 文件和镜像
  5. 签署和验证镜像

Dockerfile 最佳实践

1. 使用多阶段的构建

利用多阶段构建的优势来创建更精简、更安全的Docker镜像。多阶段 Docker 构建(multi-stage builds)允许你将你的 Dockerfile 分成几个阶段。

例如,你可以有一个阶段用于编译和构建你的应用程序,然后可以复制到后续阶段。由于只有最后一个阶段被用来创建镜像,与构建应用程序相关的依赖关系和工具就会被丢弃,因此可以留下一个精简的、模块化的、可用于生产的镜像。

Web 开发示例:

Read More

2022年序员如何选择显示器?1080p还是2K? 单屏还是多屏?

工作十几年用过了不少显示器,从最初的 17寸,到后来的 23寸、27寸、32寸、再到现在的 34 寸,根据我自己的使用体验,来个主观推荐:

第一名,一个34寸曲面显示器
第二名,一个27寸 + 一个23寸的双屏组合
第三名,一个32寸 + 一个23寸的双屏组合
第三名,两个 23 寸的双屏组合(并列第三名)

以上这些屏幕推荐购买 2K 及以上的分辨率,1080p 的分辨率不推荐。

下面我就按照时间轴说说我用过的那些显示器。

Read More

组织内如何评估 CI/CD 成熟度

问题

在一个组织内,不同的团队之间可能会有不同的维度来评估 CI/CD 的成熟度。这使得对衡量每个团队的 CI/CD 的表现变得困难。

如何快速评估哪些项目遵循最佳实践?如何更容易地构建高质量的安全软件?组织内需要建立一个由团队成员一起讨论出来的最佳实践来帮助团队建立明确的努力方向。

Read More

GitHub Actions 还能这么玩?自动将发布的博客文章更新到 GitHub 个人主页

最近实现了一个很有意思的 Workflow,就是通过 GitHub Actions 自动将每次最新发布的文章自动同步到我的 GitHub 首页。

就像这样在首页显示最近发布的博客文章。

最终效果

要实现这样的工作流需要了解以下这几点:

  1. 需要创建一个与 GitHub 同名的个人仓库,这个仓库的 README.md 信息会显示在首页
  2. 通过 GitHub Actions 自动获取博客的最新文章并更新 README.md
  3. 只有当有新的文章发布的时候才触发自动获取、更新文章 GitHub Action

Read More

2021-22 世界质量报告(World Quality Report)

前言

2021-22 世界质量报告(World Quality Report 简称 WQR)是由 Micro Focus,Capgemini 和 Sogeti 三家公司合作的来分析软件质量和测试趋势在全球范围内唯一的报告。

这份报告共采访了 1750 名高管和专业人士。从最高管理层到 QA 测试经理和质量工程师,涵盖了来自全球 32 个国家的 10 个行业。

图片 0

世界质量报告(WQR)是一项独一无二的全球研究,今年的调查强调了新部署方法中不断变化的受大流行影响的应用程序需求的影响,以及 QA 对敏捷和 DevOps 实践的采用,AI 的持续增长。

作为测试关注这类软件质量报告可以帮助我们快速了解软件测试行业的现状和趋势。

五大主题

WQR 的一个关键信息:在新冠疫情依旧的今天,我们看到了数字化转型的融合以及敏捷和 DevOps 实践的实时采用。此外,QA 正在成为采用敏捷和 DevOps 实践的领导者,为团队提供工具和流程以促进整个软件生命周期(SDLC)的质量。

WQR 围绕关键发现和趋势突出了五个特定主题:

  1. 新冠疫情对 QA 组织和软件测试的影响
  2. 数字化转型与 DevOps 和敏捷采用的实时融合以及 QA 在其中的日益重要的作用
  3. 地理上分散的团队在跨环境部署应用程序时专注于业务成果
  4. 人工智能 (AI) 增强了敏捷和 DevOps 在所有团队中培养不断增长的质量责任文化
  5. 使用 AI 驱动的持续测试和质量管理工具来解决客户体验优先事项和快速变化的受疫情影响的要求

Read More

Polaris - 静态代码分析

这可能是中文网里介绍Polaris最详细的文章了

什么是 Polaris?

Polaris - 托管静态应用程序软件测试(SAST)工具的 SaaS 平台,它是用于分类和修复漏洞并运行报告的 Web 站点。
SAST - 一种对源代码分析或构建过程中去寻找安全漏洞的工具,是一种在软件开发的生命周期(SDLC)中确保安全的重要步骤。
Coverity - Coverity 是 Synopsys 公司提供的原始静态应用软件测试 (SAST) 工具。Polaris 是 Coverity 的 SaaS 版本。
Synopsys - 是开发 Polaris 和其他软件扫描工具的公司,比如 BlackDuck 也是他们的产品。

Polaris 支持哪些语言?

C/C++
C#
Java
JavaScript
TypeScript
PHP
Python
Fortran
Swift
...and more

Polaris SaaS 平台

通常如果你的组织引入了 Polaris 的 SaaS 服务,你将会有如下网址可供访问 URL: https://organization.polaris.synopsys.com

然后登录,你就可以给自己的 Git Repository 创建对应的项目了。

建议:创建的项目名称与 Git Repository 的名称一致。

Polaris 如何进行漏洞扫描?

Polaris 安装

在进行 Polaris 扫描之前,你需要先下载并安装 polaris。

如果你的 Polaris server URL 为:POLARIS_SERVER_URL=https://organization.polaris.synopsys.com

下载连接为:$POLARIS_SERVER_URL/api/tools/polaris_cli-linux64.zip

然后将下载到本地的 polaris_cli-linux64.zip 进行解压,将其 bin 目录添加到 PATH 中。

Polaris YAML 文件配置

在进行扫描之前,你需要为你的项目创建 YAML 文件。默认配置文件名为 polaris.yml,位于项目根目录。如果你希望指定不同的配置文件名,你可以在 polaris 命令中使用 -c 选项。

在项目根目录运行 polaris setup 以生成通用的 polaris.yml 文件。

运行 polaris configure 以确认你的文件在语法上是正确的并且 polaris 没有任何问题。

Capture - 捕获

YAML 配置文件可以包含三种类型的 Capture:

  • Build(构建) - 运行构建命令,然后分析结果
  • Filesystem(文件系统) - 对于解释型语言,提供项目类型和要分析的扩展列表
  • Buildless - 对于一些可以使用依赖管理器的语言,比如 maven
Languages Build Options
C, C++, ObjectiveC, Objective C++,Go, Scala, Swift 使用 Build 捕获
PHP, Python, Ruby 使用 Buildless 或 Filesystem 捕获
C#, Visual Basic. 如果想获得更准确的结果使用 Build 捕获;如果寻求简单使用 Buildless 捕获
Java 如果想获得更准确的结果使用 Build 捕获;如果寻求简单使用 Buildless 捕获
JavaScript,TypeScript 使用 Filesystem 捕获;如果寻求简单使用 Buildless 捕获

Analyze - 分析

如果你正在扫描 C/C++ 代码,则应包括此分析部分以充分利用 Polaris 的扫描功能:

analyze:
mode: central
coverity:
cov-analyze: ["--security","--concurrency"]

Polaris YAML 示例文件

Read More

Git 常用命令备忘录

不管是对于 Git 的初学者还是经常使用 Git 的码农们,在日常工作中难免会有遇到有的命令一时想不起来。不妨将下面总结的一些 Git 常用命令及技巧收藏或打印出来,以备需要的时候可以很快找到。

git config

Read More

How does SonarQube Community Edition integrate with the project

After you have set up the SonarQube instance, you will need to integrate SonarQube with project.

Because I used the community edition version, it doesn’t support the C/C++ project, so I only demo how to integrate with Maven, Gradle, and Others.

For example, the demo project name and ID in SonarQube are both test-demo, and I build with Jenkins.

Read More

Run lcov failed "Can't locate JSON/PP.pm in @INC ..."

When execute command: lcov --capture --directory . --no-external --output-file coverage.info to generate code coverage report, I encountered the following error:

$ lcov --capture --directory . --no-external --output-file coverage.info
Capturing coverage data from .
Can't locate JSON/PP.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/local/bin/geninfo line 63.
BEGIN failed--compilation aborted at /usr/local/bin/geninfo line 63.
sh-4.2$ perl -MCPAN -e 'install JSON'
Can't locate CPAN.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .).
BEGIN failed--compilation aborted.

Read More

使用 Gcov 和 LCOV 做 C/C++ 项目的代码覆盖率

本篇分享如何使用 Gcov 和 LCOV 对 C/C++ 项目进行代码覆盖率的度量。

如果你想了解代码覆盖率工具 Gcov 是如何工作的,或是以后需要做 C/C++ 项目的代码覆盖率,希望本篇对你有所帮助。

Read More

SonarQube installation and troubleshootings

Backgroud

In my opinion, SonarQube is not a very easy setup DevOps tool to compare with Jenkins, Artifactory. You can’t just run some script under the bin folder to let the server boot up.

You must have an installed database, configuration LDAP in the config file, etc.

So I’d like to document some important steps for myself, like setup LDAP or PostgreSQL when I install SonarQube of v9.0.1. It would be better if it can help others.

Prerequisite and Download

  1. Need to be installed JRE/JDK 11 on the running machine.

    Here is the prerequisites overview: https://docs.sonarqube.org/latest/requirements/requirements/

  2. Download SonarQube: https://www.sonarqube.org/downloads/

    cd sonarqube/
    ls
    wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-9.0.1.46107.zip

    unzip sonarqube-9.0.1.46107.zip
    cd sonarqube-9.0.1.46107/bin/linux-x86-64
    sh sonar.sh console

Change Java version

I installed SonarQube on CentOS 7 machine, the Java version is OpenJDK 1.8.0_242 by default, but the prerequisite shows at least need JDK 11. There is also JDK 11 available on my machine, so I just need to change the Java version.

I recommend using the alternatives command change Java version,refer as following:

$ java -version
openjdk version "1.8.0_242"
OpenJDK Runtime Environment (build 1.8.0_242-b08)
OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode)

$ alternatives --config java

There are 3 programs which provide 'java'.

Selection Command
-----------------------------------------------
1 java-1.7.0-openjdk.x86_64 (/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.251-2.6.21.1.el7.x86_64/jre/bin/java)
*+ 2 java-1.8.0-openjdk.x86_64 (/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-1.el7.x86_64/jre/bin/java)
3 java-11-openjdk.x86_64 (/usr/lib/jvm/java-11-openjdk-11.0.12.0.7-0.el7_9.x86_64/bin/java)

Enter to keep the current selection[+], or type selection number: 3
$ java -version
openjdk version "11.0.12" 2021-07-20 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.12+7-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.12+7-LTS, mixed mode, sharing)

Install Database

SonarQube needs you to have installed a database. It supports several database engines, like Microsoft SQL Server, Oracle, and PostgreSQL. Since PostgreSQL is open source, light, and easy to install, so I choose PostgreSQL as its database.

How to download and install PostgreSQL please see this page: https://www.postgresql.org/download/linux/redhat/

Troubleshooting

1. How to establish a connection with SonarQube and PostgreSQL

Please refer to the sonar.properties file at the end of this post.

2. How to setup LDAP for users to log in

sonar.security.realm=LDAP
ldap.url=ldap://den.exmaple-org:389
ldap.bindDn=user@exmaple-org.com
ldap.bindPassword=mypassword
ldap.authentication=simple
ldap.user.baseDn=DC=exmaple-org,DC=com
ldap.user.request=(&(objectClass=user)(sAMAccountName={login}))
ldap.user.realNameAttribute=cn
ldap.user.emailAttribute=email

3. How to fix LDAP login SonarQube is very slowly

Comment out ldap.followReferrals=false in sonar.properties file would be help.

Related post: https://community.sonarsource.com/t/ldap-login-takes-2-minutes-the-first-time/1573/7

4. How to fix ‘Could not resolve 11 file paths in lcov.info’

I want to display Javascript code coverage result in SonarQube, so I added sonar.javascript.lcov.reportPaths=coverage/lcov.info to the sonar-project.properties

But when I run sonar-scanner.bat in the command line, the code coverage result can not show in sonar. I noticed the following error from the output:

INFO: Analysing [C:\workspace\xvm-ide\client\coverage\lcov.info]
WARN: Could not resolve 11 file paths in [C:\workspace\xvm-ide\client\coverage\lcov.info]

There are some posts related to this problem, for example, https://github.com/kulshekhar/ts-jest/issues/542, but no one works in my case.

# here is an example error path in lcov.info
..\src\auto-group\groupView.ts

Finally, I have to use the sed command to remove ..\ in front of the paths before running sonar-scanner.bat, then the problem was solved.

sed -i 's/\..\\//g' lcov.info

Please comment if you can solve the problem with changing options in the tsconfig.json file.

4. How to output to more logs

To output more logs, change sonar.log.level=INFO to sonar.log.level=DEBUG in below.

Note: all above changes of sonar.properties need to restart the SonarQube instance to take effect.

Final sonar.properties

For the sonar.properties file, please see below or link

Read More