跳到主要内容

115 篇博文 含有标签「开发工具与环境」

开发工具和环境配置相关文章

查看所有标签

Harbor 配置并生成认证信息

· 阅读需 2 分钟
素明诚
Full stack development

快速配置 Harbor 和生成认证信息

Harbor 是一个开源的镜像仓库,提供了强大的功能来管理和分发 Docker 镜像。为了能够推送和拉取镜像,我们需要正确配置 Harbor 并生成相应的认证信息。本文将介绍如何快速配置 Harbor 和生成认证信息,以便与 Docker 客户端进行交互。

Harbor 创建用户账户

  • 在 Harbor 的 Web 界面中,点击左侧导航栏的 "系统管理" -> "用户管理"。
  • 点击 "新建用户" 按钮,填写用户名、邮箱、密码等信息,并选择适当的用户角色(例如 "开发人员" 或 "项目管理员")。
  • 点击 "确定" 按钮创建新用户。

生成 Docker 认证信息

  • 使用新创建的用户账户登录 Harbor。
  • 点击右上角的用户名,选择 "用户配置"。
  • 在 "用户配置" 页面中,找到 "Docker CLI" 部分。
  • 复制提供的 docker login 命令
docker login -u 用户名 -p 密码 registry地址
  • 在终端中执行该命令,将 用户名密码registry地址 替换为实际的值。
  • Docker 会将认证信息保存在 ~/.docker/config.json 文件中。

推送和拉取镜像

使用 docker tag 命令为镜像添加适当的标签,指向 Harbor 的 registry 地址和仓库名称

docker tag 镜像名:标签 registry地址/项目名/仓库名:标签

使用 docker push 命令将镜像推送到 Harbor

docker push registry地址/项目名/仓库名:标签

使用 docker pull 命令从 Harbor 拉取镜像

docker pull registry地址/项目名/仓库名:标签

Docker 将自动使用之前生成的认证信息进行身份验证

Linux Bashtop 安装使用指南

· 阅读需 2 分钟
素明诚
Full stack development

bashtop

265fcc37dc81fb5e8db6aa6d1bb78f21## 安装

Ubuntu/Debian

sudo apt install bashtop

CentOS/RHEL

sudo yum install epel-release
sudo yum install bashtop

Fedora

sudo dnf install bashtop

Arch Linux

sudo pacman -S bashtop

macOS (通过 Homebrew)

brew install bashtop

使用

安装完成后,在终端直接运行 bashtop 命令即可启动。

bashtop

界面说明

  • CPU 使用率:显示每个 CPU 核心的使用率柱状图
  • 内存使用:显示内存和交换空间的使用量
  • 磁盘使用:显示挂载的文件系统的使用量
  • 网络流量:显示实时的上传和下载流量
  • 进程列表:显示当前运行的进程,可以按 CPU 或内存使用排序

交互操作

  • UP/DOWN:上下移动选择进程
  • PgUP/PgDn:上下翻页
  • a:显示所有进程或仅显示活动进程
  • f:进入进程过滤模式
  • +/-:调整进程列表刷新间隔
  • q:退出 bashtop

注意事项

  • Bashtop 需要 root 权限才能完整地获取系统信息,因此最好使用 sudo 运行
  • Bashtop 会消耗一定的系统资源,在资源紧张的服务器上要慎用
  • 频繁刷新进程列表可能会增加系统负载,酌情调整刷新间隔

Vault 初始化与配置

· 阅读需 2 分钟
素明诚
Full stack development

docker-compose 启动

https://github.com/sumingcheng/dev-tools/blob/main/vault/docker-compose.yml### 初始化 Vault

在首次启动 Vault 后,需要进行初始化。这个过程会生成解封密钥和根令牌。

使用以下命令进行初始化,也可以进入容器进行初始化

docker exec -it vault vault operator init

记录下显示的解封密钥和根令牌。这些信息非常重要,必须安全保存。

a116a96b7b77fa3b896cce801dbc7ca7### 解封 Vault

使用初始化时获得的解封密钥解封 Vault。需要至少提供初始化时指定的阈值数量的密钥。

docker exec -it vault vault operator unseal <Unseal_Key>

8fa7c1f92c01241f46656fcf3431b123

图片里给了 5 个 KEY,只要使用其中 3 个即可,重复上述命令,直到 Vault 显示为解封状态。如果 docker 完全重启的话,可能还需要重新解封。

配置环境变量

确保设置正确的环境变量,特别是 VAULT_ADDR,以便您的应用和服务能够正确地与 Vault 通信。

登录到 Vault UI

