日期: 2022 年 9 月 5 日

  • 在docker中的jenkins中调用composer

    假定部署环境使用的是futuremeng/dnmp(fork自yeszao/dnmp),我在其中增加了一个jenkins,那么当jenkins部署php项目时,除了拉取代码,我还会在shell中修改env为当前实例所需的配置,然后接下来,就是执行composer来构建项目需要的包。之前,我是在jenkins容器中又不得已安装了一个php和composer,这显然是和dnmp下面的php重复了,完全没有必要。

    所以接下来,我查到了在docker-compose.yml的jenkins配置中:

      jenkins:
        image: jenkins/jenkins:${JENKINS_VERSION}
        container_name: jenkins
        volumes:
            - ${JENKINS_HOME_DIR}:/var/jenkins_home
            - ${JENKINS_CERTS_DIR}:/certs/client
            - ${SOURCE_DIR}:/www/:rw
            - ${TOMCAT_WEBAPPS_DIR}:/webapps/:rw
            - /var/run/docker.sock:/var/run/docker.sock
            - /usr/bin/docker:/usr/bin/docker
            - /usr/lib/x86_64-linux-gnu/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7
        ports:
            - "${JENKINS_HTTP_PORT}:8080"
        expose:
            - "8080"
            - "50000"
        privileged: true
        user: root
        restart: always
        environment:
            TZ: "$TZ"
            JAVA_OPTS: '-Djava.util.logging.config.file=/var/jenkins_home/log.properties'
            JENKINS_OPTS: '--prefix=/jenkins'
        networks:
          - default

    设置了

    - /var/run/docker.sock:/var/run/docker.sock

    这一项,其实本来就是为了让容器也能直接调用宿主机的docker命令,我试了一下docker ps -a,真的没问题,那么我就把本来用在宿主机的命令拿过来,比如bash.alias.sample文件中的:

    # php composer
    composer () {
        tty=
        tty -s && tty=--tty
        docker run \
            $tty \
            --interactive \
            --rm \
            --user www-data:www-data \
            --volume ~/dnmp/data/composer:/tmp/composer \
            --volume $(pwd):/app \
            --workdir /app \
            dnmp_php composer "$@"
    }

    将其中的命令改为:

        tty=
        tty -s && tty=--tty
        docker run \
            $tty \
            --interactive \
            --rm \
            --user www-data:www-data \
            --volume /dnmp/data/composer:/tmp/composer \
            --volume /dnmp/www:/app \
            --workdir /app \
            dnmp_php composer install

    其中,我把$(pwd)改为了laravel项目所在的地址,这个地址是宿主机的地址,因为这里的docker命令是宿主机的。另外,/dnmp/data/composer也是对应宿主机中的composer缓存文件夹地址。”$@”则直接写上了install

  • jenkins中通过Global Tool安装nodejs须要注意npm版本可能过低

    初始化jenkins之后,通过Global Tool安装nodejs的某个版本,过高了项目不匹配,跑不通,比如我选择了一个node14.22.0,但依然构建不成功,报错:

    npm WARN read-shrinkwrap This version of npm is compatible with lockfileVersion@1, but package-lock.json was generated for lockfileVersion@2. I'll try to do my best with it!

    以及:

    -  Building for production...
     ERROR  Error: Cannot find module 'html-webpack-plugin'

    后来查到尽管用的是nodejs14,但其中的npm版本低了,用npm -v看了一下是6,其中从第一个报错就应该意识到要升级npm了,所以在shell中加上了:

    npm install -g npm