自动化部署

私有化部署gitlab

  • 安装 Docker 和 Docker Compose(如果尚未安装)。

  • 创建一个目录用于存储 GitLab 配置文件和数据
    mkdir -p /srv/gitlab/config /srv/gitlab/data /srv/gitlab/logs
    -创建并编辑 docker-compose.yml 文件

    version: '3'
    services:
    gitlab:
    image: 'gitlab/gitlab-ce:latest'
    restart: unless-stopped
    hostname: 'your-gitlab-domain.com'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'https://your-gitlab-domain.com'
        gitlab_rails['gitlab_shell_ssh_port'] = 30022
    ports:
      - '443:443'
      - '80:80'
      - '30022:22'
    volumes:
      - '/srv/gitlab/config:/etc/gitlab'
      - '/srv/gitlab/logs:/var/log/gitlab'
      - '/srv/gitlab/data:/var/opt/gitlab'

    -启动 GitLab 容器
    docker-compose up -d

  • 配置 GitLab Runner
    在 GitLab 中,转到项目的 Settings -> CI/CD 页面,找到 Runners 部分。
    获取 Runner 注册令牌。
    在待执行 CI/CD 任务的服务器上安装并注册 GitLab Runner

    -v /srv/gitlab-runner/config:/etc/gitlab-runner \
    -v /var/run/docker.sock:/var/run/docker.sock \
    gitlab/gitlab-runner:latest
    docker exec -it gitlab-runner gitlab-runner register
    # 使用注册令牌进行注册
  • 重启 GitLab Runner 容器:
    docker restart gitlab-runner

前端项目文件编写

  • 根目录建立一个docker文件夹 包含docker-compose.yml 和nginx.conf文件
    docker-compose.yml

    version: "3"
    services:
    react:
    image: ccr.ccs.tencentyun.com/huozhonglu/cicd:master
    ports:
      - 8080:80
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints: [node.role == manager]
      restart_policy:
        condition: on-failure

    nginx.conf

    server {
    listen 80;
    server_name _;
    location / {
        root /usr/share/nginx/html;
        index index.html inde.htm;
        try_files $uri $uri/ /index.html =404;
    }
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
    }
  • 根目录新建.gitlab-ci.yml 和 Dockerfile文件
    .gitlab-ci.yml

    default:
    # services:
    #   - name: docker:dind
    #     alias: docker
    # cache:
    #   key: modules-cache
    #   paths:
    #     - node_modules
    # 设置变量
    variables:
    # 镜像仓库地址
    REGISTRY: ccr.ccs.tencentyun.com
    # 镜像版本
    REGISTRY_IMAGE_TAG: ccr.ccs.tencentyun.com/huozhonglu/cicd:master
    stages:
    # - install
    - build
    - deploy
    # install:
    #   image: node:latest
    #   stage: install
    #   script:
    #     - npm i
    #   only:
    #     refs:
    #       - main
    #     changes:
    #       - package.json
    #   tags:
    #     - test
    build:
    stage: build
    # before_script:
    # - echo "$DOCKER_REGISTRY_PASS" | docker login $DOCKER_REGISTRY --username $DOCKER_REGISTRY_USER --password-stdin
    script:
    - docker login -u 100028714879 -p '}!rW)Jh_5;daA3' $REGISTRY
    - docker build -t $REGISTRY_IMAGE_TAG .
    - docker push $REGISTRY_IMAGE_TAG
    #   - npm run build
    # artifacts:
    #   paths:
    #     - ./build/
    only:
    - main
    tags:
    - test
    deploy:
    stage: deploy
    script:
    # - echo "啥也不干"
    - docker login -u 100028714879 -p '}!rW)Jh_5;daA3' $REGISTRY
    - docker stack deploy -c ./docker/docker-compose.yml ${CI_PROJECT_NAME} --with-registry-auth
    - docker rm -v <code>docker ps -a -q -f status=exited</code>
    - docker rmi $(docker images -f "dangling=true" -q)
    only:
    - main
    tags:
    - test

    Dockerfile

    FROM node:latest as compile
    WORKDIR /usr/src/app/
    COPY package.json ./
    RUN npm i --registry=https://registry.npm.taobao.org
    COPY . .
    RUN npm run build
    FROM nginx
    COPY ./docker/nginx.conf /etc/nginx/conf.d/default.conf
    COPY --from=compile /usr/src/app/build /usr/share/nginx/html/
    EXPOSE 8080
    CMD ["nginx", "-g", "daemon off;"]

    备注

    我是使用腾讯云保存的镜像,而且在ci文件内部敏感信息不应该使用明文
    配置腾讯云容器镜像服务:
    登录腾讯云,进入容器镜像服务控制台。
    创建一个新的镜像仓库,并记录下仓库地址和登录凭证。
    配置 GitLab 项目:
    进入你的 GitLab 项目设置页面。
    在左侧导航栏中选择 "CI/CD",然后找到 "Variables" 部分。
    添加以下环境变量(Variable):
    TENCENT_CLOUD_USERNAME:你的腾讯云账号用户名。
    TENCENT_CLOUD_PASSWORD:你的腾讯云账号密码。
    TENCENT_CLOUD_REGISTRY:腾讯云容器镜像服务的仓库地址。

发表评论

您的电子邮箱地址不会被公开。