打开浏览器访问 Vault UI(通常是 http://IP:8000)。

使用初始化生成的根令牌登录。如果 Vault UI 配置了默认的 VAULT_TOKEN_DEFAULT 令牌并且有效,也可以尝试使用它登录。如果无法登录可以先试使用root key 邓肯

配置访问控制和策略

通过 UI 或命令行配置访问控制列表 (ACL) 策略,以定义谁可以访问什么数据。

创建额外的用户和令牌,以便其他系统和用户能够访问 Vault。

Git tag 创建提交删除

· 阅读需 1 分钟
素明诚
Full stack development

git tag 是 Git 版本控制系统中用于标记特定提交的命令。它允许你在代码仓库的历史中的某一点创建一个易于记忆的句柄,代表特定的重要版本。标签(tags)在项目管理中非常有用,尤其是在发布软件版本时。

创建并推送标签

# 创建新标签
git tag -a v1.0.1 -m "v1.0.1"

# 推送标签到远程
git push origin v1.0.1

删除本地和远程标签

# 删除本地标签
git tag -d v1.0.1

# 删除远程标签
git push --delete origin v1.0.1

查看所有标签

git tag

发布 Docker 镜像到 GitHub Packages

· 阅读需 2 分钟
素明诚
Full stack development

1.准备你的项目

确保你的项目包含所有必需的文件,例如Dockerfile(对于 Docker 镜像)、并且你已经在本地测试镜像构建成功。

确定你的项目结构,你的Dockerfile支持版本控制。

2.配置 GitHub Actions

创建工作流文件

在你的 GitHub 仓库中的 .github/workflows 目录下创建一个 YAML 工作流文件。

name: Publish Docker image

on:
push:
branches:
- main
tags:
- 'v*'

jobs:
build-and-push:
runs-on: ubuntu-22.04
steps:
- name: Check out the repo
uses: actions/checkout@v2

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1

- name: Log in to GitHub Container Registry
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.PAT_TOKEN }}

- name: Build and push
uses: docker/build-push-action@v2
with:
context: .
file: ./Dockerfile
push: true
tags: ghcr.io/${{ github.repository_owner }}/gin-blog-template:${{ github.ref_name }}
build-args: VERSION=${{ github.ref_name }}

定义触发条件

配置工作流触发条件,比如在推送到特定分支或创建标签时触发。我配置的是提交tag到主分支后触发构建镜像的流程

配置环境变量,设置 GitHub Secrets

这里需要你仓库的一些权限,需要你生成PAT_TOKEN确保你有以下权限

  • write:packages (允许写入包)
  • delete:packages (可选,允许删除包)
  • repo (允许访问私有仓库,如果您的仓库是私有的)

创建令牌

3cb98ce51325c66ec3f995bf6d96319d### 添加到仓库的环境变量
238f091e27596b2f8551428ee5efed9e### 提交要构建的 tag 并推送

创建注释标签

git tag -a v1.0 -m "Release version 1.0"

查看所有标签

git tag

推送标签到远程仓库

git push origin v1.0

构建成功后你可以看到你的镜像

https://github.com/sumingcheng/gin-blog-template/pkgs/container/gin-blog-template

febd41c887cb836369ca768d26d3d3f3### 3.设置包的可见性(可选)

一旦包被推送到 GitHub Packages,你可能需要设置其可见性(公开或私有)。这可以在 GitHub 界面中完成,通过修改包的设置。

a42761d361813deed0775762a8a2bf22

修改可见性

e73a6d6c637e29d6af34554f689e8b07

修改为公开的

4.链接到仓库(可选)

如果需要,你可以将包链接到一个特定的 GitHub 仓库,以便更好地集成和展示。直接链接到你想展示的仓库,创建即可。

3b7fdbc667d8671a178d7d0600779192### 5.验证和测试

验证包是否已正确发布到 GitHub Packages,并测试是否可以正常下载和使用。

52170a3fec321082944d9904d532b1cf

如何上传镜像到 Docker Hub

· 阅读需 1 分钟
素明诚
Full stack development

创建 Docker Hub 账户:如果还没有 Docker Hub 账户,首先访问 Docker Hub 注册一个账户

https://hub.docker.com/## 进入终端

登录 Docker Hub: 在本地终端使用以下命令登录 Docker Hub

docker login

按照提示输入您的 Docker Hub 用户名和密码

标记您的镜像: 在上传镜像之前,需要将您的本地镜像标记为远程仓库的格式使用以下命令

docker tag local-image:tag username/repository:tag

其中 local-image:tag 是您本地的镜像名和标签,username/repository:tag 是您在 Docker Hub 上的用户名、仓库名和标签

上传镜像: 使用以下命令上传镜像

docker push username/repository:tag

确保替换 username/repository:tag 为您标记的镜像名

确认上传: 上传完成后,您可以在 Docker Hub 上的账户仓库中看到您的镜像

Consul 功能详解实践服务注册和发现案例

· 阅读需 4 分钟
素明诚
Full stack development

服务发现

