Skip to content

Commit 9859b18

Browse files
committed
Add Angular template configuration files and SQL updates
1 parent 11a49e1 commit 9859b18

File tree

11 files changed

+542
-31
lines changed

11 files changed

+542
-31
lines changed

.github/workflows/docker-image.yml

Lines changed: 39 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ on:
44
workflow_dispatch:
55
inputs:
66
tag:
7-
description: 'tag for the Docker image'
7+
description: "tag for the Docker image"
88
required: true
9-
default: 'latest'
9+
default: "latest"
1010
push:
1111
branches:
12-
- 'main'
12+
- "main"
1313
jobs:
1414
define-matrix:
1515
runs-on: ubuntu-latest
@@ -50,31 +50,39 @@ jobs:
5050
matrix:
5151
build_target: ${{ fromJson(needs.define-matrix.outputs.build_targets) }}
5252
steps:
53-
- name: Checkout code
54-
uses: actions/checkout@v4
55-
with:
56-
fetch-depth: 0
57-
- name: Set up QEMU
58-
uses: docker/setup-qemu-action@v3
59-
- name: Set up Docker Buildx
60-
uses: docker/setup-buildx-action@v3
61-
- name: Login to ghcr.io
62-
uses: docker/login-action@v3
63-
with:
64-
registry: ghcr.io
65-
username: ${{ github.repository_owner }}
66-
password: ${{ secrets.GH_PAT }}
67-
- name: Build and push image
68-
run: |
69-
echo "build_target=${{ matrix.build_target }}"
70-
echo "tag=${{ needs.define-matrix.outputs.tag }}"
71-
echo "tag_cn=${{ needs.define-matrix.outputs.tag_cn }}"
72-
image_name=$(bash script/get_image_name.sh ${{ github.repository_owner }} "${{ matrix.build_target }}" "${{ needs.define-matrix.outputs.tag }}")
73-
image_name_cn=$(bash script/get_image_name.sh ${{ github.repository_owner }} "${{ matrix.build_target }}" "${{ needs.define-matrix.outputs.tag_cn }}")
74-
echo "image_name=$image_name" >> $GITHUB_OUTPUT
75-
echo "image_name_cn=$image_name_cn" >> $GITHUB_OUTPUT
76-
echo "building image $image_name"
77-
is_cn="0" bash script/build_and_push_images.sh "${{ matrix.build_target }}" "$image_name" $is_cn
78-
echo "building image $image_name_cn"
79-
is_cn="1" bash script/build_and_push_images.sh "${{ matrix.build_target }}" "$image_name_cn" $is_cn
80-
# TODO: generate runtime yaml and json
53+
- name: Checkout code
54+
uses: actions/checkout@v4
55+
with:
56+
fetch-depth: 0
57+
- name: Set up QEMU
58+
uses: docker/setup-qemu-action@v3
59+
- name: Set up Docker Buildx
60+
uses: docker/setup-buildx-action@v3
61+
- name: Login to ghcr.io
62+
uses: docker/login-action@v3
63+
with:
64+
registry: ghcr.io
65+
username: ${{ github.repository_owner }}
66+
password: ${{ secrets.GH_PAT }}
67+
- name: Generate SQL
68+
run: |
69+
echo "build_target=${{ matrix.build_target }}"
70+
echo "tag=${{ needs.define-matrix.outputs.tag }}"
71+
echo "tag_cn=${{ needs.define-matrix.outputs.tag_cn }}"
72+
echo "image_name=$image_name" >> $GITHUB_OUTPUT
73+
echo "image_name_cn=$image_name_cn" >> $GITHUB_OUTPUT
74+
image_name=$(bash script/get_image_name.sh ${{ github.repository_owner }} "${{ matrix.build_target }}" "${{ needs.define-matrix.outputs.tag }}")
75+
image_name_cn=$(bash script/get_image_name.sh ${{ github.repository_owner }} "${{ matrix.build_target }}" "${{ needs.define-matrix.outputs.tag_cn }}")
76+
template_json=$(bash script/get_template_config_json.sh "${{ matrix.build_target }}")
77+
template_repo_json=$(bash script/get_template_repo_json.sh "${{ matrix.build_target }}")
78+
sql=$(bash script/generate_template_sql.sh $image_name $template_json $template_repo_json)
79+
# 保存 SQL 到文件
80+
mkdir -p /sql/templates/
81+
echo "$sql" > "/sql/templates/${{ matrix.build_target//\//_ }}.sql"
82+
- name: Build and push image
83+
run: |
84+
echo "building image $image_name"
85+
is_cn="0" bash script/build_and_push_images.sh "${{ matrix.build_target }}" "$image_name" $is_cn
86+
echo "building image $image_name_cn"
87+
is_cn="1" bash script/build_and_push_images.sh "${{ matrix.build_target }}" "$image_name_cn" $is_cn
88+
# TODO: generate runtime yaml and json

