顯示具有 gitlab 標籤的文章。 顯示所有文章
顯示具有 gitlab 標籤的文章。 顯示所有文章

星期六, 9月 30, 2023

gitlab備份與還原(使用docker)

我家裡的 gitlab 之前是用 docker-gitlab 架設的,前一陣子因為誤刪了某些檔案,導致有問題。現在就改用 gitlab 官方的 docker image 來架設,目前一切安好,為了之後的長長久久,必須看一下怎麼備份跟回存。

主要參考資料:

備份方法

docker-compose exec -it gitlab-ce gitlab-backup create

還原方法

還原時,需要先把容器裡的某些服務停掉,所以步驟比較多。

docker-compose exec -it gitlab-ce gitlab-ctl stop puma
docker-compose exec -it gitlab-ce gitlab-ctl stop sidekiq
docker-compose exec -it gitlab-ce gitlab-ctl status
docker-compose exec -it gitlab-ce gitlab-backup restore BACKUP=<backup_name>
docker-compose exec -it gitlab-ce gitlab-ctl restart
docker-compose exec -it gitlab-rake gitlab:check SANITIZE=true

結語

備份、還原蠻簡單的,很容易放到 crontab 裡去執行,之後再把備份出來的複製到遠端就可以了。

星期三, 6月 17, 2020

gitlab 看不到 last commit 跟 last updated 問題

gitlab 升級到 13.0.5 以後,發現有這問題,原本以為是 gitlab-ce 問題,下次升級就解決了。但是今天升級到 13.0.6 以後,並沒有解決。 利用瀏覽器的開發者工具去查看,發現有個請求是回傳 404,仔細看他網址裡,有 %2F

https://host/user/gitlab-ce-commit-info-bug/-/refs/master/logs_tree/folder_1%2Ffolder_2?format=json&offset=0

手動把 %2F 改為 / 以後,就可以拿到資料。

利用 “gitlab-ce “refs/master” “%2F” 404gitlab-ce “refs/master” “%2F” 404” 這幾個關鍵字在 gitlab issue 209941 找到線索,是 Apache 問題。

Apache 要在 virtualhost 裡加上 AllowEncodedSlashes NoDecode

但我這樣試了以後,發現還是不行。後來看了 Apache 文件,知道除了 NoDecode 之外,還可以設定為 On:AllowEncodedSlashes On 

於是這樣就可以成功顯示了。

但是為了安全性問題 (Apache 文件不建議這樣設定),再去找了一下,看為什麼會這樣。
後來在 StackOverflow 上找到解答,除了要改 AllowEncodedSlashes 之外,還要改 mod_proxy ProxyPass ,在後面加上 nocanon 即可。

範例

AllowEncodedSlashes NoDecode
<Location /example/>
  ProxyPass http://anotherserver:8080/example/ nocanon
</Location>

星期三, 12月 20, 2017

docker-gitlab 與 container registry

之前有試了兩三次,但都卡在憑證部份,昨天終於搞定了。

主要參考文件是 https://github.com/sameersbn/docker-gitlab/blob/master/docs/container_registry.md

第一步是產生憑證,不要用上面文章提供的 openssl 指令,用 https://gitlab.com/gitlab-org/gitlab-ce/issues/25967 所提供的:

# 假定是在 docker-compose.yml 所在的目錄下
mkdir -p certs
cd certs
openssl req -nodes -newkey rsa:4096 -keyout registry-auth.key -out registry-auth.csr -subj "/CN=gitlab-issuer"
openssl x509 -in registry-auth.csr -out registry-auth.crt -req -signkey registry-auth.key -days 3650

第二步是修改、調整原有的 docker-compose.yml

# gitlab
gitlab:
  environments:
    # ... other environment variables
    # ...
    # Registry
    - GITLAB_REGISTRY_ENABLED=true
    - GITLAB_REGISTRY_HOST=registry.example.com
    - GITLAB_REGISTRY_PORT=443
    - GITLAB_REGISTRY_API_URL=http://registry:5000
    - GITLAB_REGISTRY_KEY_PATH=/certs/registry-auth.key
    - SSL_REGISTRY_KEY_PATH=/certs/registry-auth.key
    - SSL_REGISTRY_CERT_PATH=/certs/registry-auth.crt
  volumes:
    # ... other volumes
    # ...
    # 將前面建立的 certs 資料夾掛載到 /certs
    - ./certs:/certs
  links:
    # ... other service links
    # ...
    - registry