服务实例在启动时向 Consul 注册其详细信息(如服务名、IP、端口),并通过 Consul 查询其他服务的详细信息,实现动态发现和连接。

定期健康检查:配置健康检查确保仅健康实例被发现。

服务标签:利用标签对服务进行分类,便于管理和过滤。

健康检查

可以设置多种类型的健康检查,如 HTTP、TCP、Docker 或自定义脚本,以验证服务状态。

精细的检查间隔:根据服务的重要程度调整检查频率。你的服务挂了超过多久自动删除

键值存储

通过 Consul 的 HTTP API 进行键值对的读写操作,存储配置数据或其他共享数据。

动态配置更新:利用键值存储动态更新配置,无需重启服务。

数据一致性:使用 Consul 的事务功能确保关键配置的一致性更新。

多数据中心支持

Consul 允许配置跨多个地理区域的服务同步和状态共享,每个数据中心都可以独立运行,同时与其他数据中心保持同步。

地理特定的健康检查:每个数据中心应有针对性的健康检查策略。

加密通信:确保所有数据中心间的通信经过加密,保护数据安全。

服务发现和注册案例

启动 A 和 B 两个服务之前需要保证 Consul 是正常运行的,并且 Consul 和服务直接的网络是相通的

配置文件

consul:
address: "http://172.22.220.64"
port: "8500"

服务 a

package Consul

import (
"github.com/gin-gonic/gin"
"github.com/hashicorp/consul/api"
"github.com/spf13/viper"
"log"
"net/http"
)

func init() {
viper.SetConfigFile("./Consul/config.yaml")
err := viper.ReadInConfig() // 查找并读取配置文件
if err != nil { // 处理读取配置文件的错误
log.Fatalf("致命错误: 配置文件读取失败: %s \n", err)
}
}

func main() {

// 创建 Consul 客户端
consulConfig := api.DefaultConfig()
consulConfig.Address = viper.GetString("consul.address") + ":" + viper.GetString("consul.port")
consulClient, err := api.NewClient(consulConfig)
if err != nil {
log.Fatalf("创建 Consul 客户端时发生错误: %s", err)
}

// 注册服务
registration := &api.AgentServiceRegistration{
ID: "serviceA",
Name: "service-a",
Address: "172.16.50.251",
Port: 8080,
Check: &api.AgentServiceCheck{
HTTP: "http://172.16.50.251:8080/health",
Interval: "10s",
DeregisterCriticalServiceAfter: "1m",
},
}
err = consulClient.Agent().ServiceRegister(registration)
if err != nil {
log.Fatalf("向 Consul 注册服务 A 时发生错误: %s", err)
}

// 设置 Gin 路由
r := gin.Default()
r.GET("/health", func(c *gin.Context) {
c.Status(http.StatusOK)
})
r.GET("/data", func(c *gin.Context) {
c.String(http.StatusOK, "来自服务 A 的问候!")
})

// 启动 HTTP 服务器
log.Println("服务 A 正在端口 8080 上运行")
r.Run(":8080")
}


服务 b

package Consul

import (
"github.com/gin-gonic/gin"
"github.com/hashicorp/consul/api"
"github.com/spf13/viper"
"io/ioutil"
"log"
"net/http"
"strconv"
)

func init() {
viper.SetConfigFile("./Consul/config.yaml")
err := viper.ReadInConfig()
if err != nil {
log.Fatalf("致命错误: 配置文件读取失败: %s \n", err)
}
}

func main() {
// 创建 Consul 客户端
consulConfig := api.DefaultConfig()
consulConfig.Address = viper.GetString("consul.address") + ":" + viper.GetString("consul.port")
consulClient, err := api.NewClient(consulConfig)
if err != nil {
log.Fatalf("创建 Consul 客户端时发生错误: %s", err)
}

// 注册服务
registration := &api.AgentServiceRegistration{
ID: "serviceB",
Name: "service-b",
Address: "172.16.50.251",
Port: 8081,
Check: &api.AgentServiceCheck{
HTTP: "http://172.16.50.251:8081/health",
Interval: "10s",
DeregisterCriticalServiceAfter: "1m",
},
}
err = consulClient.Agent().ServiceRegister(registration)
if err != nil {
log.Fatalf("向 Consul 注册服务 B 时发生错误: %s", err)
}

// 设置 Gin 路由
r := gin.Default()
r.GET("/health", func(c *gin.Context) {
c.Status(http.StatusOK)
})
r.GET("/call-a", func(c *gin.Context) {
// 发现服务 A 并调用其 API
services, _, err := consulClient.Health().Service("service-a", "", true, nil)
if err != nil {
c.String(http.StatusInternalServerError, "从 Consul 获取服务时发生错误")
return
}
if len(services) > 0 {
serviceA := services[0].Service
url := "http://" + serviceA.Address + ":" + strconv.Itoa(serviceA.Port) + "/data"
resp, err := http.Get(url)
if err != nil {
c.String(http.StatusInternalServerError, "调用服务 A 时发生错误")
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
c.String(http.StatusInternalServerError, "读取服务 A 响应时发生错误")
return
}
c.String(http.StatusOK, string(body))
} else {
c.String(http.StatusNotFound, "未找到服务 A")
}
})

// 启动 HTTP 服务器
log.Println("服务 B 正在端口 8081 上运行")
r.Run(":8081")
}


