CMS 比賽平台管理與使用
文件
官方文件:https://cms.readthedocs.io/en/ 一份寫得不錯的文件(我是根據他裝的):https://hackmd.io/@erichung0906/cms
架設
我是根據這一篇文章,使用 docker 架設的: https://hackmd.io/@erichung0906/cms 安裝完成之後,會預設導入一場比賽以及測試用使用者。
cms 一樣是使用 docker 架設。不過,由於是私人寫的 docker-compose 檔案,所以
docker-compose.yml
不規則很多。
在底下,有兩個 docker-compose 文件。docker-compose.yml
會安裝、啟動 cms 系統並且啟動一場比賽以及計分板。而docker-compose.empty.yml
則不會啟動比賽,只會啟動後台以及計分板。
其中,最重要的是第 41 行的地方,其中的指令為cmsResourceService -a <CONTEST_ID>
。其中,<CONTEST_ID>
要置換成 CMS 要啟動的比賽的 ID。例如,在截圖當中,可以看到 <CONTEST_ID>
為 3
,而這代表的是 2023 上機考的 ID。<CONTEST_ID>
可以透過 admin 頁面的網址看到。
而如果要用docker-compose.empty.yml
啟動的話,則要使用以下指令:
docker-compose -f docker-compose.empty.yml up -d
之後,再使用以下指令啟動指定比賽:
docker exec cms cmsResourceService -a <CONTEST_ID>
比賽控制與管理
終端機操作(CLI)
CMS 有許多東西必須在終端機以指令方式操作。
啟動 / 切換比賽
vim docker-compose.yml
將第 41 行的cmsResourceService -a <CONTEST_ID>
中 <CONTEST_ID>
置換成對的 ID。
docker-compose up -d
單純啟動比賽
docker exec cms cmsResourceService -a <CONTEST_ID>
建立使用者
如果要大量建立使用者,可以將CreateByAaW
資料夾當中的 cms_user.csv.example
複製一份到cms_user.csv
並且修改,然後再用createUserFromCsv.sh
建立。
指令:
cd ~/cms/CreateByAaW
./createUserFromCsv.sh
將使用者加到比賽中
以下指令可以將cms_user.csv
中的所有使用者加到特定比賽當中:
1. 修改 addUserToContestCsv.sh
cd ~/cms/CreateByAaW
vim addUserToContestCsv.sh
將第 8 行 -c
後面的數字改成比賽 ID,然後:q
退出vim
,執行指令:
./addUserToContestCsv.sh
刪除個人計分板
進到 cms 裡面
docker exec -it cms bash
如要刪除使用者名稱為userA
的計分板:
cmsRWSHelper delete user userA
其他指令
請閱讀官方文件:https://cms.readthedocs.io/
後台操作(GUI)
problem
按 create new task 下面是題目簡稱、中文全名 statements 放題目敘述的 pdf(正常比賽的樣子,記得要先做好 LaTeX 模板)
聯集給分
group min for 子題
[[第一組分數, 子題測資數量], [第二組分數, 子題測資數量]]
上傳.zip 裡面只有編號規律的檔案(可以透過 input file names template 那邊更改你的檔案名稱格式)
互動題
基本上有多種不同的,可以參考這一篇
基本上互動題要準備兩個檔案:header 和 grader.cpp 並且在這裡上傳:
這邊上傳的 header 使用者都可以 include 的到,另外,grader.cpp 會和使用者上傳的程式一起編譯。
而 checker 則為一個編譯過的執行黨,用來進行連續給分之類的,可以自行設計。
user
cms 的使用者從後台建立出來之後,
修改介面 這邊可以將使用者加入比賽中(participation)
participant
要藏起來讓別人試用:hidden 超級使用者(可以再開賽前測機):unrestricted
contest
anouncement
cms-ranking-archiver
將比賽計分板放到社網的工具。 https://github.com/CKEFGISC/cms-ranking-archiver 指令:
./rws-archiver.py --noflags https://iscoj.fg.tp.edu.tw/cms/ranking/
產生的網址:
https://ckefgisc.org/cms-ranking-archiver/<比賽名稱>
public resources
放在/srv/cms 裡面的
- add user faces(他真的叫這個)
- /srv/cms/heads
- 裡面放 user_id.png/jpg 就會顯示了
- add team icon
- /srv/cms/flags
- 裡面放 team_code.png/jpg
- 記得要先在 admin 頁面 create team
- 然後在比賽中為 user 指定 team
External Judge Server(Worker)
這東西相當之弔詭,cms的documentation中提到這個的只有說你可能會想在不同伺服器開不同worker,所以這些是我通靈出來的,可能會遇到一些不可預期的錯誤
Before action
如果CMS是用docker架設的,需先將儲存空間移到靜態位置,不然每次重新啟動docker更改過的文件便會被洗掉,做的方式為在docker-compose.yml指定volume 可先啟動docker一次,並透過
docker exec --it cms bash
進入docker的終端機頁面把放在/usr/local/etc的cms.conf複製出來,因為其涉及加密無法提供範本,如果之後找到在外面生成的方式亦會更新此文,在yaml的volume中加入此行便可將其轉換為靜態
- "./cmsconfig:/usr/local/etc"
可刪減不需要的服務如ranking web server,judge址需要留下worker的部分,基本的也要留
最後將docker-compose.yml最下面的cms開頭指令改為你要開啟的worker即可,如要開啟編號為0的worker便打
cmsWorker 0
也可同時啟動多個
編號為依據cms.conf中worker陣列的index,每個worker其使用的port皆有意義,需記住
在judge server上開啟worker後,需要到主程式端新增worker,新增方式為在cms.conf加上新的項目(這邊也需要將cms.conf)移至靜態儲存空間
[external_judge_server_ip, judge_port]
注意judge server必須為連通外網之伺服器,若需架於內網可透過如反向ssh通道實現 重新啟動後即可在admin看到這台worker正在運轉了