- 基于 grill-me Q1-Q61 决策 - Vitest 测试与 CI workflow - middleware: parseFilters 核心实现 - component: Vue3 TransForm 基础组件 + Storybook Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,131 @@
|
||||
name: Node.js Build
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: ["main", "master"]
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
if: contains(github.event.head_commit.message, 'chore') && contains(github.event.head_commit.message, '版本') && contains(github.event.head_commit.message, '更新')
|
||||
runs-on: docker
|
||||
steps:
|
||||
- name: Checkout code
|
||||
env:
|
||||
GIT_AUTH: ${{ secrets.CI_USER }}:${{ secrets.CI_PASSWORD }}
|
||||
run: |
|
||||
git init
|
||||
git remote add origin http://gitea:3000/windychen/trans-form-middleware.git
|
||||
AUTH_B64=$(printf '%s' "$GIT_AUTH" | base64 | tr -d '\n')
|
||||
git -c http.extraHeader="Authorization: Basic ${AUTH_B64}" fetch --depth 1 origin ${{ github.sha }}
|
||||
git checkout ${{ github.sha }}
|
||||
|
||||
- name: Setup npm for Verdaccio
|
||||
run: |
|
||||
npm config set registry http://verdaccio:4873/
|
||||
npm config set //verdaccio:4873/:_authToken ${{ secrets.NPM_TOKEN }}
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm i --registry http://verdaccio:4873/
|
||||
|
||||
- name: Run tests
|
||||
run: npm test
|
||||
|
||||
- name: Publish to Verdaccio
|
||||
id: publish-verdaccio
|
||||
run: |
|
||||
VERSION=$(node -p "require('./package.json').version")
|
||||
PKG=$(node -p "require('./package.json').name.replace('@windychen/','')")
|
||||
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://verdaccio:4873/@windychen%2f${PKG}/$VERSION || echo 404)
|
||||
if [ "$HTTP_CODE" = "200" ]; then
|
||||
echo "Verdaccio: version $VERSION already exists, skipping."
|
||||
echo "verdaccio_result=skipped|版本 ${VERSION} 已存在" >> $GITHUB_OUTPUT
|
||||
else
|
||||
if npm publish --access public 2>&1; then
|
||||
echo "verdaccio_result=published|已发布 v${VERSION}" >> $GITHUB_OUTPUT
|
||||
else
|
||||
echo "verdaccio_result=failed|发布失败" >> $GITHUB_OUTPUT
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
- name: Publish to Gitea
|
||||
id: publish-gitea
|
||||
env:
|
||||
GITEA_NPM_AUTH: ${{ secrets.CI_USER }}:${{ secrets.NPM_GITEA_TOKEN }}
|
||||
run: |
|
||||
AUTH_B64=$(printf '%s' "$GITEA_NPM_AUTH" | base64 | tr -d '\n')
|
||||
npm config set //gitea:3000/api/packages/windychen/npm/:_auth "$AUTH_B64"
|
||||
VERSION=$(node -p "require('./package.json').version")
|
||||
PKG=$(node -p "require('./package.json').name")
|
||||
EXISTS=$(curl -s "http://gitea:3000/api/v1/packages/windychen?q=trans-form-middleware" -u "${{ secrets.CI_USER }}:${{ secrets.CI_PASSWORD }}" | grep -c "\"version\":\"$VERSION\"" || true)
|
||||
if [ "$EXISTS" -gt 0 ]; then
|
||||
echo "Gitea: version $VERSION already exists, skipping."
|
||||
echo "gitea_result=skipped|版本 ${VERSION} 已存在" >> $GITHUB_OUTPUT
|
||||
else
|
||||
if npm publish --registry http://gitea:3000/api/packages/windychen/npm/ 2>&1; then
|
||||
echo "gitea_result=published|已发布 v${VERSION}" >> $GITHUB_OUTPUT
|
||||
else
|
||||
echo "gitea_result=failed|发布失败" >> $GITHUB_OUTPUT
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
- name: Create Gitea Release
|
||||
if: always() && steps.publish-gitea.outcome == 'success'
|
||||
run: |
|
||||
VERSION=$(node -p "require('./package.json').version")
|
||||
EXISTS=$(curl -s "http://gitea:3000/api/v1/repos/windychen/trans-form-middleware/releases/tags/v${VERSION}" -u "${{ secrets.CI_USER }}:${{ secrets.CI_PASSWORD }}" | grep -c "\"tag_name\"" || true)
|
||||
if [ "$EXISTS" = "0" ]; then
|
||||
curl -s -X POST \
|
||||
"http://gitea:3000/api/v1/repos/windychen/trans-form-middleware/releases" \
|
||||
-u "${{ secrets.CI_USER }}:${{ secrets.CI_PASSWORD }}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d "{\"tag_name\":\"v${VERSION}\",\"name\":\"v${VERSION}\",\"body\":\"## trans-form-middleware v${VERSION}\",\"target_commitish\":\"main\"}"
|
||||
else
|
||||
echo "Release v${VERSION} already exists, skipping."
|
||||
fi
|
||||
|
||||
- name: Notify DingTalk
|
||||
if: always()
|
||||
run: |
|
||||
STATUS="${{ job.status }}"
|
||||
VERSION=$(node -p "require('./package.json').version")
|
||||
|
||||
parse_result() {
|
||||
local raw="$1"
|
||||
local target="$2"
|
||||
local icon="${raw%%|*}"
|
||||
local detail="${raw#*|}"
|
||||
case "$icon" in
|
||||
published) echo "📦 ${target}: ${detail}" ;;
|
||||
skipped) echo "⏭️ ${target}: ${detail}" ;;
|
||||
failed) echo "❌ ${target}: ${detail}" ;;
|
||||
*) echo "⚠️ ${target}: ${detail}" ;;
|
||||
esac
|
||||
}
|
||||
|
||||
VERD_RESULT="${{ steps.publish-verdaccio.outputs.verdaccio_result }}"
|
||||
GITEA_RESULT="${{ steps.publish-gitea.outputs.gitea_result }}"
|
||||
|
||||
if [ -n "$VERD_RESULT" ]; then
|
||||
VERD_LINE=$(parse_result "$VERD_RESULT" "Verdaccio")
|
||||
else
|
||||
VERD_LINE="⚠️ Verdaccio: 未执行"
|
||||
fi
|
||||
|
||||
if [ -n "$GITEA_RESULT" ]; then
|
||||
GITEA_LINE=$(parse_result "$GITEA_RESULT" "Gitea")
|
||||
else
|
||||
GITEA_LINE="⚠️ Gitea: 未执行"
|
||||
fi
|
||||
|
||||
if [ "$STATUS" = "success" ]; then
|
||||
TITLE="✅ trans-form-middleware v${VERSION} 构建完成 chen-fnos"
|
||||
else
|
||||
TITLE="❌ trans-form-middleware v${VERSION} 构建失败 chen-fnos"
|
||||
fi
|
||||
|
||||
curl -s -X POST "https://oapi.dingtalk.com/robot/send?access_token=${{ secrets.DINGDING_TOKEN }}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d "{\"msgtype\":\"markdown\",\"markdown\":{\"title\":\"${TITLE}\",\"text\":\"## ${TITLE}\n\n${VERD_LINE}\n${GITEA_LINE}\n\n- 仓库: windychen/trans-form-middleware\n- 分支: ${{ github.ref_name }}\n- 提交: ${{ github.sha }}\"}}"
|
||||
Reference in New Issue
Block a user