registry:
  image: registry:2.4.1
  expose:
    - "5000"
  ports:
    - "5000:5000"
  volumes:
    - /var/gitlab/shared/registry:/registry
    - ./certs:/certs
  environment:
    - REGISTRY_LOG_LEVEL=info
    - REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/registry
    - REGISTRY_AUTH_TOKEN_REALM=https://git.example.com/jwt/auth
    # 如果你用的 gitlab 設定為 relative url root,那就是
    # - REGISTRY_AUTH_TOKEN_REALM=https://example.com/git/jwt/auth
    - REGISTRY_AUTH_TOKEN_SERVICE=container_registry
    - REGISTRY_AUTH_TOKEN_ISSUER=gitlab-issuer
    - REGISTRY_AUTH_TOKEN_ROOTCERTBUNDLE=/certs/registry-auth.crt
    - REGISTRY_STORAGE_DELETE_ENABLED=true

第三步是改 Apache 或 Nginx 的設定,Nginx 的設定可以參考 https://github.com/sameersbn/docker-gitlab/blob/master/docs/container_registry.md

我用的是 Apache ,所以我是參考 https://gist.github.com/dkarlovi/5f6ab416aa882086c7305b004b590dd4 來做修改,改完記得重新啟動 Apache 或 Nginx。

修改完以後,執行 docker-compose up ,應該就沒問題了。

我遇過以下問題:

    瀏覽 https://git.example.com/group1/project1/container_registry 時,出現 Internal server error:主要是 gitlab 環境變數裡的 GITLAB_REGISTRY_KEY_PATH、SSL_REGISTRY_KEY_PATH、SSL_REGISTRY_CERT_PATH 跟 registry 環境變數裡的 REGISTRY_AUTH_TOKEN_ROOTCERTBUNDLE 沒有設定好,當然其他的也有可能,儘可能都檢查一次。
    docker login 失敗:其實也是上面提的那幾個環境變數沒設定好。

檢討之前為什麼沒能架設好,原因如下:

    對 SSL 憑證不了解:我的 git.example.com / registry.example.com 都使用 SSL 憑證,但又跟 registry-auth 的憑證搞混,總的來說,總共三個憑證,git.example.com 一個,registry.example.com 一個,registry-auth 一個。gitlab.example.com/registry.example.com 的憑證是給網頁伺服器(Apache/Nginx)使用,Apache/Nginx 設定裡要設定,然後 docker-compose.yml gitlab 服務裡只用到 gitlab.example.com 的憑證,要用 SSL_KEY_PATH, SSL_CERTIFICATE_PATH 跟 SSL_DHPARAM_PATH 這三個環境變數來設定。而 registry-auth 則是 gitlab 服務與 registry 服務作 token 認証用的,主要是 gitlab 環境變數裡的 GITLAB_REGISTRY_KEY_PATH、SSL_REGISTRY_KEY_PATH、SSL_REGISTRY_CERT_PATH 跟 registry 環境變數裡的 REGISTRY_AUTH_TOKEN_ROOTCERTBUNDLE。
    Apache 的 SSL 設定錯誤:SSLCertificateFile, SSLCertificateKeyFile, SSLCertificateChainFile 跟 SSLCACertificateFile 都要設定,我少設了 SSLCertificateChainFile,導致 registry 服務去問 gitlab 時,有憑證錯而有 HTTP request fail 的問題。

星期三, 10月 25, 2017

Run ansible in gitlab runner

在 gitlab runner 裡想要執行 ansible playbook 進行佈署,幾個問題以及我的應對:
  1. ansible 的安裝:是可以自己加 ansible 的 package repository ,然後用 apt 安裝,但已經有好心人打包了裝好 ansible 的 docker image ,只要在 .gitlab-ci.yml 加入 image 設定即可:
    image: williamyeh/ansible:ubuntu14.04
  2. playbook 要放在哪裡?因為要直接在專案進行佈署,所以 playbook 也要放在專案裡,我在專案裡建立了一個 ansible 的目錄,把 playbook 放在這裡。
  3. 私密資料如何保存?gitlab 在專案設定裡提供了 variables,可以用來存放這些私密的資料,在 .gitlab-ci.yml 裡,只要用 $VAR_NAME 就可以使用這些變數。.gitlab-ci.yml 裡也可以自訂 variables ,但這些 variables 是進到 git repository 的,要視情況使用。
  4. Ansible 連到目的機器需要 SSH Key:這比較麻煩一點,好在 gitlab 有提供如何使用 SSH key 的文件,步驟很詳細,簡述如下:
    1. 在專案設定的 variables 裡新增有 SSH private key 的變數。
    2. 檢查 ssh-agent ,如果沒有就安裝 openssh-client
    3. 執行 ssh-agent
    4. 用 ssh-add 匯入第一個步驟所設定好的變數
    5. 在 ~/.ssh/config 裡加入不檢查 host key 的設定:
      Host *
          StrictHostKeyChecking no
