Docker+GitLab-CI持續集成

語言: CN / TW / HK

摘要:本文主要記錄了Python項目在GitLab中實現自動部署的具體操作;

1、持續集成基本概念

在傳統開發過程中,代碼的集成工作通常是在所有工程師們工作完成後進行的,需要單獨構建,這往往會花費大量的時間和精力。持續集成是一種將集成工作放在軟件開發階段的做法,以便更加有規律地構建、測試和集成代碼;

持續集成可以在開發人員提交了新代碼後,立即進行構建、單元測試,可以根據測試結果確定新代碼或配置環境是否正確;

2、項目相關操作:

2.1 gitlab上新建項目

寫了個python相關的demo, 放到了gitee上;

訪問地址為 https://gitee.com/fanmixue/docker-fast-tortoise-demo

打開自己的gitlab,點擊 New project , 導入下項目

image-20220318174209200.png

2.2 Dockerfile文件

FROM python:3.9 ​ WORKDIR /code ​ COPY ./requirements.txt /code/requirements.txt ​ RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt ​ COPY ./ /code/ ​ CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8888"] ​

2.3 設置CI/CD

進入gitlab當前項目中,左下角找到 Settings,選擇第一個選項General,找到Pipelines,打開後Settings裏會顯示CI/CD選項;

ps:如果你找不到Settings按鈕,啊哦,那説明你沒有項目管理員權限哦~

image-20220408104415905.png

2.4 記錄Url和Token

進入CI/CD界面,展開 Runners 選項,找到url和token;

image-20220408104339001.png

3、 服務器相關操作

服務器環境為: Ubuntu 64位

3.1 安裝docker

具體可參考官網:https://docs.docker.com/engine/install/ubuntu/

3.2 安裝gitlab-runer

3.2.1 docker方式安裝

```

拉取鏡像

docker pull gitlab/gitlab-runner:latest

運行鏡像

docker run -d --name gitlab-runner --restart always \ -v /var/run/docker.sock:/var/run/docker.sock \       -v /srv/gitlab-runner/config:/etc/gitlab-runner \       gitlab/gitlab-runner ​ ```

3.2.2 非docker方式安裝

其他環境可參考:https://docs.gitlab.com/runner/install/linux-manually.html#install-gitlab-runner-manually-on-gnulinux

```

ubuntu中安裝

sudo apt-get install gitlab-runner ```

3.3 添加用户組及權限

```

添加 用户組及用户

useradd -m -g gitlab-runner gitlab-runner ​

查看系統用户

sudo vim /etc/passwd ​

將下圖藍框內的數字改為0:0,和root保持一致

```

image-20220407181513144.png

3.4 註冊gitlab-runner

```

使用一次性容器來註冊 gitlab-runer, --rm 容器推出時清理用户數據

docker run --rm  -it -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register ```

上面命令執行完,接下來會提示你輸入以下信息,做個示例,僅供參考哈,可別都粘貼過去了~

```

輸入域名或者服務器ip地址,就是步驟三的url,如果gitlab和要部署的服務器地址不一致,需要做個地址映射哦,自行百度下

Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):

輸入token,就是步驟2.3的token

Please enter the gitlab-ci token for this runner:

輸入runner描述,可寫可不寫

Please enter the gitlab-ci description for this runner:

給這個Runner指定tags,可以寫多個,英文逗號隔開即可

Please enter the gitlab-ci tags for this runner (comma separated):

選擇Runner是否接受未指定tags的任務,稍後可修改,默認值為false,可寫可不寫

Whether to run untagged builds [true/false]:

選擇是否為當前項目鎖定Runner,通常用於被指定為某個項目的Runner,默認值為true,可寫可不寫

Whether to lock the Runner to current project [true/false]:

選擇Runner executor(Runner執行器),這裏我們選docker哈

Please enter the executor: docker, shell, virtualbox, kubernetes, docker-ssh, parallels, ssh, docker+machine, docker-ssh+machine: docker

docker版本選最新版

Please enter the default Docker image (e.g. ruby:2.6): docker:latest ​

好了到這一步,看到輸出以下語句,就算註冊完了,接下來去CI/CD界面下的Runners選項裏,看看有沒有成功;

Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded! ```

如下圖所示,前面的圓圈為綠色的,代表註冊成功了,標籤名為 fastApi

image-20220406184442725.png

注意:如果這個時候前面的圈圈為灰色的,請執行以下命令重啟下gitlab-runner, 稍作等待,多刷新幾次瀏覽器即可;

docker restart gitlab-runner

3.5 配置祕鑰及靜態目錄相關

cd ~/.ssh # 查看是否存在密鑰 ssh-keygen -t rsa # 生成密鑰 cat id_rsa    #查看私鑰 cat id_rsa.pub # 查看公鑰

將私鑰、公鑰及ip等信息粘貼到 CI/CD的變量中,具體操作看下圖: image-20220407184904543.png

image-20220408104218778.png

4、 gitlab-ci.yml文件

在項目根目錄下新增文件gitlab-ci.yml,將以下代碼粘貼過去,然後提交代碼到test分支;

test:build:   stage: test   script:      - docker build -t fast_api .      - if [ $(docker ps -aq --filter name=trunkverse_service) ]; then docker rm -f trunkverse_service; fi      - docker run -d -p 8098:8098 --restart=always --name fast_api fast_api      - echo 'docker run 完成'   only:      - test # 指定test分支一更新則立即構建   tags:      - fastApi # 對應每個runner註冊時定義的tag ​ test:deploy: image: alpine:3.7 stage: deploy script:    - echo "http://mirrors.aliyun.com/alpine/v3.7/main/" > /etc/apk/repositories # 下載鏡像    - apk add --no-cache rsync openssh # 安裝rsync openssh    - mkdir -p ~/.ssh    - echo "$SSH_KEY_PRIVATE" >> /root/.ssh/id_rsa    - echo "$SSH_KEY_PUB" >> /root/.ssh/id_rsa.pub    - chmod 700 /root/.ssh/    - chmod 600 /root/.ssh/id_rsa.pub    - chmod 600 /root/.ssh/id_rsa    - echo -e "Host *\n\t StrictHostKeyChecking no \n\n" > ~/.ssh/config    - rsync -av --delete   ./  $SERVER_HOST:$SERVER_PATH only:    - test tags:    - fastApi

5、查看結果

image-20220408105944678.png

點進去綠色圈圈,可以看到任務執行流程:

image-20220408111301218.png

任務執行成功後,在服務器上指定文件夾下,可以看到所有項目文件已經自動更新了,瀏覽器輸入服務器ip+8098端口可以訪問成功~

ps:因為這個demo項目裏,啟動時需要連下mysql,真正使用時,要將mysql配置成允許任意ip訪問才行,具體操作請看下篇文章~

6、你可能遇到的問題

如果你的服務器是在內網中的,項目中給出的URL是內網域名而不是IP,那麼我們在註冊runner的時候,第一步輸入url的時候請輸入http:// + ip, 然後sudo打開 /srv/gitlab-runner/config/config.toml ,對runner增加域名:ip映射,否則代碼拉不下來,會報錯的

sudo vim /srv/gitlab-runner/config/config.toml

2041652697186_.pic.jpg