Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
0d31a1e
feat(provider): add s3compatsigv4 provider for S3 signature V4
tishin-endou Feb 9, 2026
2ee32c4
feat(s3compatsigv4): update IdP selector, add institution storage tes…
tishin-endou Feb 18, 2026
5f3dced
feat(s3compatsigv4): update IdP selector, add institution storage tes…
tishin-endou Feb 18, 2026
82910fe
feat(ci): add WaterButler branch specification support for E2E tests
tishin-endou Feb 18, 2026
113acc1
fix(notebook): エラーになるセルを修正しoutputをクリア
tishin-endou Feb 20, 2026
1096c00
feat(ci): S3CompatSigV4 E2Eテストの CI自動実行を追加
tishin-endou Feb 25, 2026
e158652
fix(ci): S3CompatSigV4機関ストレージ用MinIOバケット作成の重複エラーを修正
tishin-endou Feb 25, 2026
9d5186f
fix(notebook): パラメータセルのSyntaxErrorを修正
tishin-endou Feb 25, 2026
2b93333
fix(notebook): ファイル詳細ページの確認方法を修正しoutputをクリア
tishin-endou Feb 26, 2026
7520af4
fix(notebook): CI環境対応(サイドメニュー/ログイン/ログアウトのロケータ修正)
tishin-endou Feb 26, 2026
cdd3b0e
fix(notebook): 機関ストレージページへ直接URL遷移に変更、ロケータを言語非依存に修正
tishin-endou Feb 26, 2026
8a1f419
debug(notebook): 機関ストレージページのデバッグ出力を追加
tishin-endou Feb 27, 2026
ab070f6
debug(notebook): エラーメッセージにページ情報を含めるデバッグ出力を追加
tishin-endou Feb 27, 2026
13d9261
fix(ci): 機関ストレージテストに機関管理者アカウントを使用するよう修正
tishin-endou Feb 27, 2026
77cae41
fix(notebook): Saveボタンロケータを柔軟にし、確認ダイアログのデバッグ情報を追加
tishin-endou Feb 27, 2026
c0e545b
fix: scope select_option locator to target storage to avoid conflicts…
anqiuy Mar 1, 2026
7acb8f4
Merge pull request #1 from anqiuy/resolve-id-conflict
tishin-endou Mar 1, 2026
8502720
fix(notebook): S3CompatSigV4追加時のstrict mode violationを修正
tishin-endou Mar 2, 2026
c0fe8b7
fix(notebook): 機関ストレージSaveボタンのロケータを.firstに修正
tishin-endou Mar 2, 2026
551ca78
debug(notebook): 機関ストレージSaveボタンのデバッグ情報を強化
tishin-endou Mar 2, 2026
4c715be
chore(notebook): Jupyter保存時のフォーマット変更を反映
tishin-endou Mar 2, 2026
b5484ef
fix(notebook): デバッグ用page.evaluateのJS構文エラーを修正
tishin-endou Mar 3, 2026
22fa688
revert(notebook): BinderHub・アドオン利用制御のフォーマット変更をrevert
tishin-endou Mar 3, 2026
01c0993
fix(notebook): 機関ストレージSave後の確認ダイアログ有無の両方に対応
tishin-endou Mar 3, 2026
66eb7aa
debug(notebook): Save後のページ遷移を待機し、リロード後の状態を詳細出力
tishin-endou Mar 3, 2026
38b8d04
fix(notebook): Save前にstorage_nameを入力しcheckValidity()を通過させる
tishin-endou Mar 3, 2026
58e8cc1
fix(notebook): .or_()のstrict mode違反を回避し、checkValidityデバッグを追加
tishin-endou Mar 3, 2026
a5d3d3e
fix(notebook): 同意ボタンとサインインボタンのstrict mode違反を修正
tishin-endou Mar 3, 2026
bb225a4
fix(notebook): ストレージ名のハードコード"NII Storage"をパラメータ変数に変更
tishin-endou Mar 3, 2026
ea303d2
fix(run_tests): S3CompatSigV4テストで1500ファイルチェックをスキップ
tishin-endou Mar 4, 2026
819dc89
ci: WaterButler修正後の再テスト
tishin-endou Mar 4, 2026
5f695cb
ci: WaterButler _delete_folder修正後の再テスト
tishin-endou Mar 4, 2026
3505650
ci: WaterButler moveメソッドオーバーライド後の再テスト
tishin-endou Mar 4, 2026
b54ce6c
ci: 新規CIラン実行(S3バケットクリーン状態でテスト)
tishin-endou Mar 4, 2026
8dc9310
ci: CIラン再トリガー
tishin-endou Mar 4, 2026
5ef171f
ci: WaterButler _delete_folder修正後の再テスト
tishin-endou Mar 5, 2026
ff75f6d
ci: 再テスト
tishin-endou Mar 5, 2026
aed401f
ci: WaterButlerデバッグログ追加後の再テスト
tishin-endou Mar 5, 2026
296049f
ci: WaterButler VersionId='null'修正後の再テスト
tishin-endou Mar 6, 2026
9e7eb42
ci: ListObjectVersions URLデコード修正後の再テスト
tishin-endou Mar 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 50 additions & 1 deletion .github/scripts/generate_ci_config.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ set -xeuo pipefail