參考資料:

星期五, 3月 04, 2016

jenkins 的 gitlab-merge-request-builder-plugin

gitlab-merge-request-builder 是可以讓 jenkins 對 gitlab 送 merge request 的 plugin,但是這個 plugin 不在 jenkins plugins repositories,所以找不到,得自己 build。
首先要裝 maven:sudo apt-get install maven
  1. 先到 java-gitlab-api ,取得原始碼,接著用 mvn install 來安裝,maven 會把生成的 gitlab api wrapper 安裝到 $HOME/.m2 下。
  2. jenkins-gitlab-merge-request-builder-plugin 取得 plugin 的原始碼,取得以後,修改 pom.xml ,把 java-gitlab-api 的版本改為 1.2.5-SNAPSHOT ,然後執行 mvn hpi:hpi 。
  3. 大功告成,建置好的 plugin 會在 target/ 下。
plugin 的說明裡提到,如果 gitlab 在 8.1.x 以下,要使用 v1.2.4 ;gitlab 在 8.1.x 以上 (含),可以直接用最新版本。關於這點,我倒是還沒去試,總之先把建置的步驟紀錄下來。
P.S. 我發現有兩個來源耶,所以?!
  1. https://github.com/timols/jenkins-gitlab-merge-request-builder-plugin
  2. https://github.com/jenkinsci/gitlab-merge-request-builder-plugin

星期五, 1月 22, 2016

gitlab-ci-multi-runner 在 archlinux 上的設定

gitlab-ce 到 8.0 以後,就把 gitlab-ci 整進去了,要用 gitlab-ci ,需要安裝 gitlab-ci-multi-runner。
archlinux AUR 裡已經有人包進去了:
  1. 用 yaourt -S gitlab-ci-multi-runner 安裝。
  2. 用 sudo systemctl enable gitlab-ci-multi-runner 啟用
  3. 執行 gitlab-ci-multi-runner register 進行設定,設定時會問:
    1. gitlab-ci coordinator URL :請到 gitlab 專案設定裡的 runner 畫面取得
    2. gitlab-ci token for this runner:跟上面一樣,到 gitlab 專案設定裡的 runner 畫面取得
    3. gitlab-ci description for this runner: 隨便填,能認得就好
    4. gitlab-ci tags for this runner:隨便填,不填就按 enter
    5. executor:這邊就看需求,我是填了 docker
    6. Docker image:應該是選了 docker 的關係,這邊需要填,主要是問要以哪個 image 為基底,ruby 可以填 ruby:2.1,python 可以填 python:2.7,日後有用到再去找。
    7. 其他:問 mysql, postgresql, redis, mongodb 要用哪個版本。
  4. 設定完,gitlab-ci-multi-runner 服務會自動載入新設定,不放心的話,用 sudo systemctl restart gitlab-ci-multi-runner 重新啟動。
到 gitlab 專案設定裡的 runner 畫面去看,應該就會看到剛剛新增的 runner。
使用上可以參考這篇 gitlab ci quickstart 來做,大致就是在專案裡新增 .gitlab-ci.yml ,裏面填好要執行的步驟,加入 repository、提交、push,之後每次 push 時,就會執行 .gitlab-ci.yml 裡的步驟了。

星期六, 11月 14, 2015

gitlab 的備份檔

gitlab 的備份是一個 tar 檔案,用 tar xf 解開以後,會依照你 gitlab 裡的 user/group 區分目錄,解開以後,會發現裏面又是一堆 .bundle 檔案。
.bundle 該怎麼解開呢?其實它也是一個 tar 檔案,用 tar tf 就可以看到內容,所以如果要還原的話,就先建一個目錄,再切到該目錄下解開就可以了。

星期一, 7月 06, 2015

git clone fail

