Home CICD
Post
Cancel

CICD

CI/CD Tool

Docker+Jenkins+GitLab 搭建 CI/CD 系统

  • 第一步:安装 Docker
  • 第二步:安装 GitLab
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
      docker run -d \
      --hostname localhost \
      -p 8080:80 -p 2222:22 \
      --name gitlab \
      --restart always \
      --volume /tmp/gitlab/config:/etc/gitlab \
      --volume /tmp/gitlab/logs:/var/log/gitlab \
      --volume /tmp/gitlab/data:/var/opt/gitlab \
      gitlab/gitlab-ce:13.3.8-ce.0
    
  • 第三步:安装 Jenkins
    1
    2
    3
    4
    5
    6
    7
    8
    
      docker run -d --name=jenkins \
      -p 8888:8080 \
      -u root \
      --restart always \
      -v /var/run/docker.sock:/var/run/docker.sock \
      -v /usr/bin/docker:/usr/bin/docker \
      -v /tmp/jenkins_home:/var/jenkins_home \
      jenkins/jenkins:lts
    
  • 解锁jenkins
    1
    
    docker logs -f jenkins
    
  • 配置 GitLab SSH 访问公钥
    1
    2
    
    ssh-keygen -o -t rsa -b 2048 -C "email@example.com"
    cat $HOME/.ssh/id_rsa.pub
    
  • 上传服务代码到 GitLab
  • 创建 Jenkins 任务
  • 配置自动构建
  • 配置自动部署

