软件开发中的特性标志与开源项目实践
1. 特性标志工具介绍
特性标志是一种开发实践,可在生产阶段直接测试应用程序。有多种特性标志工具可供选择,包括开源工具和云解决方案(PaaS)。
1.1 开源工具
- Togglz :开源特性标志工具,项目地址为 https://github.com/togglz/togglz 。
- Flip :开源特性标志工具,项目地址为 https://github.com/pda/flip 。
1.2 云解决方案(PaaS)
| 工具名称 | 地址 |
|---|---|
| LaunchDarkly | https://launchdarkly.com/ |
| Rollout | https://app.rollout.io/signup |
| Featureflag.tech | https://featureflag.tech/ |
| Featureflow | https://www.featureflow.io/ |
这些云解决方案大多需要企业进行大规模使用时进行财务投资,但它们通常提供无需安装的特性标志管理后台。
2. 使用 RimDev.FeatureFlags 实现特性标志
2.1 工具介绍
RimDev.FeatureFlags 是一个用 .NET 编写的免费开源框架,通过 NuGet 包进行打包和分发,项目地址为 https://github.com/ritterim/RimDev.FeatureFlags ,NuGet 包地址为 https://www.nuget.org/packages/RimDev.AspNetCore.FeatureFlags 。该框架使用数据库存储特性标志数据,实现后会提供一个 Web 用户界面,用于启用或禁用特性标志。
2.2 初始化步骤
假设已有一个已初始化的 ASP.NET MVC Core 应用程序,并使用 SQL Server 数据库存储特性标志数据。初始化 RimDev.FeatureFlags 的步骤如下:
1. 引用 NuGet 包 :
- 修改应用程序的 .csproj 文件,添加以下代码:
<ItemGroup>
...
<PackageReference Include="RimDev.AspNetCore.FeatureFlags" Version="1.2.0" />
</ItemGroup>
- 或者在终端中执行以下命令:
dotnet add package RimDev.AspNetCore.FeatureFlags
- 配置数据库连接字符串 :在 appsettings.json 配置文件中添加以下代码:
"connectionStrings": {
"localDb": "Data Source=<your database server>;Database=FeatureFlags.AspNetCore;User ID=<your user>;Password=<password data>"
}
- 在 startup.cs 文件中添加配置 :
private readonly FeatureFlagOptions options;
public Startup(IConfiguration configuration)
{
Configuration = configuration;
options = new FeatureFlagOptions().UseCachedSqlFeatureProvider(Configuration.GetConnectionString("localDb"));
}
public void ConfigureServices(IServiceCollection services)
{
...
services.AddFeatureFlags(options);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
...
app.UseFeatureFlags(options);
app.UseFeatureFlagsUI(options);
}
2.3 创建和使用特性标志
以创建一个名为 ShowBoxHome 的特性标志为例,该标志用于控制应用程序主页中间是否显示图像。具体步骤如下:
1. 创建特性标志类 :
using RimDev.AspNetCore.FeatureFlags;
namespace appFeatureFlags.Models{
public class ShowBoxHome : Feature {
public override string Description { get; } = "Show the home center box.";
}
}
- 在控制器中调用特性标志类 :
public class HomeController : Controller {
private readonly ShowBoxHome showboxHome;
public HomeController (ShowBoxHome showboxHome){
this.showboxHome = showboxHome;
}
public IActionResult Index() {
return View(new HomeModel{ShowboxHome = this.showboxHome.Value});
}
...
}
- 创建 HomeModel 类 :
public class HomeModel
{
public bool ShowBoxHome { get; set; }
}
- 在视图中使用特性标志 :在 Views/Home/index.chtml 中添加以下代码:
<div class="text-center">
@if(Model.ShowBoxHome){
<div><img src="img/test.png"></div>
}
</div>
2.4 动态激活特性标志
应用程序启动后,默认主页中间没有图像。要显示图像,可按以下步骤操作:
1. 访问后台管理页面: http://<yoursite>/_features ,会看到一个名为 ShowHomeBow 的开关。
2. 打开开关激活特性标志。
3. 重新加载应用程序主页,即可看到中间显示图像。
3. 使用 LaunchDarkly 实现特性标志
3.1 工具介绍
LaunchDarkly 是一个 SaaS 平台,由特性标志管理后台和 SDK 组成,SDK 支持多种开发语言,如 .NET、JavaScript、Go 和 Java 等。该平台提供用户管理特性标志和 A/B 测试功能,但需要付费使用,不过提供 30 天免费试用。
3.2 创建特性标志
- 登录 LaunchDarkly 账户 :点击 LaunchDarkly 网站顶部菜单的 Sign In 按钮,或直接访问 https://app.launchdarkly.com/ 。
- 创建新项目 :登录账户后,在 Account settings 部分创建一个名为 DemoBook 的新项目。默认会创建两个环境,也可创建自己的环境,每个环境有唯一的 SDK 密钥,用于 SDK 认证。
- 创建特性标志 :在名为 Test 的环境中,导航到 Feature flags 菜单,点击 NEW + 按钮,创建一个名为 ShowBoxHome 的特性标志,创建后可通过开关激活。
3.3 在应用程序中使用 SDK
- 选择并集成 SDK :根据应用程序开发语言选择相应的 SDK,对于 .NET 应用程序,参考 https://docs.launchdarkly.com/docs/dotnet-sdk-reference 。在应用程序的 .csproj 文件中添加以下代码:
<ItemGroup>
<PackageReference Include="LaunchDarkly.ServerSdk" Version="5.6.5" />
...
</ItemGroup>
- 导入 SDK 并连接到 LaunchDarkly :在控制器代码中添加以下代码:
using LaunchDarkly.Client;
public IActionResult Index() {
LdClient ldClient = new LdClient("sdk-eb0443dc-xxxx-xxx-xx-xxx");
User user = LaunchDarkly.Client.User.WithKey(User.Identity.Name);
bool showBoxHome = ldClient.BoolVariation("show-box-home", user, false);
return View(new HomeModel{ShowBoxHome = showBoxHome});
}
- 在视图中添加条件显示图像 :在 Home/Index.chtml 视图中添加以下代码:
<div class="text-center">
@if(Model.ShowBoxHome){
<div><img src="img/test.png"></div>
}
</div>
3.4 测试特性标志
部署并执行应用程序,默认主页会显示中央图像。可在 LaunchDarkly 门户中为当前用户修改该特性标志的值为 false,重新加载页面后,中央图像将不再显示。
4. 开源项目实践
4.1 开源项目的重要性
如今,开源在开发和企业领域已成为必然趋势。开源不仅可以使用开源产品,还能参与项目的改进和发展。开发者可通过讨论使用问题、提出改进建议或修改源代码来为开源项目做出贡献,也可将自己的项目以开源方式分享给社区。
4.2 技术要求
进行开源项目实践需要一个 GitHub 账户,可在 https://github.com/ 免费创建。为了更好地理解后续的 DevOps 实践,建议熟悉版本控制、持续集成和持续交付以及静态代码分析等相关知识。
4.3 存储源代码到 GitHub
如果想以开源方式分享项目,需要将代码存储在支持公共仓库和代码协作的 Git 平台上。常见的平台有 GitLab 和 GitHub,其中 GitHub 是目前最常用的开源项目平台。
4.4 创建新的 GitHub 仓库
创建新的 GitHub 仓库的步骤如下:
1. 登录 GitHub 账户,若为新用户,可前往 https://github.com/ 创建账户。
2. 登录后,进入账户的 Repositories 标签页。
3. 点击 New 按钮。
4. 填写新仓库的相关信息:
- 仓库名称 :必填项。
- 描述 :可选项。
- 仓库类型 :选择 Public(公共仓库,任何人都可访问)或 Private(私有仓库,仅授权成员可访问)。
- 初始化选项 :可选择初始化仓库时包含一个空的 README.md 文件和 .gitignore 文件。
以下是创建新仓库的流程图:
graph LR
A[登录 GitHub 账户] --> B[进入 Repositories 标签页]
B --> C[点击 New 按钮]
C --> D[填写仓库信息]
D --> E[选择仓库类型]
D --> F[选择初始化选项]
E --> G[创建仓库]
F --> G
通过以上步骤,就可以将项目的源代码存储在 GitHub 上,并开始参与开源项目的开发和协作。
5. 贡献开源项目使用拉取请求
5.1 拉取请求的重要性
拉取请求(Pull Request)是向开源项目贡献代码的重要方式。通过拉取请求,开发者可以将自己对项目的修改提交给项目维护者,由维护者决定是否合并这些修改到主项目中。这不仅促进了代码的共享和协作,还能让更多人参与到项目的改进中来。
5.2 贡献步骤
以下是使用拉取请求向开源项目贡献代码的一般步骤:
1. Fork 项目 :在 GitHub 上找到目标开源项目,点击页面右上角的“Fork”按钮,将项目复制到自己的 GitHub 账户下。
2. 克隆项目到本地 :使用 git clone 命令将自己账户下的项目克隆到本地开发环境中。
git clone https://github.com/yourusername/repositoryname.git
- 创建新分支 :在本地项目中创建一个新的分支,用于进行修改。
git checkout -b new-feature
- 进行修改 :在新分支上进行代码修改、添加或删除等操作。
- 提交修改 :使用
git add和git commit命令将修改提交到本地仓库。
git add .
git commit -m "Add new feature"
- 推送分支到 GitHub :使用
git push命令将本地分支推送到自己账户下的 GitHub 仓库。
git push origin new-feature
- 发起拉取请求 :在自己账户下的 GitHub 仓库页面,点击“New pull request”按钮,选择要合并的分支和目标分支,填写拉取请求的描述信息,然后提交拉取请求。
5.3 管理拉取请求
项目维护者在收到拉取请求后,会对提交的代码进行审核。可能会提出一些修改建议,贡献者需要根据建议进行修改,并再次提交。整个过程可能需要多次沟通和修改,直到维护者认为代码符合要求并合并到主项目中。
6. 管理变更日志和发布说明
6.1 变更日志的作用
变更日志(Changelog)记录了项目在不同版本之间的所有变更,包括新增功能、修复的 bug、改进的性能等。它有助于开发者和用户了解项目的发展历程,以及每个版本的具体变化。
6.2 发布说明的重要性
发布说明(Release Notes)是在项目发布新版本时提供给用户的一份文档,详细介绍了新版本的主要变化、改进和已知问题等信息。它可以帮助用户快速了解新版本的特点,决定是否升级。
6.3 管理方法
管理变更日志和发布说明可以按照以下步骤进行:
1. 记录变更 :在开发过程中,及时记录每次代码修改的详细信息,包括修改的内容、原因和影响范围。
2. 整理变更日志 :在发布新版本之前,将记录的变更信息整理成规范的变更日志,按照版本号进行分类。
3. 编写发布说明 :根据变更日志,编写简洁明了的发布说明,突出新版本的主要特点和改进。
4. 发布变更日志和发布说明 :将变更日志和发布说明发布到项目的官方网站、GitHub 仓库等地方,方便用户查看。
以下是一个简单的变更日志示例:
| 版本号 | 发布日期 | 变更内容 |
| ---- | ---- | ---- |
| v1.0.0 | 2024-01-01 | 初始版本发布,包含基本功能 |
| v1.1.0 | 2024-02-01 | 新增了用户登录和注册功能 |
| v1.2.0 | 2024-03-01 | 修复了部分 bug,优化了性能 |
7. 在 GitHub 发布中共享二进制文件
7.1 二进制文件的作用
在开源项目中,有时需要共享一些二进制文件,如编译后的可执行文件、库文件等。这些二进制文件可以方便用户直接使用项目,而无需自己进行编译。
7.2 共享步骤
在 GitHub 发布中共享二进制文件的步骤如下:
1. 创建发布 :在 GitHub 仓库的页面,点击“Releases”标签,然后点击“Create a new release”按钮。
2. 填写发布信息 :填写发布的版本号、标题、描述等信息。
3. 上传二进制文件 :在发布页面中,点击“Attach binaries by selecting them”按钮,选择要上传的二进制文件。
4. 发布版本 :填写完所有信息并上传二进制文件后,点击“Publish release”按钮,将发布版本并共享二进制文件。
8. 使用 Travis CI 进行持续集成
8.1 持续集成的概念
持续集成(Continuous Integration,CI)是一种软件开发实践,通过频繁地将代码集成到共享仓库中,并自动运行测试和构建过程,确保代码的质量和稳定性。
8.2 Travis CI 的作用
Travis CI 是一个基于云的持续集成服务,支持多种编程语言和平台。它可以与 GitHub 集成,当代码发生变更时,自动触发构建和测试任务。
8.3 使用步骤
使用 Travis CI 进行持续集成的步骤如下:
1. 登录 Travis CI :使用 GitHub 账户登录 Travis CI 。
2. 授权访问仓库 :在 Travis CI 中授权访问要进行持续集成的 GitHub 仓库。
3. 创建 .travis.yml 文件 :在项目的根目录下创建一个名为 .travis.yml 的文件,配置构建和测试任务。以下是一个简单的 .travis.yml 文件示例:
language: csharp
solution: MyProject.sln
install:
- nuget restore MyProject.sln
script:
- xbuild /p:Configuration=Release MyProject.sln
- mono ./packages/NUnit.ConsoleRunner.*/tools/nunit3-console.exe ./MyProject.Tests/bin/Release/MyProject.Tests.dll
- 提交 .travis.yml 文件 :将
.travis.yml文件提交到 GitHub 仓库,Travis CI 会自动检测到文件的变更并触发构建和测试任务。
以下是使用 Travis CI 进行持续集成的流程图:
graph LR
A[代码提交到 GitHub] --> B[Travis CI 检测到变更]
B --> C[读取 .travis.yml 文件]
C --> D[执行安装步骤]
D --> E[执行构建步骤]
E --> F[执行测试步骤]
F --> G[输出构建和测试结果]
9. 开始使用 GitHub Actions
9.1 GitHub Actions 的介绍
GitHub Actions 是 GitHub 提供的一种自动化工具,允许用户在 GitHub 仓库中创建自定义的工作流。通过编写 YAML 文件,可以定义一系列的任务,如构建、测试、部署等,当特定事件发生时自动触发。
9.2 使用步骤
使用 GitHub Actions 的步骤如下:
1. 创建 .github/workflows 目录 :在项目的根目录下创建一个名为 .github/workflows 的目录。
2. 创建工作流文件 :在 .github/workflows 目录下创建一个 YAML 文件,定义工作流的任务和触发条件。以下是一个简单的工作流文件示例:
name: CI
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up .NET
uses: actions/setup-dotnet@v1
with:
dotnet-version: 6.0.x
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: Test
run: dotnet test --no-build --verbosity normal
- 提交工作流文件 :将工作流文件提交到 GitHub 仓库,当满足触发条件时,GitHub Actions 会自动执行工作流中的任务。
10. 使用 SonarCloud 进行代码分析
10.1 静态代码分析的重要性
静态代码分析是在不运行代码的情况下,对代码进行检查和分析,以发现潜在的问题,如代码漏洞、代码规范问题等。它可以提高代码的质量和可维护性。
10.2 SonarCloud 的作用
SonarCloud 是一个基于云的静态代码分析平台,支持多种编程语言。它可以与 GitHub 集成,在代码提交时自动进行代码分析,并提供详细的分析报告。
10.3 使用步骤
使用 SonarCloud 进行代码分析的步骤如下:
1. 注册 SonarCloud 账户 :访问 SonarCloud 并注册账户。
2. 创建项目 :在 SonarCloud 中创建一个新的项目,并关联 GitHub 仓库。
3. 配置分析任务 :在项目的根目录下创建一个名为 sonar-project.properties 的文件,配置分析任务。以下是一个简单的 sonar-project.properties 文件示例:
sonar.projectKey=my-project-key
sonar.organization=my-organization
sonar.sources=.
sonar.host.url=https://sonarcloud.io
- 集成到 CI/CD 流程 :在 Travis CI 或 GitHub Actions 的工作流中添加 SonarCloud 分析任务。以下是一个在 GitHub Actions 中集成 SonarCloud 分析的示例:
name: CI with SonarCloud
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up .NET
uses: actions/setup-dotnet@v1
with:
dotnet-version: 6.0.x
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: SonarCloud Scan
uses: SonarSource/sonarcloud-github-action@master
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
11. 使用 WhiteSource Bolt 检测安全漏洞
11.1 安全漏洞检测的重要性
在开源项目中,安全漏洞是一个重要的问题。及时检测和修复安全漏洞可以保护项目和用户的安全。
11.2 WhiteSource Bolt 的作用
WhiteSource Bolt 是一个用于检测开源项目中包安全漏洞的工具。它可以自动扫描项目中的依赖项,检测是否存在已知的安全漏洞,并提供修复建议。
11.3 使用步骤
使用 WhiteSource Bolt 检测安全漏洞的步骤如下:
1. 注册 WhiteSource Bolt 账户 :访问 WhiteSource Bolt 并注册账户。
2. 安装插件 :根据项目的开发环境,安装相应的 WhiteSource Bolt 插件。
3. 扫描项目 :在开发环境中运行 WhiteSource Bolt 插件,扫描项目的依赖项。
4. 查看和修复漏洞 :在 WhiteSource Bolt 控制台中查看扫描结果,根据建议修复发现的安全漏洞。
通过以上的开源项目实践,可以更好地参与开源项目的开发和维护,提高代码的质量和安全性。同时,利用各种工具和平台,可以实现自动化的开发流程,提高开发效率。
超级会员免费看

被折叠的 条评论
为什么被折叠?