遇到下面這錯誤~
$ git clone http://your_host/your_group/your_project.git
Cloning into 'your_project'...
remote: Counting objects: 426, done.
remote: Compressing objects: 100% (375/375), done.
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed
過程大致就如 gitlab - error: git-upload-pack died of signal 13 - Stack Overflow
所以我試過 git config --global http.postBuffer 524288000 ,也試著加過 GIT_CURL_VERBOSE ,但都看不出什麼端倪,伺服器上的 log 也沒看到,最後就如 gitlab - error: git-upload-pack died of signal 13 - Stack Overflow 的解答所說,是 permission 問題。我猜可能是我有調整 nginx user 的關係,導致錯誤。後來就是依據 log 裡的提示,調整 /var/run/nginx/proxy 下資料夾的 owner 就解決問題了。

星期四, 1月 29, 2015

docker-gitlab 與 docker-redmine 的結合

這兩者是由同一個開發者建立的,兩者可以結合。主要設定有兩個:
  1. docker-gitlab :要指定 REDMINE_URL 這個環境變數,假設你把 docker-gitlab 與 docker-redmine 放到一台機器上,利用 apache mod_proxy 來區分路徑的話,那麼就是 REDMINE_URL=http://your_ip/redmine
  2. docker-redmine:要指定 --volumes-from= ,例如:--volumes-from=gitlab_gitlab_1 。
在建立專案的時候,要依照下面步驟:
  1. 在 redmine 建立專案,下面以 Demo 為例。
  2. 在 gitlab 建立專案,並且記住專案網址,假設是 your_name/demo.git。
  3. 在 redmine 的 Demo 專案設定裡的「儲存機制清單」裡建立新儲存機制,取一個好名字,然後在網址裡填入 /home/git/data/repositories/your_name/demo.git ,建立。
  4. 回到 gitlab,去專案設定裡,把 Issue tracker 改為 Redmine ,然後填入專案名稱 demo 。
這樣做之後,在 gitlab 點選 Issues 時,畫面會帶到 Redmine 去,而在 Redmine 專案的儲存機制頁籤也可以存取到跟 gitlab 的 repository,也不需要利用 git hook 機制來做同步了。

 使用者帳號同步的部份應該是可以用 LDAP 來達成,這部份還要試驗看看。

星期五, 11月 28, 2014

GitLab 與 Docker

之前就想要裝 GitLab,無奈,裝 GitLab 的相依性實在太多,後來就不了了之。時間飛快,今年年初時,知道了 Docker 這個東西,然後最近想到應該是可以把 GitLab 裝到 Docker 裡,這樣子 GitLab 的環境乾淨,也不會動到原本伺服器上的設定。於是就上網 Google ,果然已經有人做好了 (sameersbn/docker-gitlab),那就不囉唆,立刻來試試看。
網站上的安裝步驟其實已經蠻清楚了,這裡我就紀錄我改的部份。我用 fig 來進行客製化,所以就先下載他的 fig.yml,原本的 fig.yml 裡有三個 container,一個是 gitlab,一個是 postgresql,一個是 redis。我移掉了 postgresql 跟 redis,這邊我改用 host 的 mysql 與 redis,並且設定必要的環境變數。fig 的安裝一定要用 python2 的 pip 來安裝,否則會有問題,目前還沒移植到 python3 上。
要存取 host 的 mysql 與 redis,要注意幾點:
  1. 確 定 host 的 mysql 跟 redis 是可以以 port 的方式存取,另外也要允許外部 IP 的連線。mysql 是修改 my.cnf 裡的 [mysqld] section,主要是設定 port ,重新啟動之後應該就可以;至於 redis,則是改 redis.conf 裡的 bind,將其改為 bind 0.0.0.0 ,重新啟動以後就可以。
  2. host 的 IP,在 docker container 裡,照理說是用 gateway 的 IP 就可以。一般都是找到 netstat -nr | grep '^0\.0\.0\.0' | awk '{print $2}' 這指令,但這得在 docker container 裡執行,fig.yml 裡沒辦法指定這個。後來是看到說直接用 host IP 也可以,所以我就直接指定,看起來是沒問題。
