Notion Blog
技术分享1 分钟阅读

gitlab python项目CI/CD配置

配置ssh key

左侧菜单栏:CI/CD 变量,添加自己的变量名和变量值

运行脚本编写

总体思路和手动执行一样,先把代码打包,然后再通过ssh上传服务器,在执行启动命令。

添加两个任务分别为:build、deploy,也可以根据需要添加自己的任务。

build

build-job:       
  image: docker:latest  
  stage: build
  artifacts:
    untracked: false
    when: on_success
    access: all
    expire_in: 30 days
    paths:
      - djangoapi.tar.gz
  script:
    - tar -czvf XXX.tar.gz *

这个build-job是一个在GitLab CI/CD(持续集成/持续部署)中定义的步骤,用于自动化Docker镜像的构建和打包过程。以下是各个部分的解释:

image: docker:latest: 这行指定使用的Docker镜像为最新的docker镜像。这通常是基础镜像,用于构建其他镜像。
stage: build: 这个阶段定义了这个job属于build阶段,即构建和测试代码阶段,不涉及部署。
artifacts:: 这部分描述了构建过程中产生的可打包文件。
untracked: false: 设置为false表示不会包含未跟踪的文件(即Git忽略的文件)。
when: on_success: 如果这个job成功完成,才会生成artifacts。
access: all: 所有GitLab用户都将能够访问这些artifacts。
expire_in: 30 days: 这些artifacts将在30天后自动过期并从存储中删除。
paths: - djangoapi.tar.gz: 指定要打包的文件,这里是名为djangoapi.tar.gz的tar.gz压缩包,包含了所有当前目录下的内容。
script:: 这是执行的命令列表。在这个例子中,tar -czvf djangoapi.tar.gz * 命令会创建一个名为djangoapi.tar.gz的压缩包,包括当前目录下所有的文件和子目录。gitlab cicd可能是对GitLab CI/CD流程的引用,但没有具体的内容,可能需要根据实际项目配置来填充。

- deploy

deploy-job:      # This job runs in the deploy stage.
  image: docker:latest
  stage: deploy  # It only runs when *both* jobs in the test stage complete successfully.
  environment: production
  script:
    - eval $(ssh-agent -s)
    - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null
    - mkdir -p ~/.ssh
    - chmod 700 ~/.ssh
    - ssh-keyscan 114.72.41.114 >> ~/.ssh/known_hosts
    - scp  XXX.tar.gz [email protected]:/apps/XXX/
    - ssh -o StrictHostKeyChecking=no [email protected] "需要执行的shell命令"
    - echo "Application successfully deployed."

这个deploy-job定义了一个在GitLab CI/CD中的部署步骤,它运行在deploy阶段。以下是各部分的解释:

image: docker:latest: 使用的是最新的Docker镜像,这通常用于部署环境。
stage: deploy: 这个job只在test阶段的两个job都成功完成后才会运行,实现连续部署策略。
environment: production: 指定部署环境为生产环境。
script:: 这里是执行的一系列命令:
eval $(ssh-agent -s): 启动SSH代理服务,用于安全地管理私钥。
echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null: 将私钥内容添加到SSH密钥代理中,这里假设SSH_PRIVATE_KEY是一个环境变量,且已清除回车符。
mkdir -p ~/.ssh 和 chmod 700 ~/.ssh: 创建并设置~/.ssh目录的权限,保证私钥的安全。
ssh-keyscan 114.72.41.114 >> ~/.ssh/known_hosts: 添加目标服务器的公钥到信任列表,防止首次连接时提示警告。
scp XXX.tar.gz [email protected]:/app/XXX/: 使用SCP协议将XXX.tar.gz文件上传到远程服务器的/apps/XXX/目录。
ssh -o StrictHostKeyChecking=no [email protected] "需要执行的shell命令": 使用SSH登录远程服务器,并执行一个shell命令。这部分需要替换为实际的命令,以解压并部署打包后的应用。
echo "Application successfully deployed.": 在部署成功后,输出一条消息确认部署完成。

完整代码示例

stages:          # List of stages for jobs, and their order of execution
  - build
  - deploy

build-job:       # This job runs in the build stage, which runs first.
  image: docker:latest
  stage: build
  artifacts:
    untracked: false
    when: on_success
    access: all
    expire_in: 30 days
    paths:
      - XXX.tar.gz
  script:
    - tar -czvf djangoapi.tar.gz *