if [[ $# -lt 2 ]]; then
cat >&2 <<'USAGE'
Usage: generate_ci_config.sh <output_path> <base_config_yaml> [--minio] [--jupyterhub] [--weko] [--flowable]
Usage: generate_ci_config.sh <output_path> <base_config_yaml> [--minio] [--jupyterhub] [--weko] [--flowable] [--s3compatsigv4] [--s3compatsigv4-inst]
USAGE
exit 1
fi
Expand All @@ -15,6 +15,8 @@ MINIO=false
JUPYTERHUB=false
WEKO=false
FLOWABLE=false
S3COMPATSIGV4=false
S3COMPATSIGV4_INST=false

for arg in "$@"; do
case "$arg" in
Expand All @@ -30,6 +32,12 @@ for arg in "$@"; do
--flowable)
FLOWABLE=true
;;
--s3compatsigv4)
S3COMPATSIGV4=true
;;
--s3compatsigv4-inst)
S3COMPATSIGV4_INST=true
;;
*)
echo "Unknown argument: ${arg}" >&2
exit 1
Expand Down Expand Up @@ -139,4 +147,45 @@ workflow_enabled: false
EOF
fi

if [[ "${S3COMPATSIGV4}" == "true" ]]; then
if [[ -z "${S3COMPATSIGV4_ACCESS_KEY_1:-}" || -z "${S3COMPATSIGV4_SECRET_KEY_1:-}" ]]; then
echo "S3 compat sigv4 credentials are not set" >&2
exit 1
fi

cat >> "${OUTPUT}" <<EOF

s3compatsigv4_enabled: true

s3compatsigv4_access_key_1: '${S3COMPATSIGV4_ACCESS_KEY_1}'
s3compatsigv4_secret_access_key_1: '${S3COMPATSIGV4_SECRET_KEY_1}'
s3compatsigv4_endpoint_1: '${S3COMPATSIGV4_ENDPOINT}'
s3compatsigv4_test_bucket_name_1: '${S3COMPATSIGV4_BUCKET_NAME_1}'

s3compatsigv4_access_key_2: '${S3COMPATSIGV4_ACCESS_KEY_2}'
s3compatsigv4_secret_access_key_2: '${S3COMPATSIGV4_SECRET_KEY_2}'
s3compatsigv4_endpoint_2: '${S3COMPATSIGV4_ENDPOINT}'
s3compatsigv4_test_bucket_name_2: '${S3COMPATSIGV4_BUCKET_NAME_2}'

s3compatsigv4_type_name_1: '${S3COMPATSIGV4_SERVICE_NAME}'
s3compatsigv4_type_name_2: '${S3COMPATSIGV4_SERVICE_NAME}'
EOF
fi

if [[ "${S3COMPATSIGV4_INST}" == "true" ]]; then
if [[ -z "${S3COMPATSIGV4_INST_ACCESS_KEY:-}" || -z "${S3COMPATSIGV4_INST_SECRET_KEY:-}" ]]; then
echo "S3 compat sigv4 institutional storage credentials are not set" >&2
exit 1
fi

cat >> "${OUTPUT}" <<EOF

s3compatsigv4_institutional_storage_enabled: true
s3compatsigv4_inst_endpoint_url: '${S3COMPATSIGV4_INST_ENDPOINT}'
s3compatsigv4_inst_access_key: '${S3COMPATSIGV4_INST_ACCESS_KEY}'
s3compatsigv4_inst_secret_key: '${S3COMPATSIGV4_INST_SECRET_KEY}'
s3compatsigv4_inst_bucket: '${S3COMPATSIGV4_INST_BUCKET}'
EOF
fi

cat "${OUTPUT}"
46 changes: 46 additions & 0 deletions .github/scripts/setup_minio.sh
Original file line number Diff line number Diff line change
Expand Up @@ -109,4 +109,50 @@ PY