等設定好之後,直接 fig up,fig 就會幫你 pull image、建立 image 然後開始執行,第一次執行需要花一點時間。這邊我碰到的怪情況:
  1. docker 有問題,執行有問題,去查看 log ,看到 operation not supported 。查了很久,查不出來什麼問題,後來重開機,居然就沒問題了。事後猜想,可能是因為在 docker run 之前有更新過 kernel,archlinux 更新 kernel 都是使用 replace 的方式,或許是因為這樣而有問題。
  2. 使用預設的帳號 跟密碼無法登入,這個得使用 docker exec -it gitlab_gitlab_1 bash 進入 container 裡,執行 sudo -u git -H bash -c “bundle exec rake gitlab:setup RAILS_ENV=production” 以後,就可以解決。

這裡是我的 fig.yml

星期三, 7月 10, 2013

gitlab on Ubuntu 12.04

基本安裝指南是參考 gitlab 上的文件:https://github.com/gitlabhq/gitlabhq/blob/master/doc/install/installation.md
  1. Packages/Dependencies:提到的套件之前都安裝過了,寄送郵件的 SMTP server,文件裡是說要用 postfix,我是用 ssmtp。
  2. System Users:原本是先處理 Ruby,因為我想用 rvm,所以就先處理 System Users,這邊就建立 git 使用者,由於後續的 rvm 會需要用到 sudo,所以也順便把 git 加入 sudo 群組。
  3. Ruby:我是用 rvm 來安裝,所以就不移除原來系統的 ruby。這邊安裝稍微麻煩一些:
    1. cd /home/git
    2. curl -L https://get.rvm.io | sudo -u git -H bash -s stable --ruby=1.9.3
    3. sudo -u git -H vim .gemrc :填入 gem: --no-ri --no-rdoc
    4. sudo -u git -H mkdir bin
    5. sudo -u git -H vim bin/rvm:因為不知為什麼 bash 沒去讀 .bash_profile,所以就弄了一個 script 來含括環境變數,內容請參考這裡,做完以後,要用 sudo -u git -H chmod +x bin/rvm 變更其權限。
    6. sudo -u git -H bash -c "\$HOME/bin/rvm all do gem install bundler"
  4. GitLab shell:這邊照步驟做,最後的 Do setup 時,要改用 sudo -u git -H bash -c "\$HOME/bin/rvm all do ruby \$HOME/gitlab-shell/bin/install" ,強制用 rvm 的 ruby 來安裝。
  5. Database:照步驟做。
  6. GitLab: 這也是照步驟做,但要注意使用 gem/bundle/rake 的指令,要改變為 sudo -u git -H bash -c "\$HOME/bin/rvm all do gem 跟 sudo -u git -H bash -c "\$HOME/bin/rvm all do bundle 跟 sudo -u git -H bash -c "\$HOME/bin/rvm all do rake
至此,大致就完成了。
實際上在測試的時候,發生一些問題,我遇到的問題跟解:
  1. 我 用預設的帳號 admin@local.host 跟密碼 5iveL!fe 無法登入:後來找到文件,是說用 sudo -u git -H bash -c "\$HOME/bin/rvm all do bundle exec rake gitlab:setup RAILS_ENV=production" 重新執行,我發現我這個步驟有錯誤訊息,就修正以後,再執行一次,就可以登入了。主要是修正 gitlab-shell/config.yml 裡的 repos_path 跟 gitlab/config/gitlab.yml 裡的 repos_path ,這兩者要一致,我是設定為 /var/git/repositories ,之前照設定做的時候,漏了一個。
  2. 建立專案以後,無法 clone/push,這有兩種情況:
    1. gitlab-shell 用了錯誤的 ruby 版本:我是笨笨的去把 gitlab-shell/bin 下所有 script 的第1行修改為 /home/git/.rvm/bin/ruby ,後來有找到 gitlab 的 trouble shooting guide,他是把 PATH 寫到 /home/git/.ssh/environment,然後在 /etc/ssh/sshd_config 裡增加 PermitUserEnvironment yes。
    2. gitlab-shell config.yml 設定錯:我讓 gitlab 執行在 port 81 上,所以 config.yml 裡的 gitlab_url 也應該要調整為 http://localhost:81/ 才對。(來源:GitLab: Could not read from remote repository)
  3. git 版本需要 1.7.10 以上,就找了 git 的 ppa 來源安裝:sudo add-apt-repository ppa:git-core/ppa && sudo apt-get update && sudo apt-get upgrade
整個都確定完成才寫這篇,我想應該是沒漏掉吧。
除了官方的安裝文件之外,ArchLinux wiki 上的安裝指南也寫的很棒,不妨參考看看。