Framework/angular/repo.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"name": "Angular",
3+
"isPublic": true,
4+
"description": "Complete Google Angular Development Toolchain Environment"
5+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"name": "v18",
3+
"port": 4200,
4+
"isDeleted": false
5+
}

script/generate_template_config.sh

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
#!/bin/bash
2+
3+
# 确保脚本在发生错误时立即退出
4+
set -e
5+
6+
# 使用命名参数处理
7+
while [[ "$#" -gt 0 ]]; do
8+
case $1 in
9+
--app-port) APP_PORT="$2"; shift ;;
10+
--ssh-port) SSH_PORT="$2"; shift ;;
11+
--entrypoint) ENTRYPOINT="$2"; shift ;;
12+
--user) DEVBOX_USER="$2"; shift ;;
13+
--working-dir) WORKING_DIR="$2"; shift ;;
14+
--output) OUTPUT_FILE="$2"; shift ;;
15+
*) echo "Unknown parameter passed: $1"; exit 1 ;;
16+
esac
17+
shift
18+
done
19+
20+
# 检查必需参数
21+
# if [ -z "$RUNTIME_NAME" ] || [ -z "$SHORT_COMMIT_ID" ] || [ -z "$ORG_UID" ]; then
22+
# echo "Usage: $0 \\
23+
# [ --app-port <app_port> ] \\
24+
# [ --ssh-port <ssh_port> ] \\
25+
# [ --entrypoint <entrypoint> ] \\
26+
# [ --user <user> ] \\
27+
# [ --working-dir <working_dir> ] \\
28+
# [ --output <output_file> ]"
29+
# exit 1
30+
# fi
31+
32+
# 设置默认值
33+
APP_PORT=${APP_PORT:-3001}
34+
SSH_PORT=${SSH_PORT:-22}
35+
ENTRYPOINT=${ENTRYPOINT:-"/home/devbox/project/entrypoint.sh"}
36+
DEVBOX_USER=${DEVBOX_USER:-"devbox"}
37+
WORKING_DIR=${WORKING_DIR:-"/home/devbox/project"}
38+
39+
# 创建生成配置的函数
40+
generate_template_config() {
41+
cat <<EOF
42+
{"appPorts":[{"name":"devbox-app-port","port":$APP_PORT,"protocol":"TCP"}],"ports":[{"containerPort":$SSH_PORT,"name":"devbox-ssh-port","protocol":"TCP"}],"releaseArgs":["$ENTRYPOINT"],"releaseCommand":["/bin/bash","-c"],"user":"$DEVBOX_USER","workingDir":"$WORKING_DIR"}
43+
EOF
44+
}
45+
46+
# 生成配置
47+
CONFIG=$(generate_template_config)
48+
49+
# 如果指定了输出文件,则写入文件,否则输出到标准输出
50+
if [ -n "$OUTPUT_FILE" ]; then
51+
echo "$CONFIG" > "$OUTPUT_FILE"
52+
echo "Configuration written to $OUTPUT_FILE"
53+
else
54+
echo "$CONFIG"
55+
fi

