diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ca0defe..85be348 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -3,6 +3,10 @@ name: release on: workflow_dispatch: +concurrency: + group: interview-release + cancel-in-progress: false + permissions: contents: read @@ -74,39 +78,57 @@ jobs: with: persist-credentials: false + - name: Choose the next release version + id: version + run: | + latest_version="$(gh api --paginate "repos/${GITHUB_REPOSITORY}/tags?per_page=100" \ + --jq '.[].name' | sed -nE 's/^v([0-9]+)$/\1/p' | sort -n | tail -n 1)" + version="v$(( ${latest_version:-0} + 1 ))" + echo "version=${version}" >> "$GITHUB_OUTPUT" + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + shell: bash + - name: Build template, patch, and assembled assets - run: ./scripts/build-release-assets.sh release-assets + run: ./scripts/build-release-assets.sh release-assets "${{ steps.version.outputs.version }}" shell: bash - name: Create release and upload assets run: | - TAG="release-$(date +%Y%m%d-%H%M%S)" + TAG="${{ steps.version.outputs.version }}" NOTES_FILE="$(mktemp)" { echo "Auto-generated interview assets." echo - echo "- \`-template.zip\`: 面接前に事前共有されるテンプレートファイル" - echo "- \`.patch\`: 面接時に適用されるパッチファイル" - echo "- \`.zip\`: テンプレートにパッチが適用されたファイル(パッチ適用が難しい場合に利用)" + echo "- \`-template-${TAG}.zip\`: 面接前に事前共有されるテンプレートファイル" + echo "- \`-${TAG}.patch\`: 面接時に適用されるパッチファイル" + echo "- \`-${TAG}.zip\`: テンプレートにパッチが適用されたファイル(パッチ適用が難しい場合、過去形式の試験時利用)" + echo + echo "面接当日は、配布済みテンプレートの README.md に記載された release tag を確認し、" + echo "同じ tag の release から patch を取得して適用してください。" + echo "版は展開後の \`/TEMPLATE_VERSION\` でも確認できます。" echo echo "パッチの適用方法について:" echo echo "\`\`\`bash" - echo "curl -fsSL \"https://github.com/${GITHUB_REPOSITORY}/releases/download/${TAG}/.patch\" | patch -p1" + echo "curl -fsSL \"https://github.com/${GITHUB_REPOSITORY}/releases/download/${TAG}/-${TAG}.patch\" -o interview.patch" + echo "patch -p1 < interview.patch" + echo "rm interview.patch" echo "\`\`\`" echo echo "Windows PowerShell環境では、以下のコマンドを利用:" echo echo '```powershell' - echo "curl.exe -fsSL \"https://github.com/${GITHUB_REPOSITORY}/releases/download/${TAG}/.patch\" -o interview.patch" + echo "curl.exe -fsSL \"https://github.com/${GITHUB_REPOSITORY}/releases/download/${TAG}/-${TAG}.patch\" -o interview.patch" echo 'git apply interview.patch' echo 'Remove-Item interview.patch' echo '```' echo - echo "patch適用が難しい場合には、 \`.zip\` を利用すること" + echo "patch適用が難しい場合には、 \`-${TAG}.zip\` を利用すること" echo } > "$NOTES_FILE" gh release create "$TAG" \ + --target "$GITHUB_SHA" \ --title "Implementations $TAG" \ --notes-file "$NOTES_FILE" \ release-assets/* @@ -114,13 +136,20 @@ jobs: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} shell: bash - - name: Delete old releases + - name: Delete interview releases older than 100 days run: | - gh release list --limit 100 --json tagName,createdAt \ - --jq 'sort_by(.createdAt) | reverse | .[3:] | .[].tagName' \ - | while read -r tag; do + cutoff="$(date -u -d '100 days ago' +%Y-%m-%dT%H:%M:%SZ)" + gh api --paginate "repos/${GITHUB_REPOSITORY}/releases?per_page=100" \ + | jq -r --arg cutoff "$cutoff" ' + .[] + | select(.draft == false) + | select(.tag_name | test("^(v[0-9]+|release-[0-9]{8}-[0-9]{6})$")) + | select(.name == ("Implementations " + .tag_name)) + | select((.published_at // .created_at) < $cutoff) + | .tag_name + ' | while read -r tag; do echo "Deleting release: $tag" - gh release delete "$tag" --yes --cleanup-tag + gh release delete "$tag" --yes done env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/README.md b/README.md index 1d6bd79..0c7c9d6 100644 --- a/README.md +++ b/README.md @@ -34,27 +34,11 @@ cp -R golang "$work" Kick the [release action](https://github.com/folio-sec/wrap-api-example/actions/workflows/release.yml) manually, then release. -- `-template.zip` -- `.patch` -- `.zip` +Each release has a sequential tag (`v1`, `v2`, ...). Its assets are: -## On Interview - -- macOS / Linux / etc - -```sh -curl -fsSL "https://github.com/folio-sec/wrap-api-example/releases/download//.patch" | patch -p1 -``` - -Windows(PowerShell): - -```powershell -curl.exe -fsSL "https://github.com/folio-sec/wrap-api-example/releases/download//.patch" -o interview.patch -git apply interview.patch -Remove-Item interview.patch -``` - -Alternative, use full zip. +- `-template-vN.zip` — share this before the interview +- `-vN.patch` — apply this version's patch during the interview +- `-vN.zip` — completed alternative if applying the patch is difficult ### DCO Sign-Off Methods diff --git a/golang/README.md b/golang/README.md index 116eef3..231f490 100644 --- a/golang/README.md +++ b/golang/README.md @@ -15,4 +15,8 @@ go build ./... # テスト実行 go test ./... + +# 事前コマンド確認 +command -v curl +command -v patch ``` diff --git a/interview/shared/README.challenge.md b/interview/shared/README.challenge.md index baab6fb..63b23c4 100644 --- a/interview/shared/README.challenge.md +++ b/interview/shared/README.challenge.md @@ -33,10 +33,10 @@ - __リバランス注文__ - 運用されている資産を、サービスで保有する最適ポートフォリオに近づけるよう調整すること - 例: - - 新規注文時には、最適ポートフォリオが `Toyopa銘柄30% + Somy銘柄70%` で構成される場合、顧客口座においても同様の資産配分となる + - 新規注文時には、最適ポートフォリオが `Toyopa銘柄40% + Somy銘柄60%` で構成される場合、顧客口座においても同様の資産配分となる - その後にサービス上で最適ポートフォリオが `Toyopa銘柄50% + Somy銘柄50%` に更新される - 更新後に、リバランス注文を入れると、顧客の口座も最新の最適ポートフォリオ通りの内容になる - - この場合、Toyopa銘柄が20%分購入され、Somy銘柄が20%分売却される + - この場合、Toyopa銘柄が10%分購入され、Somy銘柄が10%分売却される ### 実装について diff --git a/java17/README.md b/java17/README.md index 069501f..5670907 100644 --- a/java17/README.md +++ b/java17/README.md @@ -16,6 +16,10 @@ git commit -m init # テスト実行 ./mvnw test + +# 事前コマンド確認 +command -v curl +command -v patch ``` **Windows (PowerShell):** @@ -30,4 +34,8 @@ git commit -m init # テスト実行 .\mvnw.cmd test + +# 事前コマンド確認 +Get-Command curl.exe -ErrorAction Stop +Get-Command git -ErrorAction Stop ``` diff --git a/java8/README.md b/java8/README.md index 6b21b38..5edfc8f 100644 --- a/java8/README.md +++ b/java8/README.md @@ -16,6 +16,10 @@ git commit -m init # テスト実行 ./mvnw test + +# 事前コマンド確認 +command -v curl +command -v patch ``` **Windows (PowerShell):** @@ -30,4 +34,8 @@ git commit -m init # テスト実行 .\mvnw.cmd test + +# 事前コマンド確認 +Get-Command curl.exe -ErrorAction Stop +Get-Command git -ErrorAction Stop ``` diff --git a/patches/golang.patch b/patches/golang.patch index 5f6d9ae..43730a8 100644 --- a/patches/golang.patch +++ b/patches/golang.patch @@ -1,10 +1,10 @@ diff --git a/README.md b/README.md -index 116eef3..30407de 100644 +index 231f490..a6aad80 100644 --- a/README.md +++ b/README.md -@@ -16,3 +16,67 @@ go build ./... - # テスト実行 - go test ./... +@@ -20,3 +20,67 @@ go test ./... + command -v curl + command -v patch ``` + +## サービス概要 @@ -42,10 +42,10 @@ index 116eef3..30407de 100644 + - __リバランス注文__ + - 運用されている資産を、サービスで保有する最適ポートフォリオに近づけるよう調整すること + - 例: -+ - 新規注文時には、最適ポートフォリオが `Toyopa銘柄30% + Somy銘柄70%` で構成される場合、顧客口座においても同様の資産配分となる ++ - 新規注文時には、最適ポートフォリオが `Toyopa銘柄40% + Somy銘柄60%` で構成される場合、顧客口座においても同様の資産配分となる + - その後にサービス上で最適ポートフォリオが `Toyopa銘柄50% + Somy銘柄50%` に更新される + - 更新後に、リバランス注文を入れると、顧客の口座も最新の最適ポートフォリオ通りの内容になる -+ - この場合、Toyopa銘柄が20%分購入され、Somy銘柄が20%分売却される ++ - この場合、Toyopa銘柄が10%分購入され、Somy銘柄が10%分売却される + +### 実装について + diff --git a/patches/java17.patch b/patches/java17.patch index 716e6ee..2b793a7 100644 --- a/patches/java17.patch +++ b/patches/java17.patch @@ -1,10 +1,10 @@ diff --git a/README.md b/README.md -index 069501f..f7094ca 100644 +index 5670907..295b972 100644 --- a/README.md +++ b/README.md -@@ -31,3 +31,67 @@ git commit -m init - # テスト実行 - .\mvnw.cmd test +@@ -39,3 +39,67 @@ git commit -m init + Get-Command curl.exe -ErrorAction Stop + Get-Command git -ErrorAction Stop ``` + +## サービス概要 @@ -42,10 +42,10 @@ index 069501f..f7094ca 100644 + - __リバランス注文__ + - 運用されている資産を、サービスで保有する最適ポートフォリオに近づけるよう調整すること + - 例: -+ - 新規注文時には、最適ポートフォリオが `Toyopa銘柄30% + Somy銘柄70%` で構成される場合、顧客口座においても同様の資産配分となる ++ - 新規注文時には、最適ポートフォリオが `Toyopa銘柄40% + Somy銘柄60%` で構成される場合、顧客口座においても同様の資産配分となる + - その後にサービス上で最適ポートフォリオが `Toyopa銘柄50% + Somy銘柄50%` に更新される + - 更新後に、リバランス注文を入れると、顧客の口座も最新の最適ポートフォリオ通りの内容になる -+ - この場合、Toyopa銘柄が20%分購入され、Somy銘柄が20%分売却される ++ - この場合、Toyopa銘柄が10%分購入され、Somy銘柄が10%分売却される + +### 実装について + diff --git a/patches/java8.patch b/patches/java8.patch index d9c4c10..b08e9e3 100644 --- a/patches/java8.patch +++ b/patches/java8.patch @@ -1,10 +1,10 @@ diff --git a/README.md b/README.md -index 6b21b38..d476d55 100644 +index 5edfc8f..672945e 100644 --- a/README.md +++ b/README.md -@@ -31,3 +31,67 @@ git commit -m init - # テスト実行 - .\mvnw.cmd test +@@ -39,3 +39,67 @@ git commit -m init + Get-Command curl.exe -ErrorAction Stop + Get-Command git -ErrorAction Stop ``` + +## サービス概要 @@ -42,10 +42,10 @@ index 6b21b38..d476d55 100644 + - __リバランス注文__ + - 運用されている資産を、サービスで保有する最適ポートフォリオに近づけるよう調整すること + - 例: -+ - 新規注文時には、最適ポートフォリオが `Toyopa銘柄30% + Somy銘柄70%` で構成される場合、顧客口座においても同様の資産配分となる ++ - 新規注文時には、最適ポートフォリオが `Toyopa銘柄40% + Somy銘柄60%` で構成される場合、顧客口座においても同様の資産配分となる + - その後にサービス上で最適ポートフォリオが `Toyopa銘柄50% + Somy銘柄50%` に更新される + - 更新後に、リバランス注文を入れると、顧客の口座も最新の最適ポートフォリオ通りの内容になる -+ - この場合、Toyopa銘柄が20%分購入され、Somy銘柄が20%分売却される ++ - この場合、Toyopa銘柄が10%分購入され、Somy銘柄が10%分売却される + +### 実装について + diff --git a/patches/php.patch b/patches/php.patch index b3bb945..8559533 100644 --- a/patches/php.patch +++ b/patches/php.patch @@ -2,9 +2,9 @@ diff --git a/README.md b/README.md index 815ecc2..d38e732 100644 --- a/README.md +++ b/README.md -@@ -32,3 +32,67 @@ composer install - # test - vendor\bin\phpunit +@@ -40,3 +40,67 @@ Get-Command git -ErrorAction Stop + Get-Command curl.exe -ErrorAction Stop + Get-Command git -ErrorAction Stop ``` + +## サービス概要 @@ -42,10 +42,10 @@ index 815ecc2..d38e732 100644 + - __リバランス注文__ + - 運用されている資産を、サービスで保有する最適ポートフォリオに近づけるよう調整すること + - 例: -+ - 新規注文時には、最適ポートフォリオが `Toyopa銘柄30% + Somy銘柄70%` で構成される場合、顧客口座においても同様の資産配分となる ++ - 新規注文時には、最適ポートフォリオが `Toyopa銘柄40% + Somy銘柄60%` で構成される場合、顧客口座においても同様の資産配分となる + - その後にサービス上で最適ポートフォリオが `Toyopa銘柄50% + Somy銘柄50%` に更新される + - 更新後に、リバランス注文を入れると、顧客の口座も最新の最適ポートフォリオ通りの内容になる -+ - この場合、Toyopa銘柄が20%分購入され、Somy銘柄が20%分売却される ++ - この場合、Toyopa銘柄が10%分購入され、Somy銘柄が10%分売却される + +### 実装について + diff --git a/patches/python.patch b/patches/python.patch index 256e8fd..c6367c9 100644 --- a/patches/python.patch +++ b/patches/python.patch @@ -2,9 +2,9 @@ diff --git b/README.md a/README.md index 7c3c595..6f0b529 100644 --- b/README.md +++ a/README.md -@@ -35,3 +35,67 @@ pip install -e ".[dev]" - # test - pytest -v +@@ -43,3 +43,67 @@ Get-Command git -ErrorAction Stop + Get-Command curl.exe -ErrorAction Stop + Get-Command git -ErrorAction Stop ``` + +## サービス概要 @@ -42,10 +42,10 @@ index 7c3c595..6f0b529 100644 + - __リバランス注文__ + - 運用されている資産を、サービスで保有する最適ポートフォリオに近づけるよう調整すること + - 例: -+ - 新規注文時には、最適ポートフォリオが `Toyopa銘柄30% + Somy銘柄70%` で構成される場合、顧客口座においても同様の資産配分となる ++ - 新規注文時には、最適ポートフォリオが `Toyopa銘柄40% + Somy銘柄60%` で構成される場合、顧客口座においても同様の資産配分となる + - その後にサービス上で最適ポートフォリオが `Toyopa銘柄50% + Somy銘柄50%` に更新される + - 更新後に、リバランス注文を入れると、顧客の口座も最新の最適ポートフォリオ通りの内容になる -+ - この場合、Toyopa銘柄が20%分購入され、Somy銘柄が20%分売却される ++ - この場合、Toyopa銘柄が10%分購入され、Somy銘柄が10%分売却される + +### 実装について + diff --git a/patches/ruby.patch b/patches/ruby.patch index 7c4d5c3..624f56a 100644 --- a/patches/ruby.patch +++ b/patches/ruby.patch @@ -2,9 +2,9 @@ diff --git a/README.md b/README.md index 8e16ff1..10f817c 100644 --- a/README.md +++ b/README.md -@@ -17,3 +17,67 @@ bundle install - # test - bundle exec rspec +@@ -21,3 +21,67 @@ command -v patch + command -v curl + command -v patch ``` + +## サービス概要 @@ -42,10 +42,10 @@ index 8e16ff1..10f817c 100644 + - __リバランス注文__ + - 運用されている資産を、サービスで保有する最適ポートフォリオに近づけるよう調整すること + - 例: -+ - 新規注文時には、最適ポートフォリオが `Toyopa銘柄30% + Somy銘柄70%` で構成される場合、顧客口座においても同様の資産配分となる ++ - 新規注文時には、最適ポートフォリオが `Toyopa銘柄40% + Somy銘柄60%` で構成される場合、顧客口座においても同様の資産配分となる + - その後にサービス上で最適ポートフォリオが `Toyopa銘柄50% + Somy銘柄50%` に更新される + - 更新後に、リバランス注文を入れると、顧客の口座も最新の最適ポートフォリオ通りの内容になる -+ - この場合、Toyopa銘柄が20%分購入され、Somy銘柄が20%分売却される ++ - この場合、Toyopa銘柄が10%分購入され、Somy銘柄が10%分売却される + +### 実装について + diff --git a/patches/scala.patch b/patches/scala.patch index 8661450..0b7a78a 100644 --- a/patches/scala.patch +++ b/patches/scala.patch @@ -2,9 +2,9 @@ diff --git a/README.md b/README.md index aac7fb7..c277f75 100644 --- a/README.md +++ b/README.md -@@ -12,3 +12,67 @@ sbt test:compile - # テスト実行 - sbt test +@@ -16,3 +16,67 @@ command -v patch + command -v curl + command -v patch ``` + +## サービス概要 @@ -42,10 +42,10 @@ index aac7fb7..c277f75 100644 + - __リバランス注文__ + - 運用されている資産を、サービスで保有する最適ポートフォリオに近づけるよう調整すること + - 例: -+ - 新規注文時には、最適ポートフォリオが `Toyopa銘柄30% + Somy銘柄70%` で構成される場合、顧客口座においても同様の資産配分となる ++ - 新規注文時には、最適ポートフォリオが `Toyopa銘柄40% + Somy銘柄60%` で構成される場合、顧客口座においても同様の資産配分となる + - その後にサービス上で最適ポートフォリオが `Toyopa銘柄50% + Somy銘柄50%` に更新される + - 更新後に、リバランス注文を入れると、顧客の口座も最新の最適ポートフォリオ通りの内容になる -+ - この場合、Toyopa銘柄が20%分購入され、Somy銘柄が20%分売却される ++ - この場合、Toyopa銘柄が10%分購入され、Somy銘柄が10%分売却される + +### 実装について + diff --git a/patches/typescript.patch b/patches/typescript.patch index 154e87d..258009e 100644 --- a/patches/typescript.patch +++ b/patches/typescript.patch @@ -2,9 +2,9 @@ diff --git a/README.md b/README.md index 8d989ff..883b92e 100644 --- a/README.md +++ b/README.md -@@ -16,3 +16,67 @@ npm ci - # テスト実行 - npm test +@@ -20,3 +20,67 @@ command -v patch + command -v curl + command -v patch ``` + +## サービス概要 @@ -42,10 +42,10 @@ index 8d989ff..883b92e 100644 + - __リバランス注文__ + - 運用されている資産を、サービスで保有する最適ポートフォリオに近づけるよう調整すること + - 例: -+ - 新規注文時には、最適ポートフォリオが `Toyopa銘柄30% + Somy銘柄70%` で構成される場合、顧客口座においても同様の資産配分となる ++ - 新規注文時には、最適ポートフォリオが `Toyopa銘柄40% + Somy銘柄60%` で構成される場合、顧客口座においても同様の資産配分となる + - その後にサービス上で最適ポートフォリオが `Toyopa銘柄50% + Somy銘柄50%` に更新される + - 更新後に、リバランス注文を入れると、顧客の口座も最新の最適ポートフォリオ通りの内容になる -+ - この場合、Toyopa銘柄が20%分購入され、Somy銘柄が20%分売却される ++ - この場合、Toyopa銘柄が10%分購入され、Somy銘柄が10%分売却される + +### 実装について + diff --git a/php/README.md b/php/README.md index 815ecc2..72f27b6 100644 --- a/php/README.md +++ b/php/README.md @@ -17,6 +17,10 @@ composer install # test vendor/bin/phpunit + +# 事前コマンド確認 +command -v curl +command -v patch ``` **Windows (PowerShell):** @@ -31,4 +35,8 @@ composer install # test vendor\bin\phpunit + +# 事前コマンド確認 +Get-Command curl.exe -ErrorAction Stop +Get-Command git -ErrorAction Stop ``` diff --git a/python/README.md b/python/README.md index 7c3c595..7079265 100644 --- a/python/README.md +++ b/python/README.md @@ -18,6 +18,10 @@ pip install -e ".[dev]" # test pytest -v + +# 事前コマンド確認 +command -v curl +command -v patch ``` **Windows (PowerShell):** @@ -34,4 +38,8 @@ pip install -e ".[dev]" # test pytest -v + +# 事前コマンド確認 +Get-Command curl.exe -ErrorAction Stop +Get-Command git -ErrorAction Stop ``` diff --git a/ruby/README.md b/ruby/README.md index 8e16ff1..c0e7b17 100644 --- a/ruby/README.md +++ b/ruby/README.md @@ -16,4 +16,8 @@ bundle install # test bundle exec rspec + +# 事前コマンド確認 +command -v curl +command -v patch ``` diff --git a/scala/README.md b/scala/README.md index aac7fb7..92a2861 100644 --- a/scala/README.md +++ b/scala/README.md @@ -11,4 +11,8 @@ sbt test:compile # テスト実行 sbt test + +# 事前コマンド確認 +command -v curl +command -v patch ``` diff --git a/scripts/build-release-assets.sh b/scripts/build-release-assets.sh index 00d8d09..f4a894c 100755 --- a/scripts/build-release-assets.sh +++ b/scripts/build-release-assets.sh @@ -2,11 +2,18 @@ set -euo pipefail -if [ "$#" -ne 1 ]; then - echo "usage: $0 " >&2 +if [ "$#" -lt 1 ] || [ "$#" -gt 2 ]; then + echo "usage: $0 [version]" >&2 exit 2 fi +version="${2:-}" +if [ -n "$version" ] && ! [[ "$version" =~ ^v[0-9]+$ ]]; then + echo "version must be in the form v1, v2, ..." >&2 + exit 2 +fi +version_suffix="${version:+-${version}}" + repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" output_directory="$1" @@ -41,11 +48,21 @@ for language in "${languages[@]}"; do "${repo_root}/scripts/verify-interview-patch.sh" \ "$language" "${template_parent}/${language}" + if [ -n "$version" ]; then + printf '%s\n' "$version" > "${template_parent}/${language}/TEMPLATE_VERSION" + + readme="${template_parent}/${language}/README.md" + readme_with_setup="${template_parent}/${language}/README.with-setup" + awk -v version="$version" 'NR == 1 { print $0 " `" version "`"; next } { print }' \ + "$readme" > "$readme_with_setup" + mv "$readme_with_setup" "$readme" + fi + cp -R "${template_parent}/${language}" "${assembled_parent}/${language}" - template_asset="${language}-template.zip" - assembled_asset="${language}.zip" - patch_asset="${language}.patch" + template_asset="${language}-template${version_suffix}.zip" + assembled_asset="${language}${version_suffix}.zip" + patch_asset="${language}${version_suffix}.patch" ( cd "$template_parent" diff --git a/typescript/README.md b/typescript/README.md index 8d989ff..c02ef7a 100644 --- a/typescript/README.md +++ b/typescript/README.md @@ -15,4 +15,8 @@ npm ci # テスト実行 npm test + +# 事前コマンド確認 +command -v curl +command -v patch ```