技术分享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 中的页面底部(与正文同页,便于管理)。
暂无评论,欢迎抢沙发。