mv "${tmp_json}" "${settings_json}"

# Also register MinIO service for s3compatsigv4 addon if available
sigv4_settings_json="${RDM_ROOT}/addons/s3compatsigv4/static/settings.json"

if [[ -f "${sigv4_settings_json}" ]]; then
tmp_json_sigv4=$(mktemp)

python - "$sigv4_settings_json" "$tmp_json_sigv4" <<'PY'
import json
import sys

src, dst = sys.argv[1:3]
with open(src) as f:
data = json.load(f)

service_name = "MinIO (CI)"
host = "minio:9000"

available_services = data.setdefault("availableServices", [])

if not any(s.get("name") == service_name for s in available_services):
available_services.append({
"name": service_name,
"host": host,
"bucketLocations": {
"us-east-1": {
"name": "us-east-1",
"host": host,
},
"": {
"name": "us-east-1",
},
},
"serverSideEncryption": False,
})

with open(dst, "w") as f:
json.dump(data, f, ensure_ascii=False, indent=4)
f.write("\n")
PY

mv "${tmp_json_sigv4}" "${sigv4_settings_json}"
echo "MinIO configuration applied for s3compatsigv4"
else
echo "WARNING: s3compatsigv4 settings.json not found: ${sigv4_settings_json} (skipping)"
fi

echo "MinIO configuration applied"
153 changes: 149 additions & 4 deletions .github/workflows/e2e-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,14 @@ on:
description: 'Custom WaterButler image (default: niicloudoperation/rdm-waterbutler:latest)'
required: false
default: ''
wb_repository:
description: 'RDM-waterbutler repository (default: RCOSDP/RDM-waterbutler)'
required: false
default: ''
wb_branch:
description: 'RDM-waterbutler branch to build and test against'
required: false
default: ''
tljh_version:
description: 'TLJH version (default: 1.0.0)'
required: false
Expand Down Expand Up @@ -150,6 +158,20 @@ jobs:
skip_login: true
skip_130mb_upload: true
minio_enabled: true
s3compatsigv4_enabled: true
weko_enabled: false
jupyterhub_enabled: false
flowable_enabled: false
- name: admin-minio
display_name: "Admin Tests (MinIO)"
include_admin: true
skip_admin: true
skip_metadata: true
skip_default_storage: true
skip_login: true
skip_130mb_upload: true
minio_enabled: true
s3compatsigv4_institutional_storage: true
weko_enabled: false
jupyterhub_enabled: false
flowable_enabled: false
Expand Down Expand Up @@ -193,6 +215,8 @@ jobs:
name: E2E ${{ matrix.test-group.display_name }}
env:
MINIO_ENABLED: ${{ matrix.test-group.minio_enabled == true && 'true' || 'false' }}
S3COMPATSIGV4_ENABLED: ${{ matrix.test-group.s3compatsigv4_enabled == true && 'true' || 'false' }}
S3COMPATSIGV4_INST_ENABLED: ${{ matrix.test-group.s3compatsigv4_institutional_storage == true && 'true' || 'false' }}
WEKO_ENABLED: ${{ matrix.test-group.weko_enabled == true && 'true' || 'false' }}
JUPYTERHUB_ENABLED: ${{ matrix.test-group.jupyterhub_enabled == true && 'true' || 'false' }}
FLOWABLE_ENABLED: ${{ matrix.test-group.flowable_enabled == true && 'true' || 'false' }}
Expand Down Expand Up @@ -583,6 +607,46 @@ jobs:
export INCLUDE_ADMIN=${{ matrix.test-group.include_admin }}
setup_config_files

- name: Parse PR body and workflow parameters
run: |
if [[ "${{ github.event_name }}" == "pull_request" ]]; then
cat > /tmp/pr_body.txt << 'EOF'
${{ github.event.pull_request.body }}
EOF
echo "WB_CUSTOM_REPO=$(grep -oP '^-\s*WB_REPOSITORY:\s*\K.*$' /tmp/pr_body.txt | head -1 | tr -d ' \r' || true)" >> $GITHUB_ENV
echo "WB_CUSTOM_BRANCH=$(grep -oP '^-\s*WB_BRANCH:\s*\K.*$' /tmp/pr_body.txt | head -1 | tr -d ' \r' || true)" >> $GITHUB_ENV
else
echo "WB_CUSTOM_REPO=${{ github.event.inputs.wb_repository }}" >> $GITHUB_ENV
echo "WB_CUSTOM_BRANCH=${{ github.event.inputs.wb_branch }}" >> $GITHUB_ENV
fi

