1. Create projects

vue create vue3-admin
git remote add origin "xxxxx"
git branch -M master
git push -f -u origin master
Copy the code

2. Draft gitlab – ci. Yml

# define 3 stages: -test-build-deploy 192.168.200.101 # SSH deployment address CONTAINER_DEV: ${CI_PROJECT_NAME}_${CI_PROJECT_ID}_${CI_DEV} # CONTAINER_PROD: ${CI_PROJECT_NAME}_${CI_PROJECT_ID}_${CI_PROD} # CONTAINER_DEV_IMAGE: ${CI_REGISTRY_IMAGE}:${CI_COMMIT_TAG} # CONTAINER_PROD_IMAGE: ${CI_REGISTRY_IMAGE}:${CI_COMMIT_TAG} # production CI_PROD: production CI_DEV: development http://192.168.200.100 # Production environment deployment address CI_DEV_URL: http://192.168.200.100 # Development environment deployment address CI_PROD_PORT: 7080 # Production environment deployment port CI_DEV_PORT: Build_dev: stage: build # - docker # Use docker executor only: variables: -$CI_COMMIT_TAG =~ /^dev.*/ # This phase is added only if the tag name starts with dev. Before_script: # login docker registry - echo "$CI_REGISTRY_PASSWORD" | docker login $$CI_REGISTRY_USER CI_REGISTRY - username --password-stdin script: -echo "-- build_dev --" -docker build -t $CONTAINER_DEV_IMAGE -f dockerfile. dev --force-rm $CONTAINER_DEV_IMAGE # build_prod: stage: build tags: - docker only: variables: - $CI_COMMIT_TAG =~ /^release.*/ before_script: - echo "$CI_REGISTRY_PASSWORD" | docker login $CI_REGISTRY --username $CI_REGISTRY_USER --password-stdin script: - echo "--- build_prod ---" - docker build -t $CONTAINER_PROD_IMAGE -f Dockerfile.prod --force-rm . - docker push $CONTAINER_PROD_IMAGE # deploy_dev: stage: deploy # Variables: GIT_STRATEGY: None # - $CI_COMMIT_TAG =~ /^dev.*/ # tags start with dev, this stage can be added before_script: # login docker registry - echo "$CI_REGISTRY_PASSWORD" | docker login $$CI_REGISTRY_USER CI_REGISTRY - username --password-stdin script: -echo "-- deploy_dev --" -docker container rm $CONTAINER_DEV -f # Stop and delete old containers -docker run -d -p $CI_DEV_PORT:80 --restart always --name $CONTAINER_DEV $CONTAINER_DEV_IMAGE # Start container # production deploy_prod: stage: deploy variables: GIT_STRATEGY: none tags: - docker only: variables: - $CI_COMMIT_TAG =~ /^release.*/ environment: name: $CI_PROD url: $CI_PROD_URL:$CI_PROD_PORT before_script: - echo "$CI_REGISTRY_PASSWORD" | docker login $CI_REGISTRY --username $CI_REGISTRY_USER --password-stdin script: - echo "--- deploy_prod ---" - docker container rm $CONTAINER_PROD -f - docker run -d -p $CI_PROD_PORT:80 --restart=always --name $CONTAINER_PROD $CONTAINER_PROD_IMAGE # Remote production deploy_ssh_PROd: stage: deploy # GIT_STRATEGY: none # SSH executor only: variables: - $CI_COMMIT_TAG =~ /^release.*/ # $CI_PROD # Environment name URL :$SSH_SERVER:$CI_PROD_PORT # Deployment address before_script: # configure SSH remote login - eval $(SSH) agent - s - echo "$SSH_PRIVATE_KEY" | tr -d '\ r | SSH - add - the mkdir -p ~ /. SSH - chmod 700 ~/.ssh script: SSH remote login Perform the deployment scripts - > SSH -o StrictHostKeyChecking = no root @ ${SSH_SERVER} "echo $CI_REGISTRY_PASSWORD | docker $CI_REGISTRY login --username $CI_REGISTRY_USER --password-stdin; docker container rm $CONTAINER_PROD -f; Docker run -d -p $CI_PROD_PORT:80 --restart=always --name $CONTAINER_PROD $CONTAINER_PROD_IMAGE deploy_ssh_dev: stage: deploy variables: GIT_STRATEGY: none tags: - ssh only: variables: - $CI_COMMIT_TAG =~ /^dev.*/ when: manual environment: name: $CI_DEV url: $SSH_SERVER:$CI_DEV_PORT before_script: - eval $(ssh-agent -s) - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - - mkdir -p ~/.ssh - chmod 700 ~/.ssh script: - > ssh -o StrictHostKeyChecking=no root@${SSH_SERVER} " echo $CI_REGISTRY_PASSWORD | docker login $CI_REGISTRY --username $CI_REGISTRY_USER --password-stdin; docker container rm $CONTAINER_DEV -f; docker run -d -p $CI_DEV_PORT:80 --restart=always --name $CONTAINER_DEV $CONTAINER_DEV_IMAGE "Copy the code

3. Draft Dockerfile

Dockerfile.dev

FROM node:14.15.1 AS Builder WORKDIR /app COPY package*.eslintrc.js.dockerignore./ RUN NPM install COPY public ./public COPY src ./src RUN npm run build:dev FROM nginx:alpine COPY --from=builder /app/dist /usr/share/nginx/htmlCopy the code

Dockerfile.prod

FROM node:14.15.1 AS Builder WORKDIR /app COPY package*.eslintrc.js.dockerignore./RUN NPM install COPY public ./public COPY src ./src RUN npm run build:prod FROM nginx:alpine COPY --from=builder /app/dist /usr/share/nginx/htmlCopy the code

.dockerignore

node_modules
Copy the code

4. Configuration gitlab

  1. Configuration gitlab – runner

    A. install gitlab – runner

    Juejin. Cn/post / 691060…

    B. the registered runner

    Enter the following command and fill in the relevant information gitlab-runner register as promptedCopy the code

    C. Configure docker Runner

    Docker in docker service 2. bind sock 3. shell executor /etc/gitlab-runner/config.toml Disable privileged mode; Bind sock files; Json file [runners. Docker] tls_verify=false image="docker:latest" Privileged =false volumes = ["/cache","/etc/docker/daemon.json:/etc/docker/daemon.json:ro","/var/run/docker.sock:/var/run/docker.sock"] # The daemon. {json file "registry - mirrors" : (" https://0d08o2ps.mirror.aliyuncs.com "), "Insecure - registries:"/" 192.168.200.100:5050 "}Copy the code

D. Configure shell Runner (optional, mainly for SSH deployment)

2. gitlab-registry

# edit/etc/gitlab/gitlab rb registry_external_url 'http://192.168.200.100:5050' # # gitlab - CTL reconfigure gitlab - CTL restartCopy the code

4. Release

Configuring email notification:

Settings > Integration > Email Pipelien status Fill in the Email address, pipeline branch trigger # commit code, tag, push tag completeCopy the code

Reference 5.

docs.gitlab.com/ee/ci/