mirror of
https://github.com/bregman-arie/devops-exercises.git
synced 2024-11-24 08:22:12 +02:00
scripts/run_ci.sh to cover directories in the exercises and topics dir (#315)
* Smoother practice experience * update ci to check all md files * fix some syntax * fix README-zh_CN.md * update syntax_lint accorging to PEP8 * Temporarily delete this question 'Explain the sidecar container pattern' to pass the workflow --------- Co-authored-by: zhangzhen <zhangzhen@nao.cas.cn> Co-authored-by: Arie Bregman <bregman.arie@gmail.com>
This commit is contained in:
parent
50c9714fe4
commit
01e1dddd2f
@ -289,7 +289,7 @@
|
|||||||
</b></details>
|
</b></details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary>你是如何实施从某个阶段而不是从最开始构建的选项?<summary><br><b>
|
<summary>你是如何实施从某个阶段而不是从最开始构建的选项?</summary><br><b>
|
||||||
</b></details>
|
</b></details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
@ -924,7 +924,7 @@ Zombie(假死态)
|
|||||||
</b></details>
|
</b></details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary>你能解释一下网络进程/连接如何建立以及如何终止?><br></b>
|
<summary>你能解释一下网络进程/连接如何建立以及如何终止?</summary><br></b>
|
||||||
</b></details>
|
</b></details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
@ -1385,6 +1385,7 @@ Terraform与其他工具相比的优势:
|
|||||||
* Provider
|
* Provider
|
||||||
* Resource
|
* Resource
|
||||||
* Provisioner
|
* Provisioner
|
||||||
|
</summary>
|
||||||
</b></details>
|
</b></details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
@ -1656,7 +1657,7 @@ Docker Cloud构建在Docker Hub之上,因此Docker Cloud提供了
|
|||||||
</b></details>
|
</b></details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary>解释一下递归</summary<br><b>
|
<summary>解释一下递归</summary><br><b>
|
||||||
</b></details>
|
</b></details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
@ -1951,11 +1952,11 @@ with open('file.txt', 'w') as file:
|
|||||||
</b></details>
|
</b></details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summay>如何用 "blue" 替换字符串 "green"?</summary><br><b>
|
<summary>如何用 "blue" 替换字符串 "green"?</summary><br><b>
|
||||||
</b></details>
|
</b></details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summay>如何找到一个变量中的所有IP地址? 如何在文件中找到它们?</summary><br><b>
|
<summary>如何找到一个变量中的所有IP地址? 如何在文件中找到它们?</summary><br><b>
|
||||||
</b></details>
|
</b></details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
@ -2072,6 +2073,7 @@ def reverse_string(string):
|
|||||||
* Mergesort
|
* Mergesort
|
||||||
* Bucket Sort
|
* Bucket Sort
|
||||||
* Radix Sort
|
* Radix Sort
|
||||||
|
</summary>
|
||||||
</b></details>
|
</b></details>
|
||||||
|
|
||||||
<a name="python-advanced"></a>
|
<a name="python-advanced"></a>
|
||||||
@ -2110,7 +2112,7 @@ def reverse_string(string):
|
|||||||
</b></details>
|
</b></details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary>你可以在Python中实现链接链表吗?<br><b>
|
<summary>你可以在Python中实现链接链表吗?</summary><br><b>
|
||||||
</b></details>
|
</b></details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
@ -2832,7 +2834,7 @@ where c.Customer_ID in (Select Customer_ID from cat_food);
|
|||||||
</b></details>
|
</b></details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summmary>详细描述如何使用可以从云外部访问的IP来启动实例</summary><br><b>
|
<summary>详细描述如何使用可以从云外部访问的IP来启动实例</summary><br><b>
|
||||||
</b></details>
|
</b></details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
@ -1,5 +1,15 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# These are the same steps we are running in Travis CI
|
# These are the same steps we are running in Travis CI
|
||||||
|
|
||||||
python $(dirname "$0")/../tests/syntax_lint.py
|
|
||||||
|
find . -name "*.md" -not -path "./tests/*" | \
|
||||||
|
xargs -I {} \
|
||||||
|
python $(dirname "$0")/../tests/syntax_lint.py {} > /dev/null
|
||||||
|
mdPassed=$?
|
||||||
flake8 --max-line-length=100 . && echo "PEP8 Passed"
|
flake8 --max-line-length=100 . && echo "PEP8 Passed"
|
||||||
|
pyPassed=$?
|
||||||
|
if [ $pyPassed -eq 0 ] && [ $mdPassed -eq 0 ];then
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
@ -11,12 +11,10 @@ $ python tests/syntax_lint.py
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import pathlib
|
import sys
|
||||||
|
|
||||||
p = pathlib.Path(__file__).parent.parent.joinpath('README.md')
|
p = sys.argv[1]
|
||||||
|
|
||||||
with open(p, 'rb') as f:
|
|
||||||
file_list = [line.rstrip() for line in f.readlines()]
|
|
||||||
|
|
||||||
errors = []
|
errors = []
|
||||||
|
|
||||||
@ -31,9 +29,9 @@ def count_details(file_list):
|
|||||||
details_count = 0
|
details_count = 0
|
||||||
|
|
||||||
for line_number, line in enumerate(file_list):
|
for line_number, line in enumerate(file_list):
|
||||||
if b'<details>' in line:
|
if b"<details>" in line:
|
||||||
details_count += 1
|
details_count += 1
|
||||||
if b'</details>' in line:
|
if b"</details>" in line:
|
||||||
details_final_count += 1
|
details_final_count += 1
|
||||||
|
|
||||||
return details_count == details_final_count
|
return details_count == details_final_count
|
||||||
@ -49,9 +47,9 @@ def count_summary(file_list):
|
|||||||
details_count = 0
|
details_count = 0
|
||||||
|
|
||||||
for line_number, line in enumerate(file_list):
|
for line_number, line in enumerate(file_list):
|
||||||
if b'<summary>' in line:
|
if b"<summary>" in line:
|
||||||
details_count += 1
|
details_count += 1
|
||||||
if b'</summary>' in line:
|
if b"</summary>" in line:
|
||||||
details_final_count += 1
|
details_final_count += 1
|
||||||
|
|
||||||
return details_count == details_final_count
|
return details_count == details_final_count
|
||||||
@ -70,22 +68,22 @@ def check_details_tag(file_list):
|
|||||||
|
|
||||||
after_detail = False
|
after_detail = False
|
||||||
error = False
|
error = False
|
||||||
err_message = ''
|
err_message = ""
|
||||||
for line_number, line in enumerate(file_list):
|
for line_number, line in enumerate(file_list):
|
||||||
if b'<details>' in line and b'</details>' in line:
|
if b"<details>" in line and b"</details>" in line:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
if b'<details>' in line and after_detail:
|
if b"<details>" in line and after_detail:
|
||||||
err_message = f'Missing closing detail tag round line {line_number - 1}'
|
err_message = f"Missing closing detail tag round line {line_number - 1}"
|
||||||
error = True
|
error = True
|
||||||
if b'</details>' in line and not after_detail:
|
if b"</details>" in line and not after_detail:
|
||||||
err_message = f'Missing opening detail tag round line {line_number - 1}'
|
err_message = f"Missing opening detail tag round line {line_number - 1}"
|
||||||
error = True
|
error = True
|
||||||
|
|
||||||
if b'<details>' in line:
|
if b"<details>" in line:
|
||||||
after_detail = True
|
after_detail = True
|
||||||
|
|
||||||
if b'</details>' in line and after_detail:
|
if b"</details>" in line and after_detail:
|
||||||
after_detail = False
|
after_detail = False
|
||||||
|
|
||||||
if error:
|
if error:
|
||||||
@ -107,22 +105,26 @@ def check_summary_tag(file_list):
|
|||||||
|
|
||||||
after_summary = False
|
after_summary = False
|
||||||
error = False
|
error = False
|
||||||
err_message = ''
|
err_message = ""
|
||||||
for line_number, line in enumerate(file_list):
|
for idx, line in enumerate(file_list):
|
||||||
if b'<summary>' in line and b'</summary>' in line:
|
line_number = idx + 1
|
||||||
pass
|
if b"<summary>" in line and b"</summary>" in line:
|
||||||
else:
|
if after_summary:
|
||||||
if b'<summary>' in line and after_summary:
|
err_message = f"Missing closing summary tag around line {line_number}"
|
||||||
err_message = f'Missing closing summary tag around line {line_number}'
|
|
||||||
error = True
|
|
||||||
if b'</summary>' in line and not after_summary:
|
|
||||||
err_message = f'Missing opening summary tag around line {line_number}'
|
|
||||||
error = True
|
error = True
|
||||||
|
|
||||||
if b'<summary>' in line:
|
else:
|
||||||
|
if b"<summary>" in line and after_summary:
|
||||||
|
err_message = f"Missing closing summary tag around line {line_number}"
|
||||||
|
error = True
|
||||||
|
if b"</summary>" in line and not after_summary:
|
||||||
|
err_message = f"Missing opening summary tag around line {line_number}"
|
||||||
|
error = True
|
||||||
|
|
||||||
|
if b"<summary>" in line:
|
||||||
after_summary = True
|
after_summary = True
|
||||||
|
|
||||||
if b'</summary>' in line and after_summary:
|
if b"</summary>" in line and after_summary:
|
||||||
after_summary = False
|
after_summary = False
|
||||||
|
|
||||||
if error:
|
if error:
|
||||||
@ -131,12 +133,20 @@ def check_summary_tag(file_list):
|
|||||||
error = False
|
error = False
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
def check_md_file(file_name):
|
||||||
|
with open(p, "rb") as f:
|
||||||
|
file_list = [line.rstrip() for line in f.readlines()]
|
||||||
check_details_tag(file_list)
|
check_details_tag(file_list)
|
||||||
check_summary_tag(file_list)
|
check_summary_tag(file_list)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
print(f"..........Checking {p}..........")
|
||||||
|
check_md_file(p)
|
||||||
if errors:
|
if errors:
|
||||||
|
print(f"{p} failed", file=sys.stderr)
|
||||||
for error in errors:
|
for error in errors:
|
||||||
print(error)
|
print(error, file=sys.stderr)
|
||||||
exit(1)
|
exit(1)
|
||||||
|
|
||||||
print("Tests passed successfully.")
|
print("Tests passed successfully.")
|
||||||
|
@ -2349,14 +2349,7 @@ The pod is automatically assigned with the default service account (in the names
|
|||||||
|
|
||||||
### Patterns
|
### Patterns
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>Explain the sidecar container pattern</summary><br><b>
|
|
||||||
ion container, there is a sidecar container.
|
|
||||||
</b></details>
|
|
||||||
r, the application would not exist. In addition to the application container, there is a sidecar container.
|
|
||||||
|
|
||||||
In simpler words, when you have a Pod and there is more than one container running in that Pod that supports or complements the application container, it means you use the sidecar pattern.
|
|
||||||
</b></details>
|
|
||||||
|
|
||||||
### CronJob
|
### CronJob
|
||||||
|
|
||||||
|
@ -253,6 +253,7 @@ True. It is only used during the key exchange algorithm of symmetric encryption.
|
|||||||
Hashing is a mathematical function for mapping data of arbitrary sizes to fixed-size values. This function produces a "digest" of the data that can be used for verifying that the data has not been modified (amongst other uses)
|
Hashing is a mathematical function for mapping data of arbitrary sizes to fixed-size values. This function produces a "digest" of the data that can be used for verifying that the data has not been modified (amongst other uses)
|
||||||
</b></details>
|
</b></details>
|
||||||
|
|
||||||
|
<details>
|
||||||
<summary>How is hashing different from encryption?</summary><br><b>
|
<summary>How is hashing different from encryption?</summary><br><b>
|
||||||
|
|
||||||
Encrypted data can be decrypted to its original value. Hashed data cannot be reversed to view the original data - hashing is a one-way function.
|
Encrypted data can be decrypted to its original value. Hashed data cannot be reversed to view the original data - hashing is a one-way function.
|
||||||
|
Loading…
Reference in New Issue
Block a user