使用Gitlab Runner部署

  • 新建部署用户
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  #创建一个deployer用户
  sudo useradd deployer
  
  #修改用户权限,允许其新建目录等命令操作
  ls -l /etc/sudoers
  chmod -v u+w /etc/sudoers
  #在最下面增加一个用户
  vim /etc/sudoers
  deployer        ALL=(ALL)       NOPASSWD: ALL
  #写权限收回
  chmod -v u-w /etc/sudoers
  #设置用户密码
  passwd deployer
  #登录
  ssh deployer@ip_address
  #生成秘钥
  ssh-keygen -t rsa
  #查看私钥
  cat /home/deployer/.ssh/id_rsa
  • 安装 Gitlab Runner(docker)
  • Install GitLab Runner
    1
    2
    3
    4
    
    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:latest
    

    windows => 加入参数 –user root

  • 新注册Gitlab Runner
    1
    
    gitlab-runner register
    
  • 新建.gitlab.ci.yml配置文件(php demo)
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
  variables:
    RELEASES_STORAGE_DIR: '/var/www/$CI_COMMIT_REF_NAME/$CI_PROJECT_PATH/storage'
    CREATE_RELEASES_STORAGE_DIR: '[ -d $RELEASES_STORAGE_DIR ] || sudo mkdir -p $RELEASES_STORAGE_DIR'
    RELEASES_DIR: '/var/www/$CI_COMMIT_REF_NAME/$CI_PROJECT_PATH/releases'
    CREATE_RELEASE_DIR: '[ -d $RELEASES_DIR ] || sudo mkdir -p $RELEASES_DIR'
    NEW_RELEASES_DIR: '$RELEASES_DIR/$CI_COMMIT_SHORT_SHA'
    CREATE_NEW_RELEASES_DIR: '[ -d $NEW_RELEASES_DIR ] || sudo mkdir -p $NEW_RELEASES_DIR'
    BEFORE_CHMOD: 'sudo chown -R deployer:deployer $NEW_RELEASES_DIR'
    BEFORE_CHMOD_VENDOR: 'sudo chown -R deployer:deployer $NEW_RELEASES_DIR/vendor'
    AFTER_CHMOD: 'sudo chown -R apache:apache /var/www/$CI_COMMIT_REF_NAME && sudo chown -R apache:apache $RELEASES_STORAGE_DIR && sudo chmod -R 777 $RELEASES_STORAGE_DIR'
    CD_NEW_RELEASES_DIR: 'cd $NEW_RELEASES_DIR'
    CD_RELEASES_DIR: 'cd $RELEASES_DIR'
    #Linux删除除了某个文件之外的所有文件/目录
    CLEAN_RELEASES_DIR: 'ls |grep -v $CI_COMMIT_SHORT_SHA |xargs sudo rm -rf'
    RM_RELEASE_STORAGE_DIR: 'sudo rm -rf $NEW_RELEASES_DIR/storage'
    LN_RELEASE_STORAGE_DIR: 'sudo ln -nfs $RELEASES_STORAGE_DIR $NEW_RELEASES_DIR/storage'
    LN_RELEASE_DIR: 'sudo ln -nfs $NEW_RELEASES_DIR /var/www/$CI_COMMIT_REF_NAME/$CI_PROJECT_PATH/current'
    MV_REPO: 'sudo mv -fv /home/deployer/$CI_PROJECT_DIR/* $NEW_RELEASES_DIR'
    CP_DEV_ENV: 'cp /home/deployer/$CI_PROJECT_DIR/.env.dev $NEW_RELEASES_DIR/.env'
    CREATE_FRAMEWORK_CACHE: '[ -d $RELEASES_STORAGE_DIR/framework/cache ] || sudo mkdir -p $RELEASES_STORAGE_DIR/framework/cache'
    CREATE_FRAMEWORK_SESSIONS: '[ -d $RELEASES_STORAGE_DIR/framework/sessions ] || sudo mkdir -p $RELEASES_STORAGE_DIR/framework/sessions'
    CREATE_FRAMEWORK_TESTING: '[ -d $RELEASES_STORAGE_DIR/framework/testing ] || sudo mkdir -p $RELEASES_STORAGE_DIR/framework/testing'
    CREATE_FRAMEWORK_VIEWS: '[ -d $RELEASES_STORAGE_DIR/framework/views ] || sudo mkdir -p $RELEASES_STORAGE_DIR/framework/views'
  
  
  before_script:
    - echo "Before script"
    - echo $CI_COMMIT_REF_NAME
    - echo $CI_PROJECT_PATH
    - echo $CI_COMMIT_SHORT_SHA
    - echo $CI_REPOSITORY_URL
    - echo $CI_PROJECT_DIR
    - 'eval $CREATE_RELEASES_STORAGE_DIR'  # will execute
    - 'eval $CREATE_RELEASE_DIR'  # will execute
    - 'eval $CREATE_NEW_RELEASES_DIR'  # will execute
    - 'eval $CD_NEW_RELEASES_DIR'
  
  
  stages:
    - build
    - test
    - deploy-dev
  
  building:
    stage: build
    script:
      - echo "Move repo..."
      - echo $NEW_RELEASES_DIR
      - 'eval $BEFORE_CHMOD'
      - 'eval $MV_REPO'
      - composer install
      - 'eval $BEFORE_CHMOD_VENDOR'
  
  testing:
    stage: test
    script:
      - echo "testing..."
      # - php ./vendor/bin/phpunit
  
  deploying_dev:
    stage: deploy-dev
    script:
      - echo "deploying dev..."
      - 'eval $CP_DEV_ENV'
      - php artisan key:generate
      - 'eval $CREATE_FRAMEWORK_CACHE'
      - 'eval $CREATE_FRAMEWORK_SESSIONS'
      - 'eval $CREATE_FRAMEWORK_TESTING'
      - 'eval $CREATE_FRAMEWORK_VIEWS'
      - php artisan cache:clear
      - php artisan config:clear
      - php artisan storage:link
      - php artisan migrate --force
      - php artisan passport:keys
      - echo "Restarting supervisor"
      - sudo supervisorctl restart all
      - echo "Linking storage directory"
      - 'eval $RM_RELEASE_STORAGE_DIR'
      - 'eval $LN_RELEASE_STORAGE_DIR'
      - echo 'Linking current directory'
      - 'eval $AFTER_CHMOD'
      - 'eval $LN_RELEASE_DIR'
      - echo 'Removing earlier app'
      - 'eval $CD_RELEASES_DIR'
      - 'eval $CLEAN_RELEASES_DIR'
    only:
      - develop
  
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
28
29
30
  before_script:
      - date
  stages:
      - build
      - test
      - deploy
  
  deploy_in_web1:
      stage: deploy
      script:
          - git checkout master
          - git pull
          - rsync -rvz --no-owner --no-group --no-perms --progress --exclude=".*" --exclude="/vendor" --delete $CI_PROJECT_DIR/ /data/项目路径
      only:
          - master
      tags:
          - "web1"
          
  
  #配置多台机器,新增配置即可
  deploy_in_web2:
      stage: deploy
      script:
          - git checkout master
          - git pull
          - rsync -rvz --no-owner --no-group --no-perms --progress --exclude=".*" --exclude="/vendor" --delete $CI_PROJECT_DIR/ /data/项目路径
      only:
          - master
      tags:
          - "web2"
This post is licensed under CC BY 4.0 by the author.

Roadmap

Docker