依赖的 Dockerfile
在根目录下创建 Dockerfile 文件和 .gitlab-ci.yaml 文件,并复制以下内容到 Dockerfile
# This Dockerfile creates a static build image for CI
FROM openjdk:11-jdk
# Just matched `app/build.gradle`
ENV ANDROID_COMPILE_SDK "33"
# Just matched `app/build.gradle`
ENV ANDROID_BUILD_TOOLS "33.0.2"
# Just matched `app/build.gradle`
ENV ANDROID_NDK_VERSION "21.1.6352462"
# Version from https://developer.android.com/studio
ENV ANDROID_COMMAND_LINE_TOOLS "commandlinetools-linux-9477386_latest.zip"
# Flutter SDK Version
ENV FLUTTER_SDK_VERSION "3.7.12"
# CMAKE Version
ENV CMAKE_VERSION "3.10.2.4988404"
ENV ANDROID_HOME $PWD/android-sdk-linux/sdk
ENV PATH="${PATH}:${ANDROID_HOME}/platform-tools/:$PWD/flutter/bin/"
# install OS packages
RUN echo "deb https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse\ndeb-src https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse\ndeb https://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse\ndeb-src https://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse\ndeb https://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse\ndeb-src https://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse\ndeb https://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse\ndeb-src https://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse\n" > /etc/apt/sources.list
RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32
RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 871920D1991BC93C
RUN apt --quiet update --yes
RUN apt --quiet --fix-broken install
RUN apt --quiet install --yes wget tar unzip
# We use this for xxd hex->binary
RUN apt --quiet install --yes vim-common openjdk-11-jdk
# install Android SDK
RUN wget --quiet --output-document=android-sdk.zip https://dl.google.com/android/repository/${ANDROID_COMMAND_LINE_TOOLS}
RUN unzip -d android-sdk-linux android-sdk.zip && rm android-sdk.zip
RUN mkdir -p ${ANDROID_HOME}
# install sdk content [https://developer.android.com/studio/command-line/sdkmanager]
RUN echo y | ./android-sdk-linux/cmdline-tools/bin/sdkmanager --sdk_root=${ANDROID_HOME} "platforms;android-${ANDROID_COMPILE_SDK}"
RUN echo y | ./android-sdk-linux/cmdline-tools/bin/sdkmanager --sdk_root=${ANDROID_HOME} "build-tools;${ANDROID_BUILD_TOOLS}"
RUN echo y | ./android-sdk-linux/cmdline-tools/bin/sdkmanager --sdk_root=${ANDROID_HOME} "ndk;${ANDROID_NDK_VERSION}"
RUN echo y | ./android-sdk-linux/cmdline-tools/bin/sdkmanager --sdk_root=${ANDROID_HOME} "platform-tools"
RUN echo y | ./android-sdk-linux/cmdline-tools/bin/sdkmanager --sdk_root=${ANDROID_HOME} "cmake;${CMAKE_VERSION}"
# install Flutter SDK (如果依赖 flutter)
RUN wget --quiet --output-document=flutter-sdk.tar.xz https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_${FLUTTER_SDK_VERSION}-stable.tar.xz
RUN tar -xvf flutter-sdk.tar.xz && rm flutter-sdk.tar.xz
编写 .gitlab-ci.yaml Pipeline 配置文件
stages:
- environment
- build
- deploy
####################################################################################################
####################################################################################################
# 变量定义
variables:
PUBLISH:
value: "false"
description: 是否发布, false|true
options:
- "true"
- "false"
####################################################################################################
####################################################################################################
# 更新image
.updateContainerJob:
image: docker:stable
stage: environment
services:
- name: docker:dind
alias: thedockerhost
variables:
DOCKER_HOST: tcp://thedockerhost:2375/
DOCKER_DRIVER: overlay2
DOCKER_TLS_CERTDIR: ""
script:
- docker login -u username(你docker帐号名) -p password(你docker帐号的密码)
- docker pull username(你docker帐号名)/project(仓库名称) || true
- docker build --cache-from username(你docker帐号名)/project(仓库名称) -t project(仓库名称) .
- docker tag project(仓库名称) username(你docker帐号名)/project(仓库名称)
- docker push username(你docker帐号名)/project(仓库名称)
timeout: 3h 30m
tags:
- wx-docker
updateContainer:
extends: .updateContainerJob
rules:
- if: $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "master"
changes:
- Dockerfile
when: always
- when: never
ensureContainer:
extends: .updateContainerJob
allow_failure: true
before_script:
- "mkdir -p ~/.docker && echo '{\"experimental\": \"enabled\"}' > ~/.docker/config.json"
- docker login -u username(你docker帐号名) -p password(你docker帐号的密码)
- docker manifest inspect username(你docker帐号名)/project(仓库名称) > /dev/null && exit || true
rules:
- if: $CI_PIPELINE_SOURCE == "web" || $CI_PIPELINE_SOURCE == "api" || $CI_PIPELINE_SOURCE == "schedules" || $CI_PIPELINE_SOURCE == "trigger"
when: always
allow_failure: true
- if: $CI_PIPELINE_SOURCE != "web" && $CI_PIPELINE_SOURCE != "api" && $CI_PIPELINE_SOURCE != "schedules" && $CI_PIPELINE_SOURCE != "trigger"
changes:
- Dockerfile
when: never
- if: $CI_COMMIT_BRANCH == "master"
when: on_success
####################################################################################################
# 编译
.build_job:
image: username(你docker帐号名)/project(仓库名称)
variables:
UPDATE_BRANCH_NAME: updateSubmodule
GIT_SUBMODULE_STRATEGY: recursive
timeout: 3h 30m
tags:
- docker
# Debug包
buildForPGY:
extends: .build_job
stage: build
script:
- ./release_kuril.sh -a
rules:
- if: $CI_PIPELINE_SOURCE == "web" && $PUBLISH == "true"
when: never
- if: $CI_PIPELINE_SOURCE == "web" && $PUBLISH != "true"
when: on_success
- if: $CI_PIPELINE_SOURCE == "schedules" || $CI_PIPELINE_SOURCE == "api" || $CI_PIPELINE_SOURCE == "trigger"
when: on_success
- if: $CI_COMMIT_BRANCH == "master"
when: manual
- when: never
# Release包: 用于发布
deployOnCDN:
extends: .build_job
stage: deploy
script:
- ./release.sh -r
rules:
- if: $CI_PIPELINE_SOURCE == "schedules"
when: never
- if: $CI_PIPELINE_SOURCE == "web" && $PUBLISH == "true"
when: on_success
- if: $CI_COMMIT_BRANCH == "master" && $PUBLISH == "true"
changes:
- gradle.properties
when: manual
- when: never
####################################################################################################
1. 测试包
2. Release 包