- name: Build custom WaterButler image
if: env.WB_CUSTOM_BRANCH != ''
run: |
WB_REPO="${WB_CUSTOM_REPO:-RCOSDP/RDM-waterbutler}"
WB_BRANCH="${WB_CUSTOM_BRANCH}"
WB_BASE_BRANCH="develop"

echo "Building custom WaterButler image from ${WB_REPO}@${WB_BRANCH}"

# Clone base branch
git clone --depth=50 -b "$WB_BASE_BRANCH" "https://github.com/${WB_REPO}.git" RDM-waterbutler
cd RDM-waterbutler

# Merge custom branch
git fetch origin "$WB_BRANCH"
git config user.name "github-actions[bot]"
git config user.email "RDM-e2e-test-nb@example.com"
git merge --no-ff FETCH_HEAD -m "Merge ${WB_BRANCH} for E2E tests"

# Build Docker image
docker build -t rdm-waterbutler:custom .
cd ..

# Override WB_IMAGE for subsequent steps
echo "WB_IMAGE=rdm-waterbutler:custom" >> $GITHUB_ENV
echo "Custom WaterButler image built successfully"

- name: Create docker-compose override for NII Cloud Operation images
working-directory: RDM-osf.io
run: |
Expand Down Expand Up @@ -612,22 +676,31 @@ jobs:
echo "TLJH_PLUGIN_OVERRIDE=$TLJH_PLUGIN_OVERRIDE" >> $GITHUB_ENV
echo "TLJH_REPO2DOCKER_IMAGE_OVERRIDE=$TLJH_REPO2DOCKER_IMAGE_OVERRIDE" >> $GITHUB_ENV
echo "TLJH_RDMFS_IMAGE_OVERRIDE=$TLJH_RDMFS_IMAGE_OVERRIDE" >> $GITHUB_ENV

# Use overrides if found, otherwise defaults
# If WB_IMAGE was set by "Build custom WaterButler image" step, use it
export OSF_IMAGE="${OSF_OVERRIDE:-niicloudoperation/rdm-osf.io:latest}"
export EMBER_IMAGE="${EMBER_OVERRIDE:-niicloudoperation/rdm-ember-osf-web:latest}"
export CAS_IMAGE="${CAS_OVERRIDE:-niicloudoperation/rdm-cas-overlay:latest}"
export MFR_IMAGE="${MFR_OVERRIDE:-niicloudoperation/rdm-modular-file-renderer:latest}"
export WB_IMAGE="${WB_OVERRIDE:-niicloudoperation/rdm-waterbutler:latest}"
if [[ -n "$WB_IMAGE" ]]; then
export WB_IMAGE
else
export WB_IMAGE="${WB_OVERRIDE:-niicloudoperation/rdm-waterbutler:latest}"
fi
else
# Use workflow dispatch inputs or defaults
export OSF_IMAGE="${{ github.event.inputs.osf_image || 'niicloudoperation/rdm-osf.io:latest' }}"
export EMBER_IMAGE="${{ github.event.inputs.ember_image || 'niicloudoperation/rdm-ember-osf-web:latest' }}"
export CAS_IMAGE="${{ github.event.inputs.cas_image || 'niicloudoperation/rdm-cas-overlay:latest' }}"
export MFR_IMAGE="${{ github.event.inputs.mfr_image || 'niicloudoperation/rdm-modular-file-renderer:latest' }}"
export WB_IMAGE="${{ github.event.inputs.wb_image || 'niicloudoperation/rdm-waterbutler:latest' }}"
if [[ -n "$WB_IMAGE" ]]; then
export WB_IMAGE
else
export WB_IMAGE="${{ github.event.inputs.wb_image || 'niicloudoperation/rdm-waterbutler:latest' }}"
fi
fi

source ${{ github.workspace }}/e2e-tests/.github/scripts/setup_rdm.sh
create_docker_override

Expand Down Expand Up @@ -730,6 +803,72 @@ jobs:
echo "S3COMPAT_ENDPOINT=${MINIO_ENDPOINT}" >> $GITHUB_ENV
echo "S3COMPAT_SERVICE_NAME=${MINIO_SERVICE_NAME}" >> $GITHUB_ENV

- name: Initialize MinIO for S3CompatSigV4 tests
if: env.MINIO_ENABLED == 'true' && (env.S3COMPATSIGV4_ENABLED == 'true' || env.S3COMPATSIGV4_INST_ENABLED == 'true')
working-directory: e2e-tests
run: |
set -eu

