1. 安装gitlab-runner

  1. #example
  2. docker run -d --name gitlab-runner --restart always \
  3. -v /srv/gitlab-runner/config:/etc/gitlab-runner \
  4. -v /var/run/docker.sock:/var/run/docker.sock \
  5. gitlab/gitlab-runner:latest
  1. #beta
  2. docker run -d --name gitlab-runner-beta --restart always \
  3. -v /srv/gitlab-runner-beta/config:/etc/gitlab-runner \
  4. -v /var/run/docker.sock:/var/run/docker.sock \
  5. gitlab/gitlab-runner:latest
  6. #prod
  7. docker run -d --name gitlab-runner-prod --restart always \
  8. -v /srv/gitlab-runner-prod/config:/etc/gitlab-runner \
  9. -v /var/run/docker.sock:/var/run/docker.sock \
  10. gitlab/gitlab-runner:latest

2. 注册runner(绑定gitlab项目)

基于Gitlab CI/CD做项目的持续集成与部署 - 图1

  1. #example
  2. docker exec -it gitlab-runner gitlab-ci-multi-runner register -n \
  3. --url {这里填写上图中的url} \
  4. --registration-token {这里填写上图中的token} \
  5. --executor docker \
  6. --description "gitlab-runner in docker" \
  7. --tag-list "test" \
  8. --docker-privileged=false \
  9. --docker-pull-policy="if-not-present" \
  10. --docker-image "docker:latest" \
  11. --docker-volumes /var/run/docker.sock:/var/run/docker.sock
  • url:
    gitlab ci地址
  • registration-token:
    注册Runner的令牌
  • tag-list:
    输入与Runner关联的标签,稍后可以在GitLab的UI中进行更改
  • executor:
    Runner的执行者(executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell)
  • docker-pull-policy
    设置gitlab是否从远程拉去image, 如果iamge是本地的,需要配置该属性的值为 if-not-present,这样可以避免docker 镜像每次都pull
    2.1 example
    1. docker exec -it gitlab-runner gitlab-ci-multi-runner register -n \
    2. --url https://gitlab.lazypg.com \
    3. --registration-token xDw1iFcn6C3GzjjoMWu9 \
    4. --executor docker \
    5. --description "gitlab-runner in docker" \
    6. --tag-list "test,dev" \
    7. --docker-privileged=false \
    8. --docker-pull-policy="if-not-present" \
    9. --docker-image "docker:latest" \
    10. --docker-volumes /var/run/docker.sock:/var/run/docker.sock

    3. 配置CI

    在项目的根目录增加一个.gitlab-ci.yml文件,内容如下: ``` stages:
    • build
    • update
    • deploy variables: REGISTRY: harbor.lazypg.com REGISTRY_IMAGE_TAG: harbor.lazypg.com/sloth/coupons-mgmt:test

cache: key: modules paths:

  1. - node_modules/
  2. - dist/

———-安装依赖及编译———-

build:

切换到vue环境的镜像中 在该镜像下完成编译工作

image: ebiven/vue-cli stage: build script:

  1. - npm install
  2. - npm run build-dev

只有代码push到test分支时才会触发该步骤

only:

  1. - test

使用tag为test的gitlab-runner去构建

tags:

  1. - test

———-制作镜像并上传到私有镜像仓库———-

update:

切换到docker环境的镜像中 在该镜像下完成编译镜像并推送镜像的工作

image: docker:latest stage: update script:

  1. # 登入私有镜像仓库
  2. - docker login -u $HARBOR_USERNAME -p $HARBOR_PASSWORD $REGISTRY
  3. # 根据Dockerfile文件编译image镜像
  4. - docker build -t $REGISTRY_IMAGE_TAG .
  5. # push镜像到私有仓库
  6. - docker push $REGISTRY_IMAGE_TAG

only:

  1. - test

tags:

  1. - test

————————部署————————-

deploy:

切换ubuntu作为deploy任务的镜像

image: kroniak/ssh-client stage: deploy script:

  1. # Run ssh-agent (inside the build environment)
  2. - eval $(ssh-agent -s)
  3. ##
  4. ## Add the SSH key stored in SSH_PRIVATE_KEY variable to the agent store
  5. ## We're using tr to fix line endings which makes ed25519 keys work
  6. ## without extra base64 encoding.
  7. ## https://gitlab.com/gitlab-examples/ssh-private-key/issues/1#note_48526556
  8. ##
  9. - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null
  10. # 创建SSH目录并给它正确的权限
  11. - mkdir -p ~/.ssh
  12. - chmod 700 ~/.ssh
  13. # 给runner配置ssh登录不验证HostKey
  14. - '[[ -f /.dockerenv ]] && echo -e "Host *\\n\\tStrictHostKeyChecking no\\n\\n" > ~/.ssh/config'
  15. # 采用docker-compose的方式部署服务,提前将项目中的docker-compose-ui.yml文件上传到目标服务器
  16. - scp -P $SSH_TEST_SERVER_PORT ./docker-compose-ui.yml root@$SSH_TEST_SERVER_IP:/data/docker/
  17. # 使用ssh远程登录目标服务器,并拉取之前build上传好的镜像进行部署
  18. - ssh root@$SSH_TEST_SERVER_IP -p $SSH_TEST_SERVER_PORT "docker-compose -f /data/docker/docker-compose-ui.yml pull && docker-compose -f /data/docker/docker-compose-ui.yml up -d;"

manual表示需要手动触发

when: manual

allow_failure: false only:

  1. - test

tags:

  1. - test

```

3.1 配置加密变量

有些敏感的参数我们是不希望明文暴露在.gitlab-ci.yml 中的,比如密码、私钥等. 对此,官方提供了很好的方案 GitLab CI/CD Variables,设置后,我们可以直接使用参数来代替铭感信息

基于Gitlab CI/CD做项目的持续集成与部署 - 图2

3.2 查看构建部署情况
  1. 查看Pipeline
    基于Gitlab CI/CD做项目的持续集成与部署 - 图3
  2. 查看每个Stages运行情况(或者直接在Jobs菜单下查看)
    基于Gitlab CI/CD做项目的持续集成与部署 - 图4
  3. 查看stages
    基于Gitlab CI/CD做项目的持续集成与部署 - 图5

    4.参考文档:

    https://www.jianshu.com/p/e4d12ac90439
    https://www.jianshu.com/p/b1e098cdb46b
    https://gitlab.com/gitlab-examples/ssh-private-key/blob/master/.gitlab-ci.yml
    https://gitlab.com/jyf-share/gitlab-ci-cd/blob/master/.gitlab-ci.yml