摘要:本文主要記錄了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