key_part() {
LC_ALL=C tr -dc 'a-z0-9' < /dev/urandom | head -c 18
}

secret_part() {
LC_ALL=C tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 40
}

BUCKET_PREFIX="ci-${GITHUB_RUN_ID:-0}-${GITHUB_RUN_ATTEMPT:-0}-sigv4"

if [ "${S3COMPATSIGV4_ENABLED}" = "true" ]; then
ACCESS_KEY_1="ci$(key_part)"
SECRET_KEY_1="$(secret_part)"
ACCESS_KEY_2="ci$(key_part)"
SECRET_KEY_2="$(secret_part)"

BUCKET_NAME_1="${BUCKET_PREFIX}-a"
BUCKET_NAME_2="${BUCKET_PREFIX}-b"

.github/scripts/setup_minio_buckets.sh \
../RDM-osf.io \
"${MINIO_ALIAS}" \
"${MINIO_ENDPOINT}" \
"${MINIO_ROOT_USER}" \
"${MINIO_ROOT_PASSWORD}" \
"${ACCESS_KEY_1}" "${SECRET_KEY_1}" "${BUCKET_NAME_1}" \
"${ACCESS_KEY_2}" "${SECRET_KEY_2}" "${BUCKET_NAME_2}"

echo "S3COMPATSIGV4_ACCESS_KEY_1=${ACCESS_KEY_1}" >> $GITHUB_ENV
echo "S3COMPATSIGV4_SECRET_KEY_1=${SECRET_KEY_1}" >> $GITHUB_ENV
echo "S3COMPATSIGV4_ACCESS_KEY_2=${ACCESS_KEY_2}" >> $GITHUB_ENV
echo "S3COMPATSIGV4_SECRET_KEY_2=${SECRET_KEY_2}" >> $GITHUB_ENV
echo "S3COMPATSIGV4_BUCKET_NAME_1=${BUCKET_NAME_1}" >> $GITHUB_ENV
echo "S3COMPATSIGV4_BUCKET_NAME_2=${BUCKET_NAME_2}" >> $GITHUB_ENV
echo "S3COMPATSIGV4_ENDPOINT=${MINIO_ENDPOINT}" >> $GITHUB_ENV
echo "S3COMPATSIGV4_SERVICE_NAME=${MINIO_SERVICE_NAME}" >> $GITHUB_ENV
fi

if [ "${S3COMPATSIGV4_INST_ENABLED}" = "true" ]; then
INST_ACCESS_KEY="ci$(key_part)"
INST_SECRET_KEY="$(secret_part)"
INST_BUCKET="${BUCKET_PREFIX}-inst"
# Second bucket is required by setup_minio_buckets.sh but not used for inst storage
INST_BUCKET_DUMMY="${BUCKET_PREFIX}-inst2"

.github/scripts/setup_minio_buckets.sh \
../RDM-osf.io \
"${MINIO_ALIAS}" \
"${MINIO_ENDPOINT}" \
"${MINIO_ROOT_USER}" \
"${MINIO_ROOT_PASSWORD}" \
"${INST_ACCESS_KEY}" "${INST_SECRET_KEY}" "${INST_BUCKET}" \
"${INST_ACCESS_KEY}" "${INST_SECRET_KEY}" "${INST_BUCKET_DUMMY}"

echo "S3COMPATSIGV4_INST_ACCESS_KEY=${INST_ACCESS_KEY}" >> $GITHUB_ENV
echo "S3COMPATSIGV4_INST_SECRET_KEY=${INST_SECRET_KEY}" >> $GITHUB_ENV
echo "S3COMPATSIGV4_INST_BUCKET=${INST_BUCKET}" >> $GITHUB_ENV
echo "S3COMPATSIGV4_INST_ENDPOINT=${MINIO_ENDPOINT}" >> $GITHUB_ENV
fi

- name: Start MinIO trace
if: env.MINIO_ENABLED == 'true'
working-directory: RDM-osf.io
Expand Down Expand Up @@ -948,6 +1087,12 @@ jobs:
if [ "${FLOWABLE_ENABLED}" = "true" ]; then
args+=(--flowable)
fi
if [ "${S3COMPATSIGV4_ENABLED}" = "true" ]; then
args+=(--s3compatsigv4)
fi
if [ "${S3COMPATSIGV4_INST_ENABLED}" = "true" ]; then
args+=(--s3compatsigv4-inst)
fi

.github/scripts/generate_ci_config.sh "${args[@]}"
rm base_ci.config.yaml
Expand Down
Loading
Loading