Commit b6be6b23 authored by BO ZHANG's avatar BO ZHANG 🏀
Browse files

refactor: 统一使用 BUILD_NUMBER 作为镜像版本标识

parent 77d40f0a
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -11,7 +11,6 @@ help:
	@echo ""
	@echo "Common usage:"
	@echo "  make build BUILD_NUMBER=100000 HARBOR_PROJECT=harbor.csst.nao:10443/csst/"
	@echo "  make build IMAGE_TAG=test HARBOR_PROJECT=harbor.csst.nao:10443/csst/"
	@echo "  make ansible-update ENV=p368"
	@echo ""
	@$(MAKE) -C $(SUBDIR) help
+17 −10
Original line number Diff line number Diff line
@@ -8,18 +8,27 @@
- **构建/打包/推送镜像**使用 `make`
- **部署/升级/启停集群**使用 `make ansible-*`(内部调用 Ansible Playbook)

从源码构建并更新集群(推荐只设置 `BUILD_NUMBER` 作为统一版本号,默认也会作为镜像 tag):
构建镜像(与部署环境 `ENV` 无关;推荐用 `BUILD_NUMBER` 作为统一版本号/镜像 tag):

```bash
export ENV=p368
export BUILD_NUMBER=100000
export HARBOR_PROJECT=harbor.csst.nao:10443/csst/

make build
make push
```

部署/更新集群(`ENV` 用于选择 `deploy_configs/<env>/inventory.ini`):

```bash
export ENV=p368
export BUILD_NUMBER=100000
export HARBOR_PROJECT=harbor.csst.nao:10443/csst/

make ansible-update
```

仅部署“已经构建好的镜像”(Harbor 中已存在对应 tag):只需要 `ENV` + 镜像 tag(推荐直接复用 `BUILD_NUMBER`;也可显式设置 `IMAGE_TAG` 覆盖),以及可选的 `HARBOR_PROJECT`
仅部署“已经构建好的镜像”(Harbor 中已存在对应 tag):无需执行 `make build`,直接部署即可

```bash
export ENV=csu
@@ -57,7 +66,6 @@ make ansible-update
常用命令(在仓库根目录执行即可):

```bash
export IMAGE_TAG=test
export BUILD_NUMBER=100000
export HARBOR_PROJECT=harbor.csst.nao:10443/csst/

@@ -85,9 +93,9 @@ make ansible-down
```

说明:
- `make pull` 只负责从 `required-images.txt` 拉取第三方镜像,不依赖 `IMAGE_TAG/BUILD_NUMBER/HARBOR_PROJECT`
- `make push` 只负责把已有 tag 的镜像推送到仓库,不依赖 `BUILD_NUMBER`
- `make ansible-*` 主要依赖 `ENV` 选择 inventory;同时会把 `IMAGE_TAG`(必传,默认 `latest`)与 `HARBOR_PROJECT`(可选,镜像仓库前缀,如 `harbor.csst.nao:10443/csst/`)作为 Ansible extra vars 传入,用于决定 docker compose 使用的镜像 tag/前缀。
- `make pull` 只负责从 `required-images.txt` 拉取第三方镜像,不依赖 `BUILD_NUMBER/HARBOR_PROJECT`
- `make push` 会把镜像推送到仓库,镜像 tag 使用 `BUILD_NUMBER`(默认 `latest`
- `make ansible-*` 主要依赖 `ENV` 选择 inventory;同时会把 `BUILD_NUMBER`(镜像 tag,默认 `latest`)与 `HARBOR_PROJECT`(可选,镜像仓库前缀,如 `harbor.csst.nao:10443/csst/`)作为 Ansible extra vars 传入,用于决定 docker compose 使用的镜像 tag/前缀。

底层执行的命令形式为:

@@ -96,7 +104,7 @@ ansible-playbook \
  -i deploy_configs/<env>/inventory.ini \
  ansible/<playbook>.yml \
  -e env=<env> \
  -e image_tag=<image_tag> \
  -e build_number=<build_number> \
  [-e harbor_project=<harbor_project_prefix>]
```

@@ -136,7 +144,7 @@ ansible-playbook -i deploy_configs/${ENV}/inventory.ini ansible/update.yml -e en