deploy-job:      # This job runs in the deploy stage.
  image: docker:latest
  stage: deploy  # It only runs when *both* jobs in the test stage complete successfully.
  environment: production
  script:
    - eval $(ssh-agent -s)
    - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null
    - mkdir -p ~/.ssh
    - chmod 700 ~/.ssh
    - ssh-keyscan 114.72.41.114 >> ~/.ssh/known_hosts
    - scp  djangoapi.tar.gz [email protected]:/apps/XXX/
    - ssh -o StrictHostKeyChecking=no [email protected] "source /etc/profile&& cd /app/XXXX/ &&  tar -zxvf XXX.tar.gz && ./run.sh"
    - echo "Application successfully deployed."

前端打包

# GitLab CI/CD 配置文件
stages:
  - build
  - deploy

variables:
  # 项目名称
  PROJECT_NAME: "wuzhi"
  # 部署目录
  DEPLOY_DIR: "/var/www/html-test/wuzhi"

# 构建阶段
build:
  stage: build
  image: node:18  # 使用 Node.js 18 镜像
  before_script:
    - echo "开始构建前端项目..."
    - node -v
    - npm -v
  script:
    # 安装依赖
    - echo "安装项目依赖..."
    - npm install
    # 构建项目
    - echo "开始构建项目..."
    - npm run build
    # 检查 dist 文件夹是否存在
    - ls -la dist/
    # 打包 dist 文件夹内容
    - echo "打包 dist 文件夹..."
    - tar -czf ${PROJECT_NAME}-${CI_COMMIT_SHORT_SHA}.tar.gz -C dist .
    - ls -la ${PROJECT_NAME}-${CI_COMMIT_SHORT_SHA}.tar.gz
  artifacts:
    paths:
      - ${PROJECT_NAME}-${CI_COMMIT_SHORT_SHA}.tar.gz
    expire_in: 1 hour
  only:
    - main
    - test

# 测试环境部署
deploy_test:
  stage: deploy
  before_script:
    - echo "开始部署到测试环境..."
    - echo "检查部署环境:"
    - echo "$SSH_KEY" > ssh.key
    - chmod 600 ssh.key
  script:
    - echo "开始部署到测试环境..."
    # 创建部署目录(如果不存在)
    - ssh -o StrictHostKeyChecking=no app@$WK_TEST_SERVER_APP -i ssh.key "mkdir -p ${DEPLOY_DIR}"
    # 上传部署包到服务器临时目录
    - scp -i ssh.key ${PROJECT_NAME}-${CI_COMMIT_SHORT_SHA}.tar.gz app@$WK_TEST_SERVER_APP:/tmp/
    # 登录服务器执行部署:解压到目标目录
    - ssh -o StrictHostKeyChecking=no app@$WK_TEST_SERVER_APP -i ssh.key "cd ${DEPLOY_DIR} && tar -xzf /tmp/${PROJECT_NAME}-${CI_COMMIT_SHORT_SHA}.tar.gz && echo '部署完成'"
    
  dependencies:
    - build
  only:
    - test
  when: on_success  # 测试分支自动部署到测试环境

# 主分支自动部署
deploy_main:
  stage: deploy
  before_script:
    - echo "开始部署到主分支环境..."
    - echo "$SSH_KEY" > ssh.key
    - chmod 600 ssh.key
  script:
    - echo "开始部署到主分支环境..."
    # 创建部署目录(如果不存在)
    - ssh -o StrictHostKeyChecking=no app@$WK_TEST_SERVER_APP -i ssh.key "mkdir -p ${DEPLOY_DIR}"
    # 上传部署包到服务器临时目录
    - scp -i ssh.key ${PROJECT_NAME}-${CI_COMMIT_SHORT_SHA}.tar.gz app@$WK_TEST_SERVER_APP:/tmp/
    # 登录服务器执行部署:解压到目标目录
    - ssh -o StrictHostKeyChecking=no app@$WK_TEST_SERVER_APP -i ssh.key "cd ${DEPLOY_DIR} && tar -xzf /tmp/${PROJECT_NAME}-${CI_COMMIT_SHORT_SHA}.tar.gz && echo '部署完成'"

  dependencies:
    - build
  only:
    - main
  when: on_success  # 主分支自动部署

有关使用上的问题,欢迎您在底部评论区留言,一起交流~

读者评论

评论会同步写入该文在 Notion 中的页面底部(与正文同页,便于管理)。

0/1500

暂无评论,欢迎抢沙发。