mirror of
https://github.com/pytorch/pytorch.git
synced 2025-10-21 05:34:18 +08:00
Run shellcheck on Jenkins scripts (#18874)
Summary: closes #18873 Doesn't fail the build on warnings yet. Also fix most severe shellcheck warnings Limited to `.jenkins/pytorch/` at this time Pull Request resolved: https://github.com/pytorch/pytorch/pull/18874 Differential Revision: D14936165 Pulled By: kostmo fbshipit-source-id: 1ee335695e54fe6c387ef0f6606ea7011dad0fd4
This commit is contained in:
committed by
Facebook Github Bot
parent
a0263ec047
commit
00148825fc
@ -4,7 +4,9 @@
|
|||||||
# (This is set by default in the Docker images we build, so you don't
|
# (This is set by default in the Docker images we build, so you don't
|
||||||
# need to set it yourself.
|
# need to set it yourself.
|
||||||
|
|
||||||
|
# shellcheck disable=SC2034
|
||||||
COMPACT_JOB_NAME="${BUILD_ENVIRONMENT}"
|
COMPACT_JOB_NAME="${BUILD_ENVIRONMENT}"
|
||||||
|
|
||||||
source "$(dirname "${BASH_SOURCE[0]}")/common.sh"
|
source "$(dirname "${BASH_SOURCE[0]}")/common.sh"
|
||||||
|
|
||||||
echo "Clang version:"
|
echo "Clang version:"
|
||||||
|
@ -4,7 +4,9 @@
|
|||||||
# (This is set by default in the Docker images we build, so you don't
|
# (This is set by default in the Docker images we build, so you don't
|
||||||
# need to set it yourself.
|
# need to set it yourself.
|
||||||
|
|
||||||
|
# shellcheck disable=SC2034
|
||||||
COMPACT_JOB_NAME="${BUILD_ENVIRONMENT}"
|
COMPACT_JOB_NAME="${BUILD_ENVIRONMENT}"
|
||||||
|
|
||||||
source "$(dirname "${BASH_SOURCE[0]}")/common.sh"
|
source "$(dirname "${BASH_SOURCE[0]}")/common.sh"
|
||||||
|
|
||||||
# For distributed, four environmental configs:
|
# For distributed, four environmental configs:
|
||||||
@ -31,7 +33,7 @@ if [[ "$BUILD_ENVIRONMENT" == *-xenial-cuda9*gcc7* ]] || [[ "$BUILD_ENVIRONMENT"
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$BUILD_ENVIRONMENT" == *pytorch-linux-xenial-py3-clang5-asan* ]]; then
|
if [[ "$BUILD_ENVIRONMENT" == *pytorch-linux-xenial-py3-clang5-asan* ]]; then
|
||||||
exec "$(dirname "${BASH_SOURCE[0]}")/build-asan.sh" $*
|
exec "$(dirname "${BASH_SOURCE[0]}")/build-asan.sh" "$@"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Python version:"
|
echo "Python version:"
|
||||||
@ -114,7 +116,7 @@ fi
|
|||||||
# gcc 7 with sccache seems to have intermittent OOM issue if all cores are used
|
# gcc 7 with sccache seems to have intermittent OOM issue if all cores are used
|
||||||
if [ -z "$MAX_JOBS" ]; then
|
if [ -z "$MAX_JOBS" ]; then
|
||||||
if ([[ "$BUILD_ENVIRONMENT" == *cuda* ]] || [[ "$BUILD_ENVIRONMENT" == *gcc7* ]]) && which sccache > /dev/null; then
|
if ([[ "$BUILD_ENVIRONMENT" == *cuda* ]] || [[ "$BUILD_ENVIRONMENT" == *gcc7* ]]) && which sccache > /dev/null; then
|
||||||
export MAX_JOBS=`expr $(nproc) - 1`
|
export MAX_JOBS=$(($(nproc) - 1))
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -89,7 +89,7 @@ if which sccache > /dev/null; then
|
|||||||
sccache --zero-stats
|
sccache --zero-stats
|
||||||
function sccache_epilogue() {
|
function sccache_epilogue() {
|
||||||
echo '=================== sccache compilation log ==================='
|
echo '=================== sccache compilation log ==================='
|
||||||
python $(dirname "${BASH_SOURCE[0]}")/print_sccache_log.py ~/sccache_error.log
|
python "$(dirname "${BASH_SOURCE[0]}")/print_sccache_log.py" ~/sccache_error.log
|
||||||
echo '=========== If your build fails, please take a look at the log above for possible reasons ==========='
|
echo '=========== If your build fails, please take a look at the log above for possible reasons ==========='
|
||||||
sccache --show-stats
|
sccache --show-stats
|
||||||
sccache --stop-server || true
|
sccache --stop-server || true
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
# shellcheck disable=SC2034
|
||||||
COMPACT_JOB_NAME="docker-build-test"
|
COMPACT_JOB_NAME="docker-build-test"
|
||||||
|
|
||||||
source "$(dirname "${BASH_SOURCE[0]}")/common.sh"
|
source "$(dirname "${BASH_SOURCE[0]}")/common.sh"
|
||||||
|
|
||||||
docker build -t pytorch .
|
docker build -t pytorch .
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
# shellcheck disable=SC2034
|
||||||
COMPACT_JOB_NAME="${BUILD_ENVIRONMENT}"
|
COMPACT_JOB_NAME="${BUILD_ENVIRONMENT}"
|
||||||
|
|
||||||
export PATH="/usr/local/bin:$PATH"
|
export PATH="/usr/local/bin:$PATH"
|
||||||
source "$(dirname "${BASH_SOURCE[0]}")/common.sh"
|
source "$(dirname "${BASH_SOURCE[0]}")/common.sh"
|
||||||
|
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
# shellcheck disable=SC2034
|
||||||
COMPACT_JOB_NAME="${BUILD_ENVIRONMENT}"
|
COMPACT_JOB_NAME="${BUILD_ENVIRONMENT}"
|
||||||
|
|
||||||
source "$(dirname "${BASH_SOURCE[0]}")/common.sh"
|
source "$(dirname "${BASH_SOURCE[0]}")/common.sh"
|
||||||
|
|
||||||
export PATH="/usr/local/bin:$PATH"
|
export PATH="/usr/local/bin:$PATH"
|
||||||
|
@ -4,7 +4,9 @@
|
|||||||
# (This is set by default in the Docker images we build, so you don't
|
# (This is set by default in the Docker images we build, so you don't
|
||||||
# need to set it yourself.
|
# need to set it yourself.
|
||||||
|
|
||||||
|
# shellcheck disable=SC2034
|
||||||
COMPACT_JOB_NAME="${BUILD_ENVIRONMENT}"
|
COMPACT_JOB_NAME="${BUILD_ENVIRONMENT}"
|
||||||
|
|
||||||
source "$(dirname "${BASH_SOURCE[0]}")/common.sh"
|
source "$(dirname "${BASH_SOURCE[0]}")/common.sh"
|
||||||
|
|
||||||
echo "Testing pytorch (distributed only)"
|
echo "Testing pytorch (distributed only)"
|
||||||
|
@ -10,7 +10,7 @@ get_runtime_of_command () {
|
|||||||
TIMEFORMAT=%R
|
TIMEFORMAT=%R
|
||||||
|
|
||||||
# runtime=$( { time ($@ &> /dev/null); } 2>&1 1>/dev/null)
|
# runtime=$( { time ($@ &> /dev/null); } 2>&1 1>/dev/null)
|
||||||
runtime=$( { time $@; } 2>&1 1>/dev/null)
|
runtime=$( { time "$@"; } 2>&1 1>/dev/null)
|
||||||
if [[ $runtime == *"Error"* ]]; then
|
if [[ $runtime == *"Error"* ]]; then
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
@ -19,14 +19,14 @@ test_cpu_speed_mini_sequence_labeler () {
|
|||||||
SAMPLE_ARRAY=()
|
SAMPLE_ARRAY=()
|
||||||
NUM_RUNS=$1
|
NUM_RUNS=$1
|
||||||
|
|
||||||
for (( i=1; i<=$NUM_RUNS; i++ )) do
|
for (( i=1; i<=NUM_RUNS; i++ )) do
|
||||||
runtime=$(get_runtime_of_command python main.py)
|
runtime=$(get_runtime_of_command python main.py)
|
||||||
SAMPLE_ARRAY+=(${runtime})
|
SAMPLE_ARRAY+=(${runtime})
|
||||||
done
|
done
|
||||||
|
|
||||||
cd ../../..
|
cd ../../..
|
||||||
|
|
||||||
stats=$(python ../get_stats.py ${SAMPLE_ARRAY[@]})
|
stats=$(python ../get_stats.py "${SAMPLE_ARRAY[@]}")
|
||||||
echo "Runtime stats in seconds:"
|
echo "Runtime stats in seconds:"
|
||||||
echo $stats
|
echo $stats
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ test_cpu_speed_mnist () {
|
|||||||
SAMPLE_ARRAY=()
|
SAMPLE_ARRAY=()
|
||||||
NUM_RUNS=$1
|
NUM_RUNS=$1
|
||||||
|
|
||||||
for (( i=1; i<=$NUM_RUNS; i++ )) do
|
for (( i=1; i<=NUM_RUNS; i++ )) do
|
||||||
runtime=$(get_runtime_of_command python main.py --epochs 1 --no-log)
|
runtime=$(get_runtime_of_command python main.py --epochs 1 --no-log)
|
||||||
echo $runtime
|
echo $runtime
|
||||||
SAMPLE_ARRAY+=(${runtime})
|
SAMPLE_ARRAY+=(${runtime})
|
||||||
@ -28,7 +28,7 @@ test_cpu_speed_mnist () {
|
|||||||
|
|
||||||
cd ../..
|
cd ../..
|
||||||
|
|
||||||
stats=$(python ../get_stats.py ${SAMPLE_ARRAY[@]})
|
stats=$(python ../get_stats.py "${SAMPLE_ARRAY[@]}")
|
||||||
echo "Runtime stats in seconds:"
|
echo "Runtime stats in seconds:"
|
||||||
echo $stats
|
echo $stats
|
||||||
|
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
. ./common.sh
|
. ./common.sh
|
||||||
|
|
||||||
test_cpu_speed_torch () {
|
test_cpu_speed_torch () {
|
||||||
@ -17,7 +19,7 @@ test_cpu_speed_torch () {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if ! python perf-tests/modules/test_cpu_torch.py ${ARGS}; then
|
if ! python perf-tests/modules/test_cpu_torch.py ${ARGS}; then
|
||||||
echo "To reproduce this regression, run \`cd .jenkins/pytorch/perf_test/ && bash "${FUNCNAME[0]}".sh\` on your local machine and compare the runtime before/after your code change."
|
echo "To reproduce this regression, run \`cd .jenkins/pytorch/perf_test/ && bash ${FUNCNAME[0]}.sh\` on your local machine and compare the runtime before/after your code change."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
. ./common.sh
|
. ./common.sh
|
||||||
|
|
||||||
test_cpu_speed_torch_tensor () {
|
test_cpu_speed_torch_tensor () {
|
||||||
@ -17,7 +19,7 @@ test_cpu_speed_torch_tensor () {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if ! python perf-tests/modules/test_cpu_torch_tensor.py ${ARGS}; then
|
if ! python perf-tests/modules/test_cpu_torch_tensor.py ${ARGS}; then
|
||||||
echo "To reproduce this regression, run \`cd .jenkins/pytorch/perf_test/ && bash "${FUNCNAME[0]}".sh\` on your local machine and compare the runtime before/after your code change."
|
echo "To reproduce this regression, run \`cd .jenkins/pytorch/perf_test/ && bash ${FUNCNAME[0]}.sh\` on your local machine and compare the runtime before/after your code change."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,7 @@ test_gpu_speed_cudnn_lstm () {
|
|||||||
SAMPLE_ARRAY=()
|
SAMPLE_ARRAY=()
|
||||||
NUM_RUNS=$1
|
NUM_RUNS=$1
|
||||||
|
|
||||||
for (( i=1; i<=$NUM_RUNS; i++ )) do
|
for (( i=1; i<=NUM_RUNS; i++ )) do
|
||||||
runtime=$(get_runtime_of_command python cudnn_lstm.py --skip-cpu-governor-check)
|
runtime=$(get_runtime_of_command python cudnn_lstm.py --skip-cpu-governor-check)
|
||||||
echo $runtime
|
echo $runtime
|
||||||
SAMPLE_ARRAY+=(${runtime})
|
SAMPLE_ARRAY+=(${runtime})
|
||||||
@ -27,7 +27,7 @@ test_gpu_speed_cudnn_lstm () {
|
|||||||
|
|
||||||
cd ../..
|
cd ../..
|
||||||
|
|
||||||
stats=$(python ../get_stats.py ${SAMPLE_ARRAY[@]})
|
stats=$(python ../get_stats.py "${SAMPLE_ARRAY[@]}")
|
||||||
echo "Runtime stats in seconds:"
|
echo "Runtime stats in seconds:"
|
||||||
echo $stats
|
echo $stats
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ test_gpu_speed_lstm () {
|
|||||||
SAMPLE_ARRAY=()
|
SAMPLE_ARRAY=()
|
||||||
NUM_RUNS=$1
|
NUM_RUNS=$1
|
||||||
|
|
||||||
for (( i=1; i<=$NUM_RUNS; i++ )) do
|
for (( i=1; i<=NUM_RUNS; i++ )) do
|
||||||
runtime=$(get_runtime_of_command python lstm.py --skip-cpu-governor-check)
|
runtime=$(get_runtime_of_command python lstm.py --skip-cpu-governor-check)
|
||||||
echo $runtime
|
echo $runtime
|
||||||
SAMPLE_ARRAY+=(${runtime})
|
SAMPLE_ARRAY+=(${runtime})
|
||||||
@ -27,7 +27,7 @@ test_gpu_speed_lstm () {
|
|||||||
|
|
||||||
cd ../..
|
cd ../..
|
||||||
|
|
||||||
stats=$(python ../get_stats.py ${SAMPLE_ARRAY[@]})
|
stats=$(python ../get_stats.py "${SAMPLE_ARRAY[@]}")
|
||||||
echo "Runtime stats in seconds:"
|
echo "Runtime stats in seconds:"
|
||||||
echo $stats
|
echo $stats
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ test_gpu_speed_mlstm () {
|
|||||||
SAMPLE_ARRAY=()
|
SAMPLE_ARRAY=()
|
||||||
NUM_RUNS=$1
|
NUM_RUNS=$1
|
||||||
|
|
||||||
for (( i=1; i<=$NUM_RUNS; i++ )) do
|
for (( i=1; i<=NUM_RUNS; i++ )) do
|
||||||
runtime=$(get_runtime_of_command python mlstm.py --skip-cpu-governor-check)
|
runtime=$(get_runtime_of_command python mlstm.py --skip-cpu-governor-check)
|
||||||
echo $runtime
|
echo $runtime
|
||||||
SAMPLE_ARRAY+=(${runtime})
|
SAMPLE_ARRAY+=(${runtime})
|
||||||
@ -27,7 +27,7 @@ test_gpu_speed_mlstm () {
|
|||||||
|
|
||||||
cd ../..
|
cd ../..
|
||||||
|
|
||||||
stats=$(python ../get_stats.py ${SAMPLE_ARRAY[@]})
|
stats=$(python ../get_stats.py "${SAMPLE_ARRAY[@]}")
|
||||||
echo "Runtime stats in seconds:"
|
echo "Runtime stats in seconds:"
|
||||||
echo $stats
|
echo $stats
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@ test_gpu_speed_mnist () {
|
|||||||
# Needs warm up to get accurate number
|
# Needs warm up to get accurate number
|
||||||
python main.py --epochs 1 --no-log
|
python main.py --epochs 1 --no-log
|
||||||
|
|
||||||
for (( i=1; i<=$NUM_RUNS; i++ )) do
|
for (( i=1; i<=NUM_RUNS; i++ )) do
|
||||||
runtime=$(get_runtime_of_command python main.py --epochs 1 --no-log)
|
runtime=$(get_runtime_of_command python main.py --epochs 1 --no-log)
|
||||||
echo $runtime
|
echo $runtime
|
||||||
SAMPLE_ARRAY+=(${runtime})
|
SAMPLE_ARRAY+=(${runtime})
|
||||||
@ -31,7 +31,7 @@ test_gpu_speed_mnist () {
|
|||||||
|
|
||||||
cd ../..
|
cd ../..
|
||||||
|
|
||||||
stats=$(python ../get_stats.py ${SAMPLE_ARRAY[@]})
|
stats=$(python ../get_stats.py "${SAMPLE_ARRAY[@]}")
|
||||||
echo "Runtime stats in seconds:"
|
echo "Runtime stats in seconds:"
|
||||||
echo $stats
|
echo $stats
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@ test_gpu_speed_word_language_model () {
|
|||||||
SAMPLE_ARRAY=()
|
SAMPLE_ARRAY=()
|
||||||
NUM_RUNS=$1
|
NUM_RUNS=$1
|
||||||
|
|
||||||
for (( i=1; i<=$NUM_RUNS; i++ )) do
|
for (( i=1; i<=NUM_RUNS; i++ )) do
|
||||||
runtime=$(get_runtime_of_command python main.py --cuda --epochs 1)
|
runtime=$(get_runtime_of_command python main.py --cuda --epochs 1)
|
||||||
echo $runtime
|
echo $runtime
|
||||||
SAMPLE_ARRAY+=(${runtime})
|
SAMPLE_ARRAY+=(${runtime})
|
||||||
@ -36,7 +36,7 @@ test_gpu_speed_word_language_model () {
|
|||||||
|
|
||||||
cd ../..
|
cd ../..
|
||||||
|
|
||||||
stats=$(python ../get_stats.py ${SAMPLE_ARRAY[@]})
|
stats=$(python ../get_stats.py "${SAMPLE_ARRAY[@]}")
|
||||||
echo "Runtime stats in seconds:"
|
echo "Runtime stats in seconds:"
|
||||||
echo $stats
|
echo $stats
|
||||||
|
|
||||||
|
@ -1,7 +1,12 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
# shellcheck disable=SC2034
|
||||||
COMPACT_JOB_NAME="short-perf-test-cpu"
|
COMPACT_JOB_NAME="short-perf-test-cpu"
|
||||||
source "$(dirname "${BASH_SOURCE[0]}")/common.sh"
|
|
||||||
|
SCRIPT_PARENT_DIR=$(dirname "${BASH_SOURCE[0]}")
|
||||||
|
|
||||||
|
# shellcheck source=.jenkins/pytorch/common.sh
|
||||||
|
source "$SCRIPT_PARENT_DIR/common.sh"
|
||||||
|
|
||||||
cd .jenkins/pytorch/perf_test
|
cd .jenkins/pytorch/perf_test
|
||||||
|
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
# shellcheck disable=SC2034
|
||||||
COMPACT_JOB_NAME="short-perf-test-gpu"
|
COMPACT_JOB_NAME="short-perf-test-gpu"
|
||||||
|
|
||||||
source "$(dirname "${BASH_SOURCE[0]}")/common.sh"
|
source "$(dirname "${BASH_SOURCE[0]}")/common.sh"
|
||||||
|
|
||||||
pushd .jenkins/pytorch/perf_test
|
pushd .jenkins/pytorch/perf_test
|
||||||
|
@ -4,7 +4,9 @@
|
|||||||
# (This is set by default in the Docker images we build, so you don't
|
# (This is set by default in the Docker images we build, so you don't
|
||||||
# need to set it yourself.
|
# need to set it yourself.
|
||||||
|
|
||||||
|
# shellcheck disable=SC2034
|
||||||
COMPACT_JOB_NAME="${BUILD_ENVIRONMENT}"
|
COMPACT_JOB_NAME="${BUILD_ENVIRONMENT}"
|
||||||
|
|
||||||
source "$(dirname "${BASH_SOURCE[0]}")/common.sh"
|
source "$(dirname "${BASH_SOURCE[0]}")/common.sh"
|
||||||
|
|
||||||
echo "Testing pytorch"
|
echo "Testing pytorch"
|
||||||
|
@ -9,6 +9,7 @@ if [ ! -f setup.py ]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# shellcheck disable=SC2034
|
||||||
COMPACT_JOB_NAME=pytorch-win-ws2016-cuda9-cudnn7-py3-build
|
COMPACT_JOB_NAME=pytorch-win-ws2016-cuda9-cudnn7-py3-build
|
||||||
|
|
||||||
SCRIPT_PARENT_DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
|
SCRIPT_PARENT_DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#!/bin/bash -ex
|
#!/bin/bash -ex
|
||||||
|
|
||||||
|
# shellcheck disable=SC2034
|
||||||
COMPACT_JOB_NAME=pytorch-win-ws2016-cuda9-cudnn7-py3-test
|
COMPACT_JOB_NAME=pytorch-win-ws2016-cuda9-cudnn7-py3-test
|
||||||
|
|
||||||
SCRIPT_PARENT_DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
|
SCRIPT_PARENT_DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
|
||||||
|
10
.jenkins/run-shellcheck.sh
Executable file
10
.jenkins/run-shellcheck.sh
Executable file
@ -0,0 +1,10 @@
|
|||||||
|
#!/bin/bash -xe
|
||||||
|
|
||||||
|
# One may want to invoke this script locally as follows:
|
||||||
|
#
|
||||||
|
# .jenkins/run-shellcheck.sh --color=always | less -R
|
||||||
|
|
||||||
|
|
||||||
|
EXCLUSIONS=SC2086,SC1091,SC2155,SC1090,SC2164,SC1003
|
||||||
|
|
||||||
|
find .jenkins/pytorch -name *.sh | xargs shellcheck --exclude=$EXCLUSIONS --external-sources "$@" || true
|
@ -16,6 +16,10 @@ matrix:
|
|||||||
python: "3.6"
|
python: "3.6"
|
||||||
dist: xenial
|
dist: xenial
|
||||||
script: cd .circleci && ./ensure-consistency.py
|
script: cd .circleci && ./ensure-consistency.py
|
||||||
|
- name: "Shellcheck Jenkins scripts"
|
||||||
|
dist: xenial
|
||||||
|
install: sudo apt-get install -y shellcheck
|
||||||
|
script: .jenkins/run-shellcheck.sh
|
||||||
- name: "Ensure no tabs"
|
- name: "Ensure no tabs"
|
||||||
python: "2.7"
|
python: "2.7"
|
||||||
script:
|
script:
|
||||||
|
Reference in New Issue
Block a user