Gitlab-ci/cd docker初学者手把手教学

1,247 阅读4分钟

简化工作流程,提高工作效率 --打工人

介绍

功能:持续集成 持续部署。
优点:gitlab官方推行工具,简单易用

案例使用

tips:使用服务器,并具备docker的基础知识

  1. gitlab project settings
    进入项目的settings页面中,打开piplines选项,保存设置。显示CI/CD按钮
    没有settings是因为你没有管理员权限

image.png

  1. gitlab ci/cd

    进入settings中的ci/cd页面,展开 runners选项卡,显示gitlab-runner配置。url和token要记录下来,一会要用。下方的runner就是我们项目中已经注册好的,并且显示各自的状态和介绍

image.png

  1. gitlab-runner
    follow me
    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
   # --restart always  浏览器重启策略  always  在容器推出时总是重启容器
   # -v 映射 将原文件/目录 映射到目标文件/目录 
   
   docker run --rm  -it -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register
   # 使用一次性容器来便捷注册
   # --rm 容器推出时清理用户数据
  1. 注册runner,填写信息 紧接着上个步骤

url ==》步骤2图中的url
token ==》步骤2图中的token
description ==》步骤2图中展示的name
tags ==> 步骤2中tags,可以写多个,英文逗号隔开 maintenance ==> 维护说明,可写可不写
executor ==> docker,优点多多
docker-images ==> alpine:latest 小且美的操作系统镜像,自带包管理apk
完成后 此时gitlab就会展示注册的runner

  1. 在编辑项目gitlab-ci.yml前,需要提前解决两个问题
  • gitlab-runner权限问题
    原因:用户操作docker、创建删除文件需要添加权限 解决:给gitlab-runner用户设置root权限
    useradd -m -g gitlab-runner gitlab-runner # 添加 用户组 + 用户
    sudo vim /etc/passwd # 查看系统用户
    # 将下面图中位置数字改为0:0    和root相同

image.png

  • 文件传输需要密码问题 原因:后续需要将拉去的项目代码映射到服务器中,需要服务器密码 解决:ssh配置
    cd ~/.ssh # 查看是否存在密钥
    ssh-keygen -t rsa # 生成密钥
    cat id_rsa    #查看私钥
    cat id_rsa.pub # 查看公钥

将私钥、公钥、ip等信息存放在项目CI/CD的公共变量中,在gitlab-ci.yml文件中使用 image.png

image.png

image.png

  1. gitlab-ci.yml
    先简单叙述下编写规则,直接写案例,详细教学
    # 后可以写注释
    # 缩进代表层级 - 代表上一级是数组(列表)
    before_script: # 编译前输出 
        - echo '开始'
    after_script: # 编译后输出
        - echo '结束'
    catch: # 缓存 
        key: 'test'
        paths:
            - 'node_modules/'
            - 'dist/'
    stages:  # 定义构建阶段
        - install # 每个阶段名字。可以随意命名
        - build
        - deploy
    job1:
            image: node # 镜像名
        stage: build: # 阶段
        script:
            - npm i
            - npm run build
        only: 
            - 定义执行规则
        tags:
            - tag # 对应每个runner注册时写的tag,对应上的runner执行
        artifacts: # 传递打包文件
            expire_in: 1 week # 工件有效期
            paths: # 缓存目录
              - dist 

案例:::项目增加gitlab-ci.yml, test分支更新就会执行

cache: # 缓存
  key: $CI_PROJECT_NAME
  paths:
    - node_modules/
    - dist/

before_script:
  - echo $CI_COMMIT_REF_NAME # tag名或者分支名

job1:
  image: node
  stage: build
  script:
    - npm i
    - npm run build
  only: # 定义哪些分支或标签会运行 except 定义哪些分支或标签不会运行 
    - test
  tags: # 指定runner
    - tag
  artifacts: # 传递打包文件
    expire_in: 1 week # 工件有效期
    paths: # 缓存目录
      - dist

job2:
  image: alpine
  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   ./dist/  $SERVER_HOST:$SERVER_PATH # 文件映射
  only: 
    - test
  tags:
    - tag

7.查看CI/CD pipelines

image.png 点击进程可以查看详情

image.png 成功之后我们更新的dist文件就到了服务器的静态文件夹中

  1. nginx发布
    docker pull nginx:latest
    docker run --name test -p 8087:80 -v  /静态文件夹:/usr/share/nginx/html -d nginx
    # -p 端口映射
    # -d 后台运行

完成撒花🎉🎉🎉

个别问题

  • 有的同学服务器是在内网中的,项目中给出的URL是内网域名而不是IP,那么我们在注册runner的时候url输入http:// + ip, 然后sudo打开 /srv/gitlab-runner/config/config.toml ,对runner增加域名:ip映射

image.png 遇到有关问题持续更新 参考文章: