共计 3366 个字符,预计需要花费 9 分钟才能阅读完成。
背景
之前文章 WordPress 性能优化-Redis篇 提到过,如何在 wordpress 中启用 redis 加快站点访问速度。
当时实现方式为在 docker-compose 中配置 build 构建新的镜像。
而下文会从0开始指导如何构建包含redis、memcache php拓展的 wordpress镜像,并使用 jenkins 流水线构建镜像并发布到私有化镜像仓库。
实践
Gitlab
编写 docker file 和 jenkinsfile
dockerfile 和 Jenkinsfile 已测试通过。
流水线将会从 自建的 gitlab 仓库拉取项目代码(Jenkinsfile、Dockerfile)。
对比 WordPress 性能优化-Redis篇,优化了Dockerfile。
引入 https://github.com/mlocati/docker-php-extension-installer 脚本可以简化 php 拓展的编译。
# cat Dockerfile
FROM wordpress:latest
USER root
# 安装 php extension. ref: https://github.com/mlocati/docker-php-extension-installer
ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/
RUN chmod +x /usr/local/bin/install-php-extensions && \
install-php-extensions redis memcached
Jenkinsfile 包含 3个 串行的stage 和 1个 post:
- stage(‘Checkout’):检出代码
- stage(‘Build Docker Image’):构建镜像
- stage(‘Push Docker Image’):推送镜像
- post:构建完毕后,执行清理
# cat Jenkinsfile
pipeline {
agent any
// 添加选项配置区块
options {
disableConcurrentBuilds()
// 保持构建历史数量
buildDiscarder(logRotator(numToKeepStr: '100'))
}
environment {
DOCKER_REGISTRY = "***.cn"
DOCKER_IMAGE = "${DOCKER_REGISTRY}/my-wordpress/wordpress"
BUILD_TIMESTAMP = sh(script: 'date "+%Y%m%d_%H%M%S"', returnStdout: true).trim()
GIT_COMMIT_SHORT = sh(script: 'git rev-parse --short HEAD', returnStdout: true).trim()
IMAGE_TAG = "${BUILD_TIMESTAMP}-${GIT_COMMIT_SHORT}-b${BUILD_NUMBER}"
}
stages {
// 添加阶段描述
stage('Checkout') {
steps {
checkout scm
}
}
//构建镜像
stage('Build Docker Image') {
steps {
script {
def dockerBuildCmd = """
docker build \
--no-cache \
--pull \
-t ${DOCKER_IMAGE}:${IMAGE_TAG} \
-t ${DOCKER_IMAGE}:latest \
.
"""
sh dockerBuildCmd
}
}
}
//推送镜像
stage('Push Docker Image') {
steps {
script {
withCredentials([usernamePassword(
credentialsId: 'my-wordpress-harbor-token',
passwordVariable: 'HARBOR_PASSWORD',
usernameVariable: 'HARBOR_USERNAME'
)]) {
// 使用更安全的凭证处理方式
sh '''#!/bin/bash -e
echo "$HARBOR_PASSWORD" | docker login "$DOCKER_REGISTRY" -u "$HARBOR_USERNAME" --password-stdin
docker push "${DOCKER_IMAGE}:${IMAGE_TAG}"
docker push "${DOCKER_IMAGE}:latest"
'''
}
}
}
}
}
post {
always {
// 添加清理说明
echo "Cleaning up docker images..."
sh '''#!/bin/bash
docker rmi "${DOCKER_IMAGE}:${IMAGE_TAG}" || true
docker rmi "${DOCKER_IMAGE}:latest" || true
'''
// 清理工作空间
cleanWs()
}
failure {
echo "Pipeline failed! Please check the logs for details."
}
success {
echo "Pipeline completed successfully!"
}
}
}
创建项目
# 创建本地项目目录
mkdir /data/git/my-wordpress && cd /data/git/my-wordpress
# 编辑项目文件
# ls -la
total 16
drwxr-xr-x 2 root root 4096 Nov 14 11:23 .
drwxr-xr-x 5 root root 4096 Nov 14 11:21 ..
-rw-r--r-- 1 root root 348 Nov 14 11:23 Dockerfile
-rw-r--r-- 1 root root 2635 Nov 14 19:37 Jenkinsfile
-rw-r--r-- 1 root root 162 Nov 14 11:23 RREADME.md
# 初始化本地项目并推动到远程仓库
git init --initial-branch=main
git add .
git commit -m "Initial commit "
git remote add origin ssh://git@gitlab.opshub.cn:33322/pengyinwei/my-wordpress.git
git push --set-upstream origin main
配置访问凭证
此访问凭证需要存入到 jenkins 中,用于拉取项目。
设置 –> 仓库 –> 部署令牌
Harbor
Harbor 的部署可参考站内文章:Harbor 镜像仓库部署
在 Harbor 中创建一个新项目,和一个用户,并在项目中给用户授权。
此用户需要存入到 jenkins 中,用于推送镜像。
镜像仓库创建访问凭证用户:jenkins-my-wordpress
镜像仓库创建项目:my-wordpress,并授权给用户jenkins-my-wordpress
Jenkins
部署
关于 jenkins 部署,以及如何在docker 部署的 jenkins 调用 docker 客户端,参考站内文章:docker 部署的 jenkins 调用 docker 客户端。
录入凭证
系统管理 –> 凭据管理 –> 系统 –> 全局凭据 –> Add Credentials
将 gitlab 和 harbor 凭证录入,录入后 ID 作为 jenkins 的唯一参数ID来调用。
创建流水线任务
新建任务 –> 流水线
使用 Pipeline script from SCM 方式而不是 Pipeline script 管理,这样可以将 jenkinsfile 在 gitlab 中统一维护。
- 配置项目地址
- 配置 gitlab 凭证
- 指定分支
执行构建
点击 立即构建:
构建执行后可以实时查看输出:
构建完毕后,Harbor 上查看镜像:
总结
本文将个人场景中的 wordpress 部署方式使用 jenkins 流水线实现。
流水线并没有定义的太复杂,仅仅是完成构建和推送镜像。
实际生产中,可以在流水线中引入更多动作,增强可观测性和可靠性:
- 构建完毕后发送通知
- 镜像安全扫描
- 部署流水线
- 集成测试