在 Windows 環境使用 GitLab Docker 安裝的備份、還原過程記錄
上次的 docker volume 備份、還原,其實就是為了要將 local 建立起來的 GitLab 服務做備份,我採用的 GitLab Images 是這篇文章中介紹的 sameersbn 所製作的 docker image,實際用了之後,真的非常的簡易就能夠建好自己的 GitLab,而且真的更新很快,文件也詳細,推薦給還不熟悉的人參考參考,那就直接進入主題吧
先送上文章內用到的 docker-compose.yml。傳送門:GitHub
建立備份所需的 Docker Volume
首先,我參考文件另外建立了一個 Docker Volume 用來將未來產生的備份檔案儲存起來,並且透過文件中提到的指定備份路徑設定 Docker Volume
接著直接透過指令將 GitLab 架起來
# 建立 Volume
docker volume create gitlab_data
docker volume create gitlab_backup
docker volume create postgres_data
docker volume create redis_data
# 建立 Gitlab 服務
docker-compose up
備份 GitLab
文件中有提到備份的部分,需要先將 Gitlab 的 Container 給 stop、rm 掉,接著執行 GitLab 提供的備份指令,但是在我的電腦備份時每次連線到 Repository 的時候都會出現 Connect Error 導致備份失敗,測試結果是只要有 Repository 就會失敗,如果我使用 GitLab 服務先註冊使用者在來備份就沒事情,真奇怪,後來有在這邊找到解決方案,直接貼指令
# 失敗的備份指令
docker-compose run --rm gitlab app:rake gitlab:backup:create
# -----------------------------------------------------------
# Create Backup
docker-compose exec gitlab su -c "bundle exec rake gitlab:backup:create" git
# Restore Backup
docker-compose exec gitlab supervisorctl stop unicorn
docker-compose exec gitlab supervisorctl stop sidekiq
# 列出有哪些備份可還原
docker-compose exec gitlab su -c "bundle exec rake gitlab:backup:restore" git
# 指定 TimeStamp 還原
docker-compose exec gitlab su -c "bundle exec rake gitlab:backup:restore BACKUP=1538620541_2018_10_04_11.3.0" git
docker-compose exec gitlab supervisorctl start sidekiq
docker-compose exec gitlab supervisorctl start unicorn
因為我的環境是 windows,所以用雙引號將指令包住
喔,有一點要特別提醒一下,用哪一版本做的備份檔案,就只能還原在該版本的 Container 底下
備份為實體檔案
配合上一篇的如何備份還原 Docker Volume,終於可以將備份檔案收去別的地方放了。
# 建立 container 用來取得 gitlab_backup volume 的備份檔案
docker run -d --name mybackup -v gitlab_backup:/volume alpine ping 127.0.0.1
# 使用 tar 壓縮整個 volume 目錄
docker exec -it mybackup tar -cjf /data.tar.bz2 -C /volume ./
# 用 docker inspect或者是 docker ps 查詢目前 container 的 Id
docker inspect --format="{{.Id}}" mybackup
# 透過 container Id 將 container 打包成一個新的images:my-volume-backup
docker commit -p e0a4366ae143 my-volume-backup
# 將images導出為實體檔案
docker save -o my-volume-backup.tar my-volume-backup
測試還原 GitLab 服務
為了測試需要,所以我把 GitLab Container 、Volume 砍掉,全部重來再重新建立一次服務
# 建立 Volume
docker volume create gitlab_data
docker volume create gitlab_backup
docker volume create postgres_data
docker volume create redis_data
# 將 Gitlab 服務架起來
docker-compose up
# 將實體檔案還原為 Image
docker load -i my-volume-backup.tar
# 將 Image 裡面的檔案解壓縮到 Docker Volume
docker run --rm -v gitlab_backup:/volume my-volume-backup sh -c "rm -rf /volume/* /volume/..?* /volume/.[!.]* ; tar -C /volume/ -xjf /data.tar.bz2 ;"
還原 GitLab 服務
# 把腳本建立的 GitLab 名稱改名為 gitlab (這一步省略的話接下來要自己替換掉 container name)
docker rename docker-gitlab_gitlab_1 gitlab
# 記得這個時候要確認 GitLab 是 start 的,否則會出現錯誤訊息說找不到 container
# 先確認有哪些備份檔可還原
docker-compose exec gitlab su -c "bundle exec rake gitlab:backup:restore" git
# 指定 TimeStamp 還原
docker-compose exec gitlab supervisorctl stop unicorn
docker-compose exec gitlab supervisorctl stop sidekiq
docker-compose exec gitlab su -c "bundle exec rake gitlab:backup:restore BACKUP=1538620541_2018_10_04_11.3.0" git
docker-compose exec gitlab supervisorctl start sidekiq
docker-compose exec gitlab supervisorctl start unicorn
還原過程會再要你確認是不是真的要還原
這邊如果選擇 no,那就不會幫你清掉 authorized_keys file,選擇 yes 就清掉而已,後面就是清除一些暫存檔案、目錄而已
還原完畢記得要把 unicorn、sidekiq 重新 start
我的 GitLab 又回來囉~~
加碼 GitLab Runner
都裝了 GitLab 不接著裝 Runner 始終是覺得少了一塊拼圖,那就寫一下重點吧。
閱讀官方文件 Install GitLab Runner on Windows
- 建立一個目錄用來存放 Runner 的檔案,如
C:\GitLab-Runner
- 依據作業系統環境下載 x86 或amd64 版本的 Runner 檔案,放置於剛才的目錄中,並重新命名為
gitlab-runner.exe
- 使用管理員權限執行 command line,並輸入指令
gitlab-runner.exe register
註冊 Runner - 依照畫面指示,順序輸入自己架設的 GitLab 網址及後台取得的 Token,註冊部分的細節請參考官方文件
- 安裝服務並啟動
gitlab-runner install
、gitlab-runner start
設定 GitLab Runner
- 進入 GitLab 後台管理 Runner,若成功建立 Runner,用管理員帳號登入後可以在後台看到適才註冊的 Runner 已經出現在這邊,記得將 Runner 的狀態設置好
- 專案設置加入 Gitlab CI 設定檔,於專案根目錄下新增
.gitlab-ci.yml
檔案,內容請參考下列範例自行修改調整,第二行請自行調整專案名稱
variables:
PROJECT_NAME: "TaskProject"
before_script:
- echo "starting build for %PROJECT_NAME%"
- echo "Restoring NuGet Packages..."
- nuget restore "%PROJECT_NAME%.sln"
stages:
- build
- test
build:
stage: build
script:
- echo "Release build..."
- msbuild /consoleloggerparameters:ErrorsOnly /maxcpucount /nologo /property:Configuration=Release /verbosity:quiet %PROJECT_NAME%.sln
artifacts:
untracked: true
test:
stage: test
script:
- echo "starting tests"
- cd %PROJECT_NAME%Tests/bin/Release
- vstest.console %PROJECT_NAME%Tests.dll
dependencies:
- build
這邊示範的只是最簡單基礎的 Runner 設定,所以關於 Runner 服務的執行權限設定、自動化腳本內使用到的 MSBuild、VSTest.Console、Nuget 都要先自行安裝,此處就不細談。
關於 GitLab 與 Runner 之間的關係其實就跟一般的 Git 服務配上 Jenkins 概念一樣,所以要配置 Runner 當然也有很多方法,因為要滿足不同的專案建置需求,跑 CSharp、Java、Andriod、iOS 等等,都有可能有不同的建置環境跟需求需要配置、甚至是專門用來半夜跑整合測試的也許要用比較好的機器……之類的,這部分就等用到的時後再研究囉