1. 程式人生 > >gitlab-ci + k8s 之gitlab-ci

gitlab-ci + k8s 之gitlab-ci

目前常用的持續整合工具主要是jenkins與gitlab-ci ,我已在另一博文中詳細記錄了jenkins部署過程(其中包括gitlab的搭建),此篇介紹gitlab-ci的使用。
GitLab-Runner是配合GitLab-CI進行使用的。一般地,GitLab裡面的每一個工程都會定義一個屬於這個工程的軟體整合指令碼,用來自動化地完成一些軟體整合工作。當這個工程的倉庫程式碼發生變動時,比如有人push了程式碼,GitLab就會將這個變動通知GitLab-CI。這時GitLab-CI會找出與這個工程相關聯的Runner,並通知這些Runner把程式碼更新到本地並執行預定義好的執行指令碼。

背景介紹:已線上下機房安裝好gitlab,之前jenkins專案博文有介紹詳細安裝方法,gitlab-runner端安裝在阿里雲ECS上,且還需安裝maven在 runner所在伺服器上,maven安裝部落格有教程,註冊時通過gitlab的公網或域名方式的url註冊。
我司防火牆的80埠被封了,需要將gitlab的預設80埠修改為8088:

    vim /etc/gitlab/gitlab.rb
    external_url 'http://gitlab.home.com:8088'  #新增上埠
    nginx['listen_port'] = 8088   #新增

    vim /var/opt/gitlab/nginx/conf/gitlab-http.conf 、
    server {
    listen *:8088;     #改其內建nginx監聽埠

    gitlab-ctl reconfigure  #重置配置檔案
    gitlab-ctl restart      #重啟服務

本地gitlab 版本檢視 cat /opt/gitlab/embedded/service/gitlab-rails/VERSION
版本選擇


本文gitlab為10.5.2,runner為gitlab-ci-multi-runner-9.5.1-1.x86_64.rpm

  1. 新增gitlab的官方庫

     [[email protected] ~]# curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash
  2. 安裝runner

     [[email protected] ~]# yum -y install gitlab-ci-multi-runner-10.0.0-1-x86_64
  3. 註冊 runner ,其中 url與 token可以在gitlab的web介面工具的runner中找到

     [[email protected] ~]# gitlab-ci-multi-runner register
     Running in system-mode.                            
    
     Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
     http://172.19.0.101:8088/
     Please enter the gitlab-ci token for this runner:
     hy-zVkJBwTyG3WyvS3Sr
     Please enter the gitlab-ci description for this runner:
     [localhost.localdomain]: test_nothing
     Please enter the gitlab-ci tags for this runner (comma separated):
     nothing_runner
     Whether to run untagged builds [true/false]:
     [false]: false
     Whether to lock Runner to current project [true/false]:
     [false]: false
     Registering runner... succeeded                     runner=hy-zVkJB
     Please enter the executor: docker+machine, docker-ssh+machine, docker-ssh, shell, ssh, virtualbox, kubernetes, docker, parallels:
     shell
     Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
  4. 啟動 gitlab runner

     [[email protected] ~]# gitlab-ci-multi-runner run
     [[email protected] ~]# ps -ef|grep runner
     root      9294     1  0 04:13 ?        00:00:00 /usr/bin/gitlab-ci-multi-runner run --working-directory /home/gitlab-runner --config /etc/gitlab-runner/config.toml --service gitlab-runner --syslog --user gitlab-runner

    此時在gitlab的web介面可以看到本runner

  5. 在專案根目錄新增 .gitlab-ci.yaml,runner會執行新增的命令,要注意pom.xml的路徑,預設在專案根目錄中,若不在,需要以專案根目錄為相對路徑加上該檔案所在路徑,如:mvn clean package -f libra/ ,以下指令碼可以去掉before_script,打包命令改為 mvn clean package。在註冊runner時,要根據提示,是否要執行不帶tag的專案。

     before_script:
       - mvn clean
     stages:
       - deploy
     deploy_job:
       stage: deploy
       only:
           - master
       script:
         - mvn package
         - sh /test_project/appstore-backend/runner_tomcat.sh
       tags:
         - test-tag

    以上runner_tomcat.sh指令碼定義了打包後的與應用相關的映象處理與到阿里雲的映象推送。

     vim /test_project/appstore-backend/runner_tomcat.sh
     #!/bin/bash
     namespace=testimage
     project_name=aaa-a
     war_name=aaa.war
     image_name=registry-vpc.cn-shanghai.aliyuncs.com/$namespace/$project_name
     old_version=`sudo docker images|grep $image_name|awk '{print $2}'|sort -r|awk 'NR==1{print}'`
     new_version=$(expr $old_version + 1)
     newimage=$image_name:$new_version
     Dockerfile_path=/test_project/$project_name/
     war_path=`find / -cmin -20 -name $war_name 2>/dev/null | grep -v "/var/lib/docker" | grep -v "/test_project/$project_name/"`
     source /etc/profile
     rm -rf /test_project/$project_name/$war_name &&
     mv $war_path /test_project/$project_name/ &&
     sudo docker login --username=ur_name --password=test1245\& registry-vpc.cn-shanghai.aliyuncs.com
     sudo docker build -t $newimage  $Dockerfile_path &&
     sudo docker push $newimage
  6. 測試runner是否生效
    隨意修改有 .gitlab-ci.yaml檔案的專案的程式碼,提交。檢視流水線,也可以看映象倉庫是否推送了該版本映象

    初次執行應該會報錯,以下是我多次報錯總結

    6.1 gitlab上測試專案的流水線發現觸發runner執行命令,有時候以root身份執行,專案放在/etc/gitlab-runner/builds/下,有時候以gitlab-runner身份執行,專案放在/home/gitlab-runner/build下。
    原因:可以 ps -ef|grep runner 檢視,有多個runner程序,分別屬於gitlab-runner與root
    解決方法:kill掉所有runner程序,以root身份執行 gitlab-ci-multi-runner start ,檢視程序數,只有一個

    6.2 當gitlab-runner使用者執行runner時,對於一些操作沒有許可權,需要設定sudo許可權,root使用者不存在此問題,也要注意runner上指令碼的執行許可權。
    解決方法:

         vim /etc/sudoers 
         gitlab-runner ALL=(root)  /bin/docker,NOPASSWD: ALL  #加上NOPASSWD: ALL,執行命令時不用再輸入passwd for gitlab-runner

    6.3 gitlab-ci打包某個群組裡的專案報錯

    解決方法:對該群組沒操作許可權,將你登陸gitlab的此使用者加到該群組成員中,訪客身份無效。

    6.4 Runner跑流水線pull專案報連線超時,可能是不能解析gitlab.home.com。在gitlab-runner的/etc/hosts檔案中加上域名解析,注意內網/公網ip,是否能ping通