-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.json
1 lines (1 loc) · 97.7 KB
/
index.json
1
[{"content":"服务器安装 certbot CentOS # 将EPEL扩展库添加到CentOS 7 $ yum install epel-release # 安装snapd $ yum install snapd # 启用snapd.socket $ systemctl enable --now snapd.socket # 创建软链接,用来启用classic snap支持 $ ln -s /var/lib/snapd/snap /snap # 确保snapd版本是最新的 $ snap install core $ snap refresh core # 移除yum上的certbot,进一步确保certbot是通过snap安装的 $ yum remove certbot $ snap install --classic certbot $ ln -s /snap/bin/certbot /usr/bin/certbot Debian $ apt update $ apt install snapd $ snap install core $ snap refresh core $ snap install --classic certbot $ ln -s /snap/bin/certbot /usr/bin/certbot 通过DNS TXT验证申请证书 输入命令 certbot --manual --preferred-challenges dns certonly 进行验证申请证书\nSaving debug log to /var/log/letsencrypt/letsencrypt.log Please enter the domain name(s) you would like on your certificate (comma and/or space separated) (Enter \u0026#39;c\u0026#39; to cancel): #这里输入域名 如果是泛域名请输入 *.example.com 这里以*.example.com举例 Requesting a certificate for *.example.com - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Please deploy a DNS TXT record under the name: _acme-challenge.example.com. with the following value: ldjemqlmhqoBLiU7DFc5eA-w58NC7Ub9pRvErizKQpw Before continuing, verify the TXT record has been deployed. Depending on the DNS provider, this may take some time, from a few seconds to multiple minutes. You can check if it has finished deploying with aid of online tools, such as the Google Admin Toolbox: https://toolbox.googleapps.com/apps/dig/#TXT/_acme-challenge.example.com. Look for one or more bolded line(s) below the line \u0026#39;;ANSWER\u0026#39;. It should show the value(s) you\u0026#39;ve just added. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Press Enter to Continue #这里按照上方提示 在DNS解析中添加 TXT记录 _acme-challenge.example.com 值为 上面的 ldjemqlmhqoBLiU7DFc5eA-w58NC7Ub9pRvErizKQpw 需注意每次运行的TXT记录值会改变 Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/example.com-0001/fullchain.pem Key is saved at: /etc/letsencrypt/live/example.com-0001/privkey.pem This certificate expires on 2024-08-11. These files will be updated when the certificate renews. NEXT STEPS: - This certificate will not be renewed automatically. Autorenewal of --manual certificates requires the use of an authentication hook script (--manual-auth-hook) but one was not provided. To renew this certificate, repeat this same certbot command before the certificate\u0026#39;s expiry date. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - If you like Certbot, please consider supporting our work by: * Donating to ISRG / Let\u0026#39;s Encrypt: https://letsencrypt.org/donate * Donating to EFF: https://eff.org/donate-le - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 上方输入结束后证书就自动保存到/etc/letsencrypt/live/example.com-0001/目录下 自行部署到所需业务即可\n","permalink":"https://www.potawang.cn/post/certbot_apply_ssl/","summary":"\u003ch1 id=\"服务器安装-certbot\"\u003e服务器安装 certbot\u003c/h1\u003e\n\u003ch3 id=\"centos\"\u003eCentOS\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# 将EPEL扩展库添加到CentOS 7\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ yum install epel-release\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# 安装snapd\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ yum install snapd\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# 启用snapd.socket\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ systemctl enable --now snapd.socket\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# 创建软链接,用来启用classic snap支持\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ ln -s /var/lib/snapd/snap /snap\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# 确保snapd版本是最新的\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ snap install core\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ snap refresh core\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#75715e\"\u003e# 移除yum上的certbot,进一步确保certbot是通过snap安装的\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ yum remove certbot\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ snap install --classic certbot\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ ln -s /snap/bin/certbot /usr/bin/certbot\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"debian\"\u003eDebian\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ apt update\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ apt install snapd\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ snap install core\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ snap refresh core\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ snap install --classic certbot\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ ln -s /snap/bin/certbot /usr/bin/certbot\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch1 id=\"通过dns-txt验证申请证书\"\u003e通过DNS TXT验证申请证书\u003c/h1\u003e\n\u003cblockquote\u003e\n\u003cp\u003e输入命令 \u003ccode\u003ecertbot --manual --preferred-challenges dns certonly\u003c/code\u003e 进行验证申请证书\u003c/p\u003e","title":"使用Certbot申请域名证书"},{"content":"为了确保仓库速度和防止github账号出现问题,在个人服务器搭建了gitea并配置了Drone CI,具体搭建方法网上很多这里就不在说明了。\n远程仓库 这里指的是Github,创建专门用来同步的SSH-KEY,当然直接使用你一直在用的也行,但是为了防止数据泄露,最好创建一个单独使用的。 在Drone里开启需要同步仓库的CI并在 Setting \u0026gt; Secrets 中将密钥添加进去,Key自定义即可,这里使用的是SSH-KEY Gitea仓库添加.drone.yml文件 并填入以下内容 kind: pipeline type: docker name: build steps: - name: sync-to-github image: appleboy/drone-git-push settings: branch: master remote: [email protected]:example/example.git #远程仓库地址 remote_name: master #需要推送到哪个分支 force: true #是否强制推送 commit: true ssh_key: #使用上面设置的key进行推送 from_secret: SSH-KEY trigger: branch: - master 如果一切正常应该能看到以下构建过程 至此,当前仓库就会自动同步备份到GitHub中 ","permalink":"https://www.potawang.cn/post/gitea_sync_to_github/","summary":"\u003cp\u003e为了确保仓库速度和防止github账号出现问题,在个人服务器搭建了gitea并配置了Drone CI,具体搭建方法网上很多这里就不在说明了。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e远程仓库 这里指的是\u003ccode\u003eGithub\u003c/code\u003e,创建专门用来同步的SSH-KEY,当然直接使用你一直在用的也行,但是为了防止数据泄露,最好创建一个单独使用的。\u003c/li\u003e\n\u003cli\u003e在Drone里开启需要同步仓库的CI并在 \u003ccode\u003eSetting\u003c/code\u003e \u0026gt; \u003ccode\u003eSecrets\u003c/code\u003e 中将密钥添加进去,Key自定义即可,这里使用的是\u003ccode\u003eSSH-KEY\u003c/code\u003e \u003cimg alt=\"示例\" loading=\"lazy\" src=\"/resource/20220901163424.png\"\u003e\u003c/li\u003e\n\u003cli\u003eGitea仓库添加\u003ccode\u003e.drone.yml\u003c/code\u003e文件 并填入以下内容\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-yml\" data-lang=\"yml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003ekind\u003c/span\u003e: \u003cspan style=\"color:#ae81ff\"\u003epipeline\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003etype\u003c/span\u003e: \u003cspan style=\"color:#ae81ff\"\u003edocker\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003ename\u003c/span\u003e: \u003cspan style=\"color:#ae81ff\"\u003ebuild\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003esteps\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e- \u003cspan style=\"color:#f92672\"\u003ename\u003c/span\u003e: \u003cspan style=\"color:#ae81ff\"\u003esync-to-github\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f92672\"\u003eimage\u003c/span\u003e: \u003cspan style=\"color:#ae81ff\"\u003eappleboy/drone-git-push\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f92672\"\u003esettings\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f92672\"\u003ebranch\u003c/span\u003e: \u003cspan style=\"color:#ae81ff\"\u003emaster\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f92672\"\u003eremote\u003c/span\u003e: \u003cspan style=\"color:#ae81ff\"\[email protected]:example/example.git\u003c/span\u003e \u003cspan style=\"color:#75715e\"\u003e#远程仓库地址\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f92672\"\u003eremote_name\u003c/span\u003e: \u003cspan style=\"color:#ae81ff\"\u003emaster \u003c/span\u003e \u003cspan style=\"color:#75715e\"\u003e#需要推送到哪个分支\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f92672\"\u003eforce\u003c/span\u003e: \u003cspan style=\"color:#66d9ef\"\u003etrue\u003c/span\u003e \u003cspan style=\"color:#75715e\"\u003e#是否强制推送\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f92672\"\u003ecommit\u003c/span\u003e: \u003cspan style=\"color:#66d9ef\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f92672\"\u003essh_key\u003c/span\u003e: \u003cspan style=\"color:#75715e\"\u003e#使用上面设置的key进行推送\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f92672\"\u003efrom_secret\u003c/span\u003e: \u003cspan style=\"color:#ae81ff\"\u003eSSH-KEY\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003etrigger\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f92672\"\u003ebranch\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e - \u003cspan style=\"color:#ae81ff\"\u003emaster\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"4\"\u003e\n\u003cli\u003e如果一切正常应该能看到以下构建过程\u003cimg alt=\"示例\" loading=\"lazy\" src=\"/resource/20220901163849.png\"\u003e\n至此,当前仓库就会自动同步备份到GitHub中\u003c/li\u003e\n\u003c/ol\u003e","title":"同步gitea仓库到github"},{"content":"安装 主节点 curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn INSTALL_K3S_EXEC=\u0026#34;--no-deploy traefik\u0026#34; sh - curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn INSTALL_K3S_EXEC=\u0026#34;--tls-san 121.5.251.228 --node-ip 121.5.251.228 --node-external-ip 121.5.251.228 --no-deploy servicelb --flannel-backend wireguard --kube-proxy-arg \u0026#34;proxy-mode=ipvs\u0026#34; \u0026#34;masquerade-all=true\u0026#34; --kube-proxy-arg \u0026#34;metrics-bind-address=0.0.0.0\u0026#34; --no-deploy traefik \u0026#34; sh - 安装后 /var/lib/rancher/k3s/server/node-token 获取K3S_TOKEN\n删除自带的traefik 如果安装后不需要使用自带的traefik可使用以下方法删除 kubectl -n kube-system get pods\n删除traefik资源: kubectl -n kube-system delete helmcharts.helm.cattle.io traefik 停止k3s服务: sudo service k3s stop 编辑服务文件sudo vim /etc/systemd/system/k3s.service并将此行添加到ExecStart : \u0026ndash;no-deploy traefik \\ 重新加载服务文件: sudo systemctl daemon-reload 从自动部署文件夹中删除清单文件: sudo rm /var/lib/rancher/k3s/server/manifests/traefik.yaml 启动k3s服务: sudo service k3s start 添加子节点 K3S_TOKEN=`cat /var/lib/rancher/k3s/server/node-token` curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=https://domain:6443 K3S_TOKEN=${K3S_TOKEN} sh - curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=https://121.5.251.228:6443 K3S_TOKEN=K10051304dff023c4c7ee9bece98d2cd97874f6bbae7162c6b44f559f63f9f9c6ad::server:3583bfbd2e01f12f2a4971cf38b5bbea sh - 代理 Dashboard kubectl port-forward $(kubectl get pods --selector \u0026#34;app.kubernetes.io/name=traefik\u0026#34; --output=name) 9000:9000 --address=0.0.0.0 centos 8 安装 wireguard sudo curl -Lo /etc/yum.repos.d/wireguard.repo https://copr.fedorainfracloud.org/coprs/jdoss/wireguard/repo/epel-7/jdoss-wireguard-epel-7.repo sudo yum install epel-release -y sudo yum install wireguard-dkms wireguard-tools -y kubeconfig 默认地址 etc/rancher/k3s/k3s.yaml\n","permalink":"https://www.potawang.cn/post/k3s/","summary":"\u003ch2 id=\"安装\"\u003e安装\u003c/h2\u003e\n\u003ch3 id=\"主节点\"\u003e主节点\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecurl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003ecn INSTALL_K3S_EXEC\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;--no-deploy traefik\u0026#34;\u003c/span\u003e sh -\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecurl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003ecn INSTALL_K3S_EXEC\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;--tls-san 121.5.251.228 --node-ip 121.5.251.228 --node-external-ip 121.5.251.228 --no-deploy servicelb --flannel-backend wireguard --kube-proxy-arg \u0026#34;\u003c/span\u003eproxy-mode\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003eipvs\u003cspan style=\"color:#e6db74\"\u003e\u0026#34; \u0026#34;\u003c/span\u003emasquerade-all\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003etrue\u003cspan style=\"color:#e6db74\"\u003e\u0026#34; --kube-proxy-arg \u0026#34;\u003c/span\u003emetrics-bind-address\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e0.0.0.0\u003cspan style=\"color:#e6db74\"\u003e\u0026#34; --no-deploy traefik \u0026#34;\u003c/span\u003e sh -\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e安装后 \u003ccode\u003e/var/lib/rancher/k3s/server/node-token\u003c/code\u003e 获取K3S_TOKEN\u003c/p\u003e\n\u003ch3 id=\"删除自带的traefik\"\u003e删除自带的traefik\u003c/h3\u003e\n\u003cp\u003e如果安装后不需要使用自带的traefik可使用以下方法删除\n\u003ccode\u003ekubectl -n kube-system get pods\u003c/code\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e删除traefik资源: \u003ccode\u003ekubectl -n kube-system delete helmcharts.helm.cattle.io traefik\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e停止k3s服务: \u003ccode\u003esudo service k3s stop\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e编辑服务文件\u003ccode\u003esudo vim /etc/systemd/system/k3s.service\u003c/code\u003e并将此行添加到ExecStart :\n\u0026ndash;no-deploy traefik \\\u003c/li\u003e\n\u003cli\u003e重新加载服务文件: \u003ccode\u003esudo systemctl daemon-reload\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e从自动部署文件夹中删除清单文件: \u003ccode\u003esudo rm /var/lib/rancher/k3s/server/manifests/traefik.yaml\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e启动k3s服务: \u003ccode\u003esudo service k3s start\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"添加子节点\"\u003e添加子节点\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eK3S_TOKEN\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e`\u003c/span\u003ecat /var/lib/rancher/k3s/server/node-token\u003cspan style=\"color:#e6db74\"\u003e`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecurl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003ecn K3S_URL\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003ehttps://domain:6443 K3S_TOKEN\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#e6db74\"\u003e${\u003c/span\u003eK3S_TOKEN\u003cspan style=\"color:#e6db74\"\u003e}\u003c/span\u003e sh -\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecurl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003ecn K3S_URL\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003ehttps://121.5.251.228:6443 K3S_TOKEN\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003eK10051304dff023c4c7ee9bece98d2cd97874f6bbae7162c6b44f559f63f9f9c6ad::server:3583bfbd2e01f12f2a4971cf38b5bbea sh -\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"代理-dashboard\"\u003e代理 Dashboard\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ekubectl port-forward \u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003ekubectl get pods --selector \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;app.kubernetes.io/name=traefik\u0026#34;\u003c/span\u003e --output\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003ename\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e 9000:9000 --address\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e0.0.0.0\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"centos-8-安装-wireguard\"\u003ecentos 8 安装 wireguard\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esudo curl -Lo /etc/yum.repos.d/wireguard.repo https://copr.fedorainfracloud.org/coprs/jdoss/wireguard/repo/epel-7/jdoss-wireguard-epel-7.repo\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esudo yum install epel-release -y\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esudo yum install wireguard-dkms wireguard-tools -y\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"kubeconfig-默认地址\"\u003ekubeconfig 默认地址\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003eetc/rancher/k3s/k3s.yaml\u003c/p\u003e","title":"K3s 安装"},{"content":"使用GitHub Pages配合Hugo搭建Blog中,往往出于各种原因需要将编译前的文件隐藏,如果使用一个仓库进行管理无法实现,而GitHub Pages无法使用私有仓库发布,一开始使用一个私有仓库进行原始文件版本管理,每次编辑后需要将pubilc目录单独再提交至对应的GitHub Pages仓库,此时的步骤应该是:\n编写文章 提交至private repo进行版本管理 本地生成静态文件 将静态文件Push至github pages repo 一个文章的改动非常的不方便,经过后续搜索发现可以使用GitHub提供的action配合hugo官方提供的action自动进行后两步,修改后发布文章只需要再编写后提交至private repo即可,方便再任意终端上随时记录内容\nGitHub 仓库配置 在GitHub头像下拉框选择Setting \u0026gt; Developer Settings \u0026gt; Personal access tokens 选择Generate new token 在上方填入名字,并按勾选 repo 和 admin:repo_hook 下的所有选项 点击 Generate token 生成token,并复制保存好该token 在private repo 中选择 Setting \u0026gt; secrets \u0026gt; New repository secret NAME填入ACTION_PERSONAL_ACCESS_TOKEN内容填入上面获取的token Private Repo 配置 在private repo根目录新建嵌套的两个文件夹.github/workflows\n在workflows里新建一个后缀为.yml的配置文件,名字自取。 写进去以下配置内容:\nname: github pages # 名字自取 on: push: branches: - main #当main分支触发push事件时执行当前任务 jobs: release: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 with: submodules: true fetch-depth: 0 - name: Hugo uses: peaceiris/actions-hugo@v2\t# hugo官方提供的action with: hugo-version: \u0026#39;latest\u0026#39; #hugo 版本 - name: Build run: hugo --minify\t#构建静态网页 - name: Deploy uses: peaceiris/actions-gh-pages@v3\t# 自动发布的action with: external_repository: wrpota/wrpota.github.io personal_token: ${{ secrets.ACTION_PERSONAL_ACCESS_TOKEN }} publish_dir: ./public publish_branch: main 此时将原来的hugo目录提交至私有库中即可触发自动构建发布动作。 再查看对应的GitHub Pages 就能发现相关改动已经自动发布。 ","permalink":"https://www.potawang.cn/post/hugo_release_by_github/","summary":"\u003cp\u003e使用GitHub Pages配合Hugo搭建Blog中,往往出于各种原因需要将编译前的文件隐藏,如果使用一个仓库进行管理无法实现,而GitHub Pages无法使用私有仓库发布,一开始使用一个私有仓库进行原始文件版本管理,每次编辑后需要将pubilc目录单独再提交至对应的GitHub Pages仓库,此时的步骤应该是:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003col\u003e\n\u003cli\u003e编写文章\u003c/li\u003e\n\u003cli\u003e提交至private repo进行版本管理\u003c/li\u003e\n\u003cli\u003e本地生成静态文件\u003c/li\u003e\n\u003cli\u003e将静态文件Push至github pages repo\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e一个文章的改动非常的不方便,经过后续搜索发现可以使用GitHub提供的action配合hugo官方提供的action自动进行后两步,修改后发布文章只需要再编写后提交至private repo即可,方便再任意终端上随时记录内容\u003c/p\u003e\n\u003ch2 id=\"github-仓库配置\"\u003eGitHub 仓库配置\u003c/h2\u003e\n\u003cp\u003e在GitHub头像下拉框选择\u003ccode\u003eSetting\u003c/code\u003e \u0026gt; \u003ccode\u003eDeveloper Settings\u003c/code\u003e \u0026gt; \u003ccode\u003ePersonal access tokens\u003c/code\u003e\n选择\u003ccode\u003eGenerate new token\u003c/code\u003e\n\u003cimg alt=\"Personalaccesstokens\" loading=\"lazy\" src=\"/image/github/Personalaccesstokens.png\"\u003e\u003c/p\u003e\n\u003cp\u003e在上方填入名字,并按勾选 \u003ccode\u003erepo\u003c/code\u003e 和 \u003ccode\u003eadmin:repo_hook\u003c/code\u003e 下的所有选项\n\u003cimg alt=\"pat1\" loading=\"lazy\" src=\"/image/github/pat1.png\"\u003e\n\u003cimg alt=\"pat2\" loading=\"lazy\" src=\"/image/github/pat2.png\"\u003e\n点击 \u003ccode\u003eGenerate token\u003c/code\u003e 生成token,并复制保存好该token\n\u003cimg alt=\"pats\" loading=\"lazy\" src=\"/image/github/pats.png\"\u003e\u003c/p\u003e\n\u003cp\u003e在private repo 中选择 \u003ccode\u003eSetting\u003c/code\u003e \u0026gt; \u003ccode\u003esecrets\u003c/code\u003e \u0026gt; \u003ccode\u003eNew repository secret\u003c/code\u003e\nNAME填入\u003ccode\u003eACTION_PERSONAL_ACCESS_TOKEN\u003c/code\u003e内容填入上面获取的token\n\u003cimg alt=\"secrets\" loading=\"lazy\" src=\"/image/github/secrets.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"private-repo-配置\"\u003ePrivate Repo 配置\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e在private repo根目录新建嵌套的两个文件夹.github/workflows\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e在workflows里新建一个后缀为.yml的配置文件,名字自取。\n写进去以下配置内容:\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-yml\" data-lang=\"yml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003ename\u003c/span\u003e: \u003cspan style=\"color:#ae81ff\"\u003egithub pages\u003c/span\u003e \u003cspan style=\"color:#75715e\"\u003e# 名字自取\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003eon\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f92672\"\u003epush\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f92672\"\u003ebranches\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e - \u003cspan style=\"color:#ae81ff\"\u003emain \u003c/span\u003e \u003cspan style=\"color:#75715e\"\u003e#当main分支触发push事件时执行当前任务\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003ejobs\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f92672\"\u003erelease\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f92672\"\u003eruns-on\u003c/span\u003e: \u003cspan style=\"color:#ae81ff\"\u003eubuntu-latest\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f92672\"\u003esteps\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e - \u003cspan style=\"color:#f92672\"\u003euses\u003c/span\u003e: \u003cspan style=\"color:#ae81ff\"\u003eactions/checkout@v2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f92672\"\u003ewith\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f92672\"\u003esubmodules\u003c/span\u003e: \u003cspan style=\"color:#66d9ef\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f92672\"\u003efetch-depth\u003c/span\u003e: \u003cspan style=\"color:#ae81ff\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e - \u003cspan style=\"color:#f92672\"\u003ename\u003c/span\u003e: \u003cspan style=\"color:#ae81ff\"\u003eHugo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f92672\"\u003euses\u003c/span\u003e: \u003cspan style=\"color:#ae81ff\"\u003epeaceiris/actions-hugo@v2\t# hugo官方提供的action\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f92672\"\u003ewith\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f92672\"\u003ehugo-version\u003c/span\u003e: \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;latest\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#75715e\"\u003e#hugo 版本\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e - \u003cspan style=\"color:#f92672\"\u003ename\u003c/span\u003e: \u003cspan style=\"color:#ae81ff\"\u003eBuild\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f92672\"\u003erun\u003c/span\u003e: \u003cspan style=\"color:#ae81ff\"\u003ehugo --minify\t#构建静态网页\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e - \u003cspan style=\"color:#f92672\"\u003ename\u003c/span\u003e: \u003cspan style=\"color:#ae81ff\"\u003eDeploy\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f92672\"\u003euses\u003c/span\u003e: \u003cspan style=\"color:#ae81ff\"\u003epeaceiris/actions-gh-pages@v3\t# 自动发布的action\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f92672\"\u003ewith\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f92672\"\u003eexternal_repository\u003c/span\u003e: \u003cspan style=\"color:#ae81ff\"\u003ewrpota/wrpota.github.io\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f92672\"\u003epersonal_token\u003c/span\u003e: \u003cspan style=\"color:#ae81ff\"\u003e${{ secrets.ACTION_PERSONAL_ACCESS_TOKEN }}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f92672\"\u003epublish_dir\u003c/span\u003e: \u003cspan style=\"color:#ae81ff\"\u003e./public\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f92672\"\u003epublish_branch\u003c/span\u003e: \u003cspan style=\"color:#ae81ff\"\u003emain\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e此时将原来的hugo目录提交至私有库中即可触发自动构建发布动作。\n\u003cimg alt=\"action\" loading=\"lazy\" src=\"/image/github/action.png\"\u003e\u003c/p\u003e","title":"使用GitHub Action自动发布Hugo博客"},{"content":"开启 Macos Docker Desktop 中的 K8s 支持 tips: 此操作需要科学上网支持\n等待docker执行完成后 对应容器就启动好了\n安装 Kubernetes Dashboard Web UI kubectl proxy kubectl proxy在您的机器和 Kubernetes API 服务器之间创建一个代理服务器。默认情况下,它只能在本地访问(从启动它的机器)。 先检查是否kubectl配置正确并且可以访问集群,若出现错误请自行排查\nkubectl cluster-info 输出:\nKubernetes control plane is running at https://kubernetes.docker.internal:6443 CoreDNS is running at https://kubernetes.docker.internal:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy To further debug and diagnose cluster problems, use \u0026#39;kubectl cluster-info dump\u0026#39;. 启动本地代理服务器\nkubectl proxy 若输出以下内存则进行下一步:\nStarting to serve on 127.0.0.1:8001 访问:\nhttp://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/login 如下所示 通过下方命令获取Token 登录\nkubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk \u0026#39;{print $1}\u0026#39;) ","permalink":"https://www.potawang.cn/post/macos_k8s/","summary":"\u003ch2 id=\"开启-macos-docker-desktop-中的-k8s-支持\"\u003e开启 Macos Docker Desktop 中的 K8s 支持\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003etips: 此操作需要科学上网支持\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003cimg alt=\"k8s\" loading=\"lazy\" src=\"/image/k8s.png\"\u003e\n等待docker执行完成后 对应容器就启动好了\u003c/p\u003e\n\u003ch2 id=\"安装-kubernetes-dashboard-web-ui\"\u003e安装 Kubernetes Dashboard Web UI\u003c/h2\u003e\n\u003ch3 id=\"kubectl-proxy\"\u003ekubectl proxy\u003c/h3\u003e\n\u003cp\u003ekubectl proxy在您的机器和 Kubernetes API 服务器之间创建一个代理服务器。默认情况下,它只能在本地访问(从启动它的机器)。\n先检查是否kubectl配置正确并且可以访问集群,若出现错误请自行排查\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ekubectl cluster-info\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e输出:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eKubernetes control plane is running at https://kubernetes.docker.internal:6443\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCoreDNS is running at https://kubernetes.docker.internal:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eTo further debug and diagnose cluster problems, use \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;kubectl cluster-info dump\u0026#39;\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e启动本地代理服务器\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ekubectl proxy\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e若输出以下内存则进行下一步:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eStarting to serve on 127.0.0.1:8001\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e访问:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ehttp://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/login\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e如下所示\n\u003cimg alt=\"dashboard\" loading=\"lazy\" src=\"/image/dashboard.png\"\u003e\u003c/p\u003e\n\u003cp\u003e通过下方命令获取Token 登录\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ekubectl -n kubernetes-dashboard describe secret \u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003ekubectl -n kubernetes-dashboard get secret | grep admin-user | awk \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;{print $1}\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cimg alt=\"WX20210714-160849@2x\" loading=\"lazy\" src=\"/image/[email protected]\"\u003e\u003c/p\u003e","title":"Macos 安装k8s"},{"content":"在服务器创建对应配置文件 可自行决定存储位置\n/docker/dnsmasq/dnsmasq.conf\n# 完整配置文件参考以下地址 # http://oss.segetech.com/intra/srv/dnsmasq.conf cache-size=50000 dns-forward-max=1000 # 记录所有DNS查询请求 # log-queries # 不使用本地配置的域名解析器 # no-resolv # 不使用本地hosts no-hosts resolv-file=/etc/dnsmasq.resolv.conf addn-hosts=/etc/dnsmasq.hosts # 配置上游DNS服务器地址,用于解析国内域名 server=114.114.114.114 # 配置国际DNS服务器地址 server=8.8.8.8 /docker/dnsmasq/dnsmasq.hosts\n127.0.0.1 example.com /docker/dnsmasq/dnsmasq.resolv.conf\nnameserver 114.114.114.114 nameserver 223.5.5.5 启动docker容器\ndocker run \\ --name dnsmasq \\ -d \\ -p 53:53/udp \\ -p 5380:8080 \\ -v /docker/dnsmasq/dnsmasq.conf:/etc/dnsmasq.conf \\ -v /docker/dnsmasq/dnsmasq.hosts:/etc/dnsmasq.hosts \\ -v /docker/dnsmasq/dnsmasq.resolv.conf:/etc/resolv.conf \\ --log-opt \u0026#34;max-size=100m\u0026#34; \\ -e \u0026#34;HTTP_USER=user\u0026#34; \\ -e \u0026#34;HTTP_PASS=password\u0026#34; \\ --restart always \\ jpillora/dnsmasq ","permalink":"https://www.potawang.cn/post/docker_dns/","summary":"\u003cp\u003e在服务器创建对应配置文件 可自行决定存储位置\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e/docker/dnsmasq/dnsmasq.conf\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# 完整配置文件参考以下地址\n# http://oss.segetech.com/intra/srv/dnsmasq.conf\ncache-size=50000\ndns-forward-max=1000\n\n# 记录所有DNS查询请求\n# log-queries\n# 不使用本地配置的域名解析器\n# no-resolv\n# 不使用本地hosts\nno-hosts\n\nresolv-file=/etc/dnsmasq.resolv.conf\naddn-hosts=/etc/dnsmasq.hosts\n\n# 配置上游DNS服务器地址,用于解析国内域名\nserver=114.114.114.114\n# 配置国际DNS服务器地址\nserver=8.8.8.8\n\u003c/code\u003e\u003c/pre\u003e\u003cblockquote\u003e\n\u003cp\u003e/docker/dnsmasq/dnsmasq.hosts\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e127.0.0.1 example.com\n\u003c/code\u003e\u003c/pre\u003e\u003cblockquote\u003e\n\u003cp\u003e/docker/dnsmasq/dnsmasq.resolv.conf\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003enameserver 114.114.114.114\nnameserver 223.5.5.5\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e启动docker容器\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edocker run \u003cspan style=\"color:#ae81ff\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ae81ff\"\u003e\u003c/span\u003e --name dnsmasq \u003cspan style=\"color:#ae81ff\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ae81ff\"\u003e\u003c/span\u003e -d \u003cspan style=\"color:#ae81ff\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ae81ff\"\u003e\u003c/span\u003e -p 53:53/udp \u003cspan style=\"color:#ae81ff\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ae81ff\"\u003e\u003c/span\u003e -p 5380:8080 \u003cspan style=\"color:#ae81ff\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ae81ff\"\u003e\u003c/span\u003e -v /docker/dnsmasq/dnsmasq.conf:/etc/dnsmasq.conf \u003cspan style=\"color:#ae81ff\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ae81ff\"\u003e\u003c/span\u003e -v /docker/dnsmasq/dnsmasq.hosts:/etc/dnsmasq.hosts \u003cspan style=\"color:#ae81ff\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ae81ff\"\u003e\u003c/span\u003e -v /docker/dnsmasq/dnsmasq.resolv.conf:/etc/resolv.conf \u003cspan style=\"color:#ae81ff\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ae81ff\"\u003e\u003c/span\u003e --log-opt \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;max-size=100m\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ae81ff\"\u003e\u003c/span\u003e -e \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;HTTP_USER=user\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ae81ff\"\u003e\u003c/span\u003e -e \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;HTTP_PASS=password\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ae81ff\"\u003e\u003c/span\u003e --restart always \u003cspan style=\"color:#ae81ff\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ae81ff\"\u003e\u003c/span\u003e jpillora/dnsmasq\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"使用doker搭建DNS服务"},{"content":"git规范 1.概览 项目默认分支为 线上master预发布 develop\ncommit信息必须完整描述修改内容\ncommit之前必须进行pull或者fetch进行同步\n所有需求建立新分支进行修改\ndevelop 分支作为开发阶段主分支 各需求负责人本地建立新分支进行修改 修改完成后使用rebase合并冗余commit信息合并至develop分支\n2.commit规范 保证commit尽量只做一件事 书写commit message言简意赅 规范commit message格式 完整commit信息大致如下 参考 Angular Git Commit Guidelines: # 标题行:50个字符以内,描述主要变更内容 # # 主体内容:更详细的说明文本,建议72个字符以内。 需要描述的信息包括: # # * 为什么这个变更是必须的? 它可能是用来修复一个bug,增加一个feature,提升性能、可靠性、稳定性等等 # * 他如何解决这个问题? 具体描述解决问题的步骤 # * 是否存在副作用、风险? # # 如果需要的化可以添加一个链接到issue地址或者其它文档 \u0026lt;type\u0026gt;: \u0026lt;subject\u0026gt; \u0026lt;BLANK LINE\u0026gt; \u0026lt;body\u0026gt; \u0026lt;BLANK LINE\u0026gt; \u0026lt;footer\u0026gt; type: 本次 commit 的类型,诸如 bugfix docs style 等 scope: 本次 commit 波及的范围 subject: 简明扼要的阐述下本次 commit 的主旨,结尾无需标点 body: 主体内容 footer: 描述下与之关联的 bug 或者需求链接 开发过程中遇到单行无法完整描述commit信息时必须使用完整commit信息提交\ncommit信息开头必须指明此次提交类型 包括但是不限于以下几种:\nfeat: 添加新特性 update: 因需求 添加了新的逻辑 作为feat的备选方案,仅在去除一些逻辑时使用 fix: 修复bug docs: 仅修改了文档 style: 仅代码格式调整 refactor: 代码重构,没有加新功能或者修复bug delete: 文档或代码的删除,没有功能修改或者修复bug 3. 分支规范 一个稳定master分支\n一个待发布的develop分支\n若干个正在开发的feature分支\n依据需求进行建立 由各实际负责人进行建立,需求关闭后删除 如遇到线上有十分严重bug,应在master上切换出hotFix分支进行bug修复,并验证好了后随即合并到master上准备发布 如遇到线上有一般的bug,可在develop上切换出hotFix分支进行bug修复,完成后合并到develop上,等下次版本一起发布 分支合并前若有必要先rebase待合并的分支\n合并到develop中必须去除调试commit信息 确保主分支commit信息的纯净\n如非必须情况禁止将feature分支push 至origin中 允许情况如下:\n除实际负责人之外需其余团队成员配合 本地环境无法满足测试情况 4. 操作规范 禁止使用git push --force进行提交\n禁止在develop master分支使用rebase操作,rebase仅可在无合作者的feature中进行\n分支合并出现冲突必须解决后才能提交,禁止直接撤销修改后push\n合作分支commit之前需先fetch或pull进行更新\n","permalink":"https://www.potawang.cn/post/git%E8%A7%84%E8%8C%83/","summary":"\u003ch1 id=\"git规范\"\u003egit规范\u003c/h1\u003e\n\u003ch2 id=\"1概览\"\u003e1.概览\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e项目默认分支为 \u003cstrong\u003e线上\u003c/strong\u003e\u003ccode\u003emaster\u003c/code\u003e\u003cstrong\u003e预发布\u003c/strong\u003e \u003ccode\u003edevelop\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ecommit信息\u003cstrong\u003e必须\u003c/strong\u003e完整描述修改内容\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ecommit之前\u003cstrong\u003e必须\u003c/strong\u003e进行pull或者fetch进行同步\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e所有需求建立新分支进行修改\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003edevelop 分支作为开发阶段主分支 各需求负责人本地建立新分支进行修改 修改完成后使用rebase合并冗余commit信息合并至develop分支\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"2commit规范\"\u003e2.commit规范\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e保证commit尽量只做一件事\u003c/li\u003e\n\u003cli\u003e书写commit message言简意赅\u003c/li\u003e\n\u003cli\u003e规范commit message格式\u003c/li\u003e\n\u003c/ul\u003e\n\u003col\u003e\n\u003cli\u003e完整commit信息大致如下 参考 \u003ca href=\"https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#-git-commit-guidelines\"\u003eAngular Git Commit Guidelines\u003c/a\u003e:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# 标题行:50个字符以内,描述主要变更内容\n#\n# 主体内容:更详细的说明文本,建议72个字符以内。 需要描述的信息包括:\n#\n# * 为什么这个变更是必须的? 它可能是用来修复一个bug,增加一个feature,提升性能、可靠性、稳定性等等\n# * 他如何解决这个问题? 具体描述解决问题的步骤\n# * 是否存在副作用、风险? \n#\n# 如果需要的化可以添加一个链接到issue地址或者其它文档\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\u0026lt;type\u0026gt;: \u0026lt;subject\u0026gt; \n\u0026lt;BLANK LINE\u0026gt; \n\u0026lt;body\u0026gt; \n\u0026lt;BLANK LINE\u0026gt;\n\u0026lt;footer\u0026gt;\n\n\ntype: 本次 commit 的类型,诸如 bugfix docs style 等\nscope: 本次 commit 波及的范围\nsubject: 简明扼要的阐述下本次 commit 的主旨,结尾无需标点\nbody: 主体内容\nfooter: 描述下与之关联的 bug 或者需求链接\n\u003c/code\u003e\u003c/pre\u003e\u003col start=\"2\"\u003e\n\u003cli\u003e\n\u003cp\u003e开发过程中遇到单行无法完整描述commit信息时\u003cstrong\u003e必须\u003c/strong\u003e使用完整commit信息提交\u003c/p\u003e","title":"Git规范-初版"},{"content":"git简介 一:Git是什么? Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。 工作原理 / 流程:\nWorkspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remote:远程仓库\n二:SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就纳闷了。 Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。\n三:初始化设置 1. 设置用户名及邮箱信息 全局设置\ngit config --global user.name \u0026#34;Name\u0026#34; git config --global user.email \u0026#34;Email\u0026#34; 针对项目设置\ngit config user.name \u0026#34;Name\u0026#34; git config user.email \u0026#34;Email\u0026#34; 2. 设置换行符自动转换 git config --global core.autocrlf [true | input | false] # 全局设置 git config --local core.autocrlf [true | input | false] # 针对本项目设置 true 提交时转换为LF,检出时转换为CRLF input 提交时转换为LF,检出时不转换 false 提交与检出的代码都保持文件原有的换行符不变(不转换) 推荐设置:\nwindows git config --global core.autocrlf true other OS git config --global core.autocrlf input 初始化仓库 版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。\ngit init git add 初始化.md git commit Or git commit -m\u0026lt;message\u0026gt; 版本管理 一、版本回退 1). 获取仓库当前log列表 使用 git log命令查看\n$ git log commit 310f02083e0bfd1762ddbd33664d01881cef8fd3 (HEAD -\u0026gt; master) Author: Pota \u0026lt;[email protected]\u0026gt; Date: Wed Oct 21 17:57:12 2020 +0800 feat: 第三次改动 commit ff1eb142c143b9498d57ad3c8218bd62019d3f18 Author: Pota \u0026lt;[email protected]\u0026gt; Date: Wed Oct 21 17:56:53 2020 +0800 feat: 第二次改动 commit 62ea36c7ed237ec92d333a4fc5a5d2f7f929665e Author: Pota \u0026lt;[email protected]\u0026gt; Date: Wed Oct 21 17:56:24 2020 +0800 feat: 第一次改动 commit 25bae0398fc1fe2fb10add954fba4202f8142f32 Author: Pota \u0026lt;[email protected]\u0026gt; Date: Wed Oct 21 17:55:13 2020 +0800 feat: 首次提交 git log命令显示从最近到最远的提交日志,我们可以看到4次提交,如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数:\ngit log --pretty=oneline 310f02083e0bfd1762ddbd33664d01881cef8fd3 (HEAD -\u0026gt; master) feat: 第三次改动 ff1eb142c143b9498d57ad3c8218bd62019d3f18 feat: 第二次改动 62ea36c7ed237ec92d333a4fc5a5d2f7f929665e feat: 第一次改动 25bae0398fc1fe2fb10add954fba4202f8142f32 feat: 首次提交 使用 IDE或图形化工具查看\n2). 版本回退 版本回退仅限本地仓库中使用,若提交已push至远程仓库,则无法回退远程仓库内容\n命令 git reset –-[soft | hard | mixed] commit_id --soft、--mixed、--hard是三个恢复等级:\n--soft仅将头指针HEAD恢复,已经add的缓存以及工作空间的所有东西都不变;暂存区和工作区不会被切换;保留源码,只回退到commit 信息到某个版本.不涉及index的回退,如果还需要提交,直接commit即可。\n--mixed将头HEAD恢复掉,已经add的缓存也会丢失掉,工作空间的代码之类的不变;暂存区会更新至指定的commit,工作区不会受影响;会保留源码,只是将git commit和index 信息回退到了某个版本。\n--hard将一切全都恢复,头HEAD改变,add的缓存消失,代码等也恢复到以前状态;暂存区和工作区同时更新到指定的commit;源码也会回退到某个版本,commit和index 都回回退到某个版本.\n注意事项\nreset --hard操作会导致当前缓存区和工作区的改动重置\nreset --mixed操作会导致当前缓存区的改动重置\n分支管理 一、创建与合并分支 git 初始化后会默认创建master分支 开发过程中一般会采用多分支进行项目管理\n创建分支\ngit branch \u0026lt;branch name\u0026gt; # 基于当前HEAD指向分支创建新分支 git checkout -b \u0026lt;branch name\u0026gt; # 基于当前HEAD指向分支创建新分支并切换到该分支 git switch -c \u0026lt;barnch name\u0026gt; # 基于当前HEAD指向分支创建新分支并切换到该分支 切换分支\ngit checkout \u0026lt;branch name\u0026gt; git switch \u0026lt;branch name\u0026gt; 合并分支\ngit merge \u0026lt;branch name\u0026gt; # 合并指定分支改动到当前分支 删除分支\ngit branch -d \u0026lt;branch name\u0026gt; # 删除本地分支 git push origin -d \u0026lt;branch name\u0026gt; # 删除远程分支 合并模式\n合并分支是默认使用Fast forward模式合并,合并后会丢失分支信息 使用--no-ff参数禁用Fast forward模式后合并会保留分支信息\n二、解决冲突 两个分支同一个文件都进行了提交导致节点无法连续后 合并会导致冲突\n冲突产生后 **必须 ** 解决冲突后再次提交\n$ git merge develop Auto-merging readme.md CONFLICT (content): Merge conflict in readme.md Automatic merge failed; fix conflicts and then commit the result. $ git status On branch master You have unmerged paths. (fix conflicts and run \u0026#34;git commit\u0026#34;) (use \u0026#34;git merge --abort\u0026#34; to abort the merge) Unmerged paths: (use \u0026#34;git add \u0026lt;file\u0026gt;...\u0026#34; to mark resolution) both modified: readme.md Changes not staged for commit: (use \u0026#34;git add \u0026lt;file\u0026gt;...\u0026#34; to update what will be committed) (use \u0026#34;git restore \u0026lt;file\u0026gt;...\u0026#34; to discard changes in working directory) modified: \u0026#34;\\346\\225\\231\\347\\250\\213.md\u0026#34; no changes added to commit (use \u0026#34;git add\u0026#34; and/or \u0026#34;git commit -a\u0026#34;) 查看readme.md文件后会发现git将冲突内容依据HEAD和冲突分支形式列出\n$ cat readme.md 第一次改动内容 第二次改动内容 第三次改动内容 \u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt;\u0026lt; HEAD master:第四次改动内容 ======= develop 第四次改动内容 \u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt;\u0026gt; develop 此时需要将冲突文件修改为合并后内容后再次添加到缓存区并提交\n$ cat readme.md 第一次改动内容 第二次改动内容 第三次改动内容 master:第四次改动内容 $ git add readme.md $ git commit -m\u0026#34;第四次提交\u0026#34; 此时git 主分支线路应该如下\n$ git log --graph --pretty=oneline --abbrev-commit * c6fba0d (HEAD -\u0026gt; master) 第四次提交 |\\ | * 63fcc15 (develop) feat: 第四次改动 | * 55c58f4 feat: 第四次改动 * | 9de4e23 feat: 第四次改动 * | e2a6980 feat: 第四次改动 |/ * 983093c feat: 分支前教程 * 310f020 feat: 第三次改动 * ff1eb14 feat: 第二次改动 * 62ea36c feat: 第一次改动 * 25bae03 feat: 首次提交 三、rebase 命令说明 $ git rebase -i HEAD~4 pick 55c58f4 feat: 第四次改动 pick 63fcc15 feat: 第四次改动 pick 2f5f83d 第五次提交 pick 5abf70e 第六次提交 pick 5e96e00 feat: rebase前提交 # Rebase 9de4e23..5e96e00 onto 5abf70e (5 commands) # # Commands: # p, pick \u0026lt;commit\u0026gt; = use commit # r, reword \u0026lt;commit\u0026gt; = use commit, but edit the commit message # e, edit \u0026lt;commit\u0026gt; = use commit, but stop for amending # s, squash \u0026lt;commit\u0026gt; = use commit, but meld into previous commit # f, fixup \u0026lt;commit\u0026gt; = like \u0026#34;squash\u0026#34;, but discard this commit\u0026#39;s log message # x, exec \u0026lt;command\u0026gt; = run command (the rest of the line) using shell # b, break = stop here (continue rebase later with \u0026#39;git rebase --continue\u0026#39;) # d, drop \u0026lt;commit\u0026gt; = remove commit # l, label \u0026lt;label\u0026gt; = label current HEAD with a name # t, reset \u0026lt;label\u0026gt; = reset HEAD to a label # m, merge [-C \u0026lt;commit\u0026gt; | -c \u0026lt;commit\u0026gt;] \u0026lt;label\u0026gt; [# \u0026lt;oneline\u0026gt;] # . create a merge commit using the original merge commit\u0026#39;s # . message (or the oneline, if no original merge commit was # . specified). Use -c \u0026lt;commit\u0026gt; to reword the commit message. # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out pick\npick 只表示包含提交。 在变基进行时重新排列 pick 命令的顺序会更改提交的顺序。 如果选择不包含提交,应删除整行。\nreword\nreword 命令类似于 pick,但在使用后,变基过程就会暂停,让您有机会改变提交消息。 提交所做的任何更改都不受影响。\nedit\n如果选择 edit 提交,您将有机会修订提交,也就是说,可以完全添加或更改提交。 您也可以创建更多提交后再继续变基。 这样您可以将大提交拆分为小提交,或者删除在提交中执行错误更改。\nsquash\n此命令可用于将两个或以上的提交合并为一个。 下面的提交压缩到其上面的提交。 Git 让您有机会编写描述两次更改的新提交消息。\nfixup\n这类似于 squash,但要合并的提交丢弃了其消息。 提交只是合并到其上面的提交,之前提交的消息用于描述两次更改。\nexec\n这可让您对提交运行任意 shell 命令。\n示例 假设当前git提交历史如下\n$ git log --pretty=oneline e85216ae5739c9eb1835a913b2c9449abd45ed74 这个提交移动到B文件提交前 046dfd07a3fc537871e837a8e5209a12ab37eaca 这个commit写错了 c50bd16a3ad4ef8b9cfc4ab5a7ee465609c1c976 文件A追加 de5cd71b26e94f137c7b202db0c4bee5600b2442 文件B修复 1bbbc6c8efa86e60aee2916dc46c173d1fea4f1d 文件B提交 8dbb92ae88b9d868a4817d8f25537bb83bf6c20c 文件A提交 $ git rebase -i HEAD~6 pick 8dbb92a 文件A提交 pick 1bbbc6c 文件B提交 pick de5cd71 文件B修复 pick c50bd16 文件A追加 pick 046dfd0 这个commit写错了 pick e85216a 这个提交移动到B文件提交前 # Rebase 412c835..e85216a onto c50bd16 (6 commands) 准备进行以下变更:\n将c50bd16 压缩到8dbb92a中 将最后一个提交(e85216a)向上移动到文件B提交提交(1bbbc6c)之前,并保留为pick 将文件B修复提交(de5cd71)合并到文件B提交提交(1bbbc6c)中,并忽略提交消息 使用 reword 修复拼写错误的提交 (046dfd0) 的提交消息 将编辑器中文件修改为以下内容:\npick 8dbb92a 文件A提交 squash c50bd16 文件A追加 pick e85216a 这个提交移动到B文件提交前 pick 1bbbc6c 文件B提交 fixup de5cd71 文件B修复 reword 046dfd0 这个commit写错了 保存并关闭编辑器,开始交互式rebase\npick 8dbb92a命令因无内容改动被跳过\nsquash c50bd16命令因合并提交需手动修改 会打开默认编辑器进行改动如下:\n# This is a combination of 2 commits. # This is the 1st commit message: 文件A提交 # This is the commit message #2: 文件A追加 # Please enter the commit message for your changes. Lines starting # with \u0026#39;#\u0026#39; will be ignored, and an empty message aborts the commit. # # Date: Tue Oct16:07:46+0800 # # interactive rebase in progress; onto 412c835 # Last commands done (2 commands done): # pick 8dbb92a 文件A提交 # squash c50bd16 文件A追加 # Next commands to do (4 remaining commands): # pick e85216a 这个提交移动到B文件提交前 # pick 1bbbc6c 文件B提交 # You are currently rebasing branch \u0026#39;master\u0026#39; on \u0026#39;412c835\u0026#39;. # # Changes to be committed: #▸ modified: a # 修改内容为想要的提交信息后保存文件\n# This is a combination of 2 commits. # This is the 1st commit message: 文件A提交 # This is the commit message #2: #文件A追加 pick e85216a 、pick 1bbbc6c 、fixup de5cd71因无需干预会自动进行,其中fixup de5cd71会将de5cd71提交合并到1bbbc6c中并舍弃commit信息\nreword 046dfd0 会再次打开编辑器并显示一下信息:\n这个commit写错了 # Please enter the commit message for your changes. Lines starting # with \u0026#39;#\u0026#39; will be ignored, and an empty message aborts the commit. # # Date: Tue Oct 27 16:08:56 2020 +0800 # # interactive rebase in progress; onto 412c835 # Last commands done (6 commands done): # fixup de5cd71 文件B修复 # reword 046dfd0 这个commit写错了 # No commands remaining. # You are currently editing a commit while rebasing branch \u0026#39;master\u0026#39; on \u0026#39;412c 835\u0026#39;. # # Changes to be committed: #▸ modified: c # 将内容改为想要的commit后保存 并完成此次rebase\n[detached HEAD 5a30ce2] 文件A提交 Date: Tue Oct 27 16:07:46 2020 +0800 1 file changed, 2 insertions(+) [detached HEAD 46eb136] 这个commit写错了 现在修复了 Date: Tue Oct 27 16:08:56 2020 +0800 1 file changed, 1 insertion(+) Successfully rebased and updated refs/heads/master. 在完成rebase后查看git历史\n$ git log --pretty=oneline 46eb136e6d0f70536069aa27dd603a27c8ceb4a1 这个commit写错了 现在修复了 0b17895ec112456d4e337f678bf1c2c95a85cd03 文件B提交 40b2e81db35a3e66fa4d57911df8a52dd5ff3c7b 这个提交移动到B文件提交前 5a30ce23ef594f73429ef7c77ffc0f09ceac01bf 文件A提交 412c83521248caafcfe89c1afeffb6de3551dc43 init 冲突解决 在rebase过程中如果遇到冲突 按照正常冲突解决过程一样 修改完成后使用命令\n$ git add \u0026lt;file\u0026gt; $ git rebase --continue 四、stash 当在某个分支正在进行某项修改时,此时出现了一个bug必须优先解决,这个时候需要切换到hot-fix分支进行bug修复,此时进行到一半的工作也不能提交,这个时候就需要将当前未完成的修改存储起来,等bug修改完成以后再继续进行修改\n储藏你的工作 为了演示这一功能,你可以进入你的项目,在一些文件上进行工作,有可能还暂存其中一个变更。如果你运行 git status,你可以看到你的中间状态:\n$ git status On branch master Changes to be committed: (use \u0026#34;git restore --staged \u0026lt;file\u0026gt;...\u0026#34; to unstage) new file: d.txt Changes not staged for commit: (use \u0026#34;git add \u0026lt;file\u0026gt;...\u0026#34; to update what will be committed) (use \u0026#34;git restore \u0026lt;file\u0026gt;...\u0026#34; to discard changes in working directory) modified: a 现在你想切换分支,但是你还不想提交你正在进行中的工作;所以你储藏这些变更。为了往堆栈推送一个新的储藏,只要运行 git stash:\n$ git stash Saved working directory and index state WIP on master: 46eb136 这个commit写错了 现在修复了 你的工作目录就干净了:\n$ git status On branch master nothing to commit, working tree clean 这时,你可以方便地切换到其他分支工作;你的变更都保存在栈上。要查看现有的储藏,你可以使用 git stash list:\n$ git stash list stash@{0}: WIP on master: 46eb136 这个commit写错了 现在修复了 使用储藏 当bug修复完成后回到develop分支想要继续之前的工作,此时使用 git stash apply即可将之前储藏的改动重新应用,默认情况下如果有多个储藏内容时git stash apply会默认使用最新的一条。如果想用更早的储藏,可以使用名字指定git stash apply stash@{0} $ git stash apply On branch master Changes to be committed: (use \u0026#34;git restore --staged \u0026lt;file\u0026gt;...\u0026#34; to unstage) new file: d.txt Changes not staged for commit: (use \u0026#34;git add \u0026lt;file\u0026gt;...\u0026#34; to update what will be committed) (use \u0026#34;git restore \u0026lt;file\u0026gt;...\u0026#34; to discard changes in working directory) modified: a apply 选项只尝试应用储藏的工作——储藏的内容仍然在栈上。要移除它,你可以运行 git stash drop,加上你希望移除的储藏的名字:\n$ git stash list stash@{0}: WIP on master: 46eb136 这个commit写错了 现在修复了 $ git stash drop stash@{0} Dropped stash@{0} (2def785d0c921b679077086faefc40804212e732) 你也可以运行 git stash pop 来重新应用储藏,同时立刻将其从堆栈中移走。\n从储藏中创建分支 如果你储藏了一些工作,暂时不去理会,然后继续在你储藏工作的分支上工作,你在重新应用工作时可能会碰到一些问题。如果尝试应用的变更是针对一个你那之后修改过的文件,你会碰到一个归并冲突并且必须去化解它。如果你想用更方便的方法来重新检验你储藏的变更,你可以运行 git stash branch,这会创建一个新的分支,检出你储藏工作时的所处的提交,重新应用你的工作,如果成功,将会丢弃储藏。\n$ git stash branch testchanges Switched to a new branch \u0026#39;testchanges\u0026#39; On branch testchanges Changes to be committed: (use \u0026#34;git restore --staged \u0026lt;file\u0026gt;...\u0026#34; to unstage) new file: d.txt Changes not staged for commit: (use \u0026#34;git add \u0026lt;file\u0026gt;...\u0026#34; to update what will be committed) (use \u0026#34;git restore \u0026lt;file\u0026gt;...\u0026#34; to discard changes in working directory) modified: a Dropped refs/stash@{0} (5945c48cdc350188c675eb2f78c8dcdae72a5870) ","permalink":"https://www.potawang.cn/post/git/","summary":"\u003ch1 id=\"git简介\"\u003egit简介\u003c/h1\u003e\n\u003ch2 id=\"一git是什么\"\u003e一:Git是什么?\u003c/h2\u003e\n\u003cp\u003eGit是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。\n工作原理 / 流程:\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"image-20201021180535292\" loading=\"lazy\" src=\"/image/image-20201021180535292.png\"\u003e\u003c/p\u003e\n\u003cp\u003eWorkspace:工作区\nIndex / Stage:暂存区\nRepository:仓库区(或本地仓库)\nRemote:远程仓库\u003c/p\u003e\n\u003ch2 id=\"二svn与git的最主要的区别\"\u003e二:SVN与Git的最主要的区别?\u003c/h2\u003e\n\u003cp\u003eSVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就纳闷了。\nGit是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。\u003c/p\u003e\n\u003ch2 id=\"三初始化设置\"\u003e三:初始化设置\u003c/h2\u003e\n\u003ch3 id=\"1-设置用户名及邮箱信息\"\u003e1. 设置用户名及邮箱信息\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e全局设置\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit config --global user.name \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;Name\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit config --global user.email \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;Email\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e针对项目设置\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit config user.name \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;Name\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit config user.email \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;Email\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"2-设置换行符自动转换\"\u003e2. 设置换行符自动转换\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit config --global core.autocrlf \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003etrue | input | false\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#75715e\"\u003e# 全局设置\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit config --local core.autocrlf \u003cspan style=\"color:#f92672\"\u003e[\u003c/span\u003etrue | input | false\u003cspan style=\"color:#f92672\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#75715e\"\u003e# 针对本项目设置\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e\u003ccode\u003etrue\u003c/code\u003e 提交时转换为LF,检出时转换为CRLF\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003einput\u003c/code\u003e 提交时转换为LF,检出时不转换\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efalse\u003c/code\u003e 提交与检出的代码都保持文件原有的换行符不变(不转换)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003e推荐设置:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003ewindows\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit config --global core.autocrlf true\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eother OS\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egit config --global core.autocrlf input\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch1 id=\"初始化仓库\"\u003e初始化仓库\u003c/h1\u003e\n\u003cblockquote\u003e\n\u003cp\u003e版本库又名仓库,英文名\u003cstrong\u003erepository\u003c/strong\u003e,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。\u003c/p\u003e","title":"Git教程-初版"},{"content":"1.编码规范 PHP 代码文件 必须 以 \u0026lt;?php 或 \u0026lt;?= 标签开始; PHP 代码文件 必须 以 不带 BOM 的 UTF-8 编码; PHP 代码中 应该 只定义类、函数、常量等声明, 或其他会产生 副作用 的操作(如:生成文件输出以及修改 .ini 配置文件等),二者只能选其一; 命名空间以及类 必须 符合 PSR 的自动加载规范: [PSR-0(已废弃)或 PSR-4] 中的一个。 类的命名 必须 遵循 StudlyCaps 大写开头的驼峰命名规范; 类中的常量所有字母都 必须 大写,单词间用下划线分隔; 方法名称 必须 符合 camelCase 式的小写开头驼峰命名规范。 单一文件只能申明单个类 1.类的常量、属性和方法 此处的「类」指代所有的类、接口以及可复用代码块(traits)。\n1.1常量 类的常量中所有字母都 必须 大写,词间以下划线分隔。例如:\n\u0026lt;?php namespace Vendor\\Model; class Foo { const VERSION = \u0026#39;1.0\u0026#39;; const DATE_APPROVED = \u0026#39;2012-06-01\u0026#39;; } 1.2.属性 类的属性命名 可以 遵循: 大写开头的驼峰式 ($StudlyCaps) 小写开头的驼峰式 ($camelCase) 下划线分隔式 ($under_score) 本规范不做强制要求,但无论遵循哪种命名方式,都 应该 在一定的范围内保持一致。这个范围可以是整个团队、整个包、整个类或整个方法。 1.3.方法 方法名称 必须 符合 camelCase() 式的小写开头驼峰命名规范。 1.4.注释 所有的类都 必须 添加大概说明、创建者、创建日期 切放在namespace申明前 并空一行。例:\n\u0026lt;?php /** * 类说明 * * User: pota * DateTime: 2018/11/15 5:37 PM */ namespace Example; 方法注释 必须 采用doc风格注释。例:\n/** * 方法说明 * * @param int $param 参数说明 * @throw \\Exception 若有异常抛出 需申明抛出异常类型 * @return bool true 成功 false 失败 //强制必须申明所返回参数类型 若有必要需说明返回参数说明(非强制) */ public function action(int $param): bool { //类主体 } 类属性和参数需说明参数类型以及参数说明。例:\n/** * 参数说明 * * @var array */ public $param = array(); 方法内部单行注释,在被注释语句上方另起一行,使用//\u0026lt;...\u0026gt;注释。方法内部多行注释 使用/* \u0026lt;...\u0026gt; */注释,注意与代码对齐。\n代码修改的同时,注释也要进行相应的修改,尤其是参数、返回值、异常、核心逻 辑等的修改。\n注释类型申明可以使用以下类型\nbool:此类型适用的元素仅具有状态TRUE或FALSE。 int:此类型适用的元素是整数或整数。 float:此类型适用的元素是连续或实数。 string:此类型适用的元素是二进制字符串。 object:此类型适用的元素是未确定类的实例。 array:此类型适用的元素是值数组。 iterable:此类型适用的元素是每个PHP定义的数组或Traversable对象。 resource:此类型适用的元素是每个PHP定义的资源。 mixed:此类型适用的元素可以是此处指定的任何类型。在编译时不知道将使用哪种类型。 void:此类型通常仅在定义方法或函数的返回类型时使用,指示“未返回任何内容”,因此用户不应依赖任何返回的值。 2.文件 2.1. PHP 标签 PHP 代码 必须 使用 \u0026lt;?php ?\u0026gt; 长标签 或 \u0026lt;?= ?\u0026gt; 短输出标签;一定不可 使用其它自定义标签。 2.2. 字符集编码 PHP 代码 必须 且只可使用 不带 BOM 的 UTF-8 编码。 2.3. 副作用 一份 PHP 文件中 应该 要不就只定义新的声明,如类、函数或常量等不产生 副作用 的操作,要不就只书写会产生 副作用 的逻辑操作,但 不该 同时具有两者。\n「副作用」(side effects) 一词的意思是,仅仅通过包含文件,不直接声明类、函数和常量等,而执行的逻辑操作。\n「副作用」包含却不仅限于:生成输出,明确使用 require 或 include,连接到外部服务,修改 ini 设置,发出错误或异常,修改全局或静态变量,读取或写入一个文件,等等。\n以下是一个 反例,一份包含「函数声明」以及产生「副作用」的代码:\n\u0026lt;?php // 「副作用」:修改 ini 配置 ini_set(\u0026#39;error_reporting\u0026#39;, E_ALL); // 「副作用」:引入文件 include \u0026#34;file.php\u0026#34;; // 「副作用」:生成输出 echo \u0026#34;\u0026lt;html\u0026gt;\\n\u0026#34;; // 声明函数 function foo() { // function body } 下面是一个范例,一份只包含声明不产生「副作用」的代码:\n\u0026lt;?php // 声明函数 function foo() { // 函数主体部分 } // 条件声明 **不** 属于「副作用」 if (! function_exists(\u0026#39;bar\u0026#39;)) { function bar() { // 函数主体部分 } } 2.编码风格 1.概览 代码 必须 遵循 [PSR-1] 中的编码规范 。 代码 必须 使用 4 个空格符而不是「Tab 键」进行缩进。 每行的字符数 应该 软性保持在 80 个之内,理论上 一定不可 多于 120 个,但 一定不可 有硬性限制。 每个 namespace 命名空间声明语句和 use 声明语句块后面,必须 插入一个空白行。 类的开始花括号({) 必须 写在函数声明后自成一行,结束花括号(})也 必须 写在函数主体后自成一行。 方法的开始花括号({) 必须 写在函数声明后自成一行,结束花括号(})也 必须 写在函数主体后自成一行。 类的属性和方法 必须 添加访问修饰符(private、protected 以及 public),abstract 以及 final 必须 声明在访问修饰符之前,而 static 必须 声明在访问修饰符之后。 控制结构的关键字后 必须 要有一个空格符,而调用方法或函数时则 一定不可 有。 控制结构的开始花括号({) 必须 写在声明的同一行,而结束花括号(}) 必须 写在主体后自成一行。 控制结构的开始左括号后和结束右括号前,都 一定不可 有空格符。 控制结构必须使用花括号({}) 1.1.示例 本示例将作为下文规则的快速概览:\n\u0026lt;?php namespace Vendor\\Package; use FooInterface; use BarClass as Bar; use OtherVendor\\OtherPackage\\BazClass; class Foo extends Bar implements FooInterface { public function sampleMethod($a, $b = null) { if ($a === $b) { bar(); } elseif ($a \u0026gt; $b) { $foo-\u0026gt;bar($arg1); } else { BazClass::bar($arg2, $arg3); } } final public static function bar() { // 方法体 } } 2. 通则 2.1. 基本编码准则 代码 必须 符合 PSR-1 中的所有规范。 2.2. 文件 所有 PHP 文件 必须 使用 Unix LF (linefeed) 作为行的结束符。\n所有 PHP 文件 必须 以一个空白行作为结束。\n纯 PHP 代码文件 必须 省略最后的 ?\u0026gt; 结束标签。\n2.3. 行 行的长度 一定不可 有硬性的约束。\n每行 不该 多于 80 个字符,大于 80 字符的行 应该 折成多行。\n非空行后 一定不可 有多余的空格符。\n空行 可以 使得阅读代码更加方便以及有助于代码的分块。\n每行 一定不可 存在多于一条语句。\n2.4. 缩进 代码 必须 使用 4 个空格来进行缩进, 并且 一定不能 使用 tab 键来缩进。 注:仅使用空格,而不是使用空格和 tab 键混在一起, 能帮助避免在查看代码差异,打补丁,查看提交历史,以及进行注解时产生问题。使用空格也使得代码对齐更轻松。\n2.5. 关键字与 True/False/Null PHP 的 关键字 必须 使用小写形式。\nPHP 的常量 true, false, 还有 null 必须 使用小写形式。\n3. 命名空间和使用声明 namespace 声明之后 必须 存在一个空行。\n所有的 use 声明 必须 位于 namespace 声明之后。\n每条 use 声明 必须 只有一个 use 关键字。\nuse 语句块之后 必须 存在一个空行。\n例如:\n\u0026lt;?php namespace Vendor\\Package; use FooClass; use BarClass as Bar; use OtherVendor\\OtherPackage\\BazClass; // ... 其他 PHP 代码 ... 4. 类、属性和方法 此处的「类」泛指所有的「class 类」、「接口」以及「traits 可复用代码块」。\n4.1. 扩展与继承 关键词 extends 和 implements 必须 写在类名称的同一行。 类的开始花括号 必须 独占一行,结束花括号也 必须 在类主体后独占一行。 \u0026lt;?php namespace Vendor\\Package; use FooClass; use BarClass as Bar; use OtherVendor\\OtherPackage\\BazClass; class ClassName extends ParentClass implements \\ArrayAccess, \\Countable { // 这里面是常量、属性、类方法 } implements 的继承列表也 可以 分成多行,这样的话,每个继承接口名称都 必须 分开独立成行,包括第一个。 \u0026lt;?php namespace Vendor\\Package; use FooClass; use BarClass as Bar; use OtherVendor\\OtherPackage\\BazClass; class ClassName extends ParentClass implements \\ArrayAccess, \\Countable, \\Serializable { // 这里面是常量、属性、类方法 } 4.2. 属性 每个属性都 必须 添加访问修饰符。\n一定不可 使用关键字 var 声明一个属性。\n每条语句 一定不可 定义超过一个属性。\n不该 使用下划线作为前缀,来区分属性是 protected 或 private。\n以下是属性声明的一个范例:\n\u0026lt;?php namespace Vendor\\Package; class ClassName { public $foo = null; } 4.3. 方法 所有方法都 必须 添加访问修饰符。\n不该 使用下划线作为前缀,来区分方法是 protected 或 private 访问修饰符。\n方法名称后 一定不可 有空格符,其开始花括号 必须 独占一行,结束花括号也 必须 在方法主体后单独成一行。参数左括号后和右括号前 一定不可 有空格。\n一个标准的方法声明可参照以下范例,留意其括号、逗号、空格以及花括号的位置。\n\u0026lt;?php namespace Vendor\\Package; class ClassName { public function fooBarBaz($arg1, \u0026amp;$arg2, $arg3 = []) { // 方法主体 } } 4.4. 方法的参数 参数列表中,每个逗号后面 必须 要有一个空格,而逗号前面 一定不可 有空格。\nphp7及以上版本参数必须申明类型\nfunction getSoft(int $softId, array $params) {/* todo */} 有默认值的参数,必须 放到参数列表的末尾。\n\u0026lt;?php namespace Vendor\\Package; class ClassName { public function foo($arg1, \u0026amp;$arg2, $arg3 = []) { // 方法主体 } } 参数列表 可以 分列成多行,这样,包括第一个参数在内的每个参数都 必须 单独成行。\n拆分成多行的参数列表后,结束括号以及方法开始花括号 必须 写在同一行,中间用一个空格分隔。\n\u0026lt;?php namespace Vendor\\Package; class ClassName { public function aVeryLongMethodName( ClassTypeHint $arg1, \u0026amp;$arg2, array $arg3 = [] ) { // 方法主体 } } 4.5. abstract, final, 和 static 关键字 需要添加 abstract 或 final 声明时,必须 写在访问修饰符前,而 static 则 必须 写在其后。 \u0026lt;?php namespace Vendor\\Package; abstract class ClassName { protected static $foo; abstract protected function zim(); final public static function bar() { // 方法主体 } } 4.6. 方法及函数调用 方法及函数调用时,方法名或函数名与参数左括号之间 一定不可 有空格,参数右括号前也 一定不可 有空格。每个逗号前 一定不可 有空格,但其后 必须 有一个空格。 \u0026lt;?php bar(); $foo-\u0026gt;bar($arg1); Foo::bar($arg2, $arg3); 参数 可以 分列成多行,此时包括第一个参数在内的每个参数都 必须 单独成行。 \u0026lt;?php $foo-\u0026gt;bar( $longArgument, $longerArgument, $muchLongerArgument ); 4.7局部变量和成员变量 所有申明的变量 必须 被使用\n所有被使用的变量 必须 确保已申明\n所有变量 必须 初始化\n5. 控制结构 控制结构的基本规范如下:\n控制结构关键词后 必须 有一个空格。 控制结构关键词必须使用boolean类型 左括号 ( 后 一定不可 有空格。 右括号 ) 前也 一定不可 有空格。 右括号 ) 与开始花括号 { 间 必须 有一个空格。 结构体主体 必须 要有一次缩进。 结束花括号 } 必须 在结构体主体后单独成行。 每个结构体的主体都 必须 被包含在成对的花括号之中, 这能让结构体更加标准化,以及减少加入新行时,出错的可能性。\n5.1. if, elseif, else 标准的 if 结构如下代码所示,请留意「括号」、「空格」以及「花括号」的位置, 注意 else 和 elseif 都与前面的结束花括号在同一行。 \u0026lt;?php if ($expr1) { // if body } elseif ($expr2) { // elseif body } else { // else body; } 应该 使用关键词 elseif 代替所有 else if ,以使得所有的控制关键字都像是单独的一个词。 5.2. switch, case 标准的 switch 结构如下代码所示,留意括号、空格以及花括号的位置。\ncase 语句 必须 相对 switch 进行一次缩进,而 break 语句以及 case 内的其它语句都 必须 相对 case 进行一次缩进。\n如果存在非空的 case 直穿语句,主体里 必须 有类似 // no break 的注释。\n\u0026lt;?php switch ($expr) { case 0: echo \u0026#39;First case, with a break\u0026#39;; break; case 1: echo \u0026#39;Second case, which falls through\u0026#39;; // no break case 2: case 3: case 4: echo \u0026#39;Third case, return instead of break\u0026#39;; return; default: echo \u0026#39;Default case\u0026#39;; break; } 5.3. while, do while 一个规范的 while 语句应该如下所示,注意其「括号」、「空格」以及「花括号」的位置。\n\u0026lt;?php while ($expr) { // 结构体 } 标准的 do while 语句如下所示,同样的,注意其「括号」、「空格」以及「花括号」的位置。\n\u0026lt;?php do { // 结构体 } while ($expr); 5.4. for 标准的 for 语句如下所示,注意其「括号」、「空格」以及「花括号」的位置。\n\u0026lt;?php for ($i = 0; $i \u0026lt; 10; $i++) { // for 循环主体 } 5.5. foreach 标准的 foreach 语句如下所示,注意其「括号」、「空格」以及「花括号」的位置。\n\u0026lt;?php foreach ($iterable as $key =\u0026gt; $value) { // foreach 主体 } 5.6. try, catch 标准的 try catch 语句如下所示,注意其「括号」、「空格」以及「花括号」的位置。\n\u0026lt;?php try { // try 主体 } catch (FirstExceptionType $e) { // catch 主体 } catch (OtherExceptionType $e) { // catch 主体 } 6. 闭包 闭包声明时,关键词 function 后以及关键词 use 的前后都 必须 要有一个空格。\n开始花括号 必须 写在声明的同一行,结束花括号 必须 紧跟主体结束的下一行。\n参数列表和变量列表的左括号后以及右括号前,一定不可 有空格。\n参数和变量列表中,逗号前 一定不可 有空格,而逗号后 必须 要有空格。\n闭包中有默认值的参数 必须 放到列表的后面。\n标准的闭包声明语句如下所示,注意其「括号」、「空格」以及「花括号」的位置。\n\u0026lt;?php $closureWithArgs = function ($arg1, $arg2) { // 主体 }; $closureWithArgsAndVars = function ($arg1, $arg2) use ($var1, $var2) { // 主体 }; 参数列表以及变量列表 可以 分成多行,这样,包括第一个在内的每个参数或变量都 必须 单独成行,而列表的右括号与闭包的开始花括号 必须 放在同一行。 以下几个例子,包含了参数和变量列表被分成多行的多情况。\n\u0026lt;?php $longArgs_noVars = function ( $longArgument, $longerArgument, $muchLongerArgument ) { // 主体 }; $noArgs_longVars = function () use ( $longVar1, $longerVar2, $muchLongerVar3 ) { // 主体 }; $longArgs_longVars = function ( $longArgument, $longerArgument, $muchLongerArgument ) use ( $longVar1, $longerVar2, $muchLongerVar3 ) { // 主体 }; $longArgs_shortVars = function ( $longArgument, $longerArgument, $muchLongerArgument ) use ($var1) { // 主体 }; $shortArgs_longVars = function ($arg) use ( $longVar1, $longerVar2, $muchLongerVar3 ) { // 主体 }; 注意,闭包被直接用作函数或方法调用的参数时,以上规则仍然适用。\n\u0026lt;?php $foo-\u0026gt;bar( $arg1, function ($arg2) use ($var1) { // 主体 }, $arg3 ); ","permalink":"https://www.potawang.cn/post/php_specification/","summary":"\u003ch1 id=\"1编码规范\"\u003e1.编码规范\u003c/h1\u003e\n\u003cul\u003e\n\u003cli\u003ePHP 代码文件 \u003cstrong\u003e必须\u003c/strong\u003e 以 \u003ccode\u003e\u0026lt;?php\u003c/code\u003e 或 \u003ccode\u003e\u0026lt;?=\u003c/code\u003e 标签开始;\u003c/li\u003e\n\u003cli\u003ePHP 代码文件 \u003cstrong\u003e必须\u003c/strong\u003e 以 \u003ccode\u003e不带 BOM 的 UTF-8\u003c/code\u003e 编码;\u003c/li\u003e\n\u003cli\u003ePHP 代码中 \u003cstrong\u003e应该\u003c/strong\u003e 只定义类、函数、常量等声明, 或其他会产生 \u003ccode\u003e副作用\u003c/code\u003e 的操作(如:生成文件输出以及修改 .ini 配置文件等),二者只能选其一;\u003c/li\u003e\n\u003cli\u003e命名空间以及类 \u003cstrong\u003e必须\u003c/strong\u003e 符合 PSR 的自动加载规范: [\u003ca href=\"https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md\"\u003ePSR-0\u003c/a\u003e(已废弃)或 \u003ca href=\"https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md\"\u003ePSR-4\u003c/a\u003e] 中的一个。\u003c/li\u003e\n\u003cli\u003e类的命名 \u003cstrong\u003e必须\u003c/strong\u003e 遵循 \u003ccode\u003eStudlyCaps\u003c/code\u003e 大写开头的驼峰命名规范;\u003c/li\u003e\n\u003cli\u003e类中的常量所有字母都 \u003cstrong\u003e必须\u003c/strong\u003e 大写,单词间用下划线分隔;\u003c/li\u003e\n\u003cli\u003e方法名称 \u003cstrong\u003e必须\u003c/strong\u003e 符合 \u003ccode\u003ecamelCase\u003c/code\u003e 式的小写开头驼峰命名规范。\u003c/li\u003e\n\u003cli\u003e单一文件只能申明单个类\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"1类的常量属性和方法\"\u003e1.类的常量、属性和方法\u003c/h2\u003e\n\u003cp\u003e此处的「类」指代所有的类、接口以及可复用代码块(traits)。\u003c/p\u003e\n\u003ch3 id=\"11常量\"\u003e1.1常量\u003c/h3\u003e\n\u003cp\u003e类的常量中所有字母都 \u003cstrong\u003e必须\u003c/strong\u003e 大写,词间以下划线分隔。例如:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-php\" data-lang=\"php\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003e\u0026lt;?\u003c/span\u003e\u003cspan style=\"color:#a6e22e\"\u003ephp\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003enamespace\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eVendor\\Model\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eFoo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#66d9ef\"\u003econst\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eVERSION\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;1.0\u0026#39;\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#66d9ef\"\u003econst\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eDATE_APPROVED\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;2012-06-01\u0026#39;\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"12属性\"\u003e1.2.属性\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e类的属性命名 \u003cstrong\u003e可以\u003c/strong\u003e 遵循:\n\u003cul\u003e\n\u003cli\u003e大写开头的驼峰式 (\u003ccode\u003e$StudlyCaps\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e小写开头的驼峰式 (\u003ccode\u003e$camelCase\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e下划线分隔式 (\u003ccode\u003e$under_score\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e本规范不做强制要求,但无论遵循哪种命名方式,都 \u003cstrong\u003e应该\u003c/strong\u003e 在一定的范围内保持一致。这个范围可以是整个团队、整个包、整个类或整个方法。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"13方法\"\u003e1.3.方法\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e方法名称 \u003cstrong\u003e必须\u003c/strong\u003e 符合 \u003ccode\u003ecamelCase()\u003c/code\u003e 式的小写开头驼峰命名规范。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"14注释\"\u003e1.4.注释\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e所有的类都 \u003cstrong\u003e必须\u003c/strong\u003e 添加大概说明、创建者、创建日期 切放在\u003ccode\u003enamespace\u003c/code\u003e申明前 并空一行。例:\u003c/p\u003e","title":"PHP代码规范-初版"},{"content":"","permalink":"https://www.potawang.cn/about/","summary":"","title":"About"}]