diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c525978..5511045 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,23 +1,103 @@ -image: docker:19 -services: - - docker:dind - -stages: - - build - variables: - IMAGE: registry.gitlab.com/bockiii/deemix-docker IMAGE_TAG: latest + IMAGE_TAG_TEST: test DOCKER_CLI_EXPERIMENTAL: enabled PLATFORMS: "linux/amd64,linux/arm64,linux/arm/v7" + PLATFORMS_DOCKER: "linux/amd64,linux/arm64" + PLATFORMS_TEST: "linux/amd64" + PACKAGE_REGISTRY_URL: "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/deemix-docker/${CI_COMMIT_SHORT_SHA}" + ZIP_NAME: "deemix-docker" -before_script: - - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY - - apk add --update curl jq && rm -rf /var/cache/apk/* - - export CI_JOB_TIMESTAMP=$(date --utc -Iseconds) +stages: + - build-deemix + #- build-binary + - create-release + - build-docker-image -build: - stage: build +build-deemix: + image: node:16 + stage: build-deemix + script: + - apt update && apt install -y --no-install-recommends zip git curl + - git clone --depth=1 https://gitlab.com/RemixDev/deemix-gui.git --recursive + - cp server.package.json deemix-gui/server/package.json + - cd deemix-gui + - yarn config set network-timeout 1000000 -g + - yarn install-all + - yarn dist-server + - ls -al dist/ + - | + curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file dist/deemix-server-x64 ${PACKAGE_REGISTRY_URL}/deemix-server-linux-amd64 + - | + curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file dist/deemix-server-arm64 ${PACKAGE_REGISTRY_URL}/deemix-server-linux-arm64 + only: + refs: + - CI-test + #changes: + # - server.package.json + #artifacts: + # paths: + # - deemix-gui/ + + +#build-binary: +# image: docker:19 +# stage: build-binary +# services: +# - docker:dind +# before_script: +# - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY +# - apk add --update curl jq && rm -rf /var/cache/apk/* +# - export CI_JOB_TIMESTAMP=$(date --utc -Iseconds) +# - export DATE=$(date +%Y%m%d) +# script: +# # Download latest buildx bin from github +# - mkdir -p ~/.docker/cli-plugins/ +# - BUILDX_LATEST_BIN_URI=$(curl -s -L https://github.com/docker/buildx/releases/latest | grep 'linux-amd64' | grep 'href' | sed 's/.*href="/https:\/\/github.com/g; s/amd64".*/amd64/g') +# - curl -s -L ${BUILDX_LATEST_BIN_URI} -o ~/.docker/cli-plugins/docker-buildx +# - chmod a+x ~/.docker/cli-plugins/docker-buildx + # Get and run the latest docker/binfmt tag to use its qemu parts +# - BINFMT_IMAGE_TAG=$(curl -s https://registry.hub.docker.com/v2/repositories/docker/binfmt/tags | jq '.results | sort_by(.last_updated)[-1].name' -r) +# - docker run --rm --privileged docker/binfmt:${BINFMT_IMAGE_TAG} +# # create the multibuilder +# - docker buildx create --name multibuilder +# - docker buildx use multibuilder +# # build and push +# - docker buildx build --build-arg PACKAGE_REGISTRY_URL=${PACKAGE_REGISTRY_URL} --build-arg JOB_TOKEN=${CI_JOB_TOKEN} --platform "${PLATFORMS_TEST}" . -f Dockerfile.binary +# # Also can do using date, so we dont dependant on latest, in case application break again. +# #- docker buildx build --platform "${PLATFORMS}" -t ${CI_REGISTRY_IMAGE}:${DATE} -t $CI_REGISTRY_IMAGE:${IMAGE_TAG} . --push +# only: +# refs: +# - CI-test + + +create-release: + stage: create-release + image: registry.gitlab.com/gitlab-org/release-cli:latest + #rules: + # - if: $CI_COMMIT_SHA + script: + - export DATE=$(date +%Y%m%d) #Cant tag same twice use $CI_COMMIT_SHA for a while + - | + release-cli create --name "Release $DATE" --tag-name $CI_COMMIT_SHA \ + --assets-link "{\"name\":\"deemix-server-linux-amd64\",\"url\":\"${PACKAGE_REGISTRY_URL}/deemix-server-linux-amd64\"}" \ + --assets-link "{\"name\":\"deemix-server-linux-arm64\",\"url\":\"${PACKAGE_REGISTRY_URL}/deemix-server-linux-arm64\"}" + only: + refs: + - CI-test + +build-docker-image: + image: docker:19 + #dependencies: + # - build-deemix + stage: build-docker-image + services: + - docker:dind + before_script: + - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY + - apk add --update curl jq && rm -rf /var/cache/apk/* + - export CI_JOB_TIMESTAMP=$(date --utc -Iseconds) + - export DATE=$(date +%Y%m%d) script: # Download latest buildx bin from github - mkdir -p ~/.docker/cli-plugins/ @@ -31,4 +111,9 @@ build: - docker buildx create --name multibuilder - docker buildx use multibuilder # build and push - - docker buildx build --platform "${PLATFORMS}" -t $IMAGE:${IMAGE_TAG} . --push + - docker buildx build --platform "${PLATFORMS_DOCKER}" -t ${CI_REGISTRY_IMAGE}:${IMAGE_TAG_TEST} . --push + # Also can do using date, so we dont dependant on latest, in case application break again. + #- docker buildx build --platform "${PLATFORMS}" -t ${CI_REGISTRY_IMAGE}:${DATE} -t $CI_REGISTRY_IMAGE:${IMAGE_TAG} . --push + only: + refs: + - CI-test diff --git a/Dockerfile b/Dockerfile index 2b1c322..192c577 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ FROM lsiobase/ubuntu:focal - +ARG TARGETARCH ARG BUILDDATE ENV BUILDDATEENV=${BUILDDATE} @@ -10,19 +10,11 @@ LABEL \ app.deemix.image.description="Docker image for Deemix" \ maintainer="Bocki" -RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash && \ - apt-get -y --no-install-recommends install >/dev/null \ - nodejs \ - jq \ - iputils-ping \ - unzip \ - curl && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* && \ - mkdir /downloads +#RUN curl -L -o deemix.zip http://gitlab.com/Bockiii/deemix-src/-/jobs/artifacts/master/download?job=dl_src && \ +# unzip deemix -RUN curl -L -o deemix.zip http://gitlab.com/Bockiii/deemix-src/-/jobs/artifacts/master/download?job=dl_src && \ - unzip deemix +# Need look again in project num +RUN curl -L https://gitlab.com/api/v4/projects/33610953/packages/generic/deemix-docker/deemix-docker/deemix-server-linux-$TARGETARCH -o deemix-server COPY root/ / diff --git a/Dockerfile.binary b/Dockerfile.binary new file mode 100644 index 0000000..b57bcbe --- /dev/null +++ b/Dockerfile.binary @@ -0,0 +1,14 @@ +FROM node:16 +ARG PACKAGE_REGISTRY_URL +ARG TARGETARCH +ARG JOB_TOKEN +RUN apt update && apt install -y --no-install-recommends curl git && echo $TARGETARCH +COPY deemix-gui deemix-gui +WORKDIR deemix-gui/ +COPY server.package.json server/package.json +# Only install pkg +#RUN sed -i 's/node16-win-x64/node16-linux-arm64/g' server/package.json +RUN yarn config set network-timeout 1000000 -g && yarn add pkg@latest +RUN yarn dist-server && ls -al dist/ && \ + curl --header "JOB-TOKEN: ${JOB_TOKEN}" --upload-file dist/deemix-server-x64 ${PACKAGE_REGISTRY_URL}/deemix-server-linux-amd64 && \ + curl --header "JOB-TOKEN: ${JOB_TOKEN}" --upload-file dist/deemix-server-arm64 ${PACKAGE_REGISTRY_URL}/deemix-server-linux-arm64 diff --git a/root/etc/services.d/deemix/run b/root/etc/services.d/deemix/run index 97f16b1..88e521e 100644 --- a/root/etc/services.d/deemix/run +++ b/root/etc/services.d/deemix/run @@ -17,4 +17,4 @@ export DEEMIX_SERVER_PORT=$port export DEEMIX_HOST=0.0.0.0 echo "[services.d] Starting Deemix" -s6-setuidgid abc node /deemix-gui/server/dist/app.js \ No newline at end of file +s6-setuidgid abc /deemix-server diff --git a/server.package.json b/server.package.json new file mode 100644 index 0000000..543422d --- /dev/null +++ b/server.package.json @@ -0,0 +1,78 @@ +{ + "name": "@deemix-gui/deemix-server", + "version": "0.0.0", + "private": true, + "scripts": { + "start": "node dist/app.js", + "build": "webpack --env production", + + "prewatch": "yarn lint-build", + "watch": "webpack --watch", + + "lint": "eslint \"./{src, tests}/**\" --fix", + "lint-build": "eslint \"./src/**\" --fix", + "test": "jest", + "test-watch": "jest --watch" + }, + "bin": "./dist/app.js", + "pkg": { + "scripts": "./dist/**/*.js", + "assets": [ + "../webui/public/**/*", + "../package.json" + ], + "targets": [ + "node16-linux-x64", + "node16-linux-arm64" + ] + }, + "dependencies": { + "@types/node": "14.14.37", + "bufferutil": "4.0.3", + "cookie-parser": "1.4.5", + "@types/cookie-parser": "1.4.2", + "debug": "2.6.9", + "@types/debug": "4.1.5", + "deemix": "^3.6.0", + "deezer-js": "^1.3.0", + "dotenv": "8.2.0", + "express": "4.17.1", + "@types/express": "4.17.11", + "express-session": "^1.17.1", + "@types/express-session": "^1.17.3", + "memorystore": "1.6.6", + "morgan": "1.10.0", + "@types/morgan": "1.9.2", + "ramda": "0.27.1", + "@types/ramda": "0.27.40", + "utf-8-validate": "5.0.5", + "uuid": "8.3.2", + "@types/uuid": "8.3.0", + "ws": "7.4.5", + "@types/ws": "7.4.1", + "yargs": "17.0.1", + "@types/yargs": "17.0.0", + "nodemon": "2.0.7", + "nodemon-webpack-plugin": "4.5.2", + "ts-loader": "9.2.3", + "webpack": "5.41.1", + "webpack-cli": "4.7.2" + }, + "devDependencies": { + "@nuxtjs/eslint-config": "6.0.0", + "@types/jest": "26.0.22", + "@types/supertest": "2.0.11", + "@typescript-eslint/eslint-plugin": "4.21.0", + "@typescript-eslint/parser": "4.21.0", + "eslint": "7.23.0", + "eslint-config-prettier": "8.1.0", + "eslint-plugin-prettier": "3.3.1", + "jest": "26.6.3", + "ts-jest": "26.5.4", + "ts-node": "9.1.1", + "ts-node-dev": "1.1.6", + "typescript": "4.2.4", + "prettier": "2.2.1", + "supertest": "6.1.3" + } +}