docker運行gitlab runner且指定shell executor后使用scp ssh完成一個靜態網站的ci 過程記錄


所謂executor就是執行者的意思,即gitlab-runner執行任務時候的具體承載媒介,我們的gitlab上可能會有很多項目,不同項目會使用不同語言開發,不可能把構建所有項目用到的環境都配置在gitlab-runner運行的機器之上,所以才會有executor。

gitlab-runner executor的類型以及每種類型的適用范圍可以在官方文檔上查看 https://docs.gitlab.com/runner/executors/

這里簡單記錄一下shell executor的配置和適用過程,並用其配合ssh scp實現一個靜態web網站的ci,如果使用shell executor的話,那么意味着所有任務都在gitlab-runner運行的機器上運行,這里shell也就是gitlab-runner機器上的shell。

 

1.我使用docker運行gitlab runner,所以首先需要創建一個gitlab runner的docker容器

#!/bin/bash
docker run \
        -d \
        --name xxx-gitlab-runner \
        --restart always \
        -v /xxx/config:/etc/gitlab-runner \
        -v /var/run/docker.sock:/var/run/docker.sock \
        -v /xxx/gitlab-runner:/home/gitlab-runner \
        gitlab/gitlab-runner:latest

此命令創建了一個gitlab runner容器,並且把/etc/gitlab-runner里的配置文件掛載到了宿主機,另外把gitlab-runner用戶(具體執行ci任務的時候使用的用戶)主目錄也掛載到了宿主機,這樣便於我們修改配置。

這里需要注意的一點是,如果你使用的executor是docker的話,那么-v /var/run/docker.sock:/var/run/docker.sock這一行是必須的,只有添加了此目錄掛載,docker之中的gitlab runner才能訪問到外部宿主機的docker功能。

 

2.使用root進入容器,這里建議把root用戶主目錄下的.bashrc文件復制到gitlab-runner用戶主目錄,這樣等下切換到該用戶操作的時候ll命令,終端彩色什么的就都會支持了,看起來舒服一些。因為我們把gitlab-runner用戶的主目錄掛載到了宿主機,所以在默認情況下此目錄是root用戶創建的,如果不修改此默認權限的話在接下來的步驟中我們將不能在gitlab-runner里面創建ssh需要使用到的證書。這里修改/home/gitlab-runner目錄的權限。

chown -R gitlab-runner:gitlab-runner /home/gitlab-runner

 

3.然后從root用戶切換到gitlab-runner用戶,並且進入用戶主目錄。因為需要使用ssh scp發布網站,所以需要設置好ssh的證書。

ssh-keygen -t ed25519 -C "你的郵箱"

這里生成ed25519證書,推薦使用ed25519,在生成證書的過程中會提示輸入證書密碼,這里可以不用輸入,否則之后ssh的時候還會提示輸入證書密碼,不能實現免密登錄的效果。

 

4.完成了上一步之后用戶主目錄應該已經生成了.ssh文件夾,進入該文件夾。

ssh-copy-id -i ./id_ed25519.pub name@address

使用此命令復制公鑰到目標服務器之上,此操作過程之中需要輸入目標服務器的用戶登錄密碼。

 

5.退出容器,編輯gitlab-runner注冊腳本,此腳本用於向gitlab-runner容器注冊runner。

#!/bin/bash
docker run \
        --rm \
        -it \
        --name xxx-gitlab-runner-tmp \
        -v /xxx/config:/etc/gitlab-runner \
        gitlab/gitlab-runner:latest register

此腳本運行了一個臨時的gitlab-runner容器,並且把之前正式的gitlab-runner容器的配置目錄掛載到此容器之中,這樣就可以通過臨時的容器配置之前運行的正式容器。

運行此腳本,會在交互式的方式下配置一個runner,關於項目的配置信息可以在gitlab具體項目頁面尋找到,填寫即可。另外在這里我們還要輸入executor的類型,這里我們輸入shell。

這里延伸一下,實際上gitlab的runner有三種類型,共享類型,特別類型,以及群組類型,上述配置下我們創建的是一個特殊類型的runner,即為了某一個項目特別配置的runner。關於runner類型的說明,可以參考gitlab runner的官方文檔 https://docs.gitlab.com/ee/ci/runners/

 

6.完成上一步之后,不需要重啟gitlab runner容器應該就可以讓runner生效,刷新gitlab項目頁面應該就可以看到我們剛剛配置的runner已經成功連接到項目了,這里需要編譯一下這個runner的配置,在配置頁面之中勾選 Indicates whether this runner can pick jobs without tags,這樣就算是我們不在分支上打tag也會觸發ci任務執行。

 

 

 

 

 

 

7.接下來就是配置我們項目之中的.gitlab-ci.yml文件了,.gitlab-ci.yml文件使用的是yaml語法,關於此語法的詳細可以學習 https://www.runoob.com/w3cnote/yaml-intro.html yaml很簡單,和json差不了多少,但是看起來更好看,而且支持錨點,五分鍾差不多就能學習好。這里分享一下我的.gitlab-ci.yml文件,此文件的功能是通過ssh scp發布一個靜態網站到服務器。

# xxx gitlab-ci
# 嘗試修改一下yml文件
before_script:
  - echo "🐈 持續集成開始"

after_script:
  - echo "🐈 持續集成完成"

deploy:
  stage: deploy
  script:
    - PKG_NAME='xxx.tar.gz'
    - echo "📦 開始打包"
    - tar zcvf ${PKG_NAME} ./*
    - echo "🚚 開始發送包"
    - scp ./${PKG_NAME} xxx@xxxxxx:/xxx/www
    - echo "🚴‍♂️ 開始部署包"
    - ssh xxx@xxxxxx "
        rm -rf \`ls -d /xxx/www/* | grep -v -E '\.tar\.gz$'\` &&
        cd /xxx/www &&
        tar xvzf ${PKG_NAME} &&
        rm ${PKG_NAME}"
    - echo "😄 部署完成"

只有一個stage,打包之后scp,ssh發布到目標服務器。

 

8.其實gitlab-runner還有一個ssh executor,此executor直接以ssh登錄到目標服務器,並且也會在目標服務器上拉取git項目,然后運行yml文件之中的腳本,但是官方不是很推薦使用這種executor,具體可以看文檔 https://docs.gitlab.com/runner/executors/ssh.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM