AIGC 能力
AIGC全称为AI-Generated Content,即采用人工智能技术来自动生产内容。
充分利用好AIGC的能力挺有用的,比如下面的一个例子:给我写一个shell脚本,基本上将shell 脚本的基础能力完成,只需要稍加加工即可一个生产可用的工具。
比如:
-
写个sehll 脚本分析一下linux 系统的网路流量、内存占用情况、磁盘占用情况等待,基本上完成相关的功能,相对自己独立完成效率差距还是蛮大的。
-
帮我写一篇1000字介绍Java的各种垃圾回收器的发展、原理。
-
… 稍微利用一下即可满足大多数场景的需求,不会写java 脚本也没有关系,稍微看看就会了.
体验百度-文心一言
百度app目前已经集成测试版本,可以下载体验一下.
- 提问
给我写一个shell脚本,自动抓取去jvm堆栈,然后上传到,对象存储里面去。
- 回答
以下是一个自动抓取 JVM 堆栈并上传到对象存储的 Shell 脚本示例。这里同样假设你使用的是 AWS S3 存储桶,你可以根据使用的对象存储服务进行相应的修改。
#!/bin/bash
# 检查参数数量
if [ "$#" -ne 1 ]; then
echo "Usage: $0 <pid>"
exit 1
fi
# 检查 pid 是否存在
if ! ps -p "$1" > /dev/null; then
echo "Error: PID $1 does not exist."
exit 1
fi
# 设置 AWS 访问密钥和密钥 ID
export AWS_ACCESS_KEY_ID="YOUR_AWS_ACCESS_KEY_ID"
export AWS_SECRET_ACCESS_KEY="YOUR_AWS_SECRET_ACCESS_KEY"
# 设置上传存储桶和对象键
BUCKET_NAME="YOUR_S3_BUCKET_NAME"
OBJECT_KEY="jvm_stack_$(date +%Y%m%d%H%M%S).txt" # 使用当前时间作为对象键
# 抓取 JVM 堆栈
jstack "$1" > jstack.txt # 将堆栈信息保存到本地文件 jstack.txt
# 使用 aws-cli 上传文件
aws s3 cp jstack.txt "s3://$BUCKET_NAME/$OBJECT_KEY"
echo "JVM stack uploaded successfully to s3://$BUCKET_NAME/$OBJECT_KEY"
将此脚本保存为 capture_and_upload_jvm_stack.sh
,并使用 chmod +x capture_and_upload_jvm_stack.sh
命令使其可执行。然后,你可以使用以下命令抓取指定进程的 JVM 堆栈,并将其上传到 S3 存储桶:
bash ./capture_and_upload_jvm_stack.sh <pid>
请确保在运行脚本之前,你已经安装了 aws-cli,并已经设置了正确的 AWS 访问密钥和密钥 ID。你需要将 替换为你要抓取堆栈的进程的实际 PID。如果你使用的是其他对象存储服务,请根据相应的 API 进行修改。
实操-静态资源-上传到对象存储
能力依赖
vscode 插件 突破shell 脚本语法障碍 https://github.com/yousefvand/shellman
利用上面AIGC的能力、基本上的流程都有了,稍加补充即可。
场景分析
分析一下场景: 流水线能力会自动将前端文件上传到产物包给一个URL 地址,通过环境变量可以获取,然后下载文件到本地之后将文件解压上传到 即可, APP_CODE 应用名称、 PACKAGE_URL 打包后的资源。
比如 front-delploy.sh
是一个脚本 第一个参数当前应用名称 、环境、产物包地址,即可执行如下脚本 ./front-delploy.sh "${APP_CODE}" "test" "${PACKAGE_URL}"
为了通用化,需要定制一下对象存储的路径信息 DESC_DIR="/"${APP_CODE}"/"${APP_CODE}"-group-"${CURRENT_ENV}"/release/"
代码
资源结构
index.html
navigator.html
为导航页面,先上传static 静态部分然后再上传 导航页面到对象存储。
# ├── nginx.conf
# ├── nginx_start.sh
# └── publish
# ├── index.html
# ├── navigator.html
# └── static
# └── 101
# ├── css
# │ ├── chunk-common.d5b28be3.css
# │ ├── chunk-vendors.eb48fde8.css
# │ └── navigator.875ab1a7.css
# └── js
# ├── 0.js
# ├── chunk-common.js
# ├── chunk-vendors.js
# ├── index.js
# └── navigator.js
部署脚本
对象存储的操作主要使用工具:https://github.com/s3tools/s3cmd,目前很多的对象存储都满s3的API 格式的,都可以兼容使用。
通过环境 获取对象存储配置
通过产品+环境 获取对象存储的资源目录
脚本主要有如下步骤处理上传资源文件:
- 首先上传static目录的静态资源 。
- 然后备份 导航页面,方便回滚可以手动回滚一下。
- 然后上传 导航页面
# 配置信息
CUSTOM_BUCKET_NAME=
CUSTOM_ACCESS_KEY_ID=
CUSTOM_ACCESS_KEY_SECRET=
CUSTOM_ENDPOINT=
CUSTOM_REGION=
# 地址目的地 = /应用名称/应用名称-group-环境/release/
DESC_DIR=
## 当前的环境信息
CURRENT_ENV=
CURRENT_APP_CODE=
# download package file
CURRENT_PACKAGE_URL=
# Usage: banner_simple "my title"
banner_simple() {
local msg="* $* *"
local edge=$(echo "$msg" | sed 's/./*/g')
echo "$edge"
echo "$msg"
echo "$edge"
echo
}
# 上传前端的静态文件到
# 先上传静态版本部分、然后上传动态部分
start_upload_publish() {
if [ ! -f "/usr/bin/s3cmd" ]; then
yum -y install s3cmd || echo "install s3cmd error" && exit 1
fi
# Generate Time Random Path
CURRENT_TIME=$(date +%Y%m%d%H%M%S)
PARENT_DIR="/opt/local/${CURRENT_TIME}"
if [ ! -d "$PARENT_DIR" ]; then
mkdir -p "${PARENT_DIR}"
fi
ZIP_DIR=${PARENT_DIR}"/publish.zip"
banner_simple "download push zip file path:${ZIP_DIR} "
UNZIP_DIR="${PARENT_DIR}/unzip/"
if [ ! -d "$UNZIP_DIR" ]; then
mkdir -p "${UNZIP_DIR}"
fi
banner_simple "start to download package:${CURRENT_PACKAGE_URL} and unzip package zip file path: ${UNZIP_DIR}"
curl -L "${CURRENT_PACKAGE_URL}" -o "${ZIP_DIR}" || exit 1
unzip "${ZIP_DIR}" -d "${UNZIP_DIR}" || exit 1
banner_simple "begin upload file to : ${UNZIP_DIR}"
## 先上传静态文件部分
## front static file upload to
FORNT_STATIC_LOCAL_DIR="${UNZIP_DIR}publish/static/"
FORNT_STATIC__DIR="${DESC_DIR}publish/static/"
banner_simple "start front static file local:${FORNT_STATIC_LOCAL_DIR} upload to :${FORNT_STATIC__DIR}"
s3cmd --access_key="${CUSTOM_ACCESS_KEY_ID}" --secret_key="${CUSTOM_ACCESS_KEY_SECRET}" --region="${CUSTOM_REGION}" --host="${CUSTOM_ENDPOINT}" --host-bucket="${CUSTOM_BUCKET_NAME}" put --recursive "${FORNT_STATIC_LOCAL_DIR}" "s3://${CUSTOM_BUCKET_NAME}${FORNT_STATIC__DIR}" || exit 1
banner_simple "end front static file upload to "
rm -rf "${FORNT_STATIC_LOCAL_DIR}" || exit 1
## back up front dynamics file upload to
FORNT_DYNAMICS_LOCAL_DIR="${UNZIP_DIR}publish/"
FORNT_DYNAMICS__DIR="${DESC_DIR}publish/backup/${CURRENT_TIME}/"
banner_simple "start back up front dynamics file local:${FORNT_DYNAMICS_LOCAL_DIR} upload to : ${FORNT_DYNAMICS__DIR}"
# shellcheck disable=SC2086
s3cmd --access_key="${CUSTOM_ACCESS_KEY_ID}" --secret_key="${CUSTOM_ACCESS_KEY_SECRET}" --region="${CUSTOM_REGION}" --host="${CUSTOM_ENDPOINT}" --host-bucket="${CUSTOM_BUCKET_NAME}" put --recursive "${FORNT_DYNAMICS_LOCAL_DIR}" "s3://${CUSTOM_BUCKET_NAME}${FORNT_DYNAMICS__DIR}" || exit 1
banner_simple "end back up front dynamics file upload to "
## front dynamics file upload to
FORNT_DYNAMICS_LOCAL_DIR="${UNZIP_DIR}publish/"
FORNT_DYNAMICS__DIR="${DESC_DIR}publish/"
banner_simple "start front dynamics file local:${FORNT_DYNAMICS_LOCAL_DIR} upload to : ${FORNT_DYNAMICS__DIR}"
# shellcheck disable=SC2086
s3cmd --access_key="${CUSTOM_ACCESS_KEY_ID}" --secret_key="${CUSTOM_ACCESS_KEY_SECRET}" --region="${CUSTOM_REGION}" --host="${CUSTOM_ENDPOINT}" --host-bucket="${CUSTOM_BUCKET_NAME}" put --recursive "${FORNT_DYNAMICS_LOCAL_DIR}" "s3://${CUSTOM_BUCKET_NAME}${FORNT_DYNAMICS__DIR}" || exit 1
banner_simple "end front dynamics file upload to "
rm -rf "${FORNT_DYNAMICS_LOCAL_DIR}" || exit 1
banner_simple "end upload file to "
}
# $1: appCode
# $2: env
# $3: package url
main() {
banner_simple "begin script "
CURRENT_APP_CODE="$1"
CURRENT_ENV="$2"
CURRENT_PACKAGE_URL="$3"
# 地址目的地 = /应用名称/应用名称-环境/release/
# shellcheck disable=SC2027
DESC_DIR="/"${CURRENT_APP_CODE}"/"${CURRENT_APP_CODE}"-group-"${CURRENT_ENV}"/release/"
# check base info
if [[ -z "${CURRENT_APP_CODE}" ]]; then
banner_simple "param 1: appCode is empty"
exit 1
fi
if [[ -z "${CURRENT_ENV}" ]]; then
banner_simple "param 2: env is empty,you can test pre prod"
exit 1
fi
if [[ "${CURRENT_ENV}" == "test" ]]; then
banner_simple "this is test env"
CUSTOM_BUCKET_NAME=
CUSTOM_ACCESS_KEY_ID=
CUSTOM_ACCESS_KEY_SECRET=
CUSTOM_ENDPOINT=
CUSTOM_REGION=
fi
# check info
if [[ -z "${CUSTOM_BUCKET_NAME}" ]]; then
banner_simple " info is empty"
exit 1
fi
start_upload_publish || exit 1
}
main "${@}"
执行脚本
将上面脚本保存到一个一个存储地址,然后直接在流水线配置如下脚本即可。
curl -L "https://xxxx/front-delploy.sh" >front-delploy.sh; chmod a+x front-delploy.sh; ./front-delploy.sh "${APP_CODE}" "test" "${PACKAGE_URL}"
怎么调试脚本?
如何调试shell 脚本
bash -x front-delploy.sh
当然也可以去AIGC 去提问一下 ,如何调试。文章来源:https://www.toymoban.com/news/detail-573375.html
调试shell脚本可以使用以下方法,以便快速诊断和纠正脚本中的错误:
添加注释:在脚本中添加注释,以便在执行脚本时显示说明和提示。这可以帮助您理解脚本的执行流程和变量的含义。
使用调试工具:使用调试工具,例如bash -x命令或在脚本中使用set -x,以显示脚本的详细执行过程。这些工具可以帮助您跟踪脚本的执行并找到错误。
使用echo语句:在脚本中使用echo语句输出变量的值或特定的执行步骤。这可以帮助您理解脚本的执行流程和变量的值。
使用trap命令:使用trap命令设置信号处理程序,以便在脚本发生特定信号时执行特定的操作,例如在脚本执行失败时输出错误信息。
检查脚本错误:在脚本中检查特定命令的返回值,例如if [ $? -ne 0 ]; then echo "Error" fi,以检查命令的执行情况并在出现错误时进行相应的处理。
使用调试模式:如果您的脚本需要与其他程序或系统进行交互,则可以在调试模式下运行这些程序或系统,以便检查其输出和行为。
总之,调试shell脚本需要仔细阅读脚本并使用适当的工具和技巧来诊断错误。通过使用上述方法,您可以更轻松地调试和理解脚本的执行过程,并快速纠正错误。
总结
shell 脚本相对于java 代码写的还是相对较少,对于语法糖相对来说不够熟悉,利用好工具 vscode 插件、AIGC的自动能容生成能力,即可完成为日常开发过程解决问题提速。文章来源地址https://www.toymoban.com/news/detail-573375.html
到了这里,关于AIGC 来帮我写个脚本的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!