摘要:本文主要记录了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