DevOps持续交付和持续集成已被科技公司普遍使用,它可以从代码管理到产品的交付实现全流程自动化,现在业界常规的作法是gitlab->gitlab-ci->k8s 或者 gitlab->jenkins->k8s多种方案;因为这种自动化部署可以通过K8S实现负载均衡、高可用、灵活高度等,可适用于大规模生产环境。今天介绍一个只需要gitlab和一台装有docker的服务器就可以实现的轻量级自动部署方案gitlab+docker

  • 最小化环境只需要一台装好gitlab的服务器
  • gitlab-runner非生产环境下可以和gitlab装在一起。(如果把这种轻量级的用于生产建议业务负载服务器和gitlab、gitlab-runner分开,如果你的业务较多已经是平台化的建议使用上面提到的k8s方案)。

docker安装

gitlab安装

gitlab-runner安装

在gitlab中注册gitlab-runner

  • 打开gitlab选择管理中心-runner如下图复制令牌
  • 在gitlab-runner中执行以下命令注册
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    - 1. 运行注册命令
    gitlab-runner register
    - 2. 输入gitlab实例的url
    Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )
    https://gitlab.example.com
    - 3. 输入刚复杂的令牌信息
    Please enter the gitlab-ci token for this runner
    - 4. 输入一个gitlab-runner的描述信息
    Please enter the gitlab-ci description for this runner
    [hostname] ssh
    - 5. 给gitlab-runner打一个标签,这个后面在gitlab中可以更改
    Please enter the gitlab-ci tags for this runner (comma separated):
    my-tag,another-tag
    - 6. 输入gitlab-runner的执行器(这里我们选择ssh)
    Please enter the executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell:
    ssh
这时在gitlab里就可以看到Runner已经注册上来了
  • 修改gitlab-runner配置 /etc/gitlab-runner/config.toml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    concurrent = 1
    check_interval = 0

    [session_server]
    session_timeout = 1800

    [[runners]]
    name = "ssh"
    url = "https://gitlab.example.com"
    token = "f7a4c4f95470ee192e810dddddfdf"
    executor = "ssh"
    [runners.ssh]
    host = "your ip"
    port = "22"
    user = "server username"
    password = "server password"
    identity_file = "/root/.ssh/id_rsa"

部署hexo博客项目测试

  • 项目结构:
  • Dockerfile文件 根据自己的项目调整
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     FROM hexo:latest

    MAINTAINER eddiewen email 'eddiewen@icanwen.com'

    COPY _config.yml /app/blog/_config.yml


    COPY miho /app/blog/themes/miho
    ADD source /app/blog/source
    WORKDIR /app/blog

    RUN npm install hexo-generator-json-content --save

    WORKDIR /app/blog

    RUN rm -rf source/_posts/hello-world.md

    CMD ["hexo","server"]

.gitlab-ci.yml 是定义自动部署的主要文件,每一天stage定义一个任务,例子如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
variables:
IMAGE_NAME: "registry.example.com/hexo-blog"
DOCKER_DRIVER: overlay2

before_script:
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN registry.example.com

stages:
- build
- deploy
image_build:
stage: build
tags:
- ssh
script:
- docker version
- docker build --pull -t "$IMAGE_NAME:${CI_BUILD_REF_NAME}_${CI_BUILD_REF}" .
- docker push "$IMAGE_NAME:${CI_BUILD_REF_NAME}_${CI_BUILD_REF}"

Deploy_Pro:
stage: deploy
tags:
- ssh
script:
- docker pull "$IMAGE_NAME:${CI_BUILD_REF_NAME}_${CI_BUILD_REF}"
- (if [ "$(docker ps -a | grep 'hexo server'| wc -l)" == 1 ]; then docker rm -f hexo-blog; else exit 0; fi);
- docker run -d --name hexo-blog -p 3000:3000 $IMAGE_NAME:${CI_BUILD_REF_NAME}_${CI_BUILD_REF}

保存项目提交代码

自此我们的项目就可以作到在推代码时全自动部署的功能;当然这是一个简单的项目,有很多项目不像这种展示性网站这么简单比如有下需求:

  • 一个项目有多个分支,只需要主分支才需要自动部署
  • 需要有测试环境和生产环境之分,生产环境需要审批后才能点击手动部署
  • 项目有测试DB和生产DB
  • 项目需要自动部署后就有高可用和负载均衡功能
  • 等等,我会抽空在以后的文章中涉及

最后更新: 2023年08月27日 03:06

原始链接: https://blog.icanwen.com/2019/10/21/gitlab-ci-docker/