测试

package test

import (
"io/ioutil"
"net/http"
"testing"
)

func TestService_b(t *testing.T) {
// 直接发起对服务 A 的 GET 请求
resp, err := http.Get("http://172.16.50.251:8081/call-a")
if err != nil {
t.Fatal("创建请求失败:", err)
}
defer resp.Body.Close()

// 检查状态码
if resp.StatusCode != http.StatusOK {
t.Errorf("期望的状态码 200,但是获取的是 %d", resp.StatusCode)
}

// 读取响应体
bodyBytes, err := ioutil.ReadAll(resp.Body)
if err != nil {
t.Fatal("读取响应体失败:", err)
}
body := string(bodyBytes)

// 打印响应体内容
t.Logf("响应体内容: %s", body)
}


5a33480b91f5d14e7b6c3c441d395a5f

求个赞

Git 保留主分支的最近一次提交放弃之前所有的提交

· 阅读需 1 分钟
素明诚
Full stack development

切换到主分支: 确保你当前处于主分支

git checkout main

重置分支到最新的提交: 使用 git reset 命令将分支重置到最新的提交这里使用 --hard 选项,这将会重置工作目录和索引(暂存区)到你指定的提交

git reset --hard HEAD

删除旧的提交记录: 如果你想彻底删除除最新之外的所有提交记录,可以使用下面的步骤

警告:这将不可逆转地删除这些提交记录

git branch new-temp-branch $(git commit-tree HEAD^{tree} -m "New initial commit")
git checkout new-temp-branch
git branch -D main
git branch -m main

清理仓库: 运行垃圾回收命令来清理不再需要的对象(即旧的提交记录)

git gc --prune=now

推送变更到远程仓库: 如果你的分支是跟踪远程仓库的,你需要强制推送这些变更,覆盖之前所有的历史记录

git push origin main --force

github 使用个人访问令牌PAT克隆项目

· 阅读需 1 分钟
素明诚
Full stack development

生成 PAT

登录 GitHub。

在右上角点击你的头像,然后选择“Settings(设置)”。

在侧边栏中选择“Developer settings(开发者设置)”。

选择“Personal access tokens(个人访问令牌)”,然后点击“Generate new token(生成新令牌)”。

设置令牌的权限,并生成。

克隆项目

替换为仓库的 URL

git clone https://username@repository-url.git

当提示输入密码时,输入刚才生成的 PAT

Git 提交规范之 commit 标题

· 阅读需 1 分钟
素明诚
Full stack development

用于说明 commit 的类别,只允许使用以下标识

commit 的简短描述,一般来说不超过 50 个字符

feat (新功能)

feat(search): Implement full-text search using Elasticsearch

feat(payment): Integrate Stripe for processing payments

feat(sharing): Add social media sharing buttons to product pages

feat(localization): Support multi-language content

fix (修复问题)

fix(memory-leak): Patch memory leak observed in image processing

fix(security): Sanitize user input to prevent SQL injection

fix(crash): Resolve app crash related to zero-length data parsing

fix(ui-render): Fix broken layout on mobile devices in landscape mode

docs (文档改动)

docs(installation): Revise steps to clarify the setup process

docs(contributing): Update contribution guidelines to include code review practices

docs(faq): Expand the FAQ section to cover newly reported issues

docs(license): Correct the copyright year in license documentation

style (格式调整)

style(sass): Convert CSS files to Sass for easier maintenance

style(indentation): Normalize indentation across all JavaScript files

style(variable-naming): Refactor to follow camelCase naming convention

refactor (代码重构)

refactor(auth-module): Decouple authentication from user management

refactor(api-responses): Standardize API responses to use a common format

refactor(logging): Enhance logging mechanism for better scalability

refactor(component-split): Break down the monolithic MainPage component into smaller units

test (测试相关)

test(deployment): Add pre-deployment smoke tests to the pipeline

test(performance): Implement new benchmarks for recent optimizations

test(accessibility): Conduct accessibility audits and address issues

test(integration): Increase coverage for integration testing between modules

chore (杂项)

chore(update-framework): Update frontend framework to latest stable version

chore(cleanup-deps): Remove unused dependencies to reduce build size

chore(data-migration): Script data migration for next database schema update

chore(ci-config): Modify CI configuration to include new test suites