script/generate_template_sql.sh

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
#!/bin/bash
2+
3+
# 确保脚本在发生错误时立即退出
4+
set -e
5+
6+
if [ "$#" -ne 4 ]
7+
then
8+
echo "Usage: $0 <image> <template_json> <template_repo_json>"
9+
exit 1
10+
fi
11+
12+
# 提取环境变量
13+
IMAGE=$1
14+
TEMPLATE_JSON=$2
15+
TEMPLATE_REPO_JSON=$3
16+
17+
SQL_DIR="sql"
18+
SQL_FILE="$SQL_DIR/$RUNTIME_NAME-$SHORT_COMMIT_ID.sql.tmp"
19+
# IMAGE="ghcr.io/labring-actions/devbox/$RUNTIME_NAME:$SHORT_COMMIT_ID"
20+
RUNTIME_NAME=$(echo "$TEMPLATE_REPO_JSON" | jq -r '.name')
21+
IS_PUBLIC=$(echo "$TEMPLATE_REPO_JSON" | jq -r '.isPublic')
22+
KIND=$(echo "$TEMPLATE_REPO_JSON" | jq -r '.kind')
23+
24+
# 创建目录(如果不存在)
25+
mkdir -p $SQL_DIR
26+
27+
# 生成 UUID
28+
# TEMPLATE_UID=$(uuidgen)
29+
# TEMPLATE_REPOSITORY_TAG_UID=$(uuidgen)
30+
31+
# 生成 SQL 文件
32+
cat <<EOF
33+
--1. 如果没有找到,创建一个新的 TemplateRepository
34+
WITH org_uid AS (
35+
SELECT "uid" FROM "Organization"
36+
WHERE "name" = 'labring'
37+
LIMIT 1
38+
)
39+
INSERT "TemplateRepository" ("uid", "name", "description", "kind", "organizationUid", "regionUid", "isPublic", "createdAt", "updatedAt")
40+
SELECT
41+
'$(uuidgen)',
42+
'$RUNTIME_NAME',
43+
'A new template repository',
44+
'$KIND',
45+
org_uid.uid,
46+
'<region_uid>', -- 必须替换为实际存在的 regionUid,空字符串会导致外键错误
47+
$IS_PUBLIC::boolean,
48+
now(),
49+
now()
50+
WHERE NOT EXISTS (
51+
SELECT 1 FROM "TemplateRepository"
52+
WHERE "name" = '$RUNTIME_NAME' AND "organizationUid" = '$ORG_UID' AND "regionUid" = '$REGION_UID'
53+
);
54+
55+
-- 2. 更新已存在的 Template为 isDeleted (如果有)
56+
WITH
57+
WITH org_uid AS (
58+
SELECT "uid" FROM "Organization"
59+
WHERE "name" = 'labring'
60+
LIMIT 1
61+
),
62+
template_repository_uid AS (
63+
SELECT "uid" FROM "TemplateRepository"
64+
WHERE "name" = '$RUNTIME_NAME' AND "organizationUid" = org_uid.uid AND "regionUid" = 'region_uid_placeholder'
65+
LIMIT 1
66+
)
67+
68+
UPDATE "Template"
69+
SET "image" = '$IMAGE',
70+
"config" = '$TEMPLATE_CONFIG',
71+
"updatedAt" = now(),
72+
"deletedAt" = now(),
73+
"isDeleted" = FALSE
74+
WHERE "name" = '$VERSION' AND "isDeleted" = false;
75+
76+
-- 3. 插入 新的Template
77+
WITH org_uid AS (
78+
SELECT "uid" FROM "Organization"
79+
WHERE "name" = 'labring'
80+
LIMIT 1
81+
),
82+
template_repository_uid AS (
83+
SELECT "uid" FROM "TemplateRepository"
84+
WHERE "name" = '$RUNTIME_NAME' AND "organizationUid" = org_uid.uid AND "regionUid" = 'region_uid_placeholder'
85+
LIMIT 1
86+
)
87+
INSERT "Template" ("name", "image", "config", "templateRepositoryUid", "createdAt", "updatedAt")
88+
SELECT
89+
'$VERSION',
90+
'$IMAGE',
91+
'$TEMPLATE_CONFIG',
92+
template_repository_uid.uid,
93+
now(),
94+
now();
95+
EOF
96+
97+
echo "Generated SQL Template File: $SQL_FILE"

script/get_template_config_json.sh

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#!/bin/bash
2+
3+
if [ "$#" -ne 1 ]; then
4+
echo "Usage: $0 <build_target> "
5+
exit 1
6+
fi
7+
8+
BUILD_TARGET=$1
9+
10+
IFS='/' read -ra ADDR <<< "$BUILD_TARGET"
11+
IMAGE_NAME="${ADDR[1]}-${ADDR[2]}"
12+
13+
# /Framework/angular/v18/Dockerfile => /Framework/angular
14+
# 生成 config.json 的路径
15+
TEMPLATE_CONFIG_PATH="${ADDR[0]}/${ADDR[1]}/${ADDR[2]}/template.json"
16+
17+
if [ ! -f "$TEMPLATE_CONFIG_PATH" ]; then
18+
echo "Error: template.json file not found at $TEMPLATE_CONFIG_PATH"
19+
exit 1
20+
fi
21+
22+
echo $(cat "$TEMPLATE_CONFIG_PATH")
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#!/bin/bash
2+
3+
if [ "$#" -ne 1 ]; then
4+
echo "Usage: $0 <build_target>"
5+
exit 1
6+
fi
7+
8+
BUILD_TARGET=$1
9+
10+
IFS='/' read -ra ADDR <<< "$BUILD_TARGET"
11+
IMAGE_NAME="${ADDR[1]}-${ADDR[2]}"
12+
13+
# /Framework/angular/v18/Dockerfile => /Framework/angular
14+
# 生成 config.json 的路径
15+
TEMPLATE_REPO_CONFIG_PATH="${ADDR[0]}/${ADDR[1]}/repo.json"
16+
if [ ! -f "$TEMPLATE_REPO_CONFIG_PATH" ]; then
17+
echo "Error: repo.json file not found at $TEMPLATE_REPO_CONFIG_PATH"
18+
exit 1
19+
fi
20+
echo $(cat "$TEMPLATE_REPO_CONFIG_PATH")

sql/000_init_org.sql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
-- init organization
2+
insert "Organization" (id, "updatedAt", name)
3+
values
4+
('labring', current_timestamp, 'labring');

sql/001_init_tag.sql

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
-- init tag
2+
INSERT INTO
3+
"Tag" (name, "enName", "zhName", type)
4+
VALUES
5+
(
6+
'javascript',
7+
'Javascript',
8+
'Javascript',
9+
'PROGRAMMING_LANGUAGE'
10+
),
11+
('csharp', 'C#', 'C#', 'PROGRAMMING_LANGUAGE'),
12+
(
13+
'python',
14+
'Python',
15+
'Python',
16+
'PROGRAMMING_LANGUAGE'
17+
),
18+
(
19+
'golang',
20+
'Golang',
21+
'Golang',
22+
'PROGRAMMING_LANGUAGE'
23+
),
24+
('c', 'C', 'C', 'PROGRAMMING_LANGUAGE'),
25+
('rust', 'Rust', 'Rust', 'PROGRAMMING_LANGUAGE'),
26+
('cpp', 'C++', 'C++', 'PROGRAMMING_LANGUAGE'),
27+
('ruby', 'Ruby', 'Ruby', 'PROGRAMMING_LANGUAGE'),
28+
('java', 'Java', 'Java', 'PROGRAMMING_LANGUAGE'),
29+
('php', 'Php', 'Php', 'PROGRAMMING_LANGUAGE'),
30+
('ai', 'AI', 'AI', 'USE_CASE'),
31+
('os', 'OS', '操作系统', 'USE_CASE'),
32+
('tool', 'Tool', '工具', 'USE_CASE'),
33+
('blog', 'Blog', '博客', 'USE_CASE'),
34+
(
35+
'OFFICIAL_CONTENT',
36+
'MCP',
37+
'MCP',
38+
'OFFICIAL_CONTENT'
39+
),
40+
(
41+
'official',
42+
'Official Picks',
43+
'官方精选',
44+
'OFFICIAL_CONTENT'
45+
);

0 commit comments

Comments
 (0)