gitlab_runner

gitlab_runner
安装

sudo docker run -d --name gitlab-runner --restart always \
  -v /home/gitlab-runner/config:/etc/gitlab-runner \
  -v /var/run/docker.sock:/var/run/docker.sock \
  gitlab/gitlab-runner:latest 

映射/var/run/docker.sock这个文件是为了让容器可以通过/var/run/docker.sockDocker守护进程通信,管理其他Docker容器 -v /home/gitlab-runner/config:/etc/gitlab-runner是将runner的配置文件映射到宿主机/home/gitlab-runner/config方便调整和查看配置

安装完成需要去注册Gitlab-Runner。

运行docker ps查看:

root@iZm5ebvlfc3n55vzckl9ifZ:/home/docker/gitlab# docker ps
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS                 PORTS                                                                         NAMES
ed6c7a038263        gitlab/gitlab-runner:latest   "/usr/bin/dumb-init …"   24 hours ago        Up 24 hours                                                                                          gitlab-runner
ddc7d0e214ef        twang2218/gitlab-ce-zh        "/assets/wrapper"        30 hours ago        Up 6 hours (healthy)   80/tcp, 0.0.0.0:8084->8084/tcp, 0.0.0.0:2222->22/tcp, 0.0.0.0:8443->443/tcp   gitlab_web_1 

注册

docker run --rm -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register \
  --non-interactive \
  --executor "docker" \
  --docker-image alpine:latest \
  --url "" \
  --registration-token "" \
  --description "first-register-runner" \
  --tag-list "vue3-app" \
  --run-untagged="true" \
  --locked="false" \
  --access-level="not_protected" 

注册需要输出url,token,描述,tag,执行器等,url和token怎么来的呢?在设置->CI/CD->Runner里面,这里面注册了一个专用的和共享的Runner,正常情况用专用Runner就可以了。共享版Runner是登录root账户在头部小扳手图片里面的Runner得到url和token,然后去注册。这里面的tag值会在编写.gitlab-ci.yml时用到。

运行流水线

在项目根目录里面创建一个.gitlab-ci.yml,编写代码如下:

image: node:alpine

stages: # 分段
  - install
  - eslint
  - build
  - deploy

cache: # 缓存
  paths:
    - node_modules

job_install:
  tags:
    - vue3-app
  stage: install
  script:
    - npm install

job_build:
  tags:
    - vue3-app
  stage: build
  script:
    - npm run build 

参数说明:

  • stages:pipeline的阶段列表,定义整个pipeline阶段
  • stage:定义某个job的所在阶段
  • image:指定一个基础Docker进行作为基础运行环境,比如:node,python,java
  • tags:用于指定Runner,tags的取值范围是在该项目可惜可见的runner tags中,也就是前面设置的那个tag
  • only/except:知道当前任务条件
  • when:实现在发生故障时仍能运行的作业
  • cache:讲当前工作环境目录中的一些文件,文件夹存储起来,用于在各个任务初始化的时候恢复
  • environment:指定部署相关任务的环境,并非真实环境,是对要部署到某环境的任务的归类。方便在gitlab上聚合以便进行回滚和重新部署操作
  • artifacts:保留文档。在每次 job 之前runner会清除未被 git 跟踪的文件。为了让编译或其他操作后的产物可以留存到后续使用,添加该参数并设置保留的目录,保留时间等。被保留的文件将被上传到gitlab以备后续使用。
  • dependencies:任务依赖。指定job的前置job。添加该参数后,可以获取到前置job的artifacts。注意如果前置 job 执行失败,导致没能生成artifacts,则 job 也会直接失败。

编写好上面代码后推送到gitlab后就会自己执行里面的语句:

部署

在项目中创建一个Dockerfile,代码如下:

FROM node:latest as builder
WORKDIR /app
COPY  package.json
RUN npm install --registry=http://registry.npm.taobao.org
COPY ..
RUN npm run build

FROM nginx:latest
COPY --from=builder /app/dist /usr/share/nginx/html 

.gitlab-ci.yml修改如下:

image: node:alpine

stages: # 分段
  - install
  - eslint
  - build
  - deploy

cache: # 缓存
  paths:
    - node_modules

job_install:
  tags:
    - vue3-app
  stage: install
  script:
    - npm install

job_build:
  tags:
    - vue3-app
  stage: build
  script:
    - npm run build

job_deploy:
    image: docker
    stage: deploy
    script:
      - docker build -t appimages
      - if [ $(docker ps -aq --filter name=app-container) ]; then docker rm -f app-container;fi
      - docker run -d -p 8082:80 --name app-container appimages 

if语句判断:使用docker命令去搜索docker容器里面是否有一个name为app-container的容器,如果有就销毁掉,销毁掉是为了使用新的容器重新运行。

这里image:docker不写的话会报错:

代码推送后,流水线工作,到第三步就会出下报错:

解决办法,在runner配置文件中配置docker命令:

"/usr/bin/docker:/usr/bin/docker", "/var/run/docker.sock:/var/run/docker.sock" 

 

在gitlab-runner->config-vim config.toml,找到注册runner所对应的token,在volumes数组里面加入上面命令:

concurrent = 1
check_interval = 0

[session_server]
  session_timeout = 1800
  
[[runners]]
  name = "first-register-runner"
  url = ""
  token = ""
  executor = "docker"
  [runners.custom_build_dir]
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]
  [runners.docker]
    tls_verify = false
    image = "alpine:latest"
    privileged = false
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/cache","/usr/bin/docker:/usr/bin/docker", "/var/run/docker.sock:/var/run/docker.sock"]
    shm_size = 0 

再去重新运行失败的Jobs,这时候发现成功了:

然后通过前面注册的端口号去访问,可以正常访问项目。

posted @ 2022-02-08 18:10  Wolf_Stark  阅读(184)  评论(0)    收藏  举报