2) `deploy_configs/<env>/inventory.ini`(必需)
- 定义部署拓扑(master/worker)、SSH 连接与关键变量(如 `deploy_dir``registry_pull``harbor_registry``extra_hosts``jwt_secret`)。`worker` 组支持按主机单独设置 `worker_concurrency`,Ansible 在启动各 worker 时会把该值映射到容器内并发配置。
- 镜像 tag/仓库前缀默认由执行端的 `IMAGE_TAG/HARBOR_PROJECT` 传入(见上文);如需固化到环境配置,也可以在 inventory 的 `[all:vars]` 中设置 `image_tag/harbor_project` 覆盖。
- 镜像 tag/仓库前缀默认由执行端的 `BUILD_NUMBER/HARBOR_PROJECT` 传入(见上文);如需固化到环境配置,也可以在 inventory 的 `[all:vars]` 中设置 `build_number/harbor_project` 覆盖。

3) `deploy_configs/<env>/variables.toml`(可选,但推荐)
- `runtime`:唯一的共享运行时环境分组。部署时会同时导入 Airflow Variables(键名固定为 `runtime`)并渲染为 `deploy_configs/<env>/gateway.env`,分别供 DAG 任务执行阶段与 API Gateway 启动阶段使用。
@@ -195,7 +203,6 @@ TeamCity 中推荐直接调用 `make`(仓库根目录的 `Makefile` 会转发
set -e

export ENV=p368
export IMAGE_TAG=test
export BUILD_NUMBER=100000
export HARBOR_PROJECT=harbor.csst.nao:10443/csst/

+9 −10
Original line number Diff line number Diff line

# 镜像版本和构建相关
IMAGE_TAG ?= $(if $(strip $(BUILD_NUMBER)),$(BUILD_NUMBER),latest)
BUILD_NUMBER ?= $(IMAGE_TAG)
BUILD_NUMBER ?= latest
HARBOR_PROJECT ?= 
SKIP_JS9 ?= 1

@@ -9,17 +8,17 @@ SKIP_JS9 ?= 1
REQ_FILE := required-images.txt

# 业务自定义镜像
TARGET_AIRFLOW := $(HARBOR_PROJECT)csst-airflow:$(IMAGE_TAG)
TARGET_API_GATEWAY := $(HARBOR_PROJECT)csst-airflow-api-gateway:$(IMAGE_TAG)
TARGET_TASK_PORTAL := $(HARBOR_PROJECT)csst-airflow-task-portal:$(IMAGE_TAG)
TARGET_JS9 := $(HARBOR_PROJECT)csst-airflow-js9:$(IMAGE_TAG)
TARGET_AIRFLOW := $(HARBOR_PROJECT)csst-airflow:$(BUILD_NUMBER)
TARGET_API_GATEWAY := $(HARBOR_PROJECT)csst-airflow-api-gateway:$(BUILD_NUMBER)
TARGET_TASK_PORTAL := $(HARBOR_PROJECT)csst-airflow-task-portal:$(BUILD_NUMBER)
TARGET_JS9 := $(HARBOR_PROJECT)csst-airflow-js9:$(BUILD_NUMBER)

CUSTOM_IMAGE_COUNT := 4
ifeq ($(strip $(SKIP_JS9)),1)
CUSTOM_IMAGE_COUNT := 3
endif

ANSIBLE_EXTRA_VARS := -e env=$(ENV) -e image_tag=$(IMAGE_TAG)
ANSIBLE_EXTRA_VARS := -e env=$(ENV) -e build_number=$(BUILD_NUMBER)
ifneq ($(strip $(HARBOR_PROJECT)),)
ANSIBLE_EXTRA_VARS += -e harbor_project=$(HARBOR_PROJECT)
endif
@@ -67,7 +66,7 @@ build:
	for img in $$(grep -v '^#' $(REQ_FILE) | grep -v '^$$'); do \
		basename="$${img##*/}"; \
		name="$${basename%%:*}"; \
		target="$(HARBOR_PROJECT)$${name}:$(IMAGE_TAG)"; \
		target="$(HARBOR_PROJECT)$${name}:$(BUILD_NUMBER)"; \
		if docker image inspect $${img} > /dev/null 2>&1; then \
			echo "[$${count}/$${total_imgs}] Processing $${img} -> $${target} (Skipping pull, already exists)..."; \
		else \
@@ -115,7 +114,7 @@ push:
	for img in $$(grep -v '^#' $(REQ_FILE) | grep -v '^$$'); do \
		basename="$${img##*/}"; \
		name="$${basename%%:*}"; \
		target="$(HARBOR_PROJECT)$${name}:$(IMAGE_TAG)"; \
		target="$(HARBOR_PROJECT)$${name}:$(BUILD_NUMBER)"; \
		echo "[$${count}/$${total_imgs}] Pushing $${target}..."; \
		docker push $${target}; \
		count=$$((count+1)); \
@@ -126,7 +125,7 @@ push:
	if [ "$(SKIP_JS9)" != "1" ]; then \
		echo "[$$(($$total+4))/$${total_imgs}] Pushing $(TARGET_JS9)..." && docker push $(TARGET_JS9); \
	fi; \
	echo "All $${total_imgs} images pushed successfully to $(HARBOR_PROJECT) with tag $(IMAGE_TAG)."
	echo "All $${total_imgs} images pushed successfully to $(HARBOR_PROJECT) with tag $(BUILD_NUMBER)."

all: clean pull build push

+9 −6
Original line number Diff line number Diff line
@@ -78,6 +78,7 @@
    _extra_hosts_list: "{{ (extra_hosts | default('') ).split(',') | map('trim') | reject('equalto','') | list }}"
    _harbor_api_username: "{{ lookup('env', 'HARBOR_USERNAME') | default('', true) }}"
    _harbor_api_password: "{{ lookup('env', 'HARBOR_PASSWORD') | default('', true) }}"
    _build_number: "{{ build_number | default('latest') }}"
  tasks:
    - name: Ensure deploy_configs directory exists
      file:
@@ -136,8 +137,7 @@
    - name: Build task-portal image (optional)
      shell: |
        export HARBOR_PROJECT="{{ harbor_project | default('') }}"
        export IMAGE_TAG="{{ image_tag | default('latest') }}"
        export BUILD_NUMBER="{{ build_number | default(image_tag | default('dev')) }}"
        export BUILD_NUMBER="{{ _build_number }}"
        export BUILD_TIME="{{ build_time | default(ansible_facts['date_time']['iso8601']) }}"
        export MASTER_IP="{{ hostvars[groups['master'][0]]['ansible_host'] | default('127.0.0.1') }}"
        export JWT_SECRET="{{ jwt_secret | default('') }}"
@@ -151,8 +151,7 @@
    - name: Build api-gateway image (optional)
      shell: |
        export HARBOR_PROJECT="{{ harbor_project | default('') }}"
        export IMAGE_TAG="{{ image_tag | default('latest') }}"
        export BUILD_NUMBER="{{ build_number | default(image_tag | default('dev')) }}"
        export BUILD_NUMBER="{{ _build_number }}"
        export BUILD_TIME="{{ build_time | default(ansible_facts['date_time']['iso8601']) }}"
        export MASTER_IP="{{ hostvars[groups['master'][0]]['ansible_host'] | default('127.0.0.1') }}"
        export JWT_SECRET="{{ jwt_secret | default('') }}"
@@ -166,7 +165,7 @@
    - name: Start Master services (postgres, redis, elasticsearch, airflow core, api, etc.)
      shell: |
        export HARBOR_PROJECT="{{ harbor_project | default('') }}"
        export IMAGE_TAG="{{ image_tag | default('latest') }}"
        export BUILD_NUMBER="{{ _build_number }}"
        export MASTER_IP="{{ hostvars[groups['master'][0]]['ansible_host'] | default('127.0.0.1') }}"
        export JWT_SECRET="{{ jwt_secret | default('eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhaXJmbG93IiwiaWF0IjoxNzU1NDQ3NjMxLCJleHAiOjE3ODY5ODM2MzF9.CbxQayEt370iHhvYXhHMESsk1IWmi8QLMOcctIlbicXhybNtBbfboDUdUDMClwvkSuTjC0AOeSHL23pGyy0plQ') }}"
        export ENV="{{ _env }}"
@@ -214,6 +213,7 @@
    _env: "{{ env | default('p368') }}"
    _deploy_dir: "{{ deploy_dir | default('/opt/csst-airflow') }}"
    _extra_hosts_list: "{{ (extra_hosts | default('') ).split(',') | map('trim') | reject('equalto','') | list }}"
    _build_number: "{{ build_number | default('latest') }}"
  tasks:
    - name: Ensure deploy_configs directory exists
      file:
@@ -253,7 +253,7 @@
    - name: Start Worker services (celery-worker, filebeat, monitoring)
      shell: |
        export HARBOR_PROJECT="{{ harbor_project | default('') }}"
        export IMAGE_TAG="{{ image_tag | default('latest') }}"
        export BUILD_NUMBER="{{ _build_number }}"
        export MASTER_IP="{{ hostvars[groups['master'][0]]['ansible_host'] | default('127.0.0.1') }}"
        export JWT_SECRET="{{ jwt_secret | default('eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhaXJmbG93IiwiaWF0IjoxNzU1NDQ3NjMxLCJleHAiOjE3ODY5ODM2MzF9.CbxQayEt370iHhvYXhHMESsk1IWmi8QLMOcctIlbicXhybNtBbfboDUdUDMClwvkSuTjC0AOeSHL23pGyy0plQ') }}"
        export ENV="{{ _env }}"
@@ -276,9 +276,12 @@
    _env: "{{ env | default('p368') }}"
    _deploy_dir: "{{ deploy_dir | default('/opt/csst-airflow') }}"
    _extra_hosts_list: "{{ (extra_hosts | default('') ).split(',') | map('trim') | reject('equalto','') | list }}"
    _build_number: "{{ build_number | default('latest') }}"
  tasks:
    - name: Restart Flower and API Gateway to ensure they detect new workers
      shell: |
        export HARBOR_PROJECT="{{ harbor_project | default('') }}"
        export BUILD_NUMBER="{{ _build_number }}"
        export ENV="{{ _env }}"

        COMPOSE_FILES="-f docker-compose.yaml"
+4 −2
Original line number Diff line number Diff line
@@ -23,11 +23,12 @@
  vars:
    _env: "{{ env | default('p368') }}"
    _deploy_dir: "{{ deploy_dir | default('/opt/csst-airflow') }}"
    _build_number: "{{ build_number | default('latest') }}"
  tasks:
    - name: Shutdown Master services
      shell: |
        export HARBOR_PROJECT="{{ harbor_project | default('') }}"
        export IMAGE_TAG="{{ image_tag | default('latest') }}"
        export BUILD_NUMBER="{{ _build_number }}"
        export MASTER_IP="{{ hostvars[groups['master'][0]]['ansible_host'] | default('127.0.0.1') }}"
        export JWT_SECRET="{{ jwt_secret | default('eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhaXJmbG93IiwiaWF0IjoxNzU1NDQ3NjMxLCJleHAiOjE3ODY5ODM2MzF9.CbxQayEt370iHhvYXhHMESsk1IWmi8QLMOcctIlbicXhybNtBbfboDUdUDMClwvkSuTjC0AOeSHL23pGyy0plQ') }}"
        {{ docker_compose_cmd }} --env-file deploy_configs/airflow.env --profile master down
@@ -40,11 +41,12 @@
  vars:
    _env: "{{ env | default('p368') }}"
    _deploy_dir: "{{ deploy_dir | default('/opt/csst-airflow') }}"
    _build_number: "{{ build_number | default('latest') }}"
  tasks:
    - name: Shutdown Worker services
      shell: |
        export HARBOR_PROJECT="{{ harbor_project | default('') }}"
        export IMAGE_TAG="{{ image_tag | default('latest') }}"
        export BUILD_NUMBER="{{ _build_number }}"
        export MASTER_IP="{{ hostvars[groups['master'][0]]['ansible_host'] | default('127.0.0.1') }}"
        export JWT_SECRET="{{ jwt_secret | default('eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhaXJmbG93IiwiaWF0IjoxNzU1NDQ3NjMxLCJleHAiOjE3ODY5ODM2MzF9.CbxQayEt370iHhvYXhHMESsk1IWmi8QLMOcctIlbicXhybNtBbfboDUdUDMClwvkSuTjC0AOeSHL23pGyy0plQ') }}"
        {{ docker_compose_cmd }} --env-file deploy_configs/airflow.env